Ejemplo n.º 1
0
def test_num():
    tree = eparse(1)
    assert tree.emit() == '1'
    tree2 = from_ast(tree.to_ast(), mode='eval')
    assert tree2.emit() == '1'

    tree3 = mparse(1)
    assert tree3.emit() == '1'
    tree4 = from_ast(tree3.to_ast(), mode='exec')
    assert tree4.emit() == '1'

    tree5 = iparse(1)
    assert tree5.emit() == '1'
    tree6 = from_ast(tree5.to_ast(), mode='single')
    assert tree6.emit() == '1'

    tree7 = tree3.abstract()
    assert any(n.lineno is not None for n in tree3.nodes)
    assert all(n.lineno is None for n in tree7.nodes)

    from syn.python.b import Num as Num_
    import syn.python.b.base as pybbase

    def bad():
        class Num(PythonNode):
            pass

    assert_raises(TypeError, bad)
    assert pybbase.AST_REGISTRY[ast.Num] is Num_

    n = Num(1)
    assert n.emit() == '1'
    assert n.emit(indent_level=1) == '    1'
    assert n.as_value().emit() == '1'

    rn = n.as_return()
    assert rn.emit() == 'return 1'
    assert n.emit() == '1'
Ejemplo n.º 2
0
def test_num():
    tree = eparse(1)
    assert tree.emit() == '1'
    tree2 = from_ast(tree.to_ast(), mode='eval')
    assert tree2.emit() == '1'

    tree3 = mparse(1)
    assert tree3.emit() == '1'
    tree4 = from_ast(tree3.to_ast(), mode='exec')
    assert tree4.emit() == '1'

    tree5 = iparse(1)
    assert tree5.emit() == '1'
    tree6 = from_ast(tree5.to_ast(), mode='single')
    assert tree6.emit() == '1'

    tree7 = tree3.abstract()
    assert any(n.lineno is not None for n in tree3.nodes)
    assert all(n.lineno is None for n in tree7.nodes)

    from syn.python.b import Num as Num_
    import syn.python.b.base as pybbase

    def bad():
        class Num(PythonNode):
            pass

    assert_raises(TypeError, bad)
    assert pybbase.AST_REGISTRY[ast.Num] is Num_

    n = Num(1)
    assert n.emit() == '1'
    assert n.emit(indent_level=1) == '    1'
    assert n.as_value().emit() == '1'

    rn = n.as_return()
    assert rn.emit() == 'return 1'
    assert n.emit() == '1'
Ejemplo n.º 3
0
def test_call():
    examine('foo()')
    examine('foo(1)')
    examine('foo(1, 2, 3)')
    examine('foo(a=1, b=2)')
    examine('foo(1, 2, **d)')
    if VER < '3.5':
        examine('foo(a=2, *c)')
    else:
        examine('foo(*c, a=2)')
    examine('foo(*c)')
    examine('foo(**d)')
    examine('foo(1, a=2, **b)')
    if VER < '3.5':
        examine('foo(1, 2, a=3, b=4, *c, **d)')
    else:
        examine('foo(1, 2, *c, a=3, b=4, **d)')

    assert Call(Name('list')).emit() == 'list()'
    
    c1 = Call(Name('c1'),
              [Num(2),
               Assign([Name('x')],
                      Num(3)),
               Assign([Name('y')],
                      Num(4))])
    assert c1.emit() == 'c1(2, x = 3, y = 4)'
    assert_raises(TypeError, c1.validate)
    c1r = Module(c1).expressify_statements().resolve_progn()
    c1r.emit()
    assert c1r.emit() == 'x = 3\ny = 4\nc1(2, x, y)'

    k = Keyword('foo', Num(1))
    assert k.emit() == 'foo=1'
    
    if VER >= '3.5':
        k = Keyword(None, Name('x'))
        assert k.emit() == '**x'

    if VER < '3.5':
        c = Call(Name('foo'),
                 [Num(1), Num(2)],
                 [Keyword('a', Num(3)), Keyword('b', Num(4))],
                 Name('c'),
                 Name('d'))
        assert c.emit() == 'foo(1, 2, a=3, b=4, *c, **d)'
        assert c.emit(indent_level=1) == '    foo(1, 2, a=3, b=4, *c, **d)'
    else:
        c = Call(Name('foo'),
                 [Num(1), Num(2), Starred(Name('c'))],
                 [Keyword('a', Num(3)), 
                  Keyword('b', Num(4)), 
                  Keyword(None, Name('d'))])
        assert c.emit() == 'foo(1, 2, *c, a=3, b=4, **d)'
        assert c.emit(indent_level=1) == '    foo(1, 2, *c, a=3, b=4, **d)'

    c = Call(Name('foo'))
    assert c.emit() == 'foo()'
Ejemplo n.º 4
0
def test_sequence():
    examine('[1, 2]')
    examine('(1, 2)')
    examine('(1,)')
    examine('{1}')

    l = List([Num(1), Num(2)])
    assert l.emit() == '[1, 2]'
    assert l.emit(indent_level=1) == '    [1, 2]'

    t = Tuple([Num(1), Num(2)])
    assert t.emit() == '(1, 2)'
    assert t.emit(indent_level=1) == '    (1, 2)'

    s = Set([Num(1), Num(2)])
    assert s.emit() == '{1, 2}'
    assert s.emit(indent_level=1) == '    {1, 2}'

    assert s._node_count == 3
    assert s._children == s.elts
    k = getkey(s._child_map, ('elts', 1))
    s._set_child(k, Tuple([Num(3), Num(4)]))
    assert s.emit() == '{1, (3, 4)}'
    assert s._children == [Num(1), Tuple([Num(3), Num(4)], ctx=Load())]
    assert s._node_count == 6
