from sympy.core import Symbol, Float, Rational, Integer, I
from sympy.functions import exp, factorial

from sympy.parsing.sympy_parser import (
    parse_expr, standard_transformations, rationalize, TokenError
)


def test_sympy_parser():
    x = Symbol('x')
    inputs = {
        '2*x': 2 * x,
        '3.00': Float(3),
        '22/7': Rational(22, 7),
        '2+3j': 2 + 3*I,
        'exp(x)': exp(x),
        'x!': factorial(x),
        '3.[3]': Rational(10, 3),
        '10!': 3628800,
        '(_kern)': Symbol('_kern'),
        '-(2)': -Integer(2),
        '[-1, -2, 3]': [Integer(-1), Integer(-2), Integer(3)]
    }
    for text, result in inputs.items():
        assert parse_expr(text) == result


def test_rationalize():
    inputs = {
        '0.123': Rational(123, 1000)
    }
    transformations = standard_transformations + (rationalize,)
    for text, result in inputs.items():
        assert parse_expr(text, transformations=transformations) == result


def test_factorial_fail():
    inputs = ['x!!!', 'x!!!!', '(!)']

    for text in inputs:
        try:
            parse_expr(text)
            assert False
        except TokenError:
            assert True

@@ -611,16 +611,324 @@
 eger(3)%5D
+,%0A        'Symbol(%22x%22).free_symbols': x.free_symbols,%0A        %22S('S(3).n(n=3)')%22: 3.00,%0A        'factorint(12, visual=True)': Mul(%0A            Pow(2, 2, evaluate=False),%0A            Pow(3, 1, evaluate=False),%0A            evaluate=False),%0A        'Limit(sin(x), x, 0, dir=%22-%22)': Limit(sin(x), x, 0, dir='-'),%0A
 %0A    %7D%0A 

Add tests for keyword args and attributes