def test_calculate_movement_move_partial_amount(self):
        directions = [Vector2(3, 0), Vector2(-3, 0), Vector2(0, -3), Vector2(0, 3)]
        for direction in directions:
            self.sprite = MovingSprite(50, 50, 10, 10)
            self.sprite.move_to_target(self.sprite.rect.centerx + direction.x, self.sprite.rect.centery + direction.y)

            self.assertEqual(self.sprite.calculate_movement(), direction)
    def test_calculate_movement_move_whole_velocity(self):
        directions = [Vector2(10, 0), Vector2(-10, 0), Vector2(0, -10), Vector2(0, 10)]
        for direction in directions:
            self.sprite = MovingSprite(50, 50, 10, 10)
            self.sprite.move_to_target(self.sprite.rect.centerx + direction.x, self.sprite.rect.centery + direction.y)

            self.assertEqual(self.sprite.calculate_movement(), direction / 2)
    def test_move_to_target_change_in_state(self):
        directions = [(Direction.RIGHT, Vector2(10, 0)), (Direction.LEFT, Vector2(-10, 0)),
                      (Direction.UP, Vector2(0, -10)), (Direction.DOWN, Vector2(0, 10))]
        for direction, vector in directions:
            self.sprite = MovingSprite(50, 50, 10, 10)
            self.sprite.move_to_target(self.sprite.rect.centerx + vector.x, self.sprite.rect.centery + vector.y)

            self.assertEqual(self.sprite.state, State.MOVING)
            self.assertEqual(self.sprite.facing_direction, direction)
class PlayerSpriteTest(TestCase):
    def setUp(self):
        self.sprite = MovingSprite(50, 50, 10, 10)

    def test_move_to_target_no_change_in_state(self):
        self.sprite.move_to_target(50, 50)

        self.assertEqual(self.sprite.state, State.STATIONARY)

    def test_move_to_target_change_in_state(self):
        directions = [(Direction.RIGHT, Vector2(10, 0)), (Direction.LEFT, Vector2(-10, 0)),
                      (Direction.UP, Vector2(0, -10)), (Direction.DOWN, Vector2(0, 10))]
        for direction, vector in directions:
            self.sprite = MovingSprite(50, 50, 10, 10)
            self.sprite.move_to_target(self.sprite.rect.centerx + vector.x, self.sprite.rect.centery + vector.y)

            self.assertEqual(self.sprite.state, State.MOVING)
            self.assertEqual(self.sprite.facing_direction, direction)

    def test_no_need_to_move(self):
        self.assertFalse(self.sprite.need_to_move())

    def test_needs_to_move_towards_target(self):
        directions = [Vector2(10, 0), Vector2(-10, 0), Vector2(0, -10), Vector2(0, 10)]
        for vector in directions:
            self.sprite.move_to_target(self.sprite.rect.centerx + vector.x, self.sprite.rect.centery + vector.y)

            self.assertTrue(self.sprite.need_to_move())

    def test_calculate_movement_no_movement(self):
        """No movement if stationary"""
        self.assertEqual(self.sprite.calculate_movement(), Vector2(0, 0))

    def test_calculate_movement_move_whole_velocity(self):
        directions = [Vector2(10, 0), Vector2(-10, 0), Vector2(0, -10), Vector2(0, 10)]
        for direction in directions:
            self.sprite = MovingSprite(50, 50, 10, 10)
            self.sprite.move_to_target(self.sprite.rect.centerx + direction.x, self.sprite.rect.centery + direction.y)

            self.assertEqual(self.sprite.calculate_movement(), direction / 2)

    def test_calculate_movement_move_partial_amount(self):
        directions = [Vector2(3, 0), Vector2(-3, 0), Vector2(0, -3), Vector2(0, 3)]
        for direction in directions:
            self.sprite = MovingSprite(50, 50, 10, 10)
            self.sprite.move_to_target(self.sprite.rect.centerx + direction.x, self.sprite.rect.centery + direction.y)

            self.assertEqual(self.sprite.calculate_movement(), direction)
 def setUp(self):
     self.sprite = MovingSprite(50, 50, 10, 10)