from advent.days import day19
from advent.days.day19 import Rule

EXAMPLE = """0: 4 1 5
1: 2 3 | 3 2
2: 4 4 | 5 5
3: 4 5 | 5 4
4: "a"
5: "b"

ababbb
bababa
abbbab
aaabbb
aaaabbb""".splitlines(
    keepends=True
)


def test_first():
    assert day19.first(iter(EXAMPLE)) == 2


EXAMPLE_2 = """42: 9 14 | 10 1
9: 14 27 | 1 26
10: 23 14 | 28 1
1: "a"
11: 42 31
5: 1 14 | 15 1
19: 14 1 | 14 14
12: 24 14 | 19 1
16: 15 1 | 14 14
31: 14 17 | 1 13
6: 14 14 | 1 14
2: 1 24 | 14 4
0: 8 11
13: 14 3 | 1 12
15: 1 | 14
17: 14 2 | 1 7
23: 25 1 | 22 14
28: 16 1
4: 1 1
20: 14 14 | 1 15
3: 5 14 | 16 1
27: 1 6 | 14 18
14: "b"
21: 14 1 | 1 14
25: 1 1 | 1 14
22: 14 14
8: 42
26: 14 22 | 1 20
18: 15 15
7: 14 5 | 1 21
24: 14 1

abbbbbabbbaaaababbaabbbbabababbbabbbbbbabaaaa
bbabbbbaabaabba
babbbbaabbbbbabbbbbbaabaaabaaa
aaabbbbbbaaaabaababaabababbabaaabbababababaaa
bbbbbbbaaaabbbbaaabbabaaa
bbbababbbbaaaaaaaabbababaaababaabab
ababaaaaaabaaab
ababaaaaabbbaba
baabbaaaabbaaaababbaababb
abbbbabbbbaaaababbbbbbaaaababb
aaaaabbaabaaaaababaa
aaaabbaaaabbaaa
aaaabbaabbaaaaaaabbbabbbaaabbaabaaa
babaaabbbaaabaababbaabababaaab
aabbbbbaabbbaaaaaabbbbbababaaaaabbaaabba""".splitlines(
    keepends=True
)


def test_second():
    assert day19.second(iter(EXAMPLE_2)) == 12
    # assert day19.first(iter(EXAMPLE_2)) == 3


def test_recursive_rules():
    rules = {
        "1": Rule("2 | 2 1"),
        "2": Rule("ab"),
        "3": Rule("b"),
        "4": Rule("2 3 | 2 4 3"),
        "5": Rule("2 3 | 4"),
    }

    day19.expand_rule(rules, "1")

    assert rules["1"].expanded == r"ab|ab(?P<r1>.+)"
    rule = rules["1"]

    assert rule.match(rules, "abababab")
    assert rule.match(rules, "ab")

    day19.expand_rule(rules, "4")
    rule = rules["4"]

    assert rule.match(rules, "abb")
    assert rule.match(rules, "abababbbb")
    assert not rule.match(rules, "ab")
    assert not rule.match(rules, "ab")
