Exemple #1
0
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!')
Exemple #2
0
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
Exemple #3
0
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'
Exemple #4
0
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
Exemple #5
0
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
Exemple #9
0
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
Exemple #10
0
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
Exemple #11
0
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
Exemple #16
0
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)
Exemple #17
0
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