File size: 2,219 Bytes
de9fc8c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
"""
Headless automated test for all 16 tracks.
Exit 0 if all pass, 1 if any fail.
"""

import os
os.environ['SDL_VIDEODRIVER'] = 'dummy'
os.environ['SDL_AUDIODRIVER'] = 'dummy'

import sys
import math
import pygame

pygame.init()
pygame.display.set_mode((1, 1))

from game.tracks import TRACKS, SCREEN_W, SCREEN_H

ACCEL     = 0.13
STEER_DEG = 2.7

all_pass = True

for track in TRACKS:
    name = f"Lv{track.level}: {track.name}"
    try:
        # 1. Build must not raise
        track.build()

        # 2. surface not None, correct size
        assert track.surface is not None, "surface is None"
        assert track.surface.get_size() == (SCREEN_W, SCREEN_H), \
            f"surface size {track.surface.get_size()} != ({SCREEN_W},{SCREEN_H})"

        # 3. mask not None
        assert track.mask is not None, "mask is None"

        # 4. start_pos is on track
        sx, sy = track.start_pos
        assert track.on_track(sx, sy), \
            f"start_pos {track.start_pos} not on track"

        # 5. gate_side at start_pos ≈ 0
        gs = track.gate_side(sx, sy)
        assert abs(gs) < 2.0, \
            f"gate_side at start_pos = {gs:.4f}, expected < 2.0"

        # 6. Simulate 150 steps
        x     = float(sx)
        y     = float(sy)
        angle = float(track.start_angle)
        speed = 0.0
        max_speed = track.max_speed

        for step in range(150):
            accel = 1   # constant throttle
            steer = math.sin(step * 0.15) * 0.5  # gentle sinusoidal steer

            speed_ratio = min(abs(speed) / max_speed, 1.0) if max_speed > 0 else 0
            angle += steer * STEER_DEG * max(0.3, speed_ratio)
            speed  = min(speed + ACCEL, max_speed)
            speed  = max(0.0, speed - 0.038)  # friction

            rad = math.radians(angle)
            x  += speed * math.cos(rad)
            y  += speed * math.sin(rad)

            # on_track check (no crash required)
            _ = track.on_track(x, y)

        print(f"PASS  {name}")

    except Exception as e:
        print(f"FAIL  {name}: {e}")
        all_pass = False

print()
if all_pass:
    print("All 16 tracks PASSED.")
    sys.exit(0)
else:
    print("Some tracks FAILED.")
    sys.exit(1)