about summary refs log tree commit diff
path: root/src/grammar/testparser.py
blob: 4b5a7fb9e10b5c4ce4f6d6f52932787194713d5d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#!/usr/bin/env python

# ignore-tidy-linelength

import sys

import os
import subprocess
import argparse

# usage: testparser.py [-h] [-p PARSER [PARSER ...]] -s SOURCE_DIR

# Parsers should read from stdin and return exit status 0 for a
# successful parse, and nonzero for an unsuccessful parse

parser = argparse.ArgumentParser()
parser.add_argument('-p', '--parser', nargs='+')
parser.add_argument('-s', '--source-dir', nargs=1, required=True)
args = parser.parse_args(sys.argv[1:])

total = 0
ok = {}
bad = {}
for parser in args.parser:
    ok[parser] = 0
    bad[parser] = []
devnull = open(os.devnull, 'w')
print("\n")

for base, dirs, files in os.walk(args.source_dir[0]):
    for f in filter(lambda p: p.endswith('.rs'), files):
        p = os.path.join(base, f)
        parse_fail = 'parse-fail' in p
        if sys.version_info.major == 3:
            lines = open(p, encoding='utf-8').readlines()
        else:
            lines = open(p).readlines()
        if any('ignore-test' in line or 'ignore-lexer-test' in line for line in lines):
            continue
        total += 1
        for parser in args.parser:
            if subprocess.call(parser, stdin=open(p), stderr=subprocess.STDOUT, stdout=devnull) == 0:
                if parse_fail:
                    bad[parser].append(p)
                else:
                    ok[parser] += 1
            else:
                if parse_fail:
                    ok[parser] += 1
                else:
                    bad[parser].append(p)
        parser_stats = ', '.join(['{}: {}'.format(parser, ok[parser]) for parser in args.parser])
        sys.stdout.write("\033[K\r total: {}, {}, scanned {}"
                         .format(total, os.path.relpath(parser_stats), os.path.relpath(p)))

devnull.close()

print("\n")

for parser in args.parser:
    filename = os.path.basename(parser) + '.bad'
    print("writing {} files that did not yield the correct result with {} to {}".format(len(bad[parser]), parser, filename))
    with open(filename, "w") as f:
        for p in bad[parser]:
            f.write(p)
            f.write("\n")