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)
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)
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)
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)
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)
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")
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)
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)
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)
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")
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")
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)
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")
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")
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)
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")
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")
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")
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")
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")
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")
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")
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")
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")
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)
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)
def test_swi_unhandled_interrupt(self): swi_instruction = parse_line("swi #99") processor = Processor() self.assertRaises( RuntimeError, lambda: processor.execute_instruction(swi_instruction))
def test_swi_unhandled_interrupt(self): swi_instruction = parse_line("swi #99") processor = Processor() self.assertRaises(RuntimeError, lambda : processor.execute_instruction(swi_instruction))