示例#1
0
    def test_cmp(self):
        instr_1 = parse_line("mov r0, #5")
        instr_2 = parse_line("cmp r0, #3")

        self.proc.execute_instruction(instr_1)
        self.proc.execute_instruction(instr_2)

        self.assertGreater(self.proc.comparison_register, 0)
    def test_cmp(self):
        instr_1 = parse_line("mov r0, #5")
        instr_2 = parse_line("cmp r0, #3")

        self.proc.execute_instruction(instr_1)
        self.proc.execute_instruction(instr_2)

        self.assertGreater(self.proc.comparison_register, 0)
示例#3
0
    def test_mul_reg_and_const(self):
        instr_1 = parse_line("mov r1, #5")
        instr_2 = parse_line("mul r0, r1, #2")

        self.proc.execute_instruction(instr_1)
        self.proc.execute_instruction(instr_2)

        self.assertEqual(self.proc.register_bank.get("r1"), 5)
        self.assertEqual(self.proc.register_bank.get("r0"), 10)
    def test_mul_reg_and_const(self):
        instr_1 = parse_line("mov r1, #5")
        instr_2 = parse_line("mul r0, r1, #2")

        self.proc.execute_instruction(instr_1)
        self.proc.execute_instruction(instr_2)

        self.assertEqual(self.proc.register_bank.get("r1"), 5)
        self.assertEqual(self.proc.register_bank.get("r0"), 10)
    def test_sub_const_from_reg(self):
        instr_1 = parse_line("mov r1, #5")
        instr_2 = parse_line("sub r0, r1, #2")

        self.proc.execute_instruction(instr_1)
        self.proc.execute_instruction(instr_2)

        self.assertEqual(self.proc.register_bank.get("r1"), 5)
        self.assertEqual(self.proc.register_bank.get("r0"), 3)
示例#6
0
    def test_sub_const_from_reg(self):
        instr_1 = parse_line("mov r1, #5")
        instr_2 = parse_line("sub r0, r1, #2")

        self.proc.execute_instruction(instr_1)
        self.proc.execute_instruction(instr_2)

        self.assertEqual(self.proc.register_bank.get("r1"), 5)
        self.assertEqual(self.proc.register_bank.get("r0"), 3)
    def test_mla_reg_reg_const(self):
        instr_1 = parse_line("mov r1, #5")
        instr_2 = parse_line("mov r2, #4")
        instr_3 = parse_line("mla r0, r1, r2, #3")

        self.proc.execute_instruction(instr_1)
        self.proc.execute_instruction(instr_2)
        self.proc.execute_instruction(instr_3)

        self.assertEqual(self.proc.register_bank.get("r1"), 5)
        self.assertEqual(self.proc.register_bank.get("r2"), 4)
        self.assertEqual(self.proc.register_bank.get("r0"), 23)
示例#8
0
    def test_mla_reg_reg_const(self):
        instr_1 = parse_line("mov r1, #5")
        instr_2 = parse_line("mov r2, #4")
        instr_3 = parse_line("mla r0, r1, r2, #3")

        self.proc.execute_instruction(instr_1)
        self.proc.execute_instruction(instr_2)
        self.proc.execute_instruction(instr_3)

        self.assertEqual(self.proc.register_bank.get("r1"), 5)
        self.assertEqual(self.proc.register_bank.get("r2"), 4)
        self.assertEqual(self.proc.register_bank.get("r0"), 23)
示例#9
0
    def test_swi_0_functionally_correct(self):
        swi_instruction = parse_line("swi #0")
        processor = Processor()
        processor.execute_instruction(swi_instruction)

        self.assertEqual(processor.instructions_executed, 1)
        self.assertTrue(processor.halted)
示例#10
0
    def test_instruction_no_operands_no_label(self):
        parsed = parse_line("nop")

        self.assertEqual(parsed.mnemonic, "nop")
        self.assertIsNone(parsed.label)
        self.assertIsNone(parsed.operands)
        self.assertEqual(parsed.original_instruction, "nop")
示例#11
0
    def test_swi_0_functionally_correct(self):
        swi_instruction = parse_line("swi #0")
        processor = Processor()
        processor.execute_instruction(swi_instruction)

        self.assertEqual(processor.instructions_executed, 1)
        self.assertTrue(processor.halted)
