keyshift-api / tests /test_smoother.py
balakrishna567's picture
feat: smoother — majority-vote window smoothing + consecutive segment merger
59bb1ec
Raw
History Blame Contribute Delete
1.43 kB
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