exercism-elixir/date-parser/test/date_parser_test.exs
2022-02-03 15:18:36 -04:00

423 lines
15 KiB
Elixir

defmodule DateParserTest do
use ExUnit.Case
@tag task_id: 1
test "numeric pattern for day is a string" do
assert DateParser.day() |> is_binary()
end
describe "numeric pattern for day matches" do
@tag task_id: 1
test "un-padded days" do
assert "1" =~ Regex.compile!(DateParser.day())
assert "2" =~ Regex.compile!(DateParser.day())
assert "3" =~ Regex.compile!(DateParser.day())
assert "4" =~ Regex.compile!(DateParser.day())
assert "5" =~ Regex.compile!(DateParser.day())
assert "6" =~ Regex.compile!(DateParser.day())
assert "7" =~ Regex.compile!(DateParser.day())
assert "8" =~ Regex.compile!(DateParser.day())
assert "9" =~ Regex.compile!(DateParser.day())
assert "10" =~ Regex.compile!(DateParser.day())
assert "11" =~ Regex.compile!(DateParser.day())
assert "12" =~ Regex.compile!(DateParser.day())
assert "13" =~ Regex.compile!(DateParser.day())
assert "14" =~ Regex.compile!(DateParser.day())
assert "15" =~ Regex.compile!(DateParser.day())
assert "16" =~ Regex.compile!(DateParser.day())
assert "17" =~ Regex.compile!(DateParser.day())
assert "18" =~ Regex.compile!(DateParser.day())
assert "19" =~ Regex.compile!(DateParser.day())
assert "20" =~ Regex.compile!(DateParser.day())
assert "21" =~ Regex.compile!(DateParser.day())
assert "22" =~ Regex.compile!(DateParser.day())
assert "23" =~ Regex.compile!(DateParser.day())
assert "24" =~ Regex.compile!(DateParser.day())
assert "25" =~ Regex.compile!(DateParser.day())
assert "26" =~ Regex.compile!(DateParser.day())
assert "27" =~ Regex.compile!(DateParser.day())
assert "28" =~ Regex.compile!(DateParser.day())
assert "29" =~ Regex.compile!(DateParser.day())
assert "30" =~ Regex.compile!(DateParser.day())
assert "31" =~ Regex.compile!(DateParser.day())
end
@tag task_id: 1
test "padded days" do
assert "01" =~ Regex.compile!(DateParser.day())
assert "02" =~ Regex.compile!(DateParser.day())
assert "03" =~ Regex.compile!(DateParser.day())
assert "04" =~ Regex.compile!(DateParser.day())
assert "05" =~ Regex.compile!(DateParser.day())
assert "06" =~ Regex.compile!(DateParser.day())
assert "07" =~ Regex.compile!(DateParser.day())
assert "08" =~ Regex.compile!(DateParser.day())
assert "09" =~ Regex.compile!(DateParser.day())
end
end
describe "numeric pattern for day doesn't match" do
@tag task_id: 1
test "too few digits", do: refute("" =~ Regex.compile!("^#{DateParser.day()}$"))
@tag task_id: 1
test "too many digits", do: refute("111" =~ Regex.compile!("^#{DateParser.day()}$"))
@tag task_id: 1
test "one letter", do: refute("a" =~ Regex.compile!(DateParser.day()))
@tag task_id: 1
test "two letters", do: refute("bb" =~ Regex.compile!(DateParser.day()))
end
@tag task_id: 1
test "numeric pattern for month is a string" do
assert DateParser.month() |> is_binary()
end
describe "numeric pattern for month matches" do
@tag task_id: 1
test "un-padded months" do
assert "1" =~ Regex.compile!(DateParser.month())
assert "2" =~ Regex.compile!(DateParser.month())
assert "3" =~ Regex.compile!(DateParser.month())
assert "4" =~ Regex.compile!(DateParser.month())
assert "5" =~ Regex.compile!(DateParser.month())
assert "6" =~ Regex.compile!(DateParser.month())
assert "7" =~ Regex.compile!(DateParser.month())
assert "8" =~ Regex.compile!(DateParser.month())
assert "9" =~ Regex.compile!(DateParser.month())
assert "10" =~ Regex.compile!(DateParser.month())
assert "11" =~ Regex.compile!(DateParser.month())
assert "12" =~ Regex.compile!(DateParser.month())
end
@tag task_id: 1
test "padded months" do
assert "01" =~ Regex.compile!(DateParser.month())
assert "02" =~ Regex.compile!(DateParser.month())
assert "03" =~ Regex.compile!(DateParser.month())
assert "04" =~ Regex.compile!(DateParser.month())
assert "05" =~ Regex.compile!(DateParser.month())
assert "06" =~ Regex.compile!(DateParser.month())
assert "07" =~ Regex.compile!(DateParser.month())
assert "08" =~ Regex.compile!(DateParser.month())
assert "09" =~ Regex.compile!(DateParser.month())
end
end
describe "numeric pattern for month doesn't match" do
@tag task_id: 1
test "too few digits", do: refute("" =~ Regex.compile!("^#{DateParser.month()}$"))
@tag task_id: 1
test "too many digits", do: refute("111" =~ Regex.compile!("^#{DateParser.month()}$"))
@tag task_id: 1
test "one letter", do: refute("a" =~ Regex.compile!(DateParser.month()))
@tag task_id: 1
test "two letters", do: refute("bb" =~ Regex.compile!(DateParser.month()))
@tag task_id: 1
test "short month name", do: refute("Jan" =~ Regex.compile!(DateParser.month()))
@tag task_id: 1
test "long month name", do: refute("January" =~ Regex.compile!(DateParser.month()))
end
@tag task_id: 1
test "numeric pattern for year is a string" do
assert DateParser.year() |> is_binary()
end
describe "numeric pattern for year" do
@tag task_id: 1
test "matches 4 digits", do: assert("1970" =~ Regex.compile!("^#{DateParser.year()}$"))
@tag task_id: 1
test "doesn't match short year", do: refute("84" =~ Regex.compile!("^#{DateParser.year()}$"))
@tag task_id: 1
test "doesn't match letters", do: refute("198A" =~ Regex.compile!("^#{DateParser.year()}$"))
@tag task_id: 1
test "doesn't match too few", do: refute("198" =~ Regex.compile!("^#{DateParser.year()}$"))
@tag task_id: 1
test "doesn't match too many", do: refute("19701" =~ Regex.compile!("^#{DateParser.year()}$"))
end
@tag task_id: 2
test "pattern for day names is a string" do
assert DateParser.day_names() |> is_binary()
end
@tag task_id: 2
test "day names match" do
assert "Sunday" =~ Regex.compile!(DateParser.day_names())
assert "Monday" =~ Regex.compile!(DateParser.day_names())
assert "Tuesday" =~ Regex.compile!(DateParser.day_names())
assert "Wednesday" =~ Regex.compile!(DateParser.day_names())
assert "Thursday" =~ Regex.compile!(DateParser.day_names())
assert "Friday" =~ Regex.compile!(DateParser.day_names())
assert "Saturday" =~ Regex.compile!(DateParser.day_names())
end
@tag task_id: 2
test "day names don't match with trailing or leading whitespace" do
refute " Sunday " =~ Regex.compile!("^#{DateParser.day_names()}$")
refute " Monday " =~ Regex.compile!("^#{DateParser.day_names()}$")
refute " Tuesday " =~ Regex.compile!("^#{DateParser.day_names()}$")
refute " Wednesday " =~ Regex.compile!("^#{DateParser.day_names()}$")
refute " Thursday " =~ Regex.compile!("^#{DateParser.day_names()}$")
refute " Friday " =~ Regex.compile!("^#{DateParser.day_names()}$")
refute " Saturday " =~ Regex.compile!("^#{DateParser.day_names()}$")
end
describe "day names don't match" do
@tag task_id: 2
test "combined" do
refute "TuesdayWednesday" =~ Regex.compile!("^#{DateParser.day_names()}$")
end
@tag task_id: 2
test "short name" do
refute "Sun" =~ Regex.compile!("^#{DateParser.day_names()}$")
end
@tag task_id: 2
test "numeric day of the week (0-indexed)" do
refute "0" =~ Regex.compile!("^#{DateParser.day_names()}$")
end
@tag task_id: 2
test "numeric day of the week (1-indexed)" do
refute "1" =~ Regex.compile!("^#{DateParser.day_names()}$")
end
end
@tag task_id: 2
test "pattern for month names is a string" do
assert DateParser.month_names() |> is_binary()
end
@tag task_id: 2
test "month names match" do
assert "January" =~ Regex.compile!(DateParser.month_names())
assert "February" =~ Regex.compile!(DateParser.month_names())
assert "March" =~ Regex.compile!(DateParser.month_names())
assert "April" =~ Regex.compile!(DateParser.month_names())
assert "May" =~ Regex.compile!(DateParser.month_names())
assert "June" =~ Regex.compile!(DateParser.month_names())
assert "July" =~ Regex.compile!(DateParser.month_names())
assert "August" =~ Regex.compile!(DateParser.month_names())
assert "September" =~ Regex.compile!(DateParser.month_names())
assert "October" =~ Regex.compile!(DateParser.month_names())
assert "November" =~ Regex.compile!(DateParser.month_names())
assert "December" =~ Regex.compile!(DateParser.month_names())
end
@tag task_id: 2
test "month names don't match with trailing or leading whitespace" do
refute " January " =~ Regex.compile!("^#{DateParser.month_names()}$")
refute " February " =~ Regex.compile!("^#{DateParser.month_names()}$")
refute " March " =~ Regex.compile!("^#{DateParser.month_names()}$")
refute " April " =~ Regex.compile!("^#{DateParser.month_names()}$")
refute " May " =~ Regex.compile!("^#{DateParser.month_names()}$")
refute " June " =~ Regex.compile!("^#{DateParser.month_names()}$")
refute " July " =~ Regex.compile!("^#{DateParser.month_names()}$")
refute " August " =~ Regex.compile!("^#{DateParser.month_names()}$")
refute " September " =~ Regex.compile!("^#{DateParser.month_names()}$")
refute " October " =~ Regex.compile!("^#{DateParser.month_names()}$")
refute " November " =~ Regex.compile!("^#{DateParser.month_names()}$")
refute " December " =~ Regex.compile!("^#{DateParser.month_names()}$")
end
describe "month names don't match" do
@tag task_id: 2
test "combined" do
refute "JanuaryFebruary" =~ Regex.compile!("^#{DateParser.month_names()}$")
end
@tag task_id: 2
test "short name" do
refute "Jan" =~ Regex.compile!("^#{DateParser.month_names()}$")
end
@tag task_id: 2
test "numeric month of the year (0-indexed)" do
refute "0" =~ Regex.compile!("^#{DateParser.month_names()}$")
end
@tag task_id: 2
test "numeric month of the year (1-indexed)" do
refute "1" =~ Regex.compile!("^#{DateParser.month_names()}$")
end
end
describe "capture" do
@tag task_id: 3
test "numeric month" do
assert DateParser.capture_month() |> is_binary()
assert %{"month" => "01"} =
DateParser.capture_month()
|> Regex.compile!()
|> Regex.named_captures("01")
end
@tag task_id: 3
test "numeric day" do
assert DateParser.capture_day() |> is_binary()
assert %{"day" => "01"} =
DateParser.capture_day()
|> Regex.compile!()
|> Regex.named_captures("01")
end
@tag task_id: 3
test "numeric year" do
assert DateParser.capture_year() |> is_binary()
assert %{"year" => "1970"} =
DateParser.capture_year()
|> Regex.compile!()
|> Regex.named_captures("1970")
end
@tag task_id: 3
test "capture day name" do
assert DateParser.capture_day_name() |> is_binary()
assert %{"day_name" => "Monday"} =
DateParser.capture_day_name()
|> Regex.compile!()
|> Regex.named_captures("Monday")
end
@tag task_id: 3
test "capture month name" do
assert DateParser.capture_month_name() |> is_binary()
assert %{"month_name" => "February"} =
DateParser.capture_month_name()
|> Regex.compile!()
|> Regex.named_captures("February")
end
@tag task_id: 4
test "numeric date" do
assert DateParser.capture_numeric_date() |> is_binary()
assert %{"year" => "1970", "month" => "02", "day" => "01"} =
DateParser.capture_numeric_date()
|> Regex.compile!()
|> Regex.named_captures("01/02/1970")
end
@tag task_id: 4
test "month named date" do
assert DateParser.capture_month_name_date() |> is_binary()
assert %{"year" => "1970", "month_name" => "January", "day" => "1"} =
DateParser.capture_month_name_date()
|> Regex.compile!()
|> Regex.named_captures("January 1, 1970")
end
@tag task_id: 4
test "day and month named date" do
assert DateParser.capture_day_month_name_date() |> is_binary()
assert %{
"year" => "1970",
"month_name" => "January",
"day" => "1",
"day_name" => "Thursday"
} =
DateParser.capture_day_month_name_date()
|> Regex.compile!()
|> Regex.named_captures("Thursday, January 1, 1970")
end
end
describe "regex match" do
@tag task_id: 5
test "pattern to match numeric date is a regex" do
assert match?(%Regex{}, DateParser.match_numeric_date())
end
@tag task_id: 5
test "numeric date matches" do
assert DateParser.match_numeric_date() |> Regex.match?("01/02/1970")
end
@tag task_id: 5
test "numeric date has named captures" do
assert %{"year" => "1970", "month" => "02", "day" => "01"} =
DateParser.match_numeric_date()
|> Regex.named_captures("01/02/1970")
end
@tag task_id: 5
test "numeric date with a prefix doesn't match" do
refute DateParser.match_numeric_date() |> Regex.match?("The day was 01/02/1970")
end
@tag task_id: 5
test "numeric date with a suffix doesn't match" do
refute DateParser.match_numeric_date() |> Regex.match?("01/02/1970 was the day")
end
@tag task_id: 5
test "pattern to match month name date is a regex" do
assert match?(%Regex{}, DateParser.match_month_name_date())
end
@tag task_id: 5
test "month named date matches" do
assert DateParser.match_month_name_date() |> Regex.match?("January 1, 1970")
end
@tag task_id: 5
test "month named date has named captures" do
assert %{"year" => "1970", "month_name" => "January", "day" => "1"} =
DateParser.match_month_name_date()
|> Regex.named_captures("January 1, 1970")
end
@tag task_id: 5
test "month named date with a prefix doesn't match" do
refute DateParser.match_month_name_date() |> Regex.match?("The day was January 1, 1970")
end
@tag task_id: 5
test "month named date with a suffix doesn't match" do
refute DateParser.match_month_name_date() |> Regex.match?("January 1, 1970 was the day")
end
@tag task_id: 5
test "pattern to match day month name date is a regex" do
assert match?(%Regex{}, DateParser.match_day_month_name_date())
end
@tag task_id: 5
test "day and month names date matches" do
assert DateParser.match_day_month_name_date() |> Regex.match?("Thursday, January 1, 1970")
end
@tag task_id: 5
test "day and month names date has named captures" do
assert %{
"year" => "1970",
"month_name" => "January",
"day" => "1",
"day_name" => "Thursday"
} =
DateParser.match_day_month_name_date()
|> Regex.named_captures("Thursday, January 1, 1970")
end
@tag task_id: 5
test "day and month names date with a prefix doesn't match" do
refute DateParser.match_day_month_name_date()
|> Regex.match?("The day way Thursday, January 1, 1970")
end
@tag task_id: 5
test "day and month names date with a suffix doesn't match" do
refute DateParser.match_day_month_name_date()
|> Regex.match?("Thursday, January 1, 1970 was the day")
end
end
end