Skip to content
Snippets Groups Projects
test.py 2.01 KiB
Newer Older
Martin Vejnár's avatar
Martin Vejnár committed
import os, json, sys, io, traceback
Martin Vejnár's avatar
Martin Vejnár committed
import pytoml as toml
Martin Vejnár's avatar
Martin Vejnár committed

Martin Vejnár's avatar
Martin Vejnár committed
def _testbench_literal(type, text, value):
    if type == 'table':
        return value
    if type == 'array':
        return { 'type': 'array', 'value': value }
    if type == 'str':
        return { 'type': 'string', 'value': value }
    _type_table = {'int': 'integer'}
Martin Vejnár's avatar
Martin Vejnár committed
    return {'type': _type_table.get(type, type), 'value': text}

def _main():
    succeeded = []
    failed = []

    for top, dirnames, fnames in os.walk('./toml-test/tests'):
Martin Vejnár's avatar
Martin Vejnár committed
        for fname in fnames:
            if not fname.endswith('.toml'):
                continue

Martin Vejnár's avatar
Martin Vejnár committed
            if sys.argv[1:] and not any(arg in fname for arg in sys.argv[1:]):
                continue

            parse_error = None
Martin Vejnár's avatar
Martin Vejnár committed
            try:
                with open(os.path.join(top, fname), 'rb') as fin:
Martin Vejnár's avatar
Martin Vejnár committed
                    parsed = toml.load(fin)
Martin Vejnár's avatar
Martin Vejnár committed
            except toml.TomlError:
                parsed = None
Martin Vejnár's avatar
Martin Vejnár committed
                parse_error = sys.exc_info()
Martin Vejnár's avatar
Martin Vejnár committed
            else:
                dumped = toml.dumps(parsed)
                parsed2 = toml.loads(dumped)
                if parsed != parsed2:
Martin Vejnár's avatar
Martin Vejnár committed
                    failed.append((fname, None))
Martin Vejnár's avatar
Martin Vejnár committed
                    continue

                with open(os.path.join(top, fname), 'rb') as fin:
Martin Vejnár's avatar
Martin Vejnár committed
                    parsed = toml.load(fin, translate=_testbench_literal)
Martin Vejnár's avatar
Martin Vejnár committed

            try:
Martin Vejnár's avatar
Martin Vejnár committed
                with io.open(os.path.join(top, fname[:-5] + '.json'), 'rt', encoding='utf-8') as fin:
Martin Vejnár's avatar
Martin Vejnár committed
                    bench = json.load(fin)
            except IOError:
                bench = None

            if parsed != bench:
Martin Vejnár's avatar
Martin Vejnár committed
                failed.append((fname, parsed, bench, parse_error))
Martin Vejnár's avatar
Martin Vejnár committed
            else:
                succeeded.append(fname)

Martin Vejnár's avatar
Martin Vejnár committed
    for f, parsed, bench, e in failed:
        print('failed: {}\n{}\n{}'.format(f, json.dumps(parsed, indent=4), json.dumps(bench, indent=4)))
        if e:
            traceback.print_exception(*e)
Martin Vejnár's avatar
Martin Vejnár committed
    print('succeeded: {}'.format(len(succeeded)))
Martin Vejnár's avatar
Martin Vejnár committed
    return 1 if failed else 0

if __name__ == '__main__':
    sys.exit(_main())