示例#12
0
    def test_execute_instruction(self, mock):
        nop_instruction = parse_line("nop")
        processor = Processor()
        processor.execute_instruction(nop_instruction)

        self.assertTrue(mock.called)
        self.assertEqual(processor.instructions_executed, 1)
示例#13
0
    def test_execute_instruction(self, mock):
        nop_instruction = parse_line("nop")
        processor = Processor()
        processor.execute_instruction(nop_instruction)

        self.assertTrue(mock.called)
        self.assertEqual(processor.instructions_executed, 1)
示例#14
0
    def test_instruction_no_operands_no_label(self):
        parsed = parse_line("nop")

        self.assertEqual(parsed.mnemonic, "nop")
        self.assertIsNone(parsed.label)
        self.assertIsNone(parsed.operands)
        self.assertEqual(parsed.original_instruction, "nop")
示例#15
0
    def test_instruction_single_operand(self):
        parsed = parse_line("b halt")

        self.assertEqual(parsed.mnemonic, "b")
        self.assertEqual(parsed.operands[0].type, Operand.TYPE_LABEL)
        self.assertEqual(parsed.operands[0].value, "halt")
        self.assertIsNone(parsed.label)
        self.assertEqual(parsed.original_instruction, "b halt")
示例#16
0
    def test_halting(self, mock):
        nop_instruction = parse_line("nop")
        processor = Processor()
        processor.halt()
        processor.execute_instruction(nop_instruction)

        self.assertFalse(mock.called)
        self.assertEqual(processor.instructions_executed, 0)
示例#17
0
    def test_parse_label_which_partially_matches_instruction(self):
        parsed = parse_line("bl addition")

        self.assertIsNone(parsed.label)
        self.assertEqual(parsed.mnemonic, "bl")
        self.assertEqual(len(parsed.operands), 1)
        self.assertEqual(parsed.operands[0].type, Operand.TYPE_LABEL)
        self.assertEqual(parsed.operands[0].value, "addition")
示例#18
0
    def test_parse_register_alias(self):
        parsed = parse_line("push lr")

        self.assertIsNone(parsed.label)
        self.assertEqual(parsed.mnemonic, "push")
        self.assertEqual(len(parsed.operands), 1)
        self.assertEqual(parsed.operands[0].type, Operand.TYPE_REGISTER)
        self.assertEqual(parsed.operands[0].value, "lr")
示例#19
0
    def test_halting(self, mock):
        nop_instruction = parse_line("nop")
        processor = Processor()
        processor.halt()
        processor.execute_instruction(nop_instruction)

        self.assertFalse(mock.called)
        self.assertEqual(processor.instructions_executed, 0)
示例#20
0
    def test_parse_register_alias(self):
        parsed = parse_line("push lr")

        self.assertIsNone(parsed.label)
        self.assertEqual(parsed.mnemonic, "push")
        self.assertEqual(len(parsed.operands), 1)
        self.assertEqual(parsed.operands[0].type, Operand.TYPE_REGISTER)
        self.assertEqual(parsed.operands[0].value, "lr")
示例#21
0
    def test_parse_label_which_partially_matches_instruction(self):
        parsed = parse_line("bl addition")

        self.assertIsNone(parsed.label)
        self.assertEqual(parsed.mnemonic, "bl")
        self.assertEqual(len(parsed.operands), 1)
        self.assertEqual(parsed.operands[0].type, Operand.TYPE_LABEL)
        self.assertEqual(parsed.operands[0].value, "addition")
示例#22
0
    def test_instruction_single_operand(self):
        parsed = parse_line("b halt")

        self.assertEqual(parsed.mnemonic, "b")
        self.assertEqual(parsed.operands[0].type, Operand.TYPE_LABEL)
        self.assertEqual(parsed.operands[0].value, "halt")
        self.assertIsNone(parsed.label)
        self.assertEqual(parsed.original_instruction, "b halt")
示例#23
0
    def test_label_with_colon(self):
        parsed = parse_line("foobar: str r0, [r1]")

        self.assertEqual(parsed.label, "foobar:")
        self.assertEqual(parsed.mnemonic, "str")
        self.assertEqual(len(parsed.operands), 2)
        self.assertEqual(parsed.operands[0].type, Operand.TYPE_REGISTER)
        self.assertEqual(parsed.operands[0].value, "r0")
        self.assertEqual(parsed.operands[1].type, Operand.TYPE_INDIRECT_ADDRESS)
        self.assertEqual(parsed.operands[1].value, "r1")
