Esempio n. 1
0
class TestRegisterMemory:

    """Test case for RegisterMemory."""

    registers = None

    def setup(self):
        """Init state."""
        self.registers = RegisterMemory()
        self.registers.add_register('R1', WORD_SIZE)
        assert 'R1' in self.registers
        assert self.registers.fetch('R1', WORD_SIZE) == 0
        self.registers.add_register('R2', WORD_SIZE)
        assert 'R2' in self.registers
        assert self.registers.fetch('R2', WORD_SIZE) == 0
        self.registers.add_register('S', WORD_SIZE)
        assert 'S' in self.registers
        assert self.registers.fetch('S', WORD_SIZE) == 0
        assert 'R3' not in self.registers
        assert 'R4' not in self.registers
        assert 0 not in self.registers

    def test_check_address(self):
        """Should raise an error for undefined registers."""
        self.registers.check_address('R1')
        self.registers.check_address('R2')
        self.registers.check_address('S')
        with raises(KeyError):
            self.registers.check_address('R3')
        with raises(KeyError):
            self.registers.check_address('R4')
        with raises(KeyError):
            self.registers.check_address(0)

    def test_add_register(self):
        """Register with exist name should be addable."""
        self.registers.put('R1', 10, WORD_SIZE)
        self.registers.add_register('R1', WORD_SIZE)
        assert self.registers.fetch('R1', WORD_SIZE) == 10

        with raises(KeyError):
            self.registers.add_register('R1', WORD_SIZE + 1)

        with raises(KeyError):
            self.registers.fetch('R3', WORD_SIZE)
        self.registers.add_register('R3', WORD_SIZE)
        assert self.registers.fetch('R3', WORD_SIZE) == 0
        self.registers.put('R3', 10, WORD_SIZE)
        assert self.registers.fetch('R3', WORD_SIZE) == 10

    def test_setitem(self):
        """Setitem can raise an error."""
        with raises(KeyError):
            self.registers[0] = 5
        with raises(KeyError):
            self.registers.__getitem__(0)
        with raises(KeyError):
            self.registers['R3'] = 5
        with raises(KeyError):
            self.registers.__getitem__('R3')
        self.registers['R1'] = 5
        assert self.registers['R1'] == 5
        with raises(ValueError):
            self.registers['R2'] = 2 ** self.registers.word_size
        assert self.registers['R2'] == 0

    def test_fetch_and_put(self):
        """Test main method to read and write."""
        with raises(KeyError):
            self.registers.fetch(0, WORD_SIZE)
        with raises(KeyError):
            self.registers.put('R3', 5, WORD_SIZE + 1)
        self.registers.put('R1', 5, WORD_SIZE)
        assert self.registers.fetch('R1', WORD_SIZE) == 5
        with raises(ValueError):
            self.registers.put('R2', 2 ** WORD_SIZE, WORD_SIZE)
        with raises(ValueError):
            self.registers.put('R2', -10, WORD_SIZE)
        assert self.registers.fetch('R2', WORD_SIZE) == 0
        with raises(KeyError):
            self.registers.fetch('R1', WORD_SIZE + 1)
        with raises(KeyError):
            self.registers.fetch('R1', WORD_SIZE * 2)