123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406 |
- 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'))
|