示例#24
0
    def test_store_register_to_memory(self):
        parsed = parse_line("str r0, [r1]")

        self.assertIsNone(parsed.label)
        self.assertEqual(parsed.mnemonic, "str")
        self.assertEqual(len(parsed.operands), 2)
        self.assertEqual(parsed.operands[0].type, Operand.TYPE_REGISTER)
        self.assertEqual(parsed.operands[0].value, "r0")
        self.assertEqual(parsed.operands[1].type, Operand.TYPE_INDIRECT_ADDRESS)
        self.assertEqual(parsed.operands[1].value, "r1")
示例#25
0
    def test_mov_with_label_constant_to_register(self):
        parsed = parse_line("hello mov r1, #5")

        self.assertEqual(parsed.label, "hello")
        self.assertEqual(parsed.mnemonic, "mov")
        self.assertEqual(parsed.operands[0].type, Operand.TYPE_REGISTER)
        self.assertEqual(parsed.operands[0].value, "r1")
        self.assertEqual(parsed.operands[1].type, Operand.TYPE_CONSTANT)
        self.assertEqual(parsed.operands[1].value, 5)
        self.assertEqual(len(parsed.operands), 2)
        self.assertEqual(parsed.original_instruction, "hello mov r1, #5")
示例#26
0
    def test_mov_with_label_constant_to_register(self):
        parsed = parse_line("hello mov r1, #5")

        self.assertEqual(parsed.label, "hello")
        self.assertEqual(parsed.mnemonic, "mov")
        self.assertEqual(parsed.operands[0].type, Operand.TYPE_REGISTER)
        self.assertEqual(parsed.operands[0].value, "r1")
        self.assertEqual(parsed.operands[1].type, Operand.TYPE_CONSTANT)
        self.assertEqual(parsed.operands[1].value, 5)
        self.assertEqual(len(parsed.operands), 2)
        self.assertEqual(parsed.original_instruction, "hello mov r1, #5")
示例#27
0
    def test_store_register_to_memory(self):
        parsed = parse_line("str r0, [r1]")

        self.assertIsNone(parsed.label)
        self.assertEqual(parsed.mnemonic, "str")
        self.assertEqual(len(parsed.operands), 2)
        self.assertEqual(parsed.operands[0].type, Operand.TYPE_REGISTER)
        self.assertEqual(parsed.operands[0].value, "r0")
        self.assertEqual(parsed.operands[1].type,
                         Operand.TYPE_INDIRECT_ADDRESS)
        self.assertEqual(parsed.operands[1].value, "r1")
示例#28
0
    def test_label_with_colon(self):
        parsed = parse_line("foobar: str r0, [r1]")

        self.assertEqual(parsed.label, "foobar:")
        self.assertEqual(parsed.mnemonic, "str")
        self.assertEqual(len(parsed.operands), 2)
        self.assertEqual(parsed.operands[0].type, Operand.TYPE_REGISTER)
        self.assertEqual(parsed.operands[0].value, "r0")
        self.assertEqual(parsed.operands[1].type,
                         Operand.TYPE_INDIRECT_ADDRESS)
        self.assertEqual(parsed.operands[1].value, "r1")
示例#29
0
    def test_mov_const_to_reg(self):
        instr = parse_line("mov r0, #1")
        self.proc.execute_instruction(instr)

        self.assertEqual(self.proc.register_bank.get("r0"), 1)
示例#30
0
    def test_mov_const_to_reg(self):
        instr = parse_line("mov r0, #1")
        self.proc.execute_instruction(instr)

        self.assertEqual(self.proc.register_bank.get("r0"), 1)
示例#31
0
 def test_swi_unhandled_interrupt(self):
     swi_instruction = parse_line("swi #99")
     processor = Processor()
     self.assertRaises(
         RuntimeError,
         lambda: processor.execute_instruction(swi_instruction))
示例#32
0
 def test_swi_unhandled_interrupt(self):
     swi_instruction = parse_line("swi #99")
     processor = Processor()
     self.assertRaises(RuntimeError, lambda : processor.execute_instruction(swi_instruction))