PageRenderTime 144ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/bfc/tests/cond_test.py

https://bitbucket.org/lifthrasiir/esotope-bfc
Python | 204 lines | 178 code | 25 blank | 1 comment | 25 complexity | 0f452b112480b96213cd6a318c32e38d MD5 | raw file
  1. # This is a part of Esotope Brainfuck Compiler.
  2. from bfc.expr import *
  3. from bfc.cond import *
  4. class TestCondOps:
  5. def test_always_never(self):
  6. always = Always()
  7. never = Never()
  8. assert always and not never
  9. assert always == Always()
  10. assert always != never
  11. assert Never() == never
  12. assert ~always == never and always == ~never
  13. assert always.references() == frozenset()
  14. assert always.movepointer(42) == always
  15. assert always.withmemory({0: 42}) == always
  16. assert never.references() == frozenset()
  17. assert never.movepointer(42) == never
  18. assert never.withmemory({0: 42}) == never
  19. def test_memequality(self):
  20. m0e2 = MemEqual(0, 2); m0ne2 = MemNotEqual(0, 2)
  21. m0e4 = MemEqual(0, 4); m0ne4 = MemNotEqual(0, 4)
  22. m1e4 = MemEqual(1, 4); m1ne4 = MemNotEqual(1, 4)
  23. assert m0e2 and m0ne2 and m0e4 and m0ne4 and m1e4 and m1ne4
  24. assert m0e2 != m0e4 != m1e4 != m1ne4 != m0ne4 != m0ne2
  25. assert ~m0e2 == m0ne2 and ~m0e4 == m0ne4 and ~m1e4 == m1ne4
  26. assert m0e2 == ~m0ne2 and m0e4 == ~m0ne4 and m1e4 == ~m1ne4
  27. assert m0e2 == MemEqual(0, 2) and m0ne2 == MemNotEqual(0, 2)
  28. assert type(m1e4) is MemEqual and type(m1ne4) is MemNotEqual
  29. assert m1e4.target == m1ne4.target == 1
  30. assert m1e4.expr == m1ne4.expr == Expr[1]
  31. assert m0e4.references() == m0ne4.references() == frozenset([0])
  32. assert m0e4.movepointer(1) == m1e4 and m0ne4.movepointer(1) == m1ne4
  33. assert m1e4.references() == m1ne4.references() == frozenset([1])
  34. assert m1e4.movepointer(-1) == m0e4 and m1ne4.movepointer(-1) == m0ne4
  35. assert m0e4.withmemory({0: 4}) == m0ne4.withmemory({0: 7}) == Always()
  36. assert m0e4.withmemory({0: 7}) == m0ne4.withmemory({0: 4}) == Never()
  37. assert m0e4.withmemory({0: Expr[3] * Expr[4]}) not in (Always(), Never())
  38. assert m0ne4.withmemory({0: Expr[3] * Expr[4]}) not in (Always(), Never())
  39. def test_equality(self):
  40. assert NotEqual(5, 6) == Equal(6, 6) == Always()
  41. assert NotEqual(6, 6) == Equal(5, 6) == Never()
  42. assert NotEqual(Expr[1] * 4 + 3, -13) == NotEqual(Expr[1] * 4, -16) \
  43. == NotEqual(Expr[1], -4)
  44. assert Equal(Expr[1] * 4 + 3, -13) == Equal(Expr[1] * 4, -16) \
  45. == Equal(Expr[1], -4)
  46. assert ~NotEqual(Expr[1] * 4 + 3, -13) == Equal(Expr[1] * 4 + 3, -13)
  47. assert NotEqual(Expr[1] * 4 + 3, -13) == ~Equal(Expr[1] * 4 + 3, -13)
  48. assert NotEqual(Expr[1] * 4 + 3, 5) == NotEqual(Expr[1] * 4, 2) == Always()
  49. assert Equal(Expr[1] * 4 + 3, 5) == Equal(Expr[1] * 4, 2) == Never()
  50. assert NotEqual(Expr[1] / 8, 6) == NotEqual(Expr[1], 48)
  51. assert NotEqual(Expr[1] / 8, 0) == NotEqual(Expr[1], 0)
  52. assert Equal(Expr[1] / 8, 6) == Equal(Expr[1], 48)
  53. assert Equal(Expr[1] / 8, 0) == Equal(Expr[1], 0)
  54. m6p3e5 = Equal(Expr[6] + 3, 5); m6p3ne5 = NotEqual(Expr[6] + 3, 5)
  55. assert type(m6p3e5) is MemEqual and type(m6p3ne5) is MemNotEqual
  56. assert m6p3e5 == MemEqual(6, 2) and m6p3ne5 == MemNotEqual(6, 2)
  57. mm7e5 = MemEqual(Expr[7], 5); mm7ne5 = MemNotEqual(Expr[7], 5)
  58. assert type(mm7e5) is Equal and type(mm7ne5) is NotEqual
  59. assert mm7e5.expr == mm7ne5.expr == Expr[Expr[7]]
  60. assert mm7e5.references() == mm7ne5.references() == frozenset([7, Expr[7]])
  61. assert mm7e5.movepointer(1) == Equal(Expr[Expr[8]+1], 5)
  62. assert mm7ne5.movepointer(1) == NotEqual(Expr[Expr[8]+1], 5)
  63. assert mm7e5.movepointer(-1) == Equal(Expr[Expr[6]-1], 5)
  64. assert mm7ne5.movepointer(-1) == NotEqual(Expr[Expr[6]-1], 5)
  65. assert mm7e5.withmemory({7:9}) == MemEqual(9, 5)
  66. assert mm7ne5.withmemory({7:9}) == MemNotEqual(9, 5)
  67. assert type(mm7e5.withmemory({7:9})) is MemEqual
  68. assert type(mm7ne5.withmemory({7:9})) is MemNotEqual
  69. def test_range(self):
  70. assert Range(Expr[5]) == Never()
  71. assert Range(Expr[5], 15) == MemEqual(5, 15)
  72. assert Range(Expr[5], (None,14), (16,None)) == MemNotEqual(5, 15)
  73. assert Range(Expr[5], (None,10), (5,None)) == Always()
  74. m3pm4 = Expr[3+Expr[4]]; m6pm7 = Expr[6+Expr[7]]
  75. m3pm4lt5 = Less(m3pm4, 5); m6pm7lt5 = Less(m6pm7, 5)
  76. m3pm4le5 = LessOrEqual(m3pm4, 5); m6pm7le5 = LessOrEqual(m6pm7, 5)
  77. m3pm4e5 = Equal(m3pm4, 5); m6pm7e5 = Equal(m6pm7, 5)
  78. m3pm4ge5 = GreaterOrEqual(m3pm4, 5); m6pm7ge5 = GreaterOrEqual(m6pm7, 5)
  79. m3pm4gt5 = Greater(m3pm4, 5); m6pm7gt5 = Greater(m6pm7, 5)
  80. assert m3pm4lt5 and m3pm4le5 and m3pm4e5 and m3pm4ge5 and m3pm4gt5
  81. assert m3pm4lt5 == LessOrEqual(m3pm4, 4) and m3pm4gt5 == GreaterOrEqual(m3pm4, 6)
  82. assert m3pm4lt5 == ~m3pm4ge5 and ~m3pm4lt5 == m3pm4ge5
  83. assert m3pm4le5 == ~m3pm4gt5 and ~m3pm4le5 == m3pm4gt5
  84. assert (m3pm4lt5.references() == m3pm4le5.references() == m3pm4e5.references() ==
  85. m3pm4ge5.references() == m3pm4gt5.references() == m3pm4.references())
  86. assert m3pm4lt5.movepointer(3) == m6pm7lt5
  87. assert m3pm4le5.movepointer(3) == m6pm7le5
  88. assert m3pm4ge5.movepointer(3) == m6pm7ge5
  89. assert m3pm4gt5.movepointer(3) == m6pm7gt5
  90. assert m3pm4lt5.withmemory({4: 5, 8: 15, 15: 23}) == Never()
  91. assert m3pm4le5.withmemory({4: 5, 8: 15, 15: 23}) == Never()
  92. assert m3pm4ge5.withmemory({4: 5, 8: 15, 15: 23}) == Always()
  93. assert m3pm4gt5.withmemory({4: 5, 8: 15, 15: 23}) == Always()
  94. m7e13579 = Range(Expr[7], 1, 3, 5, 7, 9)
  95. assert m7e13579
  96. assert m7e13579.expr == Expr[7]
  97. assert m7e13579.ranges == ((1,1), (3,3), (5,5), (7,7), (9,9))
  98. assert ~m7e13579 == Range(Expr[7], (None,0), 2, 4, 6, 8, (10,None))
  99. assert m7e13579 == Range(Expr[7]+1, 2, 4, 6, 8, 10)
  100. assert m7e13579 == Range(Expr[7]*2+3, 9, 5, 13, 21, 17)
  101. assert m7e13579 == Range(-Expr[7]*2+3, 1, -3, -7, -11, -15)
  102. assert m7e13579 == Range((Expr[7]-1)/2*7, 0, 7, 14, 21, 28)
  103. def test_conjunction(self):
  104. assert (Always() & Always()) == Always()
  105. assert ((Always() & Never()) == (Never() & Always()) ==
  106. (Never() & Never()) == Never())
  107. m1lt5 = Less(Expr[1], 5); m1le5 = LessOrEqual(Expr[1], 5)
  108. m1e5 = Equal(Expr[1], 5); m1ne5 = NotEqual(Expr[1], 5)
  109. m1ge5 = GreaterOrEqual(Expr[1], 5); m1gt5 = Greater(Expr[1], 5)
  110. assert (m1lt5 & m1le5) == (m1ne5 & m1le5) == m1lt5
  111. assert (m1gt5 & m1ge5) == (m1ne5 & m1ge5) == m1gt5
  112. assert (m1le5 & m1ge5) == m1e5
  113. assert (m1lt5 & m1ge5) == (m1gt5 & m1le5) == (m1lt5 & m1gt5) == Never()
  114. assert (m1e5 & m1ne5) == Never()
  115. assert ((Range(Expr[3], (None,-5), (0,4), (7,9), (13,25), (48,None)) &
  116. Range(Expr[3], (None,1), (6,12), 21, (37,49), (53,68), (70,None))) ==
  117. Range(Expr[3], (None,-5), (0,1), (7,9), 21, (48,49), (53,68), (70,None)))
  118. m3e5andm4ne7 = MemEqual(3, 5) & MemNotEqual(4, 7)
  119. assert ~m3e5andm4ne7 == (MemNotEqual(3, 5) | MemEqual(4, 7))
  120. assert m3e5andm4ne7.references() == frozenset([3, 4])
  121. assert m3e5andm4ne7.movepointer(-1) == (MemNotEqual(3, 7) & MemEqual(2, 5))
  122. assert m3e5andm4ne7.withmemory({3: 5}) == MemNotEqual(4, 7)
  123. assert m3e5andm4ne7.withmemory({3: 5, 4: 6}) == Always()
  124. assert m3e5andm4ne7.withmemory({3: 8}) == Never()
  125. def test_disjunction(self):
  126. assert ((Always() | Always()) == (Always() | Never()) ==
  127. (Never() | Always()) == Always())
  128. assert (Never() | Never()) == Never()
  129. m1lt5 = Less(Expr[1], 5); m1le5 = LessOrEqual(Expr[1], 5)
  130. m1e5 = Equal(Expr[1], 5); m1ne5 = NotEqual(Expr[1], 5)
  131. m1ge5 = GreaterOrEqual(Expr[1], 5); m1gt5 = Greater(Expr[1], 5)
  132. assert (m1lt5 | m1le5) == (m1lt5 | m1e5) == m1le5
  133. assert (m1gt5 | m1ge5) == (m1gt5 | m1e5) == m1ge5
  134. assert (m1lt5 | m1gt5) == m1ne5
  135. assert (m1le5 | m1ge5) == (m1lt5 | m1e5 | m1gt5) == Always()
  136. assert (m1e5 | m1ne5) == Always()
  137. assert (m1e5 | Equal(Expr[1], 11)) == Range(Expr[1], 5, 11)
  138. assert type(m1e5 | Equal(Expr[2], 5)) is Disjunction
  139. assert ((Range(Expr[3], (None,-5), (0,4), (7,9), (13,25), (48,None)) |
  140. Range(Expr[3], (None,1), (6,12), 21, (37,49), (53,68), (70,None))) ==
  141. Range(Expr[3], (None,4), (6,25), (37,None)))
  142. m3e5orm4ne7 = MemEqual(3, 5) | MemNotEqual(4, 7)
  143. assert ~m3e5orm4ne7 == (MemNotEqual(3, 5) & MemEqual(4, 7))
  144. assert m3e5orm4ne7.references() == frozenset([3, 4])
  145. assert m3e5orm4ne7.movepointer(-1) == (MemNotEqual(3, 7) | MemEqual(2, 5))
  146. assert m3e5orm4ne7.withmemory({3: 5}) == Always()
  147. assert m3e5orm4ne7.withmemory({3: 8}) == MemNotEqual(4, 7)
  148. assert m3e5orm4ne7.withmemory({3: 8, 4: 7}) == Never()
  149. def test_compactrepr(self):
  150. assert Always().compactrepr() == 'True'
  151. assert Never().compactrepr() == 'False'
  152. assert MemEqual(-1, 7).compactrepr() == '{-1}==7'
  153. assert MemNotEqual(-1, 7).compactrepr() == '{-1}!=7'
  154. assert Equal(Expr[3+Expr[4]], 7).compactrepr() in ('{3+{4}}==7', '{{4}+3}==7')
  155. assert Equal(Expr[3+Expr[4]], 0).compactrepr() in ('!{3+{4}}', '!{{4}+3}')
  156. assert Equal(Expr[3]+Expr[4], 0).compactrepr() in ('!({3}+{4})', '!({4}+{3})')
  157. assert NotEqual(Expr[3+Expr[4]], 7).compactrepr() in ('{3+{4}}!=7', '{{4}+3}!=7')
  158. assert NotEqual(Expr[3+Expr[4]], 0).compactrepr() in ('{3+{4}}', '{{4}+3}')
  159. assert NotEqual(Expr[3]+Expr[4], 0).compactrepr() in ('{3}+{4}', '{4}+{3}')
  160. assert Range(Expr[5], 1, 3, 5, 7, 9).compactrepr() == '{5}~(1,3,5,7,9)'
  161. assert (~Range(Expr[5], 1, 3, 5, 7, 9)).compactrepr() == '{5}~(..0,2,4,6,8,10..)'
  162. assert Range(Expr[5], (1,12), (16,30)).compactrepr() == '{5}~(1..12,16..30)'
  163. assert Range(Expr[5], (None,8)).compactrepr() == '{5}<=8'
  164. assert Range(Expr[5], (4,8)).compactrepr() == '4<={5}<=8'
  165. assert Range(Expr[5], (4,None)).compactrepr() == '4<={5}'
  166. assert ((MemEqual(1,2) | MemEqual(2,3) | MemEqual(3,4)).compactrepr() in
  167. ('{1}==2 || {2}==3 || {3}==4', '{1}==2 || {3}==4 || {2}==3',
  168. '{2}==3 || {1}==2 || {3}==4', '{2}==3 || {3}==4 || {1}==2',
  169. '{3}==4 || {1}==2 || {2}==3', '{3}==4 || {2}==3 || {1}==2'))
  170. assert ((MemEqual(1,2) & MemEqual(2,3) & MemEqual(3,4)).compactrepr() in
  171. ('{1}==2 && {2}==3 && {3}==4', '{1}==2 && {3}==4 && {2}==3',
  172. '{2}==3 && {1}==2 && {3}==4', '{2}==3 && {3}==4 && {1}==2',
  173. '{3}==4 && {1}==2 && {2}==3', '{3}==4 && {2}==3 && {1}==2'))
  174. assert (((MemEqual(1,2) | MemEqual(2,3)) & MemEqual(3,4)).compactrepr() in
  175. ('({1}==2 || {2}==3) && {3}==4', '({2}==3 || {1}==2) && {3}==4',
  176. '{3}==4 && ({1}==2 || {2}==3)', '{3}==4 && ({2}==3 || {1}==2)'))
  177. assert (((MemEqual(1,2) & MemEqual(2,3)) | MemEqual(3,4)).compactrepr() in
  178. ('({1}==2 && {2}==3) || {3}==4', '({2}==3 && {1}==2) || {3}==4',
  179. '{3}==4 || ({1}==2 && {2}==3)', '{3}==4 || ({2}==3 && {1}==2)'))