Esempio n. 1
0
class RegisterTest(unittest.TestCase):
    def setUp(self):
        self.registers = Registers()

    def test_init_creates_registers(self):
        self.assertNotIn('registers', Registers.__dict__)
        registers = Registers()
        self.assertIsInstance(registers.registers, dict)

    def test_parse_instruction(self):
        code, comparison = self.registers.parse_instruction('b inc 5 if a > 1')
        self.assertEqual(code, ('b', 'inc', 5))
        self.assertEqual(comparison, ('a', '>', 1))

    def test_is_true(self):
        self.registers.registers = {'a': 10}

        self.assertTrue(self.registers.is_true(('a', '>', 1)))
        self.assertFalse(self.registers.is_true(('a', '>', 10)))

        self.assertTrue(self.registers.is_true(('foo', '>', -1)))
        self.assertFalse(self.registers.is_true(('bar', '>', 0)))

        self.assertTrue(self.registers.is_true(('a', '<', 11)))
        self.assertFalse(self.registers.is_true(('a', '<', 9)))

        self.assertTrue(self.registers.is_true(('a', '==', 10)))
        self.assertFalse(self.registers.is_true(('a', '==', 1)))

        self.assertTrue(self.registers.is_true(('a', '!=', 1)))
        self.assertFalse(self.registers.is_true(('a', '!=', 10)))

        self.assertTrue(self.registers.is_true(('a', '>=', 9)))
        self.assertTrue(self.registers.is_true(('a', '>=', 10)))
        self.assertFalse(self.registers.is_true(('a', '>=', 11)))

        self.assertTrue(self.registers.is_true(('a', '<=', 11)))
        self.assertTrue(self.registers.is_true(('a', '<=', 10)))
        self.assertFalse(self.registers.is_true(('a', '<=', 9)))

        with self.assertRaises(RuntimeError):
            self.registers.is_true(('a', '===', 1))

    def test_exececute_instruction(self):
        self.registers.registers = {}

        self.registers.execute_instruction(('a', 'inc', 1))
        self.assertEqual(self.registers.registers['a'], 1)
        self.registers.execute_instruction(('a', 'inc', 2))
        self.assertEqual(self.registers.registers['a'], 3)

        self.registers.execute_instruction(('b', 'dec', 1))
        self.assertEqual(self.registers.registers['b'], -1)
        self.registers.execute_instruction(('b', 'dec', 2))
        self.assertEqual(self.registers.registers['b'], -3)

        self.registers.execute_instruction(('b', 'inc', 10))
        self.assertEqual(self.registers.registers['b'], 7)

        with self.assertRaises(RuntimeError):
            self.registers.execute_instruction(('a', 'mul', 2))

    def test_exececute_instruction_stores_highest_value_ever(self):
        self.registers.registers = {}
        self.registers.execute_instruction(('a', 'inc', 10))
        self.assertEqual(self.registers.highest_value_ever, 10)
        self.registers.execute_instruction(('a', 'dec', 10))
        self.assertEqual(self.registers.highest_value_ever, 10)

    @patch.object(Registers, 'process_and_execute_instruction')
    def test_parse_file(self, mock_process):
        m = mock_open(read_data='foo\nbar\n')
        with patch('registers.open', m):
            self.registers.parse_file(sentinel.filename)
        m.assert_called_once_with(sentinel.filename)
        mock_process.assert_has_calls([call('foo\n'), call('bar\n')])

    def test_get_largest_value(self):
        self.registers.registers = {'a': 1, 'b': -10, 'c': 5}
        self.assertEqual(self.registers.get_largest_value(), 5)