feat: implement DTW comparison, add data segmentation and persistence, and update QML UI for file imports and graphing.

This commit is contained in:
jack
2026-06-23 21:38:45 -07:00
parent 20a34e22ee
commit 62ce5a9c37
16 changed files with 1049 additions and 8 deletions
+90
View File
@@ -0,0 +1,90 @@
"""Tests for src/pygui/backend/splitter.py."""
from pygui.backend.splitter import DataSegment, segment_profile
def test_all_below_threshold():
temps = [10.0, 20.0, 30.0]
result = segment_profile(temps, threshold=40.0)
assert result == [
DataSegment(label="Ramp", start_frame=0, end_frame=2, avg_temp=20.0)
]
def test_all_above_threshold():
temps = [50.0, 60.0, 70.0]
result = segment_profile(temps, threshold=40.0)
assert result == [
DataSegment(label="Soak", start_frame=0, end_frame=2, avg_temp=60.0)
]
def test_ramp_soak_cool_full_cycle():
temps = [20.0, 30.0, 50.0, 60.0, 45.0, 35.0]
result = segment_profile(temps, threshold=40.0)
assert result == [
DataSegment(label="Ramp", start_frame=0, end_frame=1, avg_temp=25.0),
DataSegment(label="Soak", start_frame=2, end_frame=4, avg_temp=51.67),
DataSegment(label="Cool", start_frame=5, end_frame=5, avg_temp=35.0),
]
def test_multiple_oscillations():
temps = [20.0, 50.0, 30.0, 60.0, 25.0]
result = segment_profile(temps, threshold=40.0)
assert result == [
DataSegment(label="Ramp", start_frame=0, end_frame=0, avg_temp=20.0),
DataSegment(label="Soak", start_frame=1, end_frame=1, avg_temp=50.0),
DataSegment(label="Cool", start_frame=2, end_frame=2, avg_temp=30.0),
DataSegment(label="Soak", start_frame=3, end_frame=3, avg_temp=60.0),
DataSegment(label="Cool", start_frame=4, end_frame=4, avg_temp=25.0),
]
def test_no_cool_phase():
temps = [20.0, 30.0, 50.0, 60.0]
result = segment_profile(temps, threshold=40.0)
assert result == [
DataSegment(label="Ramp", start_frame=0, end_frame=1, avg_temp=25.0),
DataSegment(label="Soak", start_frame=2, end_frame=3, avg_temp=55.0),
]
def test_default_threshold():
temps = [20.0, 50.0, 30.0]
result = segment_profile(temps)
assert result == [
DataSegment(label="Ramp", start_frame=0, end_frame=0, avg_temp=20.0),
DataSegment(label="Soak", start_frame=1, end_frame=1, avg_temp=50.0),
DataSegment(label="Cool", start_frame=2, end_frame=2, avg_temp=30.0),
]
def test_single_frame_below():
temps = [25.0]
result = segment_profile(temps, threshold=40.0)
assert result == [
DataSegment(label="Ramp", start_frame=0, end_frame=0, avg_temp=25.0),
]
def test_single_frame_above():
temps = [55.0]
result = segment_profile(temps, threshold=40.0)
assert result == [
DataSegment(label="Soak", start_frame=0, end_frame=0, avg_temp=55.0),
]
def test_empty_input():
temps: list[float] = []
result = segment_profile(temps)
assert result == []
def test_precision_rounding():
temps = [10.0, 20.0, 30.0]
result = segment_profile(temps, threshold=15.0)
assert result == [
DataSegment(label="Ramp", start_frame=0, end_frame=0, avg_temp=10.0),
DataSegment(label="Soak", start_frame=1, end_frame=2, avg_temp=25.0),
]