Files
gb-asm/test/test_assemble.py
2021-11-27 21:19:32 -05:00

67 lines
1.7 KiB
Python

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