test_graph.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. # vim: set fileencoding=utf-8 :
  2. import unittest
  3. from node import Node, Leaf
  4. from graph import generate_graph
  5. class TestGraph(unittest.TestCase):
  6. def setUp(self):
  7. self.l0, self.l1, self.multi = Leaf(0), Leaf(1), Leaf('test')
  8. def tearDown(self):
  9. pass
  10. def test_simple_unary(self):
  11. uminus = Node('-', self.l1)
  12. g = generate_graph(uminus)
  13. self.assertEqualGraphs(g, """
  14. -
  15. 1
  16. """)
  17. def test_simple_binary(self):
  18. plus = Node('+', self.l0, self.l1)
  19. g = generate_graph(plus)
  20. self.assertEqualGraphs(g, """
  21. +
  22. ╭┴╮
  23. 0 1
  24. """)
  25. def test_multichar_unary(self):
  26. uminus = Node('-', self.multi)
  27. g = generate_graph(uminus)
  28. self.assertEqualGraphs(g, """
  29. -
  30. test
  31. """)
  32. def test_multichar_binary(self):
  33. plus = Node('+', self.multi, self.l1)
  34. g = generate_graph(plus)
  35. self.assertEqualGraphs(g, """
  36. +
  37. ╭──┴╮
  38. test 1
  39. """)
  40. def test_ternary(self):
  41. exp = Leaf('x')
  42. inf = Leaf('o')
  43. minus_inf = Node('-', Leaf('L'))
  44. integral = Node('n', exp, minus_inf, inf)
  45. g = generate_graph(integral)
  46. self.assertEqualGraphs(g, """
  47. n
  48. ╭─┼─╮
  49. x - o
  50. L
  51. """)
  52. def test_ternary_multichar(self):
  53. exp = Leaf('x')
  54. inf = Leaf('oo')
  55. minus_inf = Node('-', Leaf('LL'))
  56. integral = Node('int', exp, minus_inf, inf)
  57. g = generate_graph(integral)
  58. self.assertEqualGraphs(g, """
  59. int
  60. ╭─┼──╮
  61. x - oo
  62. LL
  63. """)
  64. def test_ternary_multichar_middle_right(self):
  65. exp = Leaf('x')
  66. minus_99 = Node('-', Leaf('99'))
  67. minus_inf = Node('-', Leaf('oo'))
  68. integral = Node('int', exp, minus_inf, minus_99)
  69. g = generate_graph(integral)
  70. self.assertEqualGraphs(g, """
  71. int
  72. ╭─┼──╮
  73. x - -
  74. │ │
  75. oo 99
  76. """)
  77. def test_ternary_multichar_right(self):
  78. exp = Leaf('x')
  79. minus_99 = Node('-', Leaf('99'))
  80. ten = Leaf('10')
  81. integral = Node('int', exp, ten, minus_99)
  82. g = generate_graph(integral)
  83. self.assertEqualGraphs(g, """
  84. int
  85. ╭─┼──╮
  86. x 10 -
  87. 99
  88. """)
  89. def test_quaternary(self):
  90. a, b, c, d = Leaf(0), Leaf(1), Leaf(2), Leaf(3)
  91. sum_node = Node('sum', a, b, c, d)
  92. g = generate_graph(sum_node)
  93. self.assertEqualGraphs(g, """
  94. sum
  95. ╭─┬┴┬─╮
  96. 0 1 2 3
  97. """)
  98. def test_quinary(self):
  99. a, b, c, d, e = Leaf(0), Leaf(1), Leaf(2), Leaf(3), Leaf(4)
  100. sum_node = Node('sum', a, b, c, d, e)
  101. g = generate_graph(sum_node)
  102. self.assertEqualGraphs(g, """
  103. sum
  104. ╭─┬─┼─┬─╮
  105. 0 1 2 3 4
  106. """)
  107. def test_expression_small(self):
  108. l0 = Leaf(3)
  109. l1 = Leaf(4)
  110. l2 = Leaf(5)
  111. l3 = Leaf(7)
  112. n0 = Node('+', l0, l1)
  113. n1 = Node('+', l2, l3)
  114. n2 = Node('*', n0, n1)
  115. g = generate_graph(n2)
  116. self.assertEqualGraphs(g, """
  117. *
  118. ╭─┴─╮
  119. + +
  120. ╭┴╮ ╭┴╮
  121. 3 4 5 7
  122. """)
  123. def test_expression_larger(self):
  124. a = Leaf(3)
  125. b = Leaf(4)
  126. c = Leaf(5)
  127. d = Leaf(7)
  128. ac = Node('*', a, c)
  129. ad = Node('*', a, d)
  130. bc = Node('*', b, c)
  131. bd = Node('*', b, d)
  132. root = Node('+', Node('+', Node('+', ac, ad), bc), bd)
  133. g = generate_graph(root)
  134. self.assertEqualGraphs(g, """
  135. +
  136. ╭───┴─╮
  137. + *
  138. ╭───┴─╮ ╭┴╮
  139. + * 4 7
  140. ╭─┴─╮ ╭┴╮
  141. * * 4 5
  142. ╭┴╮ ╭┴╮
  143. 3 5 3 7
  144. """)
  145. def strip(self, s):
  146. return s.replace('\n ', '\n')[1:-1]
  147. def assertEqualGraphs(self, g, expect):
  148. expect = self.strip(expect)
  149. if g != expect: # pragma: nocover
  150. print 'Expected:'
  151. print expect
  152. print 'Got:'
  153. print g
  154. raise AssertionError('Graph does not match expected value')