Lichen

pyparser/test/expressions.py

843:d305986d05c8
2018-07-05 Paul Boddie Employed sets for attributes and providers referenced by accesses. This causes various attributes to be identified definitively in the access plans and instruction sequences.
     1 """     2 list of tested expressions / suites (used by test_parser and test_astbuilder)     3 """     4      5 constants = [     6     "0",     7     "7",     8     "-3",     9     "053",    10     "0x18",    11     "14L",    12     "1.0",    13     "3.9",    14     "-3.6",    15     "1.8e19",    16     "90000000000000",    17     "90000000000000.",    18     "3j"    19     ]    20     21 expressions = [    22     "x = a + 1",    23     "x = 1 - a",    24     "x = a * b",    25     "x = a ** 2",    26     "x = a / b",    27     "x = a & b",    28     "x = a | b",    29     "x = a ^ b",    30     "x = a // b",    31     "x = a * b + 1",    32     "x = a + 1 * b",    33     "x = a * b / c",    34     "x = a * (1 + c)",    35     "x, y, z = 1, 2, 3",    36     "x = 'a' 'b' 'c'",    37     "del foo",    38     "del foo[bar]",    39     "del foo.bar",    40     "l[0]",    41     "k[v,]",    42     "m[a,b]",    43     "a.b.c[d]",    44     "file('some.txt').read()",    45     "a[0].read()",    46     "a[1:1].read()",    47     "f('foo')('bar')('spam')",    48     "f('foo')('bar')('spam').read()[0]",    49     "a.b[0][0]",    50     "a.b[0][:]",    51     "a.b[0][::]",    52     "a.b[0][0].pop()[0].push('bar')('baz').spam",    53     "a.b[0].read()[1][2].foo().spam()[0].bar",    54     "a**2",    55     "a**2**2",    56     "a.b[0]**2",    57     "a.b[0].read()[1][2].foo().spam()[0].bar ** 2",    58     "l[start:end] = l2",    59     "l[::] = l2",    60     "a = `s`",    61     "a = `1 + 2 + f(3, 4)`",    62     "[a, b] = c",    63     "(a, b) = c",    64     "[a, (b,c), d] = e",    65     "a, (b, c), d = e",    66     ]    67     68 # We do not export the following tests because we would have to implement 2.5    69 # features in the stable compiler (other than just building the AST).    70 expressions_inbetweenversions = expressions + [    71     "1 if True else 2",    72     "1 if False else 2",    73     ]    74     75 funccalls = [    76     "l = func()",    77     "l = func(10)",    78     "l = func(10, 12, a, b=c, *args)",    79     "l = func(10, 12, a, b=c, **kwargs)",    80     "l = func(10, 12, a, b=c, *args, **kwargs)",    81     "l = func(10, 12, a, b=c)",    82     "e = l.pop(3)",    83     "e = k.l.pop(3)",    84     "simplefilter('ignore', category=PendingDeprecationWarning, append=1)",    85     """methodmap = dict(subdirs=phase4,    86                         same_files=phase3, diff_files=phase3, funny_files=phase3,    87                         common_dirs = phase2, common_files=phase2, common_funny=phase2,    88                         common=phase1, left_only=phase1, right_only=phase1,    89                         left_list=phase0, right_list=phase0)""",    90     "odata = b2a_qp(data, quotetabs = quotetabs, header = header)",    91     ]    92     93 listmakers = [    94     "l = []",    95     "l = [1, 2, 3]",    96     "l = [i for i in range(10)]",    97     "l = [i for i in range(10) if i%2 == 0]",    98     "l = [i for i in range(10) if i%2 == 0 or i%2 == 1]", # <--    99     "l = [i for i in range(10) if i%2 == 0 and i%2 == 1]",   100     "l = [i for j in range(10) for i in range(j)]",   101     "l = [i for j in range(10) for i in range(j) if j%2 == 0]",   102     "l = [i for j in range(10) for i in range(j) if j%2 == 0 and i%2 == 0]",   103     "l = [(a, b) for (a,b,c) in l2]",   104     "l = [{a:b} for (a,b,c) in l2]",   105     "l = [i for j in k if j%2 == 0 if j*2 < 20 for i in j if i%2==0]",   106     ]   107    108 genexps = [   109     "l = (i for i in j)",   110     "l = (i for i in j if i%2 == 0)",   111     "l = (i for j in k for i in j)",   112     "l = (i for j in k for i in j if j%2==0)",   113     "l = (i for j in k if j%2 == 0 if j*2 < 20 for i in j if i%2==0)",   114     "l = (i for i in [ j*2 for j in range(10) ] )",   115     "l = [i for i in ( j*2 for j in range(10) ) ]",   116     "l = (i for i in [ j*2 for j in ( k*3 for k in range(10) ) ] )",   117     "l = [i for j in ( j*2 for j in [ k*3 for k in range(10) ] ) ]",   118     "l = f(i for i in j)",   119     ]   120    121    122 dictmakers = [   123     "l = {a : b, 'c' : 0}",   124     "l = {}",   125     ]   126    127 backtrackings = [   128     "f = lambda x: x+1",   129     "f = lambda x,y: x+y",   130     "f = lambda x,y=1,z=t: x+y",   131     "f = lambda x,y=1,z=t,*args,**kwargs: x+y",   132     "f = lambda x,y=1,z=t,*args: x+y",   133     "f = lambda x,y=1,z=t,**kwargs: x+y",   134     "f = lambda: 1",   135     "f = lambda *args: 1",   136     "f = lambda **kwargs: 1",   137     ]   138    139 comparisons = [   140     "a < b",   141     "a > b",   142     "a not in b",   143     "a is not b",   144     "a in b",   145     "a is b",   146     "3 < x < 5",   147     "(3 < x) < 5",   148     "a < b < c < d",   149     "(a < b) < (c < d)",   150     "a < (b < c) < d",   151     ]   152    153 multiexpr = [   154     'a = b; c = d;',   155     'a = b = c = d',   156     ]   157    158 attraccess = [   159     'a.b = 2',   160     'x = a.b',   161     ]   162    163 slices = [   164     "l[:]",   165     "l[::]",   166     "l[1:2]",   167     "l[1:]",   168     "l[:2]",   169     "l[1::]",   170     "l[:1:]",   171     "l[::1]",   172     "l[1:2:]",   173     "l[:1:2]",   174     "l[1::2]",   175     "l[0:1:2]",   176     "a.b.l[:]",   177     "a.b.l[1:2]",   178     "a.b.l[1:]",   179     "a.b.l[:2]",   180     "a.b.l[0:1:2]",   181     "a[1:2:3, 100]",   182     "a[:2:3, 100]",   183     "a[1::3, 100,]",   184     "a[1:2:, 100]",   185     "a[1:2, 100]",   186     "a[1:, 100,]",   187     "a[:2, 100]",   188     "a[:, 100]",   189     "a[100, 1:2:3,]",   190     "a[100, :2:3]",   191     "a[100, 1::3]",   192     "a[100, 1:2:,]",   193     "a[100, 1:2]",   194     "a[100, 1:]",   195     "a[100, :2,]",   196     "a[100, :]",   197     ]   198    199 imports = [   200     'import os',   201     'import sys, os',   202     'import os.path',   203     'import os.path, sys',   204     'import sys, os.path as osp',   205     'import os.path as osp',   206     'import os.path as osp, sys as _sys',   207     'import a.b.c.d',   208     'import a.b.c.d as abcd',   209     'from os import path',   210     'from os import path, system',   211     ]   212    213 imports_newstyle = [   214     'from os import path, system',   215     'from os import path as P, system as S',   216     'from os import (path as P, system as S,)',   217     'from os import *',   218     ]   219    220 if_stmts = [   221     "if a == 1: a+= 2",   222     """if a == 1:   223     a += 2   224 elif a == 2:   225     a += 3   226 else:   227     a += 4   228 """,   229     "if a and not b == c: pass",   230     "if a and not not not b == c: pass",   231     "if 0: print 'foo'"   232     ]   233    234 asserts = [   235     'assert False',   236     'assert a == 1',   237     'assert a == 1 and b == 2',   238     'assert a == 1 and b == 2, "assertion failed"',   239     ]   240    241 execs = [   242     'exec a',   243     'exec "a=b+3"',   244     'exec a in f()',   245     'exec a in f(), g()',   246     ]   247    248 prints = [   249     'print',   250     'print a',   251     'print a,',   252     'print a, b',   253     'print a, "b", c',   254     'print >> err',   255     'print >> err, "error"',   256     'print >> err, "error",',   257     'print >> err, "error", a',   258     ]   259    260 globs = [   261     'global a',   262     'global a,b,c',   263     ]   264    265 raises_ = [      # NB. 'raises' creates a name conflict with py.test magic   266     'raise',   267     'raise ValueError',   268     'raise ValueError("error")',   269     'raise ValueError, "error"',   270     'raise ValueError, "error", foo',   271     ]   272    273 tryexcepts = [   274     """try:   275     a   276     b   277 except:   278     pass   279 """,   280     """try:   281     a   282     b   283 except NameError:   284     pass   285 """,   286     """try:   287     a   288     b   289 except NameError, err:   290     pass   291 """,   292     """try:   293     a   294     b   295 except (NameError, ValueError):   296     pass   297 """,   298     """try:   299     a   300     b   301 except (NameError, ValueError), err:   302     pass   303 """,   304     """try:   305     a   306 except NameError, err:   307     pass   308 except ValueError, err:   309     pass   310 """,   311     """def f():   312     try:   313         a   314     except NameError, err:   315         a = 1   316         b = 2   317     except ValueError, err:   318         a = 2   319         return a   320 """   321     """try:   322     a   323 except NameError, err:   324     a = 1   325 except ValueError, err:   326     a = 2   327 else:   328     a += 3   329 """,   330     """try:   331     a   332 finally:   333     b   334 """,   335     """def f():   336     try:   337         return a   338     finally:   339         a = 3   340         return 1   341 """,   342    343     ]   344        345 one_stmt_funcdefs = [   346     "def f(): return 1",   347     "def f(x): return x+1",   348     "def f(x,y): return x+y",   349     "def f(x,y=1,z=t): return x+y",   350     "def f(x,y=1,z=t,*args,**kwargs): return x+y",   351     "def f(x,y=1,z=t,*args): return x+y",   352     "def f(x,y=1,z=t,**kwargs): return x+y",   353     "def f(*args): return 1",   354     "def f(**kwargs): return 1",   355     "def f(t=()): pass",   356     "def f(a, b, (c, d), e): pass",   357     "def f(a, b, (c, (d, e), f, (g, h))): pass",   358     "def f(a, b, (c, (d, e), f, (g, h)), i): pass",   359     "def f((a)): pass",   360     ]   361    362 one_stmt_classdefs = [   363     "class Pdb(bdb.Bdb, cmd.Cmd): pass",   364     "class A: pass",   365     ]   366    367 docstrings = [   368     '''def foo(): return 1''',   369     '''class Foo: pass''',   370     '''class Foo: "foo"''',   371     '''def foo():   372     """foo docstring"""   373     return 1   374 ''',   375     '''def foo():   376     """foo docstring"""   377     a = 1   378     """bar"""   379     return a   380 ''',   381     '''def foo():   382     """doc"""; print 1   383     a=1   384 ''',   385     '''"""Docstring""";print 1''',   386     ]   387    388 returns = [   389     'def f(): return',   390     'def f(): return 1',   391     'def f(): return a.b',   392     'def f(): return a',   393     'def f(): return a,b,c,d',   394     #'return (a,b,c,d)',      --- this one makes no sense, as far as I can tell   395     ]   396    397 augassigns = [   398     'a=1;a+=2',   399     'a=1;a-=2',   400     'a=1;a*=2',   401     'a=1;a/=2',   402     'a=1;a//=2',   403     'a=1;a%=2',   404     'a=1;a**=2',   405     'a=1;a>>=2',   406     'a=1;a<<=2',   407     'a=1;a&=2',   408     'a=1;a^=2',   409     'a=1;a|=2',   410        411     'a=A();a.x+=2',   412     'a=A();a.x-=2',   413     'a=A();a.x*=2',   414     'a=A();a.x/=2',   415     'a=A();a.x//=2',   416     'a=A();a.x%=2',   417     'a=A();a.x**=2',   418     'a=A();a.x>>=2',   419     'a=A();a.x<<=2',   420     'a=A();a.x&=2',   421     'a=A();a.x^=2',   422     'a=A();a.x|=2',   423    424     'a=A();a[0]+=2',   425     'a=A();a[0]-=2',   426     'a=A();a[0]*=2',   427     'a=A();a[0]/=2',   428     'a=A();a[0]//=2',   429     'a=A();a[0]%=2',   430     'a=A();a[0]**=2',   431     'a=A();a[0]>>=2',   432     'a=A();a[0]<<=2',   433     'a=A();a[0]&=2',   434     'a=A();a[0]^=2',   435     'a=A();a[0]|=2',   436    437     'a=A();a[0:2]+=2',   438     'a=A();a[0:2]-=2',   439     'a=A();a[0:2]*=2',   440     'a=A();a[0:2]/=2',   441     'a=A();a[0:2]//=2',   442     'a=A();a[0:2]%=2',   443     'a=A();a[0:2]**=2',   444     'a=A();a[0:2]>>=2',   445     'a=A();a[0:2]<<=2',   446     'a=A();a[0:2]&=2',   447     'a=A();a[0:2]^=2',   448     'a=A();a[0:2]|=2',   449     ]   450    451 PY23_TESTS = [   452     constants,   453     expressions,   454     augassigns,   455     comparisons,   456     funccalls,   457     backtrackings,   458     listmakers, # ERRORS   459     dictmakers,   460     multiexpr,   461     attraccess,   462     slices,   463     imports,   464     execs,   465     prints,   466     globs,   467     raises_,   468    469     ]   470    471 OPTIONAL_TESTS = [   472     # expressions_inbetweenversions,    473     genexps,   474     imports_newstyle,   475     asserts,   476     ]   477    478 TESTS = PY23_TESTS + OPTIONAL_TESTS   479    480    481 ## TESTS = [   482 ##     ["l = [i for i in range(10) if i%2 == 0 or i%2 == 1]"],   483 ##     ]   484    485 CHANGES_25_INPUTS = [   486     ["class A(): pass"],   487     ["def f(): x = yield 3"]   488     ]   489    490 EXEC_INPUTS = [   491     one_stmt_classdefs,   492     one_stmt_funcdefs,   493     if_stmts,   494     tryexcepts,   495     docstrings,   496     returns,   497     ]   498    499 SINGLE_INPUTS = [   500    one_stmt_funcdefs,   501    ['\t # hello\n',   502     'print 6*7',   503     'if 1:  x\n',   504     'x = 5',   505     'x = 5 ',   506     '''"""Docstring""";print 1''',   507     '''"Docstring"''',   508     '''"Docstring" "\\x00"''',   509     ]   510 ]