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)