Ejemplo n.º 5
0
def test_if():
    examine('if 1:\n    a = 1')
    examine('if 1:\n    a = 1\nelse:\n    a = 2')
    examine(
        'if 1:\n  a = 1\nelif 2:\n  a = 2\nelse:\n  a = 3',
        'if 1:\n    a = 1\nelse:\n    if 2:\n        a = 2\n    else:\n        a = 3'
    )

    if1 = If(Num(1), [Num(2)], [Num(3)])
    assert if1.emit() == 'if 1:\n    2\nelse:\n    3'

    rif1 = if1.as_return()
    assert rif1.emit() == 'if 1:\n    return 2\nelse:\n    return 3'

    if2 = If(Assign([Name('x')], Num(2)), [Return(Num(5))])
    assert if2.emit() == 'if x = 2:\n    return 5'
    assert_raises(TypeError, if2.validate)  # Indeed, this isn't valid python
    if2r = if2.expressify_statements().resolve_progn()
    assert isinstance(if2r, ProgN)  # Bad

    if2m = Module(if2)
    if2r = if2m.expressify_statements().resolve_progn()
    assert isinstance(if2r, Module)  # Good
    if2r.validate()
    assert if2r.emit() == '''x = 2
if x:
    return 5'''

    if3 = Module(
        If(Assign([Name('x')], Num(2)), [Assign([Name('y')], Name('x'))]))
    if3r = if3.expressify_statements().resolve_progn()
    if3r.validate()
    assert if3r.emit() == '''x = 2
if x:
    y = x'''
    assert if3r.variables() == {'x', 'y'}
    assert collection_equivalent(if3r._children[1]._children,
                                 [Assign([Name('y')], Name('x')),
                                  Name('x')])

    if4 = If(Num(1), [Num(2)], [Num(3)])
    assert if4.emit() == 'if 1:\n    2\nelse:\n    3'
    if4v = if4.as_value()
    assert isinstance(if4v, ProgN)
    assert if4v.value() == Name('_gensym_0')
    assert Module(if4v).resolve_progn().emit() == '''if 1:
    _gensym_0 = 2
else:
    _gensym_0 = 3'''

    if5 = If(Num(1), [Assign([Name('x')], Num(2))], [Num(3)])
    assert if5.emit() == 'if 1:\n    x = 2\nelse:\n    3'
    assert Module(if5.as_value()).resolve_progn().emit() == '''if 1:
    x = 2
else:
    x = 3'''

    if6 = If(Num(1), [Num(2)], [Assign([Name('x')], Num(3))])
    assert if6.emit() == 'if 1:\n    2\nelse:\n    x = 3'
    assert Module(if6.as_value()).resolve_progn().emit() == '''if 1:
    x = 2
else:
    x = 3'''

    if7 = If(Num(1), [Assign([Name('y')], Num(2))],
             [Assign([Name('x')], Num(3))])
    assert if7.emit() == 'if 1:\n    y = 2\nelse:\n    x = 3'
    assert Module(if7.as_value()).resolve_progn().emit() == '''if 1:
    y = 2
else:
    x = 3
    y = x'''

    lgr = Logger()
    if8 = If(If(Assign([Name('x')], Num(2)), [Num(3)], [Num(4)]),
             [Return(Num(5))])
    assert_raises(TypeError, if8.validate)
    print(if8.viewable().pretty())
    ex = Module(if8).expressify_statements(logger=lgr)
    print(ex.viewable().pretty())
    re = ex.resolve_progn(logger=lgr)
    print(re.viewable().pretty())

    for depth, event in lgr.root[1].depth_first(yield_depth=True):
        print('-' * 80)
        print(event.display(depth))

    print(lgr.plaintext())
    assert len(lgr.nodes) > 10

    re.validate()
    assert re.emit() == '''x = 2
Ejemplo n.º 6
0
def test_progn():
    p = ProgN()
    assert_raises(PythonError, p.validate)
    assert_raises(PythonError, p.value)
    assert_raises(PythonError, p.valuify)
    # assert_raises(NotImplementedError, p.as_value)
    assert_raises(NotImplementedError, p.expressify_statements)

    p = ProgN(Assign([Name('x')], Num(2)))
    assert p.valuify() is p
    assert p.value() == Name('x')

    ppp = ProgN(Num(1),
                ProgN(Num(2),
                      ProgN(Num(3)),
                      ProgN(Assign([Name('y')], Num(4)))))
    assert ppp.value() == Name('y')
    assert ppp.resolve_progn() == ProgN(Num(1), 
                                        Num(2), 
                                        Num(3), 
                                        Assign([Name('y')], Num(4)))

    p = ProgN(Num(2))
    assert_raises(PythonError, p.value)
    pv = p.valuify()
    assert pv == ProgN(Assign([Name('_gensym_0')], Num(2)))
    assert pv.value() == Name('_gensym_0')
Ejemplo n.º 7
0
def _to_python_native(obj, **kwargs):
    from syn.python.b import Num

    if Num._attrs.types['n'].query(obj):
        return Num(obj)
    raise TypeError("Cannot compile: {}".format(obj))