import csv import json from collections import deque from pathlib import Path from src.config_loader import TrackingLoggingSettings from src.models import BoundingBox, FrameInfo, TrackEvent, TrackPoint, TrackedPerson, TrackState from src.tracking_logger import TrackingLogger def test_all_tracking_csv_logs_and_duplicate_summary(tmp_path: Path) -> None: config = TrackingLoggingSettings(True, True, True, True, 1, str(tmp_path)) logger = TrackingLogger(config, "exp", "20260101_000000") logger.open() bbox = BoundingBox(1, 2, 11, 22) tracked = TrackedPerson(1, bbox, .9, 0, "person", 6, 12, 6, 22, True, True, 3, 0) point = TrackPoint(.1, "now", 1, 6, 12, 6, 22, bbox) state = TrackState(1, "now", "later", 1, 2, entered_evaluation_region=True, trigger_crossed=True, movement_direction="left_to_right", total_visible_frames=3, trajectory=deque([point]), finalized=True, is_confirmed=True, first_seen_monotonic=.1, last_seen_monotonic=.5, valid_for_counting=True, invalid_reason="") logger.write_frame_tracks(FrameInfo(1, "now", .1, 100, 100, 20), [tracked], {1: state}) event = TrackEvent("trigger_crossed", 1, 1, "now", .1, 6, 22, "left_to_right", {"注記": "通過"}) logger.write_events([event]) logger.write_summary(state) logger.write_summary(state) logger.close() logger.close() paths = list(tmp_path.glob("*.csv")) assert len(paths) == 3 assert all(path.read_bytes().startswith(b"\xef\xbb\xbf") for path in paths) summary = next(path for path in paths if "summary" in path.name) with summary.open(encoding="utf-8-sig", newline="") as stream: assert len(list(csv.DictReader(stream))) == 1 events = next(path for path in paths if "events" in path.name) with events.open(encoding="utf-8-sig", newline="") as stream: row = next(csv.DictReader(stream)) assert json.loads(row["metadata_json"])["注記"] == "通過"