Spaces:
Sleeping
Sleeping
| """ | |
| 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) | |