rescored / backend /scripts /test_quick_verify.py
calebhan's picture
yourmt3 integration and refactor
75d3906
#!/usr/bin/env python3
"""
Quick verification test - only runs the 6 videos that had code bugs (now fixed).
This is faster than the full suite and verifies our bug fixes work.
"""
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).parent.parent))
from test_accuracy import run_accuracy_test
import json
from datetime import datetime
# Only test the 6 videos that had code bugs (should all pass now)
QUICK_TEST_VIDEOS = [
{
"id": "chopin_nocturne",
"url": "https://www.youtube.com/watch?v=9E6b3swbnWg",
"description": "Chopin - Nocturne Op. 9 No. 2",
"difficulty": "hard",
"expected_accuracy": "50-60%",
"notes": "2048th note duration (Bug #2b)",
"bug": "2048th note duration (Bug #2b)"
},
{
"id": "canon_in_d",
"url": "https://www.youtube.com/watch?v=NlprozGcs80",
"description": "Pachelbel - Canon in D",
"difficulty": "medium",
"expected_accuracy": "60-70%",
"notes": "NoneType velocity (Bug #2a)",
"bug": "NoneType velocity (Bug #2a)"
},
{
"id": "river_flows",
"url": "https://www.youtube.com/watch?v=7maJOI3QMu0",
"description": "Yiruma - River Flows in You",
"difficulty": "medium",
"expected_accuracy": "60-70%",
"notes": "NoneType velocity (Bug #2a)",
"bug": "NoneType velocity (Bug #2a)"
},
{
"id": "moonlight_sonata",
"url": "https://www.youtube.com/watch?v=4Tr0otuiQuU",
"description": "Beethoven - Moonlight Sonata",
"difficulty": "medium",
"expected_accuracy": "60-70%",
"notes": "NoneType velocity (Bug #2a)",
"bug": "NoneType velocity (Bug #2a)"
},
{
"id": "claire_de_lune",
"url": "https://www.youtube.com/watch?v=WNcsUNKlAKw",
"description": "Debussy - Clair de Lune",
"difficulty": "hard",
"expected_accuracy": "50-60%",
"notes": "2048th note duration (Bug #2b)",
"bug": "2048th note duration (Bug #2b)"
},
{
"id": "la_campanella",
"url": "https://www.youtube.com/watch?v=MD6xMyuZls0",
"description": "Liszt - La Campanella",
"difficulty": "very_hard",
"expected_accuracy": "40-50%",
"notes": "NoneType velocity (Bug #2a)",
"bug": "NoneType velocity (Bug #2a)"
}
]
def main():
"""Run quick verification tests."""
print("="*70)
print("Quick Verification Test - Bug Fixes")
print("="*70)
print(f"Testing {len(QUICK_TEST_VIDEOS)} videos that previously failed")
print("All should now succeed (verifies bug fixes)")
print()
results = []
for i, video in enumerate(QUICK_TEST_VIDEOS, 1):
print(f"\n[{i}/{len(QUICK_TEST_VIDEOS)}] Testing: {video['id']}")
print(f"Previous error: {video['bug']}")
result = run_accuracy_test(video, verbose=True)
results.append(result)
# Summary
print("\n" + "="*70)
print("QUICK VERIFICATION SUMMARY")
print("="*70)
successful = [r for r in results if r["success"]]
failed = [r for r in results if not r["success"]]
print(f"\nTotal: {len(results)} | Success: {len(successful)} | Failed: {len(failed)}")
print(f"Success Rate: {len(successful)/len(results)*100:.1f}%")
if successful:
print("\n✅ Bug Fixes Verified - Successful Transcriptions:")
for r in successful:
if "midi" in r["metrics"] and "musicxml" in r["metrics"]:
notes = r["metrics"]["midi"]["total_notes"]
measures = r["metrics"]["musicxml"]["total_measures"]
print(f" - {r['video_id']:20s} | {notes:4d} notes | {measures:3d} measures")
if failed:
print("\n❌ Still Failing:")
for r in failed:
error_preview = r["error"][:80] if r["error"] else "Unknown"
print(f" - {r['video_id']:20s} | {error_preview}")
# Save results
from app_config import settings
output_path = Path(settings.storage_path) / "quick_verify_results.json"
output_path.parent.mkdir(parents=True, exist_ok=True)
with open(output_path, 'w') as f:
json.dump({
"test_date": datetime.utcnow().isoformat(),
"test_type": "bug_fix_verification",
"total_tests": len(results),
"successful": len(successful),
"failed": len(failed),
"success_rate": len(successful) / len(results),
"results": results
}, f, indent=2)
print(f"\n📊 Results saved to: {output_path}")
if len(successful) == len(results):
print("\n🎉 ALL BUG FIXES VERIFIED! Ready for full test suite.")
return 0
else:
print(f"\n⚠️ {len(failed)} test(s) still failing - investigate before full suite")
return 1
if __name__ == "__main__":
sys.exit(main())