from gbasm.gbasm import assemble from pathlib import Path import os import yaml import pytest import logging logger = logging.getLogger(__name__) if __name__ == "__main__": logging.basicConfig(format="") logging.getLogger().setLevel(logging.INFO) class AssembleCase(object): def __init__(self, name: str, program: str, expected: bytes): self.name = name self.program = program self.expected = expected def find_case_files(subdir: str): test_root = Path(os.path.dirname(os.path.abspath(__file__))) case_root = test_root / "cases" / subdir return case_root.glob("**/*.yaml") def get_test_cases(subdir: str): cases = [] files = find_case_files(subdir) for f in files: index = 0 with open(str(f), "r") as yaml_file: test_descs = yaml.safe_load_all(yaml_file) for desc in test_descs: try: case = AssembleCase( desc["name"], desc["program"], bytes(desc["expected"]) ) except TypeError: logger.exception("Failed to parse yaml: %s", desc) cases.append(case) return cases instruction_cases = get_test_cases("instructions") @pytest.mark.parametrize( "case", instruction_cases, ids=[case.name for case in instruction_cases] ) def test_assemble_instruction(case): lines = case.program.split("\n") assembled = assemble(lines) assert assembled == case.expected format_cases = get_test_cases("format") @pytest.mark.parametrize("case", format_cases, ids=[case.name for case in format_cases]) def test_format_instruction(case): lines = case.program.split("\n") assembled = assemble(lines) assert assembled == case.expected