Esempio n. 1
0
 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
Esempio n. 2
0
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"