Commit c0757d6c authored by Johannes Bechberger's avatar Johannes Bechberger

Modify ast mode checker algorithm

parent fec32835
...@@ -75,7 +75,7 @@ Test types for the ast mode ...@@ -75,7 +75,7 @@ Test types for the ast mode
<tr> <tr>
<td><code>.valid.mj</code> <code>.mj</code> <td><code>.valid.mj</code> <code>.mj</code>
<td>Pretty printing the source file should result in the same output as pretty printing the already pretty printed file. <td>Pretty printing the source file should result in the same output as pretty printing the already pretty printed file.
The sorted lexer output for the last should be the same as the sorted lexer output for the source file.</td> All lines in the lexer output for the source file should be present in the lexer output of the pretty printed file.</td>
</tr> </tr>
</table> </table>
......
import difflib import difflib
import os import os
import shutil, logging import shutil, logging
from typing import Tuple from typing import Tuple, Dict
from mjtest.environment import Environment, TestMode from mjtest.environment import Environment, TestMode
from mjtest.test.syntax_tests import BasicSyntaxTest from mjtest.test.syntax_tests import BasicSyntaxTest
from mjtest.test.tests import TestCase, BasicDiffTestResult, BasicTestResult from mjtest.test.tests import TestCase, BasicDiffTestResult, BasicTestResult
...@@ -36,22 +36,23 @@ class ASTPrettyPrintTest(BasicSyntaxTest): ...@@ -36,22 +36,23 @@ class ASTPrettyPrintTest(BasicSyntaxTest):
rtcode_lex, out_lex, err_lex = self.env.run_mj_command(TestMode.lexer, self.file) rtcode_lex, out_lex, err_lex = self.env.run_mj_command(TestMode.lexer, self.file)
rtcode_lex2, out_lex2, err_lex2 = self.env.run_mj_command(TestMode.lexer, tmp_file2) rtcode_lex2, out_lex2, err_lex2 = self.env.run_mj_command(TestMode.lexer, tmp_file2)
os.remove(tmp_file2) os.remove(tmp_file2)
out_lex = self._sort_lexed(out_lex.decode()) out_lex = self._line_count(out_lex.decode())
out_lex2 = self._sort_lexed(out_lex2.decode()) out_lex2 = self._line_count(out_lex2.decode())
comp = self._comp_dicts(out_lex, out_lex2)
incorrect_msg, rtcode = "", 0 incorrect_msg, rtcode = "", 0
if rtcode_lex + rtcode_lex2: if rtcode_lex + rtcode_lex2:
incorrect_msg, rtcode = "Lexing failed", 1 incorrect_msg, rtcode = "Lexing failed", 1
elif out != out2: elif out != out2:
incorrect_msg, rtcode = "Not idempotent", 1 incorrect_msg, rtcode = "Not idempotent", 1
elif out_lex != out_lex2: elif comp[0]:
incorrect_msg, rtcode = "Sorted and lexed second pretty print differs from original", 1 incorrect_msg, rtcode = "Sorted and lexed second pretty print differs from original", 1
btr = BasicTestResult(self, rtcode, incorrect_msg=incorrect_msg) btr = BasicTestResult(self, rtcode, incorrect_msg=incorrect_msg)
btr.add_additional_text("First round output", out) btr.add_additional_text("First round output", out)
btr.add_additional_text("Second round output", out2) btr.add_additional_text("Second round output", out2)
btr.add_additional_text("Diff", self._diff(out, out2)) btr.add_additional_text("Diff", self._diff(out, out2))
btr.add_additional_text("Original file, sorted and lexed", out_lex) btr.add_additional_text("Original file, sorted and lexed", self._dict_to_str(out_lex))
btr.add_additional_text("Second round output, sorted and lexed", out_lex2) btr.add_additional_text("Second round output, sorted and lexed", self._dict_to_str(out_lex2))
btr.add_additional_text("Diff", self._diff(out_lex, out_lex2)) btr.add_additional_text("Diff", comp[1])
return btr return btr
def _diff(self, first: str, second: str) -> str: def _diff(self, first: str, second: str) -> str:
...@@ -61,7 +62,26 @@ class ASTPrettyPrintTest(BasicSyntaxTest): ...@@ -61,7 +62,26 @@ class ASTPrettyPrintTest(BasicSyntaxTest):
#return "".join(difflib.Differ().compare(self.expected_output.splitlines(True), self.output.splitlines(True))) #return "".join(difflib.Differ().compare(self.expected_output.splitlines(True), self.output.splitlines(True)))
return "".join(sorted(lexed.splitlines(True))) return "".join(sorted(lexed.splitlines(True)))
def _line_count(self, lexed: str) -> Dict[str, int]:
d = {}
for l in lexed.splitlines():
if l not in d:
d[l] = 1
else:
d[l] += 1
return d
def _dict_to_str(self, d: Dict[str, int]) -> str:
return "\n".join("{} {}".format(k, d[k]) for k in sorted(d.keys()))
def _comp_dicts(self, d_orig: Dict[str, int], d_second: Dict[str, int]) -> (bool, str):
strs = []
for k in sorted(d_orig.keys()):
c_orig = d_orig[k]
c_second = d_second[k] if k in d_second else 0
if c_orig > c_second:
strs.append("{} [original file contained {}, pretty printed only {}]".format(c_orig, c_second))
return len(strs) == 0, "\n".join(strs)
def _pretty_print(self, input_file: str, output_file: str) -> Tuple[int, str, str]: def _pretty_print(self, input_file: str, output_file: str) -> Tuple[int, str, str]:
out, err, rtcode = self.env.run_mj_command(TestMode.ast, input_file) out, err, rtcode = self.env.run_mj_command(TestMode.ast, input_file)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment