#!/usr/bin/env python3 """ Test script to verify CSV format matches SCHEMA_EXAMPLE.csv """ import csv from io import StringIO # Exemple de détections comme generées par le backend frame_detections = [ { "frame": 1, "timestamp_sec": 0.033, "scene_name": "abc123", "group_id": "abc123", "video_name": "traffic_clip1.mp4", "track_id": "", "class_name": "Vehicle", "confidence": 0.912, "bbox_x1": 340, "bbox_y1": 210, "bbox_x2": 520, "bbox_y2": 310, "cx": 430, "cy": 260, "frame_width": 1920, "frame_height": 1080, "crossed_line": "false", "direction": "", "speed_px_s": 0.0 }, { "frame": 2, "timestamp_sec": 0.067, "scene_name": "abc123", "group_id": "abc123", "video_name": "traffic_clip1.mp4", "track_id": "", "class_name": "Vehicle", "confidence": 0.908, "bbox_x1": 345, "bbox_y1": 213, "bbox_x2": 525, "bbox_y2": 313, "cx": 435, "cy": 263, "frame_width": 1920, "frame_height": 1080, "crossed_line": "false", "direction": "", "speed_px_s": 14.2 }, { "frame": 48, "timestamp_sec": 1.600, "scene_name": "abc123", "group_id": "abc123", "video_name": "traffic_clip1.mp4", "track_id": "", "class_name": "Vehicle", "confidence": 0.887, "bbox_x1": 560, "bbox_y1": 290, "bbox_x2": 740, "bbox_y2": 390, "cx": 650, "cy": 340, "frame_width": 1920, "frame_height": 1080, "crossed_line": "true", "direction": "down", "speed_px_s": 15.1 }, ] # Generate CSV output = StringIO() writer = csv.writer(output, lineterminator="\n") # Header writer.writerow([ "frame", "timestamp_sec", "scene_name", "group_id", "video_name", "track_id", "class_name", "confidence", "bbox_x1", "bbox_y1", "bbox_x2", "bbox_y2", "cx", "cy", "frame_width", "frame_height", "crossed_line", "direction", "speed_px_s" ]) # Data rows for det in frame_detections: writer.writerow([ det["frame"], f"{det['timestamp_sec']:.3f}", det["scene_name"], det["group_id"], det["video_name"], det["track_id"], det["class_name"], f"{det['confidence']:.3f}", det["bbox_x1"], det["bbox_y1"], det["bbox_x2"], det["bbox_y2"], det["cx"], det["cy"], det["frame_width"], det["frame_height"], det["crossed_line"], det["direction"], f"{det['speed_px_s']:.1f}" ]) # Print result csv_output = output.getvalue() print("Generated CSV:") print("=" * 120) print(csv_output) print("=" * 120) # Compare with expected format expected_header = "frame,timestamp_sec,scene_name,group_id,video_name,track_id,class_name,confidence,bbox_x1,bbox_y1,bbox_x2,bbox_y2,cx,cy,frame_width,frame_height,crossed_line,direction,speed_px_s" actual_header = csv_output.split('\n')[0] print("\nExpected header:") print(expected_header) print("\nActual header:") print(actual_header) print("\nHeaders match:", expected_header == actual_header) # Verify number of columns lines = csv_output.strip().split('\n') for i, line in enumerate(lines, 1): cols = line.split(',') expected_cols = 19 if len(cols) != expected_cols: print(f"Row {i}: WARNING - Expected {expected_cols} columns, got {len(cols)}") else: print(f"Row {i}: OK ({len(cols)} columns)") print("\n✅ CSV Format validation complete!")