Murad Karammaev
2 years ago
5 changed files with 105 additions and 0 deletions
@ -0,0 +1,17 @@ |
|||
.PHONY: build clean test unit-tests acceptance-tests all |
|||
|
|||
all: build test |
|||
|
|||
build: |
|||
@cargo build --release |
|||
|
|||
clean: |
|||
@cargo clean |
|||
|
|||
test: unit-tests acceptance-tests |
|||
|
|||
unit-tests: |
|||
@cargo test |
|||
|
|||
acceptance-tests: build |
|||
@acceptance-tests/main.py |
@ -0,0 +1,15 @@ |
|||
# SPDX-License-Identifier: MIT |
|||
# Copyright Murad Karammaev, Nikita Kuzmin |
|||
|
|||
# This program computes 3 + 7 + 8 + 80 |
|||
# and stores result in [15] |
|||
|
|||
MOV R0.l, 3 |
|||
MOV R1.l, 7 |
|||
ADD |
|||
MOV R1.l, 8 |
|||
ADD |
|||
MOV R1.l, 0 |
|||
MOV R1.h, 5 |
|||
ADD |
|||
MOV [0xf], R0 |
@ -0,0 +1,13 @@ |
|||
P2 |
|||
9 1 |
|||
255 |
|||
|
|||
67 # MOV R0.l, 3 |
|||
87 # MOV R1.l, 7 |
|||
228 # ADD |
|||
88 # MOV R1.l, 8 |
|||
228 # ADD |
|||
80 # MOV R1.l, 0 |
|||
117 # MOV R1.h, 5 |
|||
228 # ADD |
|||
47 # MOV [0xf], R0 |
@ -0,0 +1,59 @@ |
|||
#!/usr/bin/env python3 |
|||
import os |
|||
import subprocess |
|||
from tempfile import NamedTemporaryFile |
|||
import cv2 |
|||
|
|||
|
|||
class AssemblerAcceptanceTest: |
|||
def __init__(self, source, binary): |
|||
self.source_code = os.path.join(os.getcwd(), "acceptance-tests", source) |
|||
self.expected_binary = os.path.join(os.getcwd(), "acceptance-tests", binary) |
|||
|
|||
def __str__(self): |
|||
return f'acceptance_test(asm("{self.source_code}") → {self.expected_binary})' |
|||
|
|||
def run(self, toyasm): |
|||
tmp_file = NamedTemporaryFile(delete=False) |
|||
expected_binary = cv2.imread(self.expected_binary) |
|||
|
|||
result = subprocess.run([toyasm, self.source_code, tmp_file.name]) |
|||
assert result.returncode == 0 |
|||
compiled_binary = tmp_file.read() |
|||
|
|||
for i in range(len(expected_binary[0])): |
|||
assert compiled_binary[i] == expected_binary[0][i][0] |
|||
|
|||
for i in range(len(expected_binary[0]), 256): |
|||
assert compiled_binary[i] == 0 |
|||
|
|||
os.unlink(tmp_file.name) |
|||
print(f'OK: asm("{self.source_code}") == "{self.expected_binary}"') |
|||
|
|||
|
|||
class AcceptanceTestsRunner: |
|||
def __init__(self): |
|||
self.toyasm = self.prepare_tool("toyasm") |
|||
self.toyvm = self.prepare_tool("toyvm") |
|||
self.tests = [ |
|||
AssemblerAcceptanceTest("add_four_ints.asm", "add_four_ints.pgm") |
|||
] |
|||
|
|||
def prepare_tool(self, name): |
|||
tool_path = os.path.join(os.getcwd(), "target", "release", name) |
|||
if not os.path.exists(tool_path): |
|||
raise FileNotFoundError(tool_path) |
|||
return tool_path |
|||
|
|||
def run(self): |
|||
for test in self.tests: |
|||
test.run(self.toyasm) |
|||
|
|||
|
|||
def main(): |
|||
runner = AcceptanceTestsRunner() |
|||
runner.run() |
|||
|
|||
|
|||
if __name__ == '__main__': |
|||
main() |
@ -0,0 +1 @@ |
|||
opencv-python |
Loading…
Reference in new issue