snake-pathfinding-AI / test_snake.py
rhdang1
Edit pathfinding to improve success rate
5625b4c
import unittest
import pygame
from snake import Snake, Apple # Make sure the Snake and Apple classes are imported correctly
from settings import *
class TestSnakeGame(unittest.TestCase):
def setUp(self):
pygame.init()
self.snake = Snake()
self.apple = Apple()
def tearDown(self):
pygame.quit()
def test_initial_state(self):
# Test initial snake position
self.assertEqual(self.snake.head.x, 0)
self.assertEqual(self.snake.head.y, 0)
# Test initial snake length
self.assertEqual(len(self.snake.body), 0)
def test_movement(self):
# Test snake movement to the right
self.snake.pos = [1, 0]
self.snake.drawSnake()
self.assertEqual(self.snake.head.x, BLOCK_SIZE)
self.assertEqual(self.snake.head.y, 0)
# Test snake movement left
self.snake.pos = [-1, 0]
self.snake.drawSnake()
self.assertEqual(self.snake.head.x, 0)
self.assertEqual(self.snake.head.y, 0)
# Test snake movement downwards
self.snake.pos = [0, -1]
self.snake.drawSnake()
self.assertEqual(self.snake.head.x, 0)
self.assertEqual(self.snake.head.y, -50)
# Test snake movement upwards
self.snake.pos = [0, 1]
self.snake.drawSnake()
self.assertEqual(self.snake.head.x, 0)
self.assertEqual(self.snake.head.y, 0)
def test_apple_spawn(self):
# Test apple spawning within the grid
self.apple.spawn()
self.assertTrue(0 <= self.apple.apple.x < WIDTH)
self.assertTrue(0 <= self.apple.apple.y < HEIGHT)
self.assertEqual(self.apple.apple.width, BLOCK_SIZE)
self.assertEqual(self.apple.apple.height, BLOCK_SIZE)
def test_eating_apple(self):
# Place apple directly in front of the snake
self.apple.apple.x = self.snake.head.x + BLOCK_SIZE
self.apple.apple.y = self.snake.head.y
self.snake.pos = [1, 0]
self.snake.drawSnake()
# Simulate snake eating the apple
if self.snake.head.colliderect(self.apple.apple):
self.snake.body.append(pygame.Rect(self.snake.head.x, self.snake.head.y, BLOCK_SIZE, BLOCK_SIZE))
self.apple.spawn()
self.assertEqual(len(self.snake.body), 1)
self.assertNotEqual((self.apple.apple.x, self.apple.apple.y), (self.snake.head.x, self.snake.head.y))
def test_collision_with_wall(self):
# Move snake to the right until it hits the wall
self.snake.pos = [-1, 0]
self.snake.drawSnake()
self.snake.pos = [-1, 0]
self.snake.drawSnake()
self.assertTrue(self.snake.dead)
def test_collision_with_self(self):
# Create a situation where the snake will collide with itself
self.snake.body = [
pygame.Rect(WIDTH / 2, HEIGHT / 2, BLOCK_SIZE, BLOCK_SIZE),
pygame.Rect(WIDTH / 2 - BLOCK_SIZE, HEIGHT / 2, BLOCK_SIZE, BLOCK_SIZE),
pygame.Rect(WIDTH / 2 - 2 * BLOCK_SIZE, HEIGHT / 2, BLOCK_SIZE, BLOCK_SIZE)
]
self.snake.pos = [1, 0]
self.snake.drawSnake() # Move right
self.snake.pos = [0, -1]
self.snake.drawSnake() # Move up
self.snake.pos = [-1, 0]
self.snake.drawSnake() # Move left (collide with body)
self.assertTrue(self.snake.dead)
if __name__ == '__main__':
unittest.main()