




import hashlib
import importlib.util
import json
import os
import pathlib
from types import ModuleType

import pytest
import requests

__magic_name__     :     List[str]  							=					pathlib.Path.cwd().joinpath("""project_euler""")
__magic_name__     :     Dict  							=					pathlib.Path.cwd().joinpath(
    """scripts""", """project_euler_answers.json"""
)

with open(PROJECT_EULER_ANSWERS_PATH) as file_handle:
      __magic_name__     :     dict[str, str]  							=					json.load(file_handle)
def 		a_       (   __lowerCAmelCase							):
  lowerCAmelCase__								=			importlib.util.spec_from_file_location(file_path.name      ,   str(__lowerCAmelCase							)							)
  lowerCAmelCase__								=			importlib.util.module_from_spec(__lowerCAmelCase							)  # type: ignore
  spec.loader.exec_module(__lowerCAmelCase							)  # type: ignore
  return module
def 		a_       (   ):
  lowerCAmelCase__								=			[]
  for problem_dir_path in PROJECT_EULER_DIR_PATH.iterdir():
    if problem_dir_path.is_file() or problem_dir_path.name.startswith('''_'''							):
      continue
    for file_path in problem_dir_path.iterdir():
      if file_path.suffix != ".py" or file_path.name.startswith(('''_''', '''test''')							):
        continue
      solution_file_paths.append(__lowerCAmelCase							)
  return solution_file_paths
def 		a_       (   ):
  with open(os.environ['''GITHUB_EVENT_PATH''']							) as file:
    lowerCAmelCase__								=			json.load(__lowerCAmelCase							)
  return event["pull_request"]["url"] + "/files"
def 		a_       (   ):
  lowerCAmelCase__								=			[]
  lowerCAmelCase__								=			{
      '''Accept''': '''application/vnd.github.v3+json''',
      '''Authorization''': '''token ''' + os.environ['''GITHUB_TOKEN'''],
  }
  lowerCAmelCase__								=			requests.get(get_files_url()      ,   headers=__lowerCAmelCase							).json()
  for file in files:
    lowerCAmelCase__								=			pathlib.Path.cwd().joinpath(file['''filename''']							)
    if (
        filepath.suffix != ".py"
        or filepath.name.startswith(('''_''', '''test''')							)
        or not filepath.name.startswith('''sol'''							)
    ):
      continue
    solution_file_paths.append(__lowerCAmelCase							)
  return solution_file_paths
def 		a_       (   ):
  if os.environ.get('''CI'''							) and os.environ.get('''GITHUB_EVENT_NAME'''							) == "pull_request":
    # Return only if there are any, otherwise default to all solutions
    if filepaths := added_solution_file_path():
      return filepaths
  return all_solution_file_paths()




@pytest.mark.parametrize(
    '''solution_path'''      ,   collect_solution_file_paths()      ,   ids=lambda __lowerCAmelCase							: F"""{path.parent.name}/{path.name}"""      ,   )
def 		a_       (   __lowerCAmelCase							):
  lowerCAmelCase__								=			solution_path.parent.name[8:].zfill(3							)
  lowerCAmelCase__								=			PROBLEM_ANSWERS[problem_number]
  lowerCAmelCase__								=			convert_path_to_module(__lowerCAmelCase							)
  lowerCAmelCase__								=			str(solution_module.solution()							)  # type: ignore
  lowerCAmelCase__								=			hashlib.shaaaa(answer.encode()							).hexdigest()
  assert (
      answer == expected
  ), F"""Expected solution to {problem_number} to have hash {expected}, got {answer}"""







__magic_name__     :     dict[str, float]  							=					{
    "kilogram": 1,
    "gram": pow(10, 3),
    "milligram": pow(10, 6),
    "metric-ton": pow(10, -3),
    "long-ton": 0.0009842073,
    "short-ton": 0.0011023122,
    "pound": 2.2046244202,
    "stone": 0.1574731728,
    "ounce": 35.273990723,
    "carrat": 50_00,
    "atomic-mass-unit": 6.022_136_652E26,
}

__magic_name__     :     dict[str, float]  							=					{
    "kilogram": 1,
    "gram": pow(10, -3),
    "milligram": pow(10, -6),
    "metric-ton": pow(10, 3),
    "long-ton": 1016.04608,
    "short-ton": 907.184,
    "pound": 0.453592,
    "stone": 6.35029,
    "ounce": 0.0283495,
    "carrat": 0.0002,
    "atomic-mass-unit": 1.660_540_199E-27,
}
def 		a_       (   __lowerCAmelCase      ,   __lowerCAmelCase      ,   __lowerCAmelCase							):
  if to_type not in KILOGRAM_CHART or from_type not in WEIGHT_TYPE_CHART:
    lowerCAmelCase__								=			(
        F"""Invalid 'from_type' or 'to_type' value: {from_type!r}, {to_type!r}\n"""
        F"""Supported values are: {', '.join(__lowerCAmelCase							)}"""
    )
    raise ValueError(__lowerCAmelCase							)
  return value * KILOGRAM_CHART[to_type] * WEIGHT_TYPE_CHART[from_type]


if __name__ == "__main__":
      import doctest

      doctest.testmod()

