def test_ExpressionGenerator_2(): #IGNORE:C01111
    msg = 'Test creation of expression strings. Check function call.'
    #skip_test(msg)
    print msg
    
    import math 
    from freeode.pygenerator import ExpressionGenerator
    from freeode.interpreter import IFloat, BUILTIN_LIB
    from freeode.ast import NodeFuncCall

    e_gen = ExpressionGenerator()
    #create a variable
    a = IFloat()
    a.target_name = 'a'

    #get the "sin" function
    sin = BUILTIN_LIB.sin
    
    #create expression "sin(a)" and create Python code for it
    expr = NodeFuncCall(sin, (a,))
    expr_str = e_gen.create_expression(expr)
    print expr_str
    
    #Execute the generated Python code
    assert eval(expr_str, {'a':0, 'sin':math.sin}) == 0
def test_ExpressionGenerator_2(): #IGNORE:C01111
    msg = 'Test creation of expression strings. Check function call.'
    #py.test.skip(msg)
    print msg
    from math import sin
    from freeode.pygenerator import ExpressionGenerator
    from freeode.interpreter import IFloat, CallableObject
    from freeode.ast import NodeFuncCall

    e_gen = ExpressionGenerator()
    #create a variable
    a = IFloat()
    a.target_name = 'a'
    #create a function
    fsin = CallableObject(None)
    fsin.codegen_name = 'sin' 
    
    #expression: sin(a)
    expr = NodeFuncCall(fsin, (a,))
    expr_str = e_gen.create_expression(expr)
    print expr_str
    assert eval(expr_str, {'a':0, 'sin':sin}) == 0
def test_ExpressionGenerator_1(): #IGNORE:C01111
    msg = 'Test creation of expression strings. Check all operators'
    #skip_test(msg)
    print msg
    from numpy import float64
    from freeode.pygenerator import ExpressionGenerator, func
    from freeode.interpreter import IFloat
    from freeode.ast import RoleConstant, NodeFuncCall, NodeParentheses

    e_gen = ExpressionGenerator()
    #create some variables and numbers
    a = IFloat()
    a.target_name = 'a'
    b = IFloat()
    b.target_name = 'b'
    c = IFloat(2)
    c.role = RoleConstant
    
    #Get some functions that are converted into Python operators
    add = func(IFloat.__add__)
    sub = func(IFloat.__sub__)
    mul = func(IFloat.__mul__)
    div = func(IFloat.__div__)
    pow = func(IFloat.__pow__)
    mod = func(IFloat.__mod__)
    neg = func(IFloat.__neg__)
    
    #expression a + b * 2
    expr = NodeFuncCall(add, (a, NodeFuncCall(mul, (b, c))))
    expr_str = e_gen.create_expression(expr)
    print expr_str
    assert eval(expr_str, {'a':1, 'b':2, 'float64':float64}) == 1 + 2 * 2 #5

    #expression a - b / 2
    expr = NodeFuncCall(sub, (a, NodeFuncCall(div, (b, c))))
    expr_str = e_gen.create_expression(expr)
    print expr_str
    assert eval(expr_str, {'a':1, 'b':2, 'float64':float64}) == 1 - 2 / 2 #0

    #expression a ** b % 2
    expr = NodeFuncCall(pow, (a, NodeFuncCall(mod, (b, c))))
    expr_str = e_gen.create_expression(expr)
    print expr_str
    assert eval(expr_str, {'a':2, 'b':3, 'float64':float64}) == 2 ** 3 % 2 #0

    #expression - 2
    expr = NodeFuncCall(neg, (c,))
    expr_str = e_gen.create_expression(expr)
    print expr_str
    assert eval(expr_str, {'float64':float64}) == -2

    #expression (a + b) * 2
    expr = NodeFuncCall(mul, (NodeParentheses((NodeFuncCall(add, (a, b)),)
                                              ), 
                              c)
                        )
    expr_str = e_gen.create_expression(expr)
    print expr_str
    assert eval(expr_str, {'a':1, 'b':2, 'float64':float64}) == (1 + 2) * 2 #6
def test_ExpressionGenerator_1(): #IGNORE:C01111
    msg = 'Test creation of expression strings. Check all operators'
    #py.test.skip(msg)
    print msg
    from numpy import float64
    from freeode.pygenerator import ExpressionGenerator, IFloat
    from freeode.ast import (RoleConstant,
                             NodeOpInfix2, NodeOpPrefix1, NodeParentheses)

    e_gen = ExpressionGenerator()
    #create some variables and numbers
    a = IFloat()
    a.target_name = 'a'
    b = IFloat()
    b.target_name = 'b'
    c = IFloat(2)
    c.role = RoleConstant
    
    #expression a + b * 2
    expr = NodeOpInfix2('+', (a, NodeOpInfix2('*', (b, c))))
    expr_str = e_gen.create_expression(expr)
    print expr_str
    assert eval(expr_str, {'a':1, 'b':2, 'float64':float64}) == 5

    #expression a - b / 2
    expr = NodeOpInfix2('-', (a, NodeOpInfix2('/', (b, c))))
    expr_str = e_gen.create_expression(expr)
    print expr_str
    assert eval(expr_str, {'a':1, 'b':2, 'float64':float64}) == 0

    #expression a ** b % 2
    expr = NodeOpInfix2('**', (a, NodeOpInfix2('%', (b, c))))
    expr_str = e_gen.create_expression(expr)
    print expr_str
    assert eval(expr_str, {'a':2, 'b':3, 'float64':float64}) == 0

    #expression - 2
    expr = NodeOpPrefix1('-', (c,))
    expr_str = e_gen.create_expression(expr)
    print expr_str
    assert eval(expr_str, {'float64':float64}) == -2

    #expression (a + b) * 2
    expr = NodeOpInfix2('*', (NodeParentheses((NodeOpInfix2('+', (a, b)),)
                                              ), 
                              c)
                        )
    expr_str = e_gen.create_expression(expr)
    print expr_str
    assert eval(expr_str, {'a':1, 'b':2, 'float64':float64}) == 6