Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tiagoefmoraes/d5cba88345e563ba4fe6c4f1d36752d3 to your computer and use it in GitHub Desktop.
Save tiagoefmoraes/d5cba88345e563ba4fe6c4f1d36752d3 to your computer and use it in GitHub Desktop.
stream_data generators to create elixir date/time structs
defmodule DateTimeGenerators do
use ExUnitProperties
@time_zones ["Etc/UTC"]
def date do
gen all year <- integer(1970..2050),
month <- integer(1..12),
day <- integer(1..31),
match?({:ok, _}, Date.from_erl({year, month, day})) do
Date.from_erl!({year, month, day})
end
end
def time do
gen all hour <- integer(0..23),
minute <- integer(0..59),
second <- integer(0..59) do
Time.from_erl!({hour, minute, second})
end
end
def naive_datetime do
gen all date <- date(),
time <- time() do
{:ok, naive_datetime} = NaiveDateTime.new(date, time)
naive_datetime
end
end
def datetime do
gen all naive_datetime <- naive_datetime(),
time_zone <- member_of(@time_zones) do
DateTime.from_naive!(naive_datetime, time_zone)
end
end
end
defmodule Connect.GeneratorsTwo do
import StreamData
@time_zones ["Etc/UTC"]
def date do
tuple({integer(1970..2050), integer(1..12), integer(1..31)})
|> bind_filter(fn tuple ->
case Date.from_erl(tuple) do
{:ok, date} -> {:cont, constant(date)}
_ -> :skip
end
end)
end
def time do
tuple({integer(0..23), integer(0..59), integer(0..59)})
|> map(&Time.from_erl!)
end
def naive_datetime do
tuple({date(), time()})
|> map(fn {date, time} ->
{:ok, naive_datetime} = NaiveDateTime.new(date, time)
naive_datetime
end)
end
def datetime do
tuple({naive_datetime(), member_of(@time_zones)})
|> map(fn {naive_datetime, time_zone} ->
DateTime.from_naive!(naive_datetime, time_zone)
end)
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment