advent-of-code/2020-python/tests/test_day_04.py
2021-11-01 16:45:03 +01:00

121 lines
3.2 KiB
Python

import unittest
from solutions.day_04 import (
Solution,
valid_height,
valid_password_id,
valid_range,
valid_hex_color,
exactly_1_valid_eye_color,
)
class Day04TestCase(unittest.TestCase):
def setUp(self):
self.solution = Solution()
self.puzzle_input = self.solution.parse_input(
"""
ecl:gry pid:860033327 eyr:2020 hcl:#fffffd
byr:1937 iyr:2017 cid:147 hgt:183cm
iyr:2013 ecl:amb cid:350 eyr:2023 pid:028048884
hcl:#cfa07d byr:1929
hcl:#ae17e1 iyr:2013
eyr:2024
ecl:brn pid:760753108 byr:1931
hgt:179cm
hcl:#cfa07d eyr:2025 pid:166559648
iyr:2011 ecl:brn hgt:59in
"""
)
def test_parse_puzzle_input(self):
data = """
ecl:gry a:1
iyr:2013
a:1
"""
expected = ["a:1 ecl:gry ", "a:1 iyr:2013 "]
assert self.solution.parse_input(data) == expected
def test_solve_first_part(self):
assert self.solution.solve(self.puzzle_input) == 2
def test_solve_second_part(self):
valid_passports = self.solution.parse_input(
"""
pid:087499704 hgt:74in ecl:grn iyr:2012 eyr:2030 byr:1980
hcl:#623a2f
eyr:2029 ecl:blu cid:129 byr:1989
iyr:2014 pid:896056539 hcl:#a97842 hgt:165cm
hcl:#888785
hgt:164cm byr:2001 iyr:2015 cid:88
pid:545766238 ecl:hzl
eyr:2022
iyr:2010 hgt:158cm hcl:#b6652a ecl:blu byr:1944 eyr:2021 pid:093154719
"""
)
invalid_passports = self.solution.parse_input(
"""
eyr:1972 cid:100
hcl:#18171d ecl:amb hgt:170 pid:186cm iyr:2018 byr:1926
iyr:2019
hcl:#602927 eyr:1967 hgt:170cm
ecl:grn pid:012533040 byr:1946
hcl:dab227 iyr:2012
ecl:brn hgt:182cm pid:021572410 eyr:2020 byr:1992 cid:277
hgt:59cm ecl:zzz
eyr:2038 hcl:74454a iyr:2023
pid:3556412378 byr:2007
"""
)
assert self.solution.solve_again(valid_passports) == 4
assert self.solution.solve_again(invalid_passports) == 0
def test_valid_range(self):
assert valid_range("a:1999 ", "a", 1999, 2001)
assert valid_range("a:2000 ", "a", 1999, 2001)
assert valid_range("a:2001 ", "a", 1999, 2001)
assert not valid_range("a:1000 ", "a", 1999, 2002)
def test_valid_height(self):
assert valid_height("hgt:160cm ")
assert valid_height("hgt:70in ")
assert not valid_height("hgt:203cm ")
assert not valid_height("hgt:203in ")
assert not valid_height("hgt:20cm ")
assert not valid_height("hgt:2in ")
def test_valid_hex_color(self):
assert valid_hex_color("hcl:#facade ")
assert valid_hex_color("hcl:#123456 ")
assert not valid_hex_color("hcl:hreu ")
assert not valid_hex_color("hcl:#hreu ")
assert not valid_hex_color("hcl:#aaaaaaa ")
def test_exactly_1_valid_eye_color(self):
for c in ["amb", "blu", "brn", "gry", "grn", "hzl", "oth"]:
assert exactly_1_valid_eye_color(f"ecl:{c} ")
assert not exactly_1_valid_eye_color("ecl:blk ")
def test_valid_pid(self):
assert valid_password_id("pid:123456789 ")
assert valid_password_id("pid:003456789 ")
assert not valid_password_id("pid:123123123123 ")
if __name__ == "__main__":
unittest.main()