- Notifications
You must be signed in to change notification settings - Fork 46.7k
/
Copy pathvalidate_solutions.py
executable file
·52 lines (43 loc) · 1.88 KB
/
validate_solutions.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#!/usr/bin/env python3
importimportlib.util
importjson
importpathlib
fromtypesimportModuleType
fromtypingimportDict, List
importpytest
PROJECT_EULER_DIR_PATH=pathlib.Path.cwd().joinpath("project_euler")
PROJECT_EULER_ANSWERS_PATH=pathlib.Path.cwd().joinpath(
"scripts", "project_euler_answers.json"
)
withopen(PROJECT_EULER_ANSWERS_PATH) asfile_handle:
PROBLEM_ANSWERS: Dict[str, str] =json.load(file_handle)
defconvert_path_to_module(file_path: pathlib.Path) ->ModuleType:
"""Converts a file path to a Python module"""
spec=importlib.util.spec_from_file_location(file_path.name, str(file_path))
module=importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
returnmodule
defcollect_solution_file_paths() ->List[pathlib.Path]:
"""Collects all the solution file path in the Project Euler directory"""
solution_file_paths= []
forproblem_dir_pathinPROJECT_EULER_DIR_PATH.iterdir():
ifproblem_dir_path.is_file() orproblem_dir_path.name.startswith("_"):
continue
forfile_pathinproblem_dir_path.iterdir():
iffile_path.suffix!=".py"orfile_path.name.startswith(("_", "test")):
continue
solution_file_paths.append(file_path)
returnsolution_file_paths
@pytest.mark.parametrize(
"solution_path",
collect_solution_file_paths(),
ids=lambdapath: f"{path.parent.name}/{path.name}",
)
deftest_project_euler(solution_path: pathlib.Path):
"""Testing for all Project Euler solutions"""
# problem_[extract this part] and pad it with zeroes for width 3
problem_number: str=solution_path.parent.name[8:].zfill(3)
expected: str=PROBLEM_ANSWERS[problem_number]
solution_module=convert_path_to_module(solution_path)
answer=str(solution_module.solution())
assertanswer==expected, f"Expected {expected} but got {answer}"