Guest User

Untitled

a guest
Apr 21st, 2018
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.53 KB | None | 0 0
  1. defmodule DateTimeGenerator do
  2. import StreamData
  3.  
  4. @moduledoc """
  5. DateTimeGenerator generates Elixir `Date`s, `Time`s, `DateTime`s, and `NaiveDateTime`s to be used
  6. with property-based testing.
  7. """
  8.  
  9. @defaults %{
  10. year_range: 1970..2050,
  11. month_range: 1..12,
  12. day_range: 1..31,
  13. hour_range: 1..23,
  14. minute_range: 1..59,
  15. second_range: 1..59,
  16. time_zones: ["Etc/UTC"]
  17. }
  18.  
  19. def date(), do: date(@defaults)
  20.  
  21. def date(%{} = opts) do
  22. opts = Map.merge(@defaults, opts)
  23.  
  24. tuple({integer(opts.year_range), integer(opts.month_range), integer(opts.day_range)})
  25. |> bind_filter(fn tuple ->
  26. case Date.from_erl(tuple) do
  27. {:ok, date} -> {:cont, constant(date)}
  28. _ -> :skip
  29. end
  30. end)
  31. end
  32.  
  33. def time(), do: time(@defaults)
  34.  
  35. def time(%{} = opts) do
  36. opts = Map.merge(@defaults, opts)
  37.  
  38. tuple({integer(opts.hour_range), integer(opts.minute_range), integer(opts.second_range)})
  39. |> map(&Time.from_erl!/1)
  40. end
  41.  
  42. def naive_datetime(), do: naive_datetime(@defaults)
  43.  
  44. def naive_datetime(%{} = opts) do
  45. opts = Map.merge(@defaults, opts)
  46.  
  47. tuple({date(opts), time(opts)})
  48. |> map(fn {date, time} ->
  49. {:ok, naive_datetime} = NaiveDateTime.new(date, time)
  50. naive_datetime
  51. end)
  52. end
  53.  
  54. def datetime(), do: datetime(@defaults)
  55.  
  56. def datetime(%{} = opts) do
  57. opts = Map.merge(@defaults, opts)
  58.  
  59. tuple({naive_datetime(opts), member_of(opts.time_zones)})
  60. |> map(fn {naive_datetime, time_zone} ->
  61. DateTime.from_naive!(naive_datetime, time_zone)
  62. end)
  63. end
  64.  
  65. end
Add Comment
Please, Sign In to add comment