def test_creation_via_custom_function():
    register_named_date(
        "CustomDate",
        custom_func=lambda x: x.day == 25)
    assert is_named_date(date(2015, 10, 25), "CustomDate")
    assert is_named_date(date(1999, 12, 25), "CustomDate")
    assert not is_named_date(date(2015, 10, 26), "CustomDate")

    def custom_date_function(the_date):
        return the_date.month == 7

    register_named_date(
        "CustomDate2",
        custom_func=custom_date_function)
    assert is_named_date(date(2015, 7, 25), "CustomDate2")
    assert is_named_date(date(1999, 7, 25), "CustomDate2")
    assert not is_named_date(date(2015, 10, 25), "CustomDate2")
def test_bad_creation_specifications():
    with pytest.raises(MissingArgumentsError):
        register_named_date("Nope")

    with pytest.raises(MissingArgumentsError):
        register_named_date("Nope", 1)

    with pytest.raises(MissingArgumentsError):
        register_named_date("Nope", day=1)

    with pytest.raises(TypeError):
        register_named_date("Nope", bad_kwarg=1)
def test_named_date_sets():
    register_named_date("DateA", 11, 3, nth=4)
    register_named_date("DateB", 11, 28)
    register_named_date("DateC", 9, 25)

    make_named_date_set("GroupC", ["DateC"])
    make_named_date_set("GroupAB", ["DateA", "DateB"])

    assert in_named_date_set(date(2015, 11, 26), "GroupAB")
    assert in_named_date_set(date(2015, 11, 28), "GroupAB")
    assert not in_named_date_set(date(2015, 9, 25), "GroupAB")
    assert in_named_date_set(date(1937, 9, 25), "GroupC")

    assert get_named_dates_in_set("GroupC") == {"DateC"}
    assert get_named_dates_in_set("GroupAB") == {"DateA", "DateB"}
def test_named_date_creation():
    register_named_date("MyDate", 11, 3, nth=4)
    assert is_named_date(date(2015, 11, 26), "MyDate")
    assert is_named_date(date(2016, 11, 24), "MyDate")
    assert is_named_date(date(2017, 11, 23), "MyDate")
    assert not is_named_date(date(2014, 11, 26), "MyDate")
    assert not is_named_date(date(2015, 11, 25), "MyDate")
    assert not is_named_date(date(2015, 11, 27), "MyDate")

    register_named_date("MyDateHard", 11, 26)
    assert is_named_date(date(2016, 11, 26), "MyDateHard")
    assert is_named_date(date(2015, 11, 26), "MyDateHard")
    assert is_named_date(date(2014, 11, 26), "MyDateHard")
    assert not is_named_date(date(2015, 11, 25), "MyDateHard")
    assert not is_named_date(date(2016, 11, 24), "MyDateHard")

    register_named_date("SpecialDate", 9, 25)
    assert is_named_date(date(1937, 9, 25), "SpecialDate")
    assert is_named_date(date(2014, 9, 25), "SpecialDate")
    assert not is_named_date(date(2014, 12, 17), "SpecialDate")