Hello.
I would like to generate a valid tri-tuple date with StreamData
. After some digging and experimentation I arrived at this working code:
defmodule SomeFactory do
def valid_date?({_y, _m, _d} = date_tuple) do
case Date.from_erl(date_tuple) do
{:ok, _date} -> true
_ -> false
end
end
def date_maybe_invalid_tuple() do
gen all y <- integer(0..99),
m <- integer(1..12),
d <- integer(1..31) do
{y, m, d}
end
end
def date_valid_tuple() do
StreamData.filter(date_maybe_invalid_tuple(), &valid_date?/1)
end
end
Running this gave me a reasonable certainty that the filter indeed stops invalid dates like 2018-02-30
(it returns the empty list as I expected):
Enum.take(SomeFactory.date_valid_tuple(), 1_000_000) |> Enum.reject(&SomeFactory.valid_date?/1)
So, am I doing this right? And is there a way to do the above with only one function?