test_statement.py 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  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_is_inline_comment(self):
  29. self.assertTrue(S('comment', 'foo', inline=True).is_inline_comment())
  30. self.assertFalse(S('comment', 'foo', inline=False).is_inline_comment())
  31. def test_jump_target(self):
  32. self.assertEqual(S('command', 'j', 'foo').jump_target(), 'foo')
  33. self.assertRaises(Exception, S('command', 'foo').jump_target)
  34. def test_iter(self):
  35. self.assertEqual(self.block.statements, list(self.block))
  36. def test_read(self):
  37. self.assertEqual(self.block.read(), S('command', 'foo'))
  38. self.assertEqual(self.block.read(), S('comment', 'bar'))
  39. self.assertEqual(self.block.read(), S('command', 'baz'))
  40. def test_end(self):
  41. self.assertFalse(self.block.end())
  42. self.block.read()
  43. self.block.read()
  44. self.block.read()
  45. self.assertTrue(self.block.end())
  46. def test_peek(self):
  47. self.assertEqual(self.block.peek(), S('command', 'foo'))
  48. self.assertEqual(self.block.peek(2), [S('command', 'foo'), \
  49. S('comment', 'bar')])
  50. self.block.read()
  51. self.assertEqual(self.block.peek(), S('comment', 'bar'))
  52. def test_replace(self):
  53. self.block.read()
  54. self.block.replace(1, [S('command', 'foobar')])
  55. self.assertEqual(self.block.pointer, 1)
  56. self.assertEqual(self.block.statements, [S('command', 'foobar'), \
  57. S('comment', 'bar'), \
  58. S('command', 'baz')])
  59. def test_apply_filter(self):
  60. self.block.apply_filter(lambda s: s.is_command())
  61. self.assertEqual(self.block.statements, [S('command', 'foo'), \
  62. S('command', 'baz')])
  63. def test_is_shift(self):
  64. self.assertTrue(S('command', 'sll').is_shift())
  65. self.assertFalse(S('command', 'foo').is_shift())
  66. self.assertFalse(S('label', 'sll').is_shift())
  67. def test_is_load(self):
  68. self.assertTrue(S('command', 'lw').is_load())
  69. self.assertFalse(S('command', 'foo').is_load())
  70. self.assertFalse(S('label', 'lw').is_load())
  71. def test_is_arith(self):
  72. self.assertTrue(S('command', 'addu', '$1', '$2', '$3').is_arith())
  73. self.assertFalse(S('command', 'foo').is_arith())
  74. self.assertFalse(S('label', 'addu').is_arith())
  75. def test_get_def_true(self):
  76. a = ['a']
  77. self.assertEqual(S('command', 'move', 'a', 'b').get_def(), a)
  78. self.assertEqual(S('command', 'subu', 'a', 'b').get_def(), a)
  79. self.assertEqual(S('command', 'addu', 'a', 'b', 'c').get_def(), a)
  80. self.assertEqual(S('command', 'sll', 'a', 'b', 'c').get_def(), a)
  81. self.assertEqual(S('command', 'srl', 'a', 'b', 'c').get_def(), a)
  82. self.assertEqual(S('command', 'la', 'a', '16($fp)').get_def(), a)
  83. self.assertEqual(S('command', 'li', 'a', '16($fp)').get_def(), a)
  84. self.assertEqual(S('command', 'lw', 'a', 'b').get_def(), a)
  85. self.assertEqual(S('command', 'l.d', 'a', 'b').get_def(), a)
  86. self.assertEqual(S('command', 'add.d', 'a', 'b', 'c').get_def(), a)
  87. self.assertEqual(S('command', 'neg.d', 'a', 'b').get_def(), a)
  88. self.assertEqual(S('command', 'sub.d', 'a', 'b', 'c').get_def(), a)
  89. self.assertEqual(S('command', 'slt', 'a', 'b').get_def(), a)
  90. self.assertEqual(S('command', 'xori', 'a', 'b', '0x0000').get_def(), a)
  91. self.assertEqual(S('command', 'mov.d', 'a', 'b').get_def(), a)
  92. self.assertEqual(S('command', 'dmfc1', 'a', '$f0').get_def(), a)
  93. self.assertEqual(S('command', 'mtc1', 'b', 'a').get_def(), a)
  94. self.assertEqual(S('command', 'trunc.w.d', 'a', 'b', 'c').get_def(), a)
  95. def test_get_def_false(self):
  96. a = []
  97. self.assertEqual(S('command', 'bne', 'a', 'b', 'L1').get_def(), a)
  98. def test_get_use_true(self):
  99. arg1 = ['$1']
  100. arg2 = ['$1', '$2']
  101. self.assertEqual(S('command', 'addu', '$3', '$1', '$2').get_use(), \
  102. arg2)
  103. self.assertEqual(S('command', 'subu', '$3', '$1', '$2').get_use(), \
  104. arg2)
  105. self.assertEqual(S('command', 'mult', '$1', '$2').get_use(), arg2)
  106. self.assertEqual(S('command', 'div', '$1', '$2').get_use(), arg2)
  107. self.assertEqual(S('command', 'move', '$2', '$1').get_use(), arg1)
  108. self.assertEqual(S('command', 'beq', '$1', '$2', '$L1').get_use(), \
  109. arg2)
  110. self.assertEqual(S('command', 'bne', '$1', '$2', '$L1').get_use(), \
  111. arg2)
  112. self.assertEqual(S('command', 'sll', '$2', '$1', 2).get_use(), arg1)
  113. self.assertEqual(S('command', 'lb', '$2', '10($1)').get_use(), arg1)
  114. self.assertEqual(S('command', 'lw', '$2', '10($1)').get_use(), arg1)
  115. self.assertEqual(S('command', 'la', '$2', '10($1)').get_use(), arg1)
  116. self.assertEqual(S('command', 'lb', '$2', 'n.7').get_use(), ['n.7'])
  117. self.assertEqual(S('command', 'lbu', '$2', '10($1)').get_use(), arg1)
  118. self.assertEqual(S('command', 'l.d', '$2', '10($1)').get_use(), arg1)
  119. self.assertEqual(S('command', 's.d', '$1', '10($2)').get_use(), \
  120. arg2)
  121. self.assertEqual(S('command', 's.s', '$1', '10($2)').get_use(), \
  122. arg2)
  123. self.assertEqual(S('command', 'sb', '$1', '10($2)').get_use(), \
  124. arg2)
  125. self.assertEqual(S('command', 'mtc1', '$1', '$2').get_use(), arg1)
  126. self.assertEqual(S('command', 'add.d', '$3', '$1', '$2').get_use(), \
  127. arg2)
  128. self.assertEqual(S('command', 'sub.d', '$3', '$1', '$2').get_use(), \
  129. arg2)
  130. self.assertEqual(S('command', 'div.d', '$3', '$1', '$2').get_use(), \
  131. arg2)
  132. self.assertEqual(S('command', 'mul.d', '$3', '$1', '$2').get_use(), \
  133. arg2)
  134. self.assertEqual(S('command', 'neg.d', '$2', '$1').get_use(), arg1)
  135. self.assertEqual(S('command', 'abs.d', '$2', '$1').get_use(), arg1)
  136. self.assertEqual(S('command', 'dsz', '10($1)', '$2').get_use(), arg1)
  137. self.assertEqual(S('command', 'dsw', '$1', '10($2)').get_use(), arg2)
  138. self.assertEqual(S('command', 'c.lt.d', '$1', '$2').get_use(), arg2)
  139. self.assertEqual(S('command', 'bgez', '$1', '$2').get_use(), arg1)
  140. self.assertEqual(S('command', 'bltz', '$1', '$2').get_use(), arg1)
  141. self.assertEqual(S('command', 'trunc.w.d', '$3', '$1', '$2').get_use()\
  142. , arg2)