syntax_tests.py 2.09 KB
Newer Older
1
import shutil
Johannes Bechberger's avatar
Johannes Bechberger committed
2
from mjtest.environment import Environment, TestMode
3
from mjtest.test.tests import TestCase, BasicTestResult
Johannes Bechberger's avatar
Johannes Bechberger committed
4 5 6 7 8 9
from os import path


class BasicSyntaxTest(TestCase):

    FILE_ENDINGS = [".invalid.mj", ".valid.mj", ".mj"]
10
    MODE = TestMode.syntax
Johannes Bechberger's avatar
Johannes Bechberger committed
11 12 13 14 15 16 17 18 19

    def __init__(self, env: Environment, type: str, file: str):
        super().__init__(env, type, file)
        self._should_succeed = not file.endswith(".invalid.mj")

    def should_succeed(self) -> bool:
        return self._should_succeed

    def short_name(self) -> str:
20
        return path.basename(self.file)
Johannes Bechberger's avatar
Johannes Bechberger committed
21

22
    def run(self) -> BasicTestResult:
23
        out, err, rtcode = self.env.run_mj_command(self.MODE, self.file)
Johannes Bechberger's avatar
Johannes Bechberger committed
24 25 26 27
        return BasicTestResult(self, rtcode, out.decode(), err.decode())

TestCase.TEST_CASE_CLASSES[TestMode.syntax].append(BasicSyntaxTest)

28 29 30 31 32 33 34

class JavaCompileTest(BasicSyntaxTest):
    """
    The MiniJava compiler should behave the same as javac
    """

    FILE_ENDINGS = [".java"]
35
    SYNTAX_TEST = True
36 37 38 39 40

    def __init__(self, env: Environment, type: str, file: str):
        super().__init__(env, type, file)
        tmp_dir = self.env.create_tmpdir()
        _, self.javac_err, self.javac_rtcode = \
41 42
            self.env.run_command("javac", path.relpath(file), "-d", tmp_dir, "-verbose")
        self.javac_err = self.javac_err.decode()  # type: str
43
        shutil.rmtree(tmp_dir, ignore_errors=True)
44
        self._should_succeed = self._is_file_syntactically_correct() if self.SYNTAX_TEST else self.javac_rtcode == 0
45

46 47 48 49 50
    def _is_file_syntactically_correct(self):
        return self.javac_rtcode == 0 or "META-INF" in self.javac_err

    def _is_file_semantically_correct(self):
        return self.javac_rtcode == 0
51 52 53

    def run(self) -> BasicTestResult:
        ret = super().run()
54
        ret.add_additional_text("javac (verbose) error output", self.javac_err)
55
        ret.add_additional_text_line("javac return code", str(self.javac_rtcode))
56
        ret.add_additional_text_line("Is syntax correct? ", str(self._is_file_syntactically_correct()))
57 58 59
        return ret

TestCase.TEST_CASE_CLASSES[TestMode.syntax].append(JavaCompileTest)