bookmark - Refactor
This commit is contained in:
126
tests/test_scripting_api.py
Normal file
126
tests/test_scripting_api.py
Normal file
@@ -0,0 +1,126 @@
|
||||
"""Tests for the scripting API (Session, ChannelHandle, TransformProxy)."""
|
||||
|
||||
from pathlib import Path
|
||||
|
||||
import pytest
|
||||
|
||||
from impakt import Session, Template
|
||||
|
||||
FIXTURE_DATA = Path(__file__).parent / "fixtures" / "sample_mme"
|
||||
MME_DATA = Path(__file__).parent / "mme_data"
|
||||
|
||||
|
||||
class TestSession:
|
||||
def test_open(self):
|
||||
s = Session.open(FIXTURE_DATA)
|
||||
assert s.test_id == "IMPAKT_SYNTH_001"
|
||||
assert len(s) == 26
|
||||
|
||||
def test_channel_access(self):
|
||||
s = Session.open(FIXTURE_DATA)
|
||||
ch = s.channel("11HEAD0000ACXA")
|
||||
assert ch.name == "11HEAD0000ACXA"
|
||||
assert ch.peak > 0
|
||||
|
||||
def test_find(self):
|
||||
s = Session.open(FIXTURE_DATA)
|
||||
channels = s.find("*HEAD*AC*")
|
||||
assert len(channels) == 3
|
||||
|
||||
def test_group(self):
|
||||
s = Session.open(FIXTURE_DATA)
|
||||
group = s.group("HEAD0000AC")
|
||||
assert group.x is not None
|
||||
|
||||
def test_compute_criteria(self):
|
||||
s = Session.open(FIXTURE_DATA)
|
||||
criteria = s.compute_criteria()
|
||||
assert len(criteria) > 0
|
||||
|
||||
def test_evaluate(self):
|
||||
s = Session.open(FIXTURE_DATA)
|
||||
result = s.evaluate("euro_ncap")
|
||||
assert result.stars is not None
|
||||
assert result.protocol == "Euro NCAP"
|
||||
|
||||
def test_evaluate_us_ncap(self):
|
||||
s = Session.open(FIXTURE_DATA)
|
||||
result = s.evaluate("us_ncap")
|
||||
assert result.stars is not None
|
||||
|
||||
def test_evaluate_iihs(self):
|
||||
s = Session.open(FIXTURE_DATA)
|
||||
result = s.evaluate("iihs")
|
||||
assert result.overall_rating in ("GOOD", "ACCEPTABLE", "MARGINAL", "POOR")
|
||||
|
||||
def test_evaluate_invalid_protocol(self):
|
||||
s = Session.open(FIXTURE_DATA)
|
||||
with pytest.raises(ValueError, match="Unknown protocol"):
|
||||
s.evaluate("invalid")
|
||||
|
||||
def test_contains(self):
|
||||
s = Session.open(FIXTURE_DATA)
|
||||
assert "11HEAD0000ACXA" in s
|
||||
assert "NONEXISTENT" not in s
|
||||
|
||||
|
||||
class TestChannelHandleChaining:
|
||||
"""The fluent API must support chaining — each transform returns ChannelHandle."""
|
||||
|
||||
def test_single_transform(self):
|
||||
s = Session.open(FIXTURE_DATA)
|
||||
ch = s.channel("11HEAD0000ACXA")
|
||||
filtered = ch.transform.cfc(600)
|
||||
assert type(filtered).__name__ == "ChannelHandle"
|
||||
assert filtered.raw.cfc_class == 600
|
||||
|
||||
def test_double_chain(self):
|
||||
s = Session.open(FIXTURE_DATA)
|
||||
result = s.channel("11HEAD0000ACXA").transform.cfc(600).transform.y_align()
|
||||
assert type(result).__name__ == "ChannelHandle"
|
||||
assert len(result.raw.transform_history) == 2
|
||||
|
||||
def test_triple_chain(self):
|
||||
s = Session.open(FIXTURE_DATA)
|
||||
result = (
|
||||
s.channel("11HEAD0000ACXA")
|
||||
.transform.cfc(1000)
|
||||
.transform.y_align()
|
||||
.transform.trim(t_start=0.0, t_end=0.1)
|
||||
)
|
||||
assert type(result).__name__ == "ChannelHandle"
|
||||
assert len(result.raw.transform_history) == 3
|
||||
|
||||
def test_chain_preserves_data(self):
|
||||
s = Session.open(FIXTURE_DATA)
|
||||
original = s.channel("11HEAD0000ACXA")
|
||||
original_peak = original.peak
|
||||
filtered = original.transform.cfc(600)
|
||||
# Original should be unchanged — peak should be the same
|
||||
assert original.peak == original_peak
|
||||
# Filtered should have different CFC and lower peak (smoothed)
|
||||
assert filtered.raw.cfc_class == 600
|
||||
assert filtered.peak <= original_peak
|
||||
|
||||
|
||||
@pytest.mark.skipif(not (MME_DATA / "3239").exists(), reason="Real data not available")
|
||||
class TestSessionRealData:
|
||||
def test_open_real(self):
|
||||
s = Session.open(MME_DATA / "3239")
|
||||
assert s.test_id == "3239"
|
||||
assert len(s) == 133
|
||||
|
||||
def test_full_pipeline(self):
|
||||
s = Session.open(MME_DATA / "3239")
|
||||
# Chain: get channel -> filter -> check
|
||||
ch = s.channel("11HEAD0000H3ACXP").transform.cfc(1000)
|
||||
assert ch.peak > 100 # Significant head acceleration
|
||||
|
||||
# Compute criteria
|
||||
criteria = s.compute_criteria()
|
||||
assert "HIC15" in criteria
|
||||
|
||||
# Evaluate
|
||||
result = s.evaluate("euro_ncap")
|
||||
assert result.stars is not None
|
||||
assert result.stars >= 0
|
||||
Reference in New Issue
Block a user