def setup(self): """Init state and mock.""" self.cpu = AbstractCPU() self.cpu.memory = create_autospec(RandomAccessMemory, True, True) self.cpu.registers = create_autospec(RegisterMemory, True, True) self.cpu.alu = create_autospec(ArithmeticLogicUnit, True, True) self.cpu.control_unit = create_autospec(AbstractControlUnit, True, True) self.cpu.io_unit = create_autospec(InputOutputUnit, True, True) self.cpu.io_unit.get_int.return_value = 789 self.source = ["[config]", # 0 "arch = mm1", # 1 "input =0o100, 0x101, 102 \n", # 2 "output= 102\n\n", # 3 "key=value", # 4 "[code]", # 5 "00 00; comment", # 6 "99 00", # 7 "[input]", # 8 "0o123 0x456", # 9 "789"] # 10
class TestAbstractCPU: """Test case for Abstract CPU.""" cpu = None source = None def setup(self): """Init state and mock.""" self.cpu = AbstractCPU() self.cpu.memory = create_autospec(RandomAccessMemory, True, True) self.cpu.registers = create_autospec(RegisterMemory, True, True) self.cpu.alu = create_autospec(ArithmeticLogicUnit, True, True) self.cpu.control_unit = create_autospec(AbstractControlUnit, True, True) self.cpu.io_unit = create_autospec(InputOutputUnit, True, True) self.cpu.io_unit.get_int.return_value = 789 self.source = ["[config]", # 0 "arch = mm1", # 1 "input =0o100, 0x101, 102 \n", # 2 "output= 102\n\n", # 3 "key=value", # 4 "[code]", # 5 "00 00; comment", # 6 "99 00", # 7 "[input]", # 8 "0o123 0x456", # 9 "789"] # 10 def test_load_program(self): """Test load all program.""" self.cpu.load_program(self.source) assert self.cpu.config == {"arch": "mm1", "input": "0o100, 0x101, 102", "output": "102", "key": "value"} self.cpu.io_unit.load_source.assert_called_once_with(["00 00", "99 00"]) self.cpu.io_unit.load_data.assert_called_once_with([0o100, 0x101, 102], ["0o123", "0x456", "789"]) with raises(ValueError): source = list(self.source) source[0] = "wrong_format" self.cpu.load_program(source) with raises(ValueError): source = list(self.source) source[0] = "[input]" source[8] = "[config]" self.cpu.load_program(source) with raises(ValueError): source = list(self.source) source[1] = "wrong_format" self.cpu.load_program(source) def input_function(): """Mock on input""" return "0o123 0x456 789" self.cpu.io_unit.reset_mock() source = self.source[:9] self.cpu.load_program(source, input_function=input_function) assert self.cpu.config == {"arch": "mm1", "input": "0o100, 0x101, 102", "output": "102", "key": "value"} self.cpu.io_unit.load_source.assert_called_once_with(["00 00", "99 00"]) self.cpu.io_unit.load_data.assert_called_once_with([0o100, 0x101, 102], ["0o123", "0x456", "789"]) self.cpu.io_unit.reset_mock() source = self.source[:8] self.cpu.load_program(source, input_function=input_function) assert self.cpu.config == {"arch": "mm1", "input": "0o100, 0x101, 102", "output": "102", "key": "value"} self.cpu.io_unit.load_source.assert_called_once_with(["00 00", "99 00"]) self.cpu.io_unit.load_data.assert_called_once_with([0o100, 0x101, 102], ["0o123", "0x456", "789"]) def test_print_result(self, tmpdir): """CPU should print to file.""" self.cpu.load_program(self.source) out = tmpdir.join("output.txt") with open(str(out), 'w') as output: self.cpu.print_result(output=output) self.cpu.io_unit.get_int.assert_called_once_with(102) assert out.read() == "789\n" def test_run(self, tmpdir): """Send run message to control unit.""" self.cpu.load_program(self.source) out = tmpdir.join("output.txt") with open(str(out), 'w') as output: self.cpu.run(output=output) assert self.cpu.config == {"arch": "mm1", "input": "0o100, 0x101, 102", "output": "102", "key": "value"} self.cpu.io_unit.load_source.assert_called_once_with(["00 00", "99 00"]) self.cpu.io_unit.load_data.assert_called_once_with([0o100, 0x101, 102], ["0o123", "0x456", "789"]) self.cpu.control_unit.run.assert_called_with() self.cpu.io_unit.get_int.assert_called_once_with(102) assert out.read() == "789\n"