|
@@ -1,5 +1,6 @@
|
|
|
import unittest
|
|
import unittest
|
|
|
import doctest
|
|
import doctest
|
|
|
|
|
+import new
|
|
|
|
|
|
|
|
import line
|
|
import line
|
|
|
from node import Node as N, Leaf as L
|
|
from node import Node as N, Leaf as L
|
|
@@ -38,6 +39,8 @@ class TestLine(unittest.TestCase):
|
|
|
minus = N('-', l0, plus)
|
|
minus = N('-', l0, plus)
|
|
|
self.assertEquals(generate_line(minus), '1 - (2 + 3)')
|
|
self.assertEquals(generate_line(minus), '1 - (2 + 3)')
|
|
|
|
|
|
|
|
|
|
+ power = N('^', l0, N('_', l1, l2))
|
|
|
|
|
+ self.assertEquals(generate_line(power), '1 ^ 2 _ 3')
|
|
|
power = N('^', l0, N('^', l1, l2))
|
|
power = N('^', l0, N('^', l1, l2))
|
|
|
self.assertEquals(generate_line(power), '1 ^ 2 ^ 3')
|
|
self.assertEquals(generate_line(power), '1 ^ 2 ^ 3')
|
|
|
power = N('^', N('^', l0, l1), l2)
|
|
power = N('^', N('^', l0, l1), l2)
|
|
@@ -63,11 +66,8 @@ class TestLine(unittest.TestCase):
|
|
|
self.assertEquals(generate_line(plus), '1 + 2 + 3')
|
|
self.assertEquals(generate_line(plus), '1 + 2 + 3')
|
|
|
|
|
|
|
|
def test_function(self):
|
|
def test_function(self):
|
|
|
- exp = L('x')
|
|
|
|
|
- inf = L('oo')
|
|
|
|
|
- minus_inf = -L('oo')
|
|
|
|
|
- integral = N('int', exp, minus_inf, inf)
|
|
|
|
|
- self.assertEquals(generate_line(integral), 'int(x, -oo, oo)')
|
|
|
|
|
|
|
+ sin = N('sin', N('*', L(2), L('x')))
|
|
|
|
|
+ self.assertEquals(generate_line(sin), 'sin(2x)')
|
|
|
|
|
|
|
|
def test_mod(self):
|
|
def test_mod(self):
|
|
|
l0, l1 = L(1), L(2)
|
|
l0, l1 = L(1), L(2)
|
|
@@ -77,7 +77,7 @@ class TestLine(unittest.TestCase):
|
|
|
def test_multiplication_identifiers(self):
|
|
def test_multiplication_identifiers(self):
|
|
|
a, b = L('a'), L('b')
|
|
a, b = L('a'), L('b')
|
|
|
self.assertEquals(generate_line(N('*', a, b)), 'ab')
|
|
self.assertEquals(generate_line(N('*', a, b)), 'ab')
|
|
|
- self.assertEquals(generate_line(N('*', a, -b)), 'a(-b)')
|
|
|
|
|
|
|
+ self.assertEquals(generate_line(N('*', a, -b)), 'a * -b')
|
|
|
|
|
|
|
|
def test_multiplication_constant_identifier(self):
|
|
def test_multiplication_constant_identifier(self):
|
|
|
l0, a = L(2), L('a')
|
|
l0, a = L(2), L('a')
|
|
@@ -206,8 +206,14 @@ class TestLine(unittest.TestCase):
|
|
|
neg = -N('-', L(1), L(2))
|
|
neg = -N('-', L(1), L(2))
|
|
|
self.assertEquals(generate_line(neg), '-(1 - 2)')
|
|
self.assertEquals(generate_line(neg), '-(1 - 2)')
|
|
|
|
|
|
|
|
|
|
+ # FIXME: neg = N('+', L(1), N('+', L(1), L(2)))
|
|
|
|
|
+ # FIXME: self.assertEquals(generate_line(neg), '1 + 1 + 2')
|
|
|
|
|
+
|
|
|
|
|
+ neg = N('+', N('+', L(1), L(2)), L(3))
|
|
|
|
|
+ self.assertEquals(generate_line(neg), '1 + 2 + 3')
|
|
|
|
|
+
|
|
|
neg = N('+', L(1), N('+', L(1), L(2)))
|
|
neg = N('+', L(1), N('+', L(1), L(2)))
|
|
|
- self.assertEquals(generate_line(neg), '1 + 1 + 2')
|
|
|
|
|
|
|
+ self.assertEquals(generate_line(neg), '1 + (1 + 2)')
|
|
|
|
|
|
|
|
neg = N('+', L(1), -N('+', L(1), L(2)))
|
|
neg = N('+', L(1), -N('+', L(1), L(2)))
|
|
|
self.assertEquals(generate_line(neg), '1 - (1 + 2)')
|
|
self.assertEquals(generate_line(neg), '1 - (1 + 2)')
|
|
@@ -219,7 +225,7 @@ class TestLine(unittest.TestCase):
|
|
|
self.assertEquals(generate_line(neg), '-4a')
|
|
self.assertEquals(generate_line(neg), '-4a')
|
|
|
|
|
|
|
|
neg = N('*', L(4), -L('a'))
|
|
neg = N('*', L(4), -L('a'))
|
|
|
- self.assertEquals(generate_line(neg), '4(-a)')
|
|
|
|
|
|
|
+ self.assertEquals(generate_line(neg), '4 * -a')
|
|
|
|
|
|
|
|
neg = -N('*', L(4), L(5))
|
|
neg = -N('*', L(4), L(5))
|
|
|
self.assertEquals(generate_line(neg), '-4 * 5')
|
|
self.assertEquals(generate_line(neg), '-4 * 5')
|
|
@@ -234,11 +240,15 @@ class TestLine(unittest.TestCase):
|
|
|
self.assertEquals(generate_line(plus), 'a / b - c / d')
|
|
self.assertEquals(generate_line(plus), 'a / b - c / d')
|
|
|
|
|
|
|
|
mul = N('*', N('+', L('a'), L('b')), -N('+', L('c'), L('d')))
|
|
mul = N('*', N('+', L('a'), L('b')), -N('+', L('c'), L('d')))
|
|
|
- self.assertEquals(generate_line(mul), '(a + b)(-(c + d))')
|
|
|
|
|
|
|
+ self.assertEquals(generate_line(mul), '(a + b) * -(c + d)')
|
|
|
|
|
|
|
|
def test_double_negation(self):
|
|
def test_double_negation(self):
|
|
|
neg = --L(1)
|
|
neg = --L(1)
|
|
|
self.assertEquals(generate_line(neg), '--1')
|
|
self.assertEquals(generate_line(neg), '--1')
|
|
|
|
|
+ neg = --N('*', L('x'), L(2))
|
|
|
|
|
+ self.assertEquals(generate_line(neg), '--x * 2')
|
|
|
|
|
+ neg = --N('^', L('x'), L(2))
|
|
|
|
|
+ self.assertEquals(generate_line(neg), '--x ^ 2')
|
|
|
|
|
|
|
|
def test_divide_fractions(self):
|
|
def test_divide_fractions(self):
|
|
|
a, b, c, d = L('a'), L('b'), L('c'), L('d')
|
|
a, b, c, d = L('a'), L('b'), L('c'), L('d')
|
|
@@ -246,3 +256,85 @@ class TestLine(unittest.TestCase):
|
|
|
self.assertEquals(generate_line(div), 'a / (b / c)')
|
|
self.assertEquals(generate_line(div), 'a / (b / c)')
|
|
|
div = N('/', N('/', a, b), N('/', c, d))
|
|
div = N('/', N('/', a, b), N('/', c, d))
|
|
|
self.assertEquals(generate_line(div), 'a / b / (c / d)')
|
|
self.assertEquals(generate_line(div), 'a / b / (c / d)')
|
|
|
|
|
+
|
|
|
|
|
+ def test_prime(self):
|
|
|
|
|
+ a, b, c, d = L('a'), L('b'), L('c'), L('d')
|
|
|
|
|
+ root = N('*', a, N("'", b))
|
|
|
|
|
+ self.assertEquals(generate_line(root), "a b'")
|
|
|
|
|
+ root = N("'", -a)
|
|
|
|
|
+ self.assertEquals(generate_line(root), "-a'")
|
|
|
|
|
+ root = -N("'", a)
|
|
|
|
|
+ self.assertEquals(generate_line(root), "-(a')")
|
|
|
|
|
+ root = N("'", N('*', a, b))
|
|
|
|
|
+ self.assertEquals(generate_line(root), "(ab)'")
|
|
|
|
|
+ root = N("'", N('/', a, b))
|
|
|
|
|
+
|
|
|
|
|
+ def test_function(self):
|
|
|
|
|
+ root = N('sin', L('x'))
|
|
|
|
|
+ self.assertEquals(generate_line(root), 'sin x')
|
|
|
|
|
+ root = N('sin', N('+', L('x'), L(2)))
|
|
|
|
|
+ self.assertEquals(generate_line(root), 'sin(x + 2)')
|
|
|
|
|
+ root = N('dummyfunc', L('x'), L(2))
|
|
|
|
|
+ self.assertEquals(generate_line(root), 'dummyfunc(x, 2)')
|
|
|
|
|
+
|
|
|
|
|
+ def test_no_spacing(self):
|
|
|
|
|
+ root = N('+', L('x'), L(2), no_spacing=True)
|
|
|
|
|
+ self.assertEquals(generate_line(root), 'x+2')
|
|
|
|
|
+
|
|
|
|
|
+ def test_explicit_parentheses(self):
|
|
|
|
|
+ root = N('[]', L('x'))
|
|
|
|
|
+ self.assertEquals(generate_line(root), '[x]')
|
|
|
|
|
+ root = N('()', L('x'))
|
|
|
|
|
+ self.assertEquals(generate_line(root), '(x)')
|
|
|
|
|
+ root = N('{}', L('x'))
|
|
|
|
|
+ self.assertEquals(generate_line(root), '{x}')
|
|
|
|
|
+
|
|
|
|
|
+ root = N('^', N('[]', N('+', L('x'), L('y'))), L(2))
|
|
|
|
|
+ self.assertEquals(generate_line(root), '[x + y] ^ 2')
|
|
|
|
|
+
|
|
|
|
|
+ def test_abs(self):
|
|
|
|
|
+ root = N('||', L('x'))
|
|
|
|
|
+ self.assertEquals(generate_line(root), '|x|')
|
|
|
|
|
+ root = N('||', N('+', L('x'), L(1)))
|
|
|
|
|
+ self.assertEquals(generate_line(root), '|x + 1|')
|
|
|
|
|
+ root = N('ln', N('||', L('x')))
|
|
|
|
|
+ self.assertEquals(generate_line(root), 'ln|x|')
|
|
|
|
|
+
|
|
|
|
|
+ def test_postprocess_str(self):
|
|
|
|
|
+ root = N('int', N('^', L('x'), L(2)), L('x'))
|
|
|
|
|
+ root.arity = lambda: 1
|
|
|
|
|
+ root.postprocess_str = lambda s: s + ' dx'
|
|
|
|
|
+ self.assertEquals(generate_line(root), 'int x ^ 2 dx')
|
|
|
|
|
+
|
|
|
|
|
+ def test_concat_with_negation(self):
|
|
|
|
|
+ root = N('*', -L(2), L('x'))
|
|
|
|
|
+ self.assertEquals(generate_line(root), '(-2)x')
|
|
|
|
|
+ root = N('*', N('*', L(3), -L(2)), L('x'))
|
|
|
|
|
+ self.assertEquals(generate_line(root), '3 * -2x')
|
|
|
|
|
+ root = N('*', L(3), -L(2), L('x'))
|
|
|
|
|
+ self.assertEquals(generate_line(root), '3 * -2 * x')
|
|
|
|
|
+
|
|
|
|
|
+ def test_first_child_negation(self):
|
|
|
|
|
+ root = N('*', -L(1), L(2))
|
|
|
|
|
+ self.assertEquals(generate_line(root), '(-1)2')
|
|
|
|
|
+ root = -N('*', L(1), L(2))
|
|
|
|
|
+ self.assertEquals(generate_line(root), '-1 * 2')
|
|
|
|
|
+ root = N('/', -L(1), L(2))
|
|
|
|
|
+ self.assertEquals(generate_line(root), '(-1) / 2')
|
|
|
|
|
+ root = -N('/', L(1), L(2))
|
|
|
|
|
+ self.assertEquals(generate_line(root), '-1 / 2')
|
|
|
|
|
+
|
|
|
|
|
+ def test_postfix_brackets(self):
|
|
|
|
|
+ root = N('*', L('x'), N("'", N('[]', N('^', L('x'), L(2)))))
|
|
|
|
|
+ self.assertEquals(generate_line(root), "x[x ^ 2]'")
|
|
|
|
|
+
|
|
|
|
|
+ def test_custom_line(self):
|
|
|
|
|
+ root = N('*', L(1), L(2))
|
|
|
|
|
+ root.custom_line = lambda: 'test'
|
|
|
|
|
+ self.assertEquals(generate_line(root), 'test')
|
|
|
|
|
+
|
|
|
|
|
+ def test_preprocess_str_exp(self):
|
|
|
|
|
+ root = N('-', L(1))
|
|
|
|
|
+ def addbrackets(self): self[0] = N('[]', self[0])
|
|
|
|
|
+ root.preprocess_str_exp = new.instancemethod(addbrackets, root)
|
|
|
|
|
+ self.assertEquals(generate_line(root), '-[1]')
|