Lichen

pyparser/test/unittest_samples.py

627:05ad7964265c
2017-02-27 Paul Boddie Merged convenience macro changes.
     1 """test module for CPython / PyPy nested tuples comparison"""     2      3 import os, os.path as osp     4 import sys     5 from pyparser.pythonutil import python_parse, pypy_parse     6 from pprint import pprint     7 from pyparser import grammar     8 grammar.DEBUG = False     9 from symbol import sym_name    10     11     12 def name(elt):    13     return "%s[%s]"% (sym_name.get(elt,elt),elt)    14     15 def read_samples_dir():    16     return [osp.join('samples', fname) for fname in os.listdir('samples') if fname.endswith('.py')]    17     18 def print_sym_tuple(nested, level=0, limit=15, names=False, trace=()):    19     buf = []    20     if level <= limit:    21         buf.append("%s(" % (" "*level))    22     else:    23         buf.append("(")    24     for index, elt in enumerate(nested):    25         # Test if debugging and if on last element of error path    26         if trace and not trace[1:] and index == trace[0]:    27             buf.append('\n----> ')    28         if type(elt) is int:    29             if names:    30                 buf.append(name(elt))    31             else:    32                 buf.append(str(elt))    33             buf.append(', ')    34         elif type(elt) is str:    35             buf.append(repr(elt))    36         else:    37             if level < limit:    38                 buf.append('\n')    39             buf.extend(print_sym_tuple(elt, level+1, limit,    40                                        names, trace[1:]))    41     buf.append(')')    42     return buf    43     44 def assert_tuples_equal(tup1, tup2, curpos = ()):    45     for index, (elt1, elt2) in enumerate(zip(tup1, tup2)):    46         if elt1 != elt2:    47             if type(elt1) is tuple and type(elt2) is tuple:    48                 assert_tuples_equal(elt1, elt2, curpos + (index,))    49             raise AssertionError('Found difference at %s : %s != %s' %    50                                  (curpos, name(elt1), name(elt2) ), curpos)    51     52 from time import time, clock    53 def test_samples( samples ):    54     time_reports = {}    55     for sample in samples:    56         print "testing", sample    57         tstart1, cstart1 = time(), clock()    58         pypy_tuples = pypy_parse(sample)    59         tstart2, cstart2 = time(), clock()    60         python_tuples = python_parse(sample)    61         time_reports[sample] = (time() - tstart2, tstart2-tstart1, clock() - cstart2, cstart2-cstart1 )    62         #print "-"*10, "PyPy parse results", "-"*10    63         #print ''.join(print_sym_tuple(pypy_tuples, names=True))    64         #print "-"*10, "CPython parse results", "-"*10    65         #print ''.join(print_sym_tuple(python_tuples, names=True))    66         print    67         try:    68             assert_tuples_equal(pypy_tuples, python_tuples)    69         except AssertionError as e:    70             error_path = e.args[-1]    71             print "ERROR PATH =", error_path    72             print "="*80    73             print file(sample).read()    74             print "="*80    75             print "-"*10, "PyPy parse results", "-"*10    76             print ''.join(print_sym_tuple(pypy_tuples, names=True, trace=error_path))    77             print "-"*10, "CPython parse results", "-"*10    78             print ''.join(print_sym_tuple(python_tuples, names=True, trace=error_path))    79             print "Failed on (%s)" % sample    80             # raise    81     pprint(time_reports)    82     83 if __name__=="__main__":    84     import getopt    85     opts, args = getopt.getopt( sys.argv[1:], "d:", [] )    86     for opt, val in opts:    87         if opt == "-d":    88             pass    89 #            set_debug(int(val))    90     if args:    91         samples = args    92     else:    93         samples = read_samples_dir()    94     95     test_samples( samples )