# Test if --verify works using the itc testsuite
# The itc test suite can be downloaded here:
# https://github.com/regehr/itc-benchmarks


import glob
import os
import re
import sys
import subprocess

if sys.argv[0] in ('test/verify/itc.py', './test/verify/itc.py'):
    CPPCHECK_PATH = './cppcheck'
else:
    CPPCHECK_PATH = '../../cppcheck'

if len(sys.argv) == 2:
    TESTFILE = sys.argv[1]
    if not os.path.isfile(TESTFILE):
        print(f'ERROR: {TESTFILE} is not a file')
        sys.exit(1)
else:
    TESTFILE = os.path.expanduser('~/itc/01.w_Defects/zero_division.c')

def get_error_lines(filename):
    ret = []
    f = open(filename, 'rt')
    lines = f.readlines()
    for linenr, line in enumerate(lines):
        if line.find('/* ERROR:') > 0:
            ret.append(linenr+1)
    return ret

def check(filename):
    cmd = [CPPCHECK_PATH,
           '--verify',
           '--platform=unix64',
           filename]
    print(' '.join(cmd))

    p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    comm = p.communicate()
    stdout = comm[0].decode(encoding='utf-8', errors='ignore')
    stderr = comm[1].decode(encoding='utf-8', errors='ignore')

    ret = []
    for line in stderr.split('\n'):
        res = re.match(r'.*zero_division.c:([0-9]+):[0-9]+: error: There is division.*', line)
        if res is None:
            continue
        ret.append(int(res.group(1)))
    return ret

wanted = get_error_lines(TESTFILE)
actual = check(TESTFILE)
print('wanted:' + str(wanted))
print('actual:' + str(actual))
missing = []
for w in wanted:
    if w not in actual:
        missing.append(w);
print('missing:' + str(missing))