def test_empty_directory(self): with tempfile.TemporaryDirectory() as challenges_root: with amending_settings( challenges_root=Path(challenges_root), challenges_boilerplate=DefaultBoilerplate()): current_year = datetime.now().year repo_info = RepoInfo.from_roots() self.assertFalse(repo_info.has_code) self.assertTrue( set(repo_info.year_infos).issuperset( {2015, 2016, 2017, 2018, 2019, 2020})) self.assertEqual(set(repo_info.year_infos), set(range(2015, current_year + 1))) for year, year_info in repo_info.year_infos.items(): self.assertEqual(year_info.year, year) self.assertFalse(year_info.has_code) self.assertFalse(year_info.path.exists()) self.assertEqual(set(year_info.day_infos), set(range(1, 26))) for day, day_info in year_info.day_infos.items(): self.assertEqual(day_info.year_info, year_info) self.assertEqual(day_info.year, year) self.assertEqual(day_info.day, day) self.assertFalse(day_info.has_code) self.assertFalse(day_info.path.exists()) self.assertEqual(set(day_info.part_infos), {'a', 'b'}) for part, part_info in day_info.part_infos.items(): self.assertEqual(part_info.day_info, day_info) self.assertEqual(part_info.year, year) self.assertEqual(part_info.day, day) self.assertEqual(part_info.part, part) self.assertFalse(part_info.has_code) self.assertFalse(part_info.path.exists())
def test_create_part_a_single_digit_day(self): files_in_repo_before_create = glob.glob(str( current_directory.joinpath('**/*')), recursive=True) with tempfile.TemporaryDirectory() as challenges_root: self.assertEqual( glob.glob(str(Path(challenges_root).joinpath('**/*')), recursive=True), []) with amending_settings(challenges_root=Path(challenges_root)): DefaultBoilerplate().create_part(2020, 5, 'a') self.assertEqual( set( glob.glob(str(Path(challenges_root).joinpath('**/*')), recursive=True)), { f"{challenges_root}/year_2020", f"{challenges_root}/year_2020/__init__.py", f"{challenges_root}/year_2020/day_05", f"{challenges_root}/year_2020/day_05/__init__.py", f"{challenges_root}/year_2020/day_05/part_a.py", f"{challenges_root}/year_2020/day_05/input.txt", }) files_in_repo_after_create = glob.glob(str( current_directory.joinpath('**/*')), recursive=True) self.assertEqual(files_in_repo_before_create, files_in_repo_after_create)
def test_get_part_filename_absolute_path_single_digit_day(self): with amending_settings(challenges_root=Path('/tmp/test-directory')): self.assertEqual( DefaultBoilerplate().get_part_filename(2020, 5, 'a'), Path('/tmp/test-directory/year_2020/day_05/part_a.py')) self.assertEqual( DefaultBoilerplate().get_part_filename(2020, 5, 'b'), Path('/tmp/test-directory/year_2020/day_05/part_b.py'))
def check_submit_solution(self, year, day, part, solution, response_path, expected_result): if response_path: response = bs4.BeautifulSoup( response_path.read_text(), 'html.parser') else: response = None with using_controller([], None, interactive=False) \ as (controller, combined_info, _), \ amending_settings(challenges_boilerplate=DummyBoilerplate()), \ patch.object(WebAoc, 'submit_solution', return_value=response): self.assertEqual(controller.submit_challenge_solution( year, day, part, no_prompt=True, solution=solution), expected_result)
def check_play_challenge(self, year, day, part, force, original_replacement, expected_result): with using_controller([], None, interactive=False) \ as (controller, combined_info, _), \ amending_settings(challenges_boilerplate=DummyBoilerplate()): if original_replacement is not None: controller.add_challenge(year, day, part) part_info = combined_info.get_part(year, day, part) code = part_info.path.read_text() code = code.replace(' "FUNCTION-BODY"', original_replacement) part_info.path.write_text(code) self.assertEqual(controller.play_challenge(year, day, part, force), expected_result)
def checking_add_challenge(self, year, day, part, expected_result): with using_controller([], None) as (controller, combined_info, _), \ amending_settings(challenges_boilerplate=DummyBoilerplate()): expected_contents = {} yield controller, combined_info, expected_contents self.assertEqual(controller.add_challenge(year, day, part), expected_result) for path, expected_content in expected_contents.items(): if path.exists(): content = path.read_text() else: content = None self.assertEqual(content, expected_content)
def test_paths_in_created_part_b_single_digit_day(self): with tempfile.TemporaryDirectory() as challenges_root: with amending_settings(challenges_root=Path(challenges_root)): boilerplate = DefaultBoilerplate() boilerplate.create_part(2020, 5, 'b') paths = set( map(str, ( boilerplate.get_part_filename(2020, 5, 'a'), boilerplate.get_part_filename(2020, 5, 'b'), boilerplate.get_day_directory(2020, 5), boilerplate.get_day_input_filename(2020, 5), boilerplate.get_year_directory(2020), ))) self.assertTrue( set( glob.glob(str(Path(challenges_root).joinpath('**/*')), recursive=True), ).issuperset(paths))
def check_readme(self, parts_to_create_on_disk, collected_data, initial_content, expected_content, expected_result): if initial_content is None: readme_file = nullcontext() new_settings = {"readme_path": None} else: readme_file = tempfile.NamedTemporaryFile(mode="w") new_settings = {"readme_path": Path(readme_file.name)} with using_controller(parts_to_create_on_disk, collected_data) \ as (controller, _, _), readme_file, \ amending_settings(**new_settings): if initial_content is not None: readme_file.write(initial_content) readme_file.flush() self.assertEqual(controller.update_readme(), expected_result) readme_path = settings_proxy().readme_path if readme_path and readme_path.exists(): content = readme_path.read_text() else: content = None self.assertEqual(content, expected_content)
def test_some_parts_exist(self): with tempfile.TemporaryDirectory() as challenges_root: with amending_settings( challenges_root=Path(challenges_root), challenges_boilerplate=DefaultBoilerplate()): settings_proxy().challenges_boilerplate.create_part( 2020, 1, 'b') settings_proxy().challenges_boilerplate.create_part( 2020, 2, 'b') settings_proxy().challenges_boilerplate.create_part( 2020, 3, 'b') settings_proxy().challenges_boilerplate.create_part( 2020, 10, 'b') settings_proxy().challenges_boilerplate.create_part( 2020, 11, 'a') settings_proxy().challenges_boilerplate.create_part( 2019, 1, 'b') settings_proxy().challenges_boilerplate.create_part( 2019, 3, 'a') settings_proxy().challenges_boilerplate.create_part( 2019, 11, 'b') folder_contents = glob.glob(f"{challenges_root}/**/*", recursive=True) repo_info = RepoInfo.from_roots() self.assertTrue(repo_info.has_code) self.assertTrue( set(repo_info.year_infos).issuperset( {2015, 2016, 2017, 2018, 2019, 2020})) # Check years with code self.assertEqual( { year_info.year for year_info in repo_info.year_infos.values() if str(year_info.path) in folder_contents }, {2019, 2020}) self.assertEqual( { year_info.year for year_info in repo_info.year_infos.values() if year_info.has_code }, {2019, 2020}) self.assertEqual( { year_info.year for year_info in repo_info.year_infos.values() if year_info.path.exists() }, {2019, 2020}) # Check days with code self.assertEqual( {(day_info.year, day_info.day) for year_info in repo_info.year_infos.values() for day_info in year_info.day_infos.values() if str(day_info.path) in folder_contents}, { (2020, 1), (2020, 2), (2020, 3), (2020, 10), (2020, 11), (2019, 1), (2019, 3), (2019, 11), }) self.assertEqual( {(day_info.year, day_info.day) for year_info in repo_info.year_infos.values() for day_info in year_info.day_infos.values() if day_info.has_code}, { (2020, 1), (2020, 2), (2020, 3), (2020, 10), (2020, 11), (2019, 1), (2019, 3), (2019, 11), }) self.assertEqual( {(day_info.year, day_info.day) for year_info in repo_info.year_infos.values() for day_info in year_info.day_infos.values() if day_info.path.exists()}, { (2020, 1), (2020, 2), (2020, 3), (2020, 10), (2020, 11), (2019, 1), (2019, 3), (2019, 11), }) # Check parts with code self.assertEqual( {(part_info.year, part_info.day, part_info.part) for year_info in repo_info.year_infos.values() for day_info in year_info.day_infos.values() for part_info in day_info.part_infos.values() if str(part_info.path) in folder_contents}, { (2020, 1, 'a'), (2020, 1, 'b'), (2020, 2, 'a'), (2020, 2, 'b'), (2020, 3, 'a'), (2020, 3, 'b'), (2020, 10, 'a'), (2020, 10, 'b'), (2020, 11, 'a'), (2019, 1, 'a'), (2019, 1, 'b'), (2019, 3, 'a'), (2019, 11, 'a'), (2019, 11, 'b'), }) self.assertEqual( {(part_info.year, part_info.day, part_info.part) for year_info in repo_info.year_infos.values() for day_info in year_info.day_infos.values() for part_info in day_info.part_infos.values() if part_info.has_code}, { (2020, 1, 'a'), (2020, 1, 'b'), (2020, 2, 'a'), (2020, 2, 'b'), (2020, 3, 'a'), (2020, 3, 'b'), (2020, 10, 'a'), (2020, 10, 'b'), (2020, 11, 'a'), (2019, 1, 'a'), (2019, 1, 'b'), (2019, 3, 'a'), (2019, 11, 'a'), (2019, 11, 'b'), }) self.assertEqual( {(part_info.year, part_info.day, part_info.part) for year_info in repo_info.year_infos.values() for day_info in year_info.day_infos.values() for part_info in day_info.part_infos.values() if part_info.path.exists()}, { (2020, 1, 'a'), (2020, 1, 'b'), (2020, 2, 'a'), (2020, 2, 'b'), (2020, 3, 'a'), (2020, 3, 'b'), (2020, 10, 'a'), (2020, 10, 'b'), (2020, 11, 'a'), (2019, 1, 'a'), (2019, 1, 'b'), (2019, 3, 'a'), (2019, 11, 'a'), (2019, 11, 'b'), }) for year, year_info in repo_info.year_infos.items(): self.assertEqual(year_info.year, year) self.assertEqual(set(year_info.day_infos), set(range(1, 26))) for day, day_info in year_info.day_infos.items(): self.assertEqual(day_info.year_info, year_info) self.assertEqual(day_info.year, year) self.assertEqual(day_info.day, day) self.assertEqual(set(day_info.part_infos), {'a', 'b'}) for part, part_info in day_info.part_infos.items(): self.assertEqual(part_info.day_info, day_info) self.assertEqual(part_info.year, year) self.assertEqual(part_info.day, day) self.assertEqual(part_info.part, part)
def getting_output(self): with amending_settings( default_debugger_report_format=self.concise_debugger_format): with capturing_stdout() as captured: yield captured
def test_get_part_module_name_custom_package_double_digit_day(self): with amending_settings(challenges_module_name_root='custom.package'): self.assertEqual( DefaultBoilerplate().get_part_module_name(2020, 15, 'a'), 'custom.package.year_2020.day_15.part_a')
def test_get_part_module_name_top_level_double_digit_day(self): with amending_settings(challenges_module_name_root=None): self.assertEqual( DefaultBoilerplate().get_part_module_name(2020, 15, 'a'), 'year_2020.day_15.part_a')
def test_get_year_directory_absolute_path(self): with amending_settings(challenges_root=Path('/tmp/test-directory')): self.assertEqual(DefaultBoilerplate().get_year_directory(2020), Path('/tmp/test-directory/year_2020'))
def test_get_day_directory_absolute_path_double_digit_day(self): with amending_settings(challenges_root=Path('/tmp/test-directory')): self.assertEqual(DefaultBoilerplate().get_day_directory(2020, 15), Path('/tmp/test-directory/year_2020/day_15'))