from app.services.smoother import smooth_transitions, merge_segments def d(key, mode, start, end, conf=0.85): return {"key": key, "mode": mode, "start": start, "end": end, "confidence": conf} def test_smooth_removes_outlier(): dets = [d("G","major",0,10), d("G","major",10,20), d("E","minor",20,30,0.6), d("G","major",30,40), d("G","major",40,50)] sm = smooth_transitions(dets, window_size=3) assert sm[2]["key"] == "G" and sm[2]["mode"] == "major" def test_smooth_preserves_genuine_transition(): dets = [d("G","major",0,10), d("G","major",10,20), d("E","minor",20,30), d("E","minor",30,40), d("E","minor",40,50)] sm = smooth_transitions(dets, window_size=3) assert sm[4]["key"] == "E" and sm[4]["mode"] == "minor" def test_smooth_preserves_timing(): dets = [d("G","major", i*10, (i+1)*10) for i in range(5)] for orig, sm in zip(dets, smooth_transitions(dets, window_size=3)): assert sm["start"] == orig["start"] and sm["end"] == orig["end"] def test_merge_combines_consecutive(): dets = [d("G","major",0,10,0.9), d("G","major",10,20,0.85), d("E","minor",20,30,0.82)] merged = merge_segments(dets) assert len(merged) == 2 assert merged[0]["end"] == 20.0 def test_merge_averages_confidence(): dets = [d("G","major",0,10,0.8), d("G","major",10,20,0.6)] merged = merge_segments(dets) assert abs(merged[0]["confidence"] - 0.7) < 0.01