def main(files: List[str], draw_cfg: str = "", binary: str = "../output/bin/iec_checker"): for f in files: if not os.path.isfile(f): continue checker_warnings, rc = run_checker(f, binary) if rc != 0: print(f'Report for {f}:') for w in checker_warnings: print(f'{w}') continue dump_name = f'{f}.dump.json' plugins_warnings = [] with DumpManager(dump_name) as dm: plugins_warnings = dm.run_all_inspections() if draw_cfg: cfg_plotter = CFGPlotter(dm.scheme.cfgs) cfg_plotter.save_file(draw_cfg) print(f'Report for {f}:') if checker_warnings or plugins_warnings: for w in checker_warnings: print(f'{w}') for p in plugins_warnings: print(f'{w}') else: print('No errors found!')
def test_direct_variables(): f = './test/st/good/direct-variables.st' fdump = f'{f}.dump.json' checker_warnings, rc = run_checker(f) assert rc == 0 with DumpManager(fdump) as dm: _ = dm.scheme # TODO
def test_missing_file(): f = 'test/st/foo.bar' checker_warnings, rc = run_checker(f) assert rc == 1 assert len(checker_warnings) == 1 cv = checker_warnings[0] assert cv.id == 'FileNotFoundError'
def test_no_parser_errors(): f = os.path.join('./test/plcopen/example.xml') fdump = f'{f}.dump.json' checker_warnings, rc = run_checker(f, '-input-format', 'xml') assert rc == 0, f"Incorrect exit code for {f}" with DumpManager(fdump): pass
def test_zerodiv(): f = 'st/zero-division.st' fdump = f'{f}.dump.json' checker_warnings, rc = run_checker(f) assert rc == 0 checker_warnings.count('ZeroDivision') == 2 with DumpManager(fdump): pass
def test_l10(): f = 'st/plcopen-l10.st' fdump = f'{f}.dump.json' checker_warnings, rc = run_checker(f) assert rc == 0 checker_warnings.count('PLCOPEN-L10') == 3 with DumpManager(fdump): pass
def test_cp25(): f = 'st/plcopen-cp25.st' fdump = f'{f}.dump.json' checker_warnings, rc = run_checker(f) assert rc == 0 checker_warnings.count('PLCOPEN-CP25') == 2 with DumpManager(fdump): pass
def test_cp9(): f = 'st/plcopen-cp9.st' fdump = f'{f}.dump.json' warns, rc = run_checker(f) assert rc == 0 assert len(filter_warns(warns, 'PLCOPEN-CP9')) == 2 with DumpManager(fdump): pass
def test_parser_errors(): for fname in os.listdir('./test/st/bad/'): f = os.path.join('./test/st/bad/', fname) fdump = f'{f}.dump.json' checker_warnings, rc = run_checker(f) assert rc == 1, f"Incorrect exit code for {f}" assert len(checker_warnings) > 0 with DumpManager(fdump): pass
def test_no_parser_errors(): for fname in os.listdir('./test/st/good/'): if not fname.endswith('.st'): continue f = os.path.join('./test/st/good/', fname) fdump = f'{f}.dump.json' checker_warnings, rc = run_checker(f) assert rc == 0, f"Incorrect exit code for {f}" with DumpManager(fdump): pass
def test_lexing_error(): f = './test/st/bad/lexing-error.st' fdump = f'{f}.dump.json' checker_warnings, rc = run_checker(f) assert rc == 1 assert len(checker_warnings) == 1 cv = checker_warnings[0] assert cv.id == 'LexingError' assert cv.linenr == 9 assert cv.column == 6 with DumpManager(fdump): pass
def test_n3(): f = 'st/plcopen-n3.st' fdump = f'{f}.dump.json' checker_warnings, rc = run_checker(f) assert rc == 0 assert len(checker_warnings) >= 1 cv = checker_warnings[0] assert cv.id == 'PLCOPEN-N3' assert cv.linenr == 6 assert cv.column == 7 with DumpManager(fdump): pass
def test_l17(): f = 'st/plcopen-l17.st' fdump = f'{f}.dump.json' checker_warnings, rc = run_checker(f) assert rc == 0 assert len(checker_warnings) >= 1 cv = checker_warnings[1] assert cv.id == 'PLCOPEN-L17' assert cv.linenr == 10 assert cv.column == 4 with DumpManager(fdump): pass
def test_initialization_literal(): f = 'st/declaration-analysis.st' fdump = f'{f}.dump.json' checker_warnings, rc = run_checker(f) assert rc == 0 assert len(checker_warnings) == 3 cv = checker_warnings[0] assert cv.id == 'OutOfBounds' # assert cv.linenr == 8 # assert cv.column == 31 with DumpManager(fdump): pass
def test_cp13(): f = './test/st/plcopen-cp13.st' fdump = f'{f}.dump.json' checker_warnings, rc = run_checker(f) assert rc == 0 assert len(checker_warnings) >= 1 cv = checker_warnings[0] assert cv.id == 'PLCOPEN-CP13' assert cv.linenr == 8 assert cv.column == 30 with DumpManager(fdump): pass
def test_large_file(): """Make sure that there are no stack overflows on large programs.""" fname = 'test/st/_TEMP_large.st' with open(fname, 'w') as f: f.write(f""" PROGRAM test_for VAR a : INT; i : INT; END_VAR FOR i := 0 TO 10 BY 2 DO """) for _ in range(1000): f.write('a := a + i;\n') f.write(f""" END_FOR; i := 0; END_PROGRAM """) checker_warnings, rc = run_checker(fname) os.remove(fname)
def test_zerodiv(): f = './test/st/zero-division.st' fdump = f'{f}.dump.json' cvs, rc = run_checker(f) assert rc == 0 assert len(cvs) == 2 assert cvs[0].id == 'ZeroDivision' assert cvs[0].linenr == 7 assert cvs[0].column == 12 assert 'Constant' in cvs[0].msg assert cvs[1].id == 'ZeroDivision' assert cvs[1].linenr == 9 assert cvs[1].column == 14 assert 'Variable' in cvs[1].msg with DumpManager(fdump): pass