You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
406 lines
12 KiB
406 lines
12 KiB
from sympy.testing.pytest import raises
|
|
from sympy.parsing.sym_expr import SymPyExpression
|
|
from sympy.external import import_module
|
|
|
|
lfortran = import_module('lfortran')
|
|
|
|
if lfortran:
|
|
from sympy.codegen.ast import (Variable, IntBaseType, FloatBaseType, String,
|
|
Return, FunctionDefinition, Assignment,
|
|
Declaration, CodeBlock)
|
|
from sympy.core import Integer, Float, Add
|
|
from sympy.core.symbol import Symbol
|
|
|
|
|
|
expr1 = SymPyExpression()
|
|
expr2 = SymPyExpression()
|
|
src = """\
|
|
integer :: a, b, c, d
|
|
real :: p, q, r, s
|
|
"""
|
|
|
|
|
|
def test_sym_expr():
|
|
src1 = (
|
|
src +
|
|
"""\
|
|
d = a + b -c
|
|
"""
|
|
)
|
|
expr3 = SymPyExpression(src,'f')
|
|
expr4 = SymPyExpression(src1,'f')
|
|
ls1 = expr3.return_expr()
|
|
ls2 = expr4.return_expr()
|
|
for i in range(0, 7):
|
|
assert isinstance(ls1[i], Declaration)
|
|
assert isinstance(ls2[i], Declaration)
|
|
assert isinstance(ls2[8], Assignment)
|
|
assert ls1[0] == Declaration(
|
|
Variable(
|
|
Symbol('a'),
|
|
type = IntBaseType(String('integer')),
|
|
value = Integer(0)
|
|
)
|
|
)
|
|
assert ls1[1] == Declaration(
|
|
Variable(
|
|
Symbol('b'),
|
|
type = IntBaseType(String('integer')),
|
|
value = Integer(0)
|
|
)
|
|
)
|
|
assert ls1[2] == Declaration(
|
|
Variable(
|
|
Symbol('c'),
|
|
type = IntBaseType(String('integer')),
|
|
value = Integer(0)
|
|
)
|
|
)
|
|
assert ls1[3] == Declaration(
|
|
Variable(
|
|
Symbol('d'),
|
|
type = IntBaseType(String('integer')),
|
|
value = Integer(0)
|
|
)
|
|
)
|
|
assert ls1[4] == Declaration(
|
|
Variable(
|
|
Symbol('p'),
|
|
type = FloatBaseType(String('real')),
|
|
value = Float(0.0)
|
|
)
|
|
)
|
|
assert ls1[5] == Declaration(
|
|
Variable(
|
|
Symbol('q'),
|
|
type = FloatBaseType(String('real')),
|
|
value = Float(0.0)
|
|
)
|
|
)
|
|
assert ls1[6] == Declaration(
|
|
Variable(
|
|
Symbol('r'),
|
|
type = FloatBaseType(String('real')),
|
|
value = Float(0.0)
|
|
)
|
|
)
|
|
assert ls1[7] == Declaration(
|
|
Variable(
|
|
Symbol('s'),
|
|
type = FloatBaseType(String('real')),
|
|
value = Float(0.0)
|
|
)
|
|
)
|
|
assert ls2[8] == Assignment(
|
|
Variable(Symbol('d')),
|
|
Symbol('a') + Symbol('b') - Symbol('c')
|
|
)
|
|
|
|
def test_assignment():
|
|
src1 = (
|
|
src +
|
|
"""\
|
|
a = b
|
|
c = d
|
|
p = q
|
|
r = s
|
|
"""
|
|
)
|
|
expr1.convert_to_expr(src1, 'f')
|
|
ls1 = expr1.return_expr()
|
|
for iter in range(0, 12):
|
|
if iter < 8:
|
|
assert isinstance(ls1[iter], Declaration)
|
|
else:
|
|
assert isinstance(ls1[iter], Assignment)
|
|
assert ls1[8] == Assignment(
|
|
Variable(Symbol('a')),
|
|
Variable(Symbol('b'))
|
|
)
|
|
assert ls1[9] == Assignment(
|
|
Variable(Symbol('c')),
|
|
Variable(Symbol('d'))
|
|
)
|
|
assert ls1[10] == Assignment(
|
|
Variable(Symbol('p')),
|
|
Variable(Symbol('q'))
|
|
)
|
|
assert ls1[11] == Assignment(
|
|
Variable(Symbol('r')),
|
|
Variable(Symbol('s'))
|
|
)
|
|
|
|
|
|
def test_binop_add():
|
|
src1 = (
|
|
src +
|
|
"""\
|
|
c = a + b
|
|
d = a + c
|
|
s = p + q + r
|
|
"""
|
|
)
|
|
expr1.convert_to_expr(src1, 'f')
|
|
ls1 = expr1.return_expr()
|
|
for iter in range(8, 11):
|
|
assert isinstance(ls1[iter], Assignment)
|
|
assert ls1[8] == Assignment(
|
|
Variable(Symbol('c')),
|
|
Symbol('a') + Symbol('b')
|
|
)
|
|
assert ls1[9] == Assignment(
|
|
Variable(Symbol('d')),
|
|
Symbol('a') + Symbol('c')
|
|
)
|
|
assert ls1[10] == Assignment(
|
|
Variable(Symbol('s')),
|
|
Symbol('p') + Symbol('q') + Symbol('r')
|
|
)
|
|
|
|
|
|
def test_binop_sub():
|
|
src1 = (
|
|
src +
|
|
"""\
|
|
c = a - b
|
|
d = a - c
|
|
s = p - q - r
|
|
"""
|
|
)
|
|
expr1.convert_to_expr(src1, 'f')
|
|
ls1 = expr1.return_expr()
|
|
for iter in range(8, 11):
|
|
assert isinstance(ls1[iter], Assignment)
|
|
assert ls1[8] == Assignment(
|
|
Variable(Symbol('c')),
|
|
Symbol('a') - Symbol('b')
|
|
)
|
|
assert ls1[9] == Assignment(
|
|
Variable(Symbol('d')),
|
|
Symbol('a') - Symbol('c')
|
|
)
|
|
assert ls1[10] == Assignment(
|
|
Variable(Symbol('s')),
|
|
Symbol('p') - Symbol('q') - Symbol('r')
|
|
)
|
|
|
|
|
|
def test_binop_mul():
|
|
src1 = (
|
|
src +
|
|
"""\
|
|
c = a * b
|
|
d = a * c
|
|
s = p * q * r
|
|
"""
|
|
)
|
|
expr1.convert_to_expr(src1, 'f')
|
|
ls1 = expr1.return_expr()
|
|
for iter in range(8, 11):
|
|
assert isinstance(ls1[iter], Assignment)
|
|
assert ls1[8] == Assignment(
|
|
Variable(Symbol('c')),
|
|
Symbol('a') * Symbol('b')
|
|
)
|
|
assert ls1[9] == Assignment(
|
|
Variable(Symbol('d')),
|
|
Symbol('a') * Symbol('c')
|
|
)
|
|
assert ls1[10] == Assignment(
|
|
Variable(Symbol('s')),
|
|
Symbol('p') * Symbol('q') * Symbol('r')
|
|
)
|
|
|
|
|
|
def test_binop_div():
|
|
src1 = (
|
|
src +
|
|
"""\
|
|
c = a / b
|
|
d = a / c
|
|
s = p / q
|
|
r = q / p
|
|
"""
|
|
)
|
|
expr1.convert_to_expr(src1, 'f')
|
|
ls1 = expr1.return_expr()
|
|
for iter in range(8, 12):
|
|
assert isinstance(ls1[iter], Assignment)
|
|
assert ls1[8] == Assignment(
|
|
Variable(Symbol('c')),
|
|
Symbol('a') / Symbol('b')
|
|
)
|
|
assert ls1[9] == Assignment(
|
|
Variable(Symbol('d')),
|
|
Symbol('a') / Symbol('c')
|
|
)
|
|
assert ls1[10] == Assignment(
|
|
Variable(Symbol('s')),
|
|
Symbol('p') / Symbol('q')
|
|
)
|
|
assert ls1[11] == Assignment(
|
|
Variable(Symbol('r')),
|
|
Symbol('q') / Symbol('p')
|
|
)
|
|
|
|
def test_mul_binop():
|
|
src1 = (
|
|
src +
|
|
"""\
|
|
d = a + b - c
|
|
c = a * b + d
|
|
s = p * q / r
|
|
r = p * s + q / p
|
|
"""
|
|
)
|
|
expr1.convert_to_expr(src1, 'f')
|
|
ls1 = expr1.return_expr()
|
|
for iter in range(8, 12):
|
|
assert isinstance(ls1[iter], Assignment)
|
|
assert ls1[8] == Assignment(
|
|
Variable(Symbol('d')),
|
|
Symbol('a') + Symbol('b') - Symbol('c')
|
|
)
|
|
assert ls1[9] == Assignment(
|
|
Variable(Symbol('c')),
|
|
Symbol('a') * Symbol('b') + Symbol('d')
|
|
)
|
|
assert ls1[10] == Assignment(
|
|
Variable(Symbol('s')),
|
|
Symbol('p') * Symbol('q') / Symbol('r')
|
|
)
|
|
assert ls1[11] == Assignment(
|
|
Variable(Symbol('r')),
|
|
Symbol('p') * Symbol('s') + Symbol('q') / Symbol('p')
|
|
)
|
|
|
|
|
|
def test_function():
|
|
src1 = """\
|
|
integer function f(a,b)
|
|
integer :: x, y
|
|
f = x + y
|
|
end function
|
|
"""
|
|
expr1.convert_to_expr(src1, 'f')
|
|
for iter in expr1.return_expr():
|
|
assert isinstance(iter, FunctionDefinition)
|
|
assert iter == FunctionDefinition(
|
|
IntBaseType(String('integer')),
|
|
name=String('f'),
|
|
parameters=(
|
|
Variable(Symbol('a')),
|
|
Variable(Symbol('b'))
|
|
),
|
|
body=CodeBlock(
|
|
Declaration(
|
|
Variable(
|
|
Symbol('a'),
|
|
type=IntBaseType(String('integer')),
|
|
value=Integer(0)
|
|
)
|
|
),
|
|
Declaration(
|
|
Variable(
|
|
Symbol('b'),
|
|
type=IntBaseType(String('integer')),
|
|
value=Integer(0)
|
|
)
|
|
),
|
|
Declaration(
|
|
Variable(
|
|
Symbol('f'),
|
|
type=IntBaseType(String('integer')),
|
|
value=Integer(0)
|
|
)
|
|
),
|
|
Declaration(
|
|
Variable(
|
|
Symbol('x'),
|
|
type=IntBaseType(String('integer')),
|
|
value=Integer(0)
|
|
)
|
|
),
|
|
Declaration(
|
|
Variable(
|
|
Symbol('y'),
|
|
type=IntBaseType(String('integer')),
|
|
value=Integer(0)
|
|
)
|
|
),
|
|
Assignment(
|
|
Variable(Symbol('f')),
|
|
Add(Symbol('x'), Symbol('y'))
|
|
),
|
|
Return(Variable(Symbol('f')))
|
|
)
|
|
)
|
|
|
|
|
|
def test_var():
|
|
expr1.convert_to_expr(src, 'f')
|
|
ls = expr1.return_expr()
|
|
for iter in expr1.return_expr():
|
|
assert isinstance(iter, Declaration)
|
|
assert ls[0] == Declaration(
|
|
Variable(
|
|
Symbol('a'),
|
|
type = IntBaseType(String('integer')),
|
|
value = Integer(0)
|
|
)
|
|
)
|
|
assert ls[1] == Declaration(
|
|
Variable(
|
|
Symbol('b'),
|
|
type = IntBaseType(String('integer')),
|
|
value = Integer(0)
|
|
)
|
|
)
|
|
assert ls[2] == Declaration(
|
|
Variable(
|
|
Symbol('c'),
|
|
type = IntBaseType(String('integer')),
|
|
value = Integer(0)
|
|
)
|
|
)
|
|
assert ls[3] == Declaration(
|
|
Variable(
|
|
Symbol('d'),
|
|
type = IntBaseType(String('integer')),
|
|
value = Integer(0)
|
|
)
|
|
)
|
|
assert ls[4] == Declaration(
|
|
Variable(
|
|
Symbol('p'),
|
|
type = FloatBaseType(String('real')),
|
|
value = Float(0.0)
|
|
)
|
|
)
|
|
assert ls[5] == Declaration(
|
|
Variable(
|
|
Symbol('q'),
|
|
type = FloatBaseType(String('real')),
|
|
value = Float(0.0)
|
|
)
|
|
)
|
|
assert ls[6] == Declaration(
|
|
Variable(
|
|
Symbol('r'),
|
|
type = FloatBaseType(String('real')),
|
|
value = Float(0.0)
|
|
)
|
|
)
|
|
assert ls[7] == Declaration(
|
|
Variable(
|
|
Symbol('s'),
|
|
type = FloatBaseType(String('real')),
|
|
value = Float(0.0)
|
|
)
|
|
)
|
|
|
|
else:
|
|
def test_raise():
|
|
from sympy.parsing.fortran.fortran_parser import ASR2PyVisitor
|
|
raises(ImportError, lambda: ASR2PyVisitor())
|
|
raises(ImportError, lambda: SymPyExpression(' ', mode = 'f'))
|