test_statement.py 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  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='bar').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 = ['a']
  78. self.assertEqual(S('command', 'move', 'a', 'b').get_def(), a)
  79. self.assertEqual(S('command', 'subu', 'a', 'b').get_def(), a)
  80. self.assertEqual(S('command', 'addu', 'a', 'b', 'c').get_def(), a)
  81. self.assertEqual(S('command', 'sll', 'a', 'b', 'c').get_def(), a)
  82. self.assertEqual(S('command', 'srl', 'a', 'b', 'c').get_def(), a)
  83. self.assertEqual(S('command', 'la', 'a', '16($fp)').get_def(), a)
  84. self.assertEqual(S('command', 'li', 'a', '16($fp)').get_def(), a)
  85. self.assertEqual(S('command', 'lw', 'a', 'b').get_def(), a)
  86. self.assertEqual(S('command', 'l.d', 'a', 'b').get_def(), a)
  87. self.assertEqual(S('command', 'add.d', 'a', 'b', 'c').get_def(), a)
  88. self.assertEqual(S('command', 'neg.d', 'a', 'b').get_def(), a)
  89. self.assertEqual(S('command', 'sub.d', 'a', 'b', 'c').get_def(), a)
  90. self.assertEqual(S('command', 'slt', 'a', 'b').get_def(), a)
  91. self.assertEqual(S('command', 'xori', 'a', 'b', '0x0000').get_def(), a)
  92. self.assertEqual(S('command', 'mov.d', 'a', 'b').get_def(), a)
  93. self.assertEqual(S('command', 'dmfc1', 'a', '$f0').get_def(), a)
  94. self.assertEqual(S('command', 'mtc1', 'b', 'a').get_def(), a)
  95. self.assertEqual(S('command', 'trunc.w.d', 'a', 'b', 'c').get_def(), a)
  96. def test_get_def_false(self):
  97. a = []
  98. self.assertEqual(S('command', 'bne', 'a', 'b', 'L1').get_def(), a)
  99. def test_get_use_true(self):
  100. arg1 = ['$1']
  101. arg2 = ['$1', '$2']
  102. self.assertEqual(S('command', 'addu', '$3', '$1', '$2').get_use(), \
  103. arg2)
  104. self.assertEqual(S('command', 'subu', '$3', '$1', '$2').get_use(), \
  105. arg2)
  106. self.assertEqual(S('command', 'mult', '$1', '$2').get_use(), arg2)
  107. self.assertEqual(S('command', 'div', '$1', '$2').get_use(), arg2)
  108. self.assertEqual(S('command', 'move', '$2', '$1').get_use(), arg1)
  109. self.assertEqual(S('command', 'beq', '$1', '$2', '$L1').get_use(), \
  110. arg2)
  111. self.assertEqual(S('command', 'bne', '$1', '$2', '$L1').get_use(), \
  112. arg2)
  113. self.assertEqual(S('command', 'sll', '$2', '$1', 2).get_use(), arg1)
  114. self.assertEqual(S('command', 'lb', '$2', '10($1)').get_use(), arg1)
  115. self.assertEqual(S('command', 'lw', '$2', '10($1)').get_use(), arg1)
  116. self.assertEqual(S('command', 'la', '$2', '10($1)').get_use(), arg1)
  117. self.assertEqual(S('command', 'lb', '$2', 'n.7').get_use(), ['n.7'])
  118. self.assertEqual(S('command', 'lbu', '$2', '10($1)').get_use(), arg1)
  119. self.assertEqual(S('command', 'l.d', '$2', '10($1)').get_use(), arg1)
  120. self.assertEqual(S('command', 's.d', '$1', '10($2)').get_use(), \
  121. arg2)
  122. self.assertEqual(S('command', 's.s', '$1', '10($2)').get_use(), \
  123. arg2)
  124. self.assertEqual(S('command', 'sb', '$1', '10($2)').get_use(), \
  125. arg2)
  126. self.assertEqual(S('command', 'mtc1', '$1', '$2').get_use(), arg1)
  127. self.assertEqual(S('command', 'add.d', '$3', '$1', '$2').get_use(), \
  128. arg2)
  129. self.assertEqual(S('command', 'sub.d', '$3', '$1', '$2').get_use(), \
  130. arg2)
  131. self.assertEqual(S('command', 'div.d', '$3', '$1', '$2').get_use(), \
  132. arg2)
  133. self.assertEqual(S('command', 'mul.d', '$3', '$1', '$2').get_use(), \
  134. arg2)
  135. self.assertEqual(S('command', 'neg.d', '$2', '$1').get_use(), arg1)
  136. self.assertEqual(S('command', 'abs.d', '$2', '$1').get_use(), arg1)
  137. self.assertEqual(S('command', 'dsz', '10($1)', '$2').get_use(), arg1)
  138. self.assertEqual(S('command', 'dsw', '$1', '10($2)').get_use(), arg2)
  139. self.assertEqual(S('command', 'c.lt.d', '$1', '$2').get_use(), arg2)
  140. self.assertEqual(S('command', 'bgez', '$1', '$2').get_use(), arg1)
  141. self.assertEqual(S('command', 'bltz', '$1', '$2').get_use(), arg1)
  142. self.assertEqual(S('command', 'trunc.w.d', '$3', '$1', '$2').get_use(),
  143. arg2)