test_statement.py 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. import unittest
  2. from src.statement import Statement as S, Block as B
  3. class TestStatement(unittest.TestCase):
  4. def setUp(self):
  5. self.statement = S('command', 'foo', '$1')
  6. self.block = B([S('command', 'foo'), \
  7. S('comment', 'bar'),
  8. S('command', 'baz')])
  9. def tearDown(self):
  10. del self.block
  11. def test_getitem(self):
  12. self.assertEqual(self.statement[0], '$1')
  13. def test_setitem(self):
  14. self.statement[0] = '$2'
  15. self.assertEqual(self.statement[0], '$2')
  16. def test_eq(self):
  17. self.assertTrue(S('command', 'foo') == S('command', 'foo'))
  18. self.assertFalse(S('command', 'foo') == S('command', 'bar'))
  19. def test_stype(self):
  20. self.assertTrue(S('comment', 'foo', inline=False).is_comment())
  21. self.assertTrue(S('directive', 'foo').is_directive())
  22. self.assertTrue(S('label', 'foo').is_label())
  23. self.assertTrue(S('command', 'foo').is_command())
  24. self.assertFalse(S('command', 'foo').is_comment())
  25. self.assertFalse(S('label', 'foo').is_directive())
  26. self.assertFalse(S('comment', 'foo', inline=False).is_label())
  27. self.assertFalse(S('directive', 'foo').is_command())
  28. def test_has_inline_comment(self):
  29. self.assertTrue(S('comment', 'foo', comment='a').has_inline_comment())
  30. self.assertFalse(S('comment', 'foo', comment='').has_inline_comment())
  31. self.assertFalse(S('comment', 'foo').has_inline_comment())
  32. def test_jump_target(self):
  33. self.assertEqual(S('command', 'j', 'foo').jump_target(), 'foo')
  34. self.assertRaises(Exception, S('command', 'foo').jump_target)
  35. def test_iter(self):
  36. self.assertEqual(self.block.statements, list(self.block))
  37. def test_read(self):
  38. self.assertEqual(self.block.read(), S('command', 'foo'))
  39. self.assertEqual(self.block.read(), S('comment', 'bar'))
  40. self.assertEqual(self.block.read(), S('command', 'baz'))
  41. def test_end(self):
  42. self.assertFalse(self.block.end())
  43. self.block.read()
  44. self.block.read()
  45. self.block.read()
  46. self.assertTrue(self.block.end())
  47. def test_peek(self):
  48. self.assertEqual(self.block.peek(), S('command', 'foo'))
  49. self.assertEqual(self.block.peek(2), [S('command', 'foo'), \
  50. S('comment', 'bar')])
  51. self.block.read()
  52. self.assertEqual(self.block.peek(), S('comment', 'bar'))
  53. def test_replace(self):
  54. self.block.read()
  55. self.block.replace(1, [S('command', 'foobar')])
  56. self.assertEqual(self.block.pointer, 1)
  57. self.assertEqual(self.block.statements, [S('command', 'foobar'), \
  58. S('comment', 'bar'), \
  59. S('command', 'baz')])
  60. def test_apply_filter(self):
  61. self.block.apply_filter(lambda s: s.is_command())
  62. self.assertEqual(self.block.statements, [S('command', 'foo'), \
  63. S('command', 'baz')])
  64. def test_is_shift(self):
  65. self.assertTrue(S('command', 'sll').is_shift())
  66. self.assertFalse(S('command', 'foo').is_shift())
  67. self.assertFalse(S('label', 'sll').is_shift())
  68. def test_is_load(self):
  69. self.assertTrue(S('command', 'lw').is_load())
  70. self.assertFalse(S('command', 'foo').is_load())
  71. self.assertFalse(S('label', 'lw').is_load())
  72. def test_is_arith(self):
  73. self.assertTrue(S('command', 'addu', '$1', '$2', '$3').is_arith())
  74. self.assertFalse(S('command', 'foo').is_arith())
  75. self.assertFalse(S('label', 'addu').is_arith())
  76. def test_get_def_true(self):
  77. a = set()
  78. a.add('a')
  79. self.assertEqual(S('command', 'move', 'a', 'b').get_def(), a)
  80. self.assertEqual(S('command', 'subu', 'a', 'b', 'c').get_def(), a)
  81. self.assertEqual(S('command', 'addu', 'a', 'b', 'c').get_def(), a)
  82. self.assertEqual(S('command', 'div', 'a', 'b', 'c').get_def(), a)
  83. self.assertEqual(S('command', 'sll', 'a', 'b', 'c').get_def(), a)
  84. self.assertEqual(S('command', 'srl', 'a', 'b', 'c').get_def(), a)
  85. self.assertEqual(S('command', 'la', 'a', '16($fp)').get_def(), a)
  86. self.assertEqual(S('command', 'li', 'a', '16($fp)').get_def(), a)
  87. self.assertEqual(S('command', 'lw', 'a', 'b').get_def(), a)
  88. self.assertEqual(S('command', 'l.d', 'a', 'b').get_def(), a)
  89. self.assertEqual(S('command', 'add.d', 'a', 'b', 'c').get_def(), a)
  90. self.assertEqual(S('command', 'neg.d', 'a', 'b').get_def(), a)
  91. self.assertEqual(S('command', 'sub.d', 'a', 'b', 'c').get_def(), a)
  92. self.assertEqual(S('command', 'slt', 'a', 'b').get_def(), a)
  93. self.assertEqual(S('command', 'xori', 'a', 'b', '0x0000').get_def(), a)
  94. self.assertEqual(S('command', 'mov.d', 'a', 'b').get_def(), a)
  95. self.assertEqual(S('command', 'dmfc1', 'a', '$f0').get_def(), a)
  96. self.assertEqual(S('command', 'mtc1', 'b', 'a').get_def(), a)
  97. self.assertEqual(S('command', 'trunc.w.d', 'a', 'b', 'c').get_def(), a)
  98. def test_get_def_false(self):
  99. arg = set()
  100. self.assertEqual(S('command', 'bne', 'a', 'b', 'L1').get_def(), arg)
  101. self.assertEqual(S('command', 'beq', 'a', 'b', 'L1').get_def(), arg)
  102. def test_get_use_true(self):
  103. arg1 = set()
  104. arg1.add('$1')
  105. arg2 = set()
  106. arg2.add('$1')
  107. arg2.add('$2')
  108. arg3 = set()
  109. arg3.add('n.7')
  110. self.assertEqual(S('command', 'addu', '$3', '$1', '$2').get_use(), \
  111. arg2)
  112. self.assertEqual(S('command', 'subu', '$3', '$1', '$2').get_use(), \
  113. arg2)
  114. self.assertEqual(S('command', 'mult', '$1', '$2').get_use(), arg2)
  115. self.assertEqual(S('command', 'div', '$3', '$1', '$2').get_use(), arg2)
  116. self.assertEqual(S('command', 'move', '$2', '$1').get_use(), arg1)
  117. self.assertEqual(S('command', 'beq', '$1', '$2', '$L1').get_use(), \
  118. arg2)
  119. self.assertEqual(S('command', 'bne', '$1', '$2', '$L1').get_use(), \
  120. arg2)
  121. self.assertEqual(S('command', 'sll', '$2', '$1', 2).get_use(), arg1)
  122. self.assertEqual(S('command', 'lb', '$2', '10($1)').get_use(), arg1)
  123. self.assertEqual(S('command', 'lw', '$2', '10($1)').get_use(), arg1)
  124. self.assertEqual(S('command', 'la', '$2', '10($1)').get_use(), arg1)
  125. self.assertEqual(S('command', 'lb', '$2', 'n.7').get_use(), arg3)
  126. self.assertEqual(S('command', 'lbu', '$2', '10($1)').get_use(), arg1)
  127. self.assertEqual(S('command', 'l.d', '$2', '10($1)').get_use(), arg1)
  128. self.assertEqual(S('command', 's.d', '$1', '10($2)').get_use(), \
  129. arg2)
  130. self.assertEqual(S('command', 's.s', '$1', '10($2)').get_use(), \
  131. arg2)
  132. self.assertEqual(S('command', 'sw', '$1', '10($2)').get_use(), \
  133. arg2)
  134. self.assertEqual(S('command', 'sb', '$1', '10($2)').get_use(), \
  135. arg2)
  136. self.assertEqual(S('command', 'mtc1', '$1', '$2').get_use(), arg1)
  137. self.assertEqual(S('command', 'add.d', '$3', '$1', '$2').get_use(), \
  138. arg2)
  139. self.assertEqual(S('command', 'sub.d', '$3', '$1', '$2').get_use(), \
  140. arg2)
  141. self.assertEqual(S('command', 'div.d', '$3', '$1', '$2').get_use(), \
  142. arg2)
  143. self.assertEqual(S('command', 'mul.d', '$3', '$1', '$2').get_use(), \
  144. arg2)
  145. self.assertEqual(S('command', 'neg.d', '$2', '$1').get_use(), arg1)
  146. self.assertEqual(S('command', 'abs.d', '$2', '$1').get_use(), arg1)
  147. self.assertEqual(S('command', 'dsz', '10($1)', '$2').get_use(), arg1)
  148. self.assertEqual(S('command', 'dsw', '$1', '10($2)').get_use(), arg2)
  149. self.assertEqual(S('command', 'c.lt.d', '$1', '$2').get_use(), arg2)
  150. self.assertEqual(S('command', 'bgez', '$1', '$2').get_use(), arg1)
  151. self.assertEqual(S('command', 'bltz', '$1', '$2').get_use(), arg1)
  152. self.assertEqual(S('command', 'trunc.w.d', '$3', '$1', '$2').get_use(),
  153. arg2)