class RulesTest(unittest.TestCase):
    def setUp(self):
        self.matrix = np.zeros((3, 3))
        self.index = (1, 1)
        self.matrix[self.index] = 1
        self.mock_life = mock.create_autospec(LifeCounter, spec_set=True, instance=True)
        self.rules = Rules(self.mock_life)

    def test_if_alive_will_return_death_for_less_than_2_living_neighbors(self):
        self.mock_life.count.return_value = 1.0
        nt.assert_equals(self.rules.apply(self.index, self.matrix), 0)

    def test_if_alive_will_return_life_for_2_living_neighbors(self):
        self.mock_life.count.return_value = 2.0
        nt.assert_equals(self.rules.apply(self.index, self.matrix), 1)

    def test_if_alive_will_return_life_for_3_living_neighbors(self):
        self.mock_life.count.return_value = 3.0
        nt.assert_equals(self.rules.apply(self.index, self.matrix), 1)

    def test_if_alive_will_return_death_for_4_living_neighbors(self):
        self.mock_life.count.return_value = 4.0
        nt.assert_equals(self.rules.apply(self.index, self.matrix), 0)

    def test_if_dead_will_return_dead_for_2_living_neighbors(self):
        self.matrix[self.index] = 0
        self.mock_life.count.return_value = 2.0
        nt.assert_equals(self.rules.apply(self.index, self.matrix), 0)

    def test_if_dead_but_has_3_living_neighbors_then_comes_alive(self):
        self.matrix[self.index] = 0
        self.mock_life.count.return_value = 3.0
        nt.assert_equals(self.rules.apply(self.index, self.matrix), 1)