test_graph.py 4.5 KB

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