train-schedule-optimization / test_system.py
Arpit-Bansal's picture
protoype integration completed
a8ba5ce
"""
Simple Test Script - Verify Metro Scheduling System
Tests core functionality without requiring full API setup
"""
import sys
import traceback
def test_imports():
"""Test that all modules can be imported"""
print("Testing imports...")
try:
from DataService import metro_models
from DataService import metro_data_generator
from DataService import schedule_optimizer
print(" βœ“ DataService modules imported successfully")
return True
except Exception as e:
print(f" βœ— Import failed: {e}")
traceback.print_exc()
return False
def test_data_generation():
"""Test data generation"""
print("\nTesting data generation...")
try:
from DataService.metro_data_generator import MetroDataGenerator
generator = MetroDataGenerator(num_trains=10, num_stations=10)
print(f" βœ“ Generator created for {len(generator.trainset_ids)} trains")
# Test route generation
route = generator.generate_route()
print(f" βœ“ Route generated: {route.name} with {len(route.stations)} stations")
# Test train health
health = generator.generate_train_health_statuses()
print(f" βœ“ Generated health status for {len(health)} trains")
# Test certificates
certs = generator.generate_fitness_certificates("TS-001")
print(f" βœ“ Generated fitness certificates")
return True
except Exception as e:
print(f" βœ— Data generation failed: {e}")
traceback.print_exc()
return False
def test_schedule_optimization():
"""Test schedule optimization"""
print("\nTesting schedule optimization...")
try:
from DataService.metro_data_generator import MetroDataGenerator
from DataService.schedule_optimizer import MetroScheduleOptimizer
from datetime import datetime
# Setup
generator = MetroDataGenerator(num_trains=15, num_stations=15)
route = generator.generate_route()
health = generator.generate_train_health_statuses()
# Create optimizer
optimizer = MetroScheduleOptimizer(
date=datetime.now().strftime("%Y-%m-%d"),
num_trains=15,
route=route,
train_health=health
)
print(f" βœ“ Optimizer created")
# Generate schedule
schedule = optimizer.optimize_schedule(min_service_trains=10, min_standby=2)
print(f" βœ“ Schedule generated: {schedule.schedule_id}")
print(f" - Trains in service: {schedule.fleet_summary.revenue_service}")
print(f" - Total planned km: {schedule.optimization_metrics.total_planned_km}")
print(f" - Optimization time: {schedule.optimization_metrics.optimization_runtime_ms} ms")
return True
except Exception as e:
print(f" βœ— Schedule optimization failed: {e}")
traceback.print_exc()
return False
def test_models():
"""Test Pydantic models"""
print("\nTesting data models...")
try:
from DataService.metro_models import (
ScheduleRequest, TrainHealthStatus, Route, Station
)
# Test ScheduleRequest
request = ScheduleRequest(
date="2025-10-25",
num_trains=25,
num_stations=25
)
print(f" βœ“ ScheduleRequest model validated")
# Test Station
station = Station(
station_id="STN-001",
name="Test Station",
sequence=1,
distance_from_origin_km=0.0
)
print(f" βœ“ Station model validated")
return True
except Exception as e:
print(f" βœ— Model validation failed: {e}")
traceback.print_exc()
return False
def test_json_export():
"""Test JSON export"""
print("\nTesting JSON export...")
try:
import json
from DataService.metro_data_generator import MetroDataGenerator
from DataService.schedule_optimizer import MetroScheduleOptimizer
from datetime import datetime
generator = MetroDataGenerator(num_trains=10, num_stations=10)
route = generator.generate_route()
health = generator.generate_train_health_statuses()
optimizer = MetroScheduleOptimizer(
date=datetime.now().strftime("%Y-%m-%d"),
num_trains=10,
route=route,
train_health=health
)
schedule = optimizer.optimize_schedule()
# Convert to dict and save
schedule_dict = schedule.model_dump()
# Try to serialize to JSON
json_str = json.dumps(schedule_dict, indent=2, default=str)
print(f" βœ“ Schedule exported to JSON ({len(json_str)} chars)")
print(f" - Contains {len(schedule_dict['trainsets'])} trainsets")
return True
except Exception as e:
print(f" βœ— JSON export failed: {e}")
traceback.print_exc()
return False
def main():
"""Run all tests"""
print("=" * 70)
print(" METRO SCHEDULING SYSTEM - VERIFICATION TESTS")
print("=" * 70)
tests = [
("Imports", test_imports),
("Data Generation", test_data_generation),
("Schedule Optimization", test_schedule_optimization),
("Data Models", test_models),
("JSON Export", test_json_export)
]
results = []
for name, test_func in tests:
try:
result = test_func()
results.append((name, result))
except Exception as e:
print(f"\nβœ— {name} crashed: {e}")
results.append((name, False))
# Summary
print("\n" + "=" * 70)
print(" TEST SUMMARY")
print("=" * 70)
passed = sum(1 for _, result in results if result)
total = len(results)
for name, result in results:
status = "βœ“ PASS" if result else "βœ— FAIL"
print(f" {status}: {name}")
print("\n" + "-" * 70)
print(f" Results: {passed}/{total} tests passed")
if passed == total:
print("\n πŸŽ‰ All tests passed! System is ready to use.")
print("\n Next steps:")
print(" 1. Run: python demo_schedule.py")
print(" 2. Run: python run_api.py")
print(" 3. Visit: http://localhost:8000/docs")
else:
print("\n ⚠️ Some tests failed. Please check the errors above.")
print(" Make sure all dependencies are installed:")
print(" pip install -r requirements.txt")
print("=" * 70)
return 0 if passed == total else 1
if __name__ == "__main__":
sys.exit(main())