67 lines
1.7 KiB
Python
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
|