94 lines
3.0 KiB
Python
94 lines
3.0 KiB
Python
"""Tests for chest deflection, femur load, tibia index, 3ms clip, viscous criterion."""
|
|
|
|
import numpy as np
|
|
import pytest
|
|
|
|
from impakt.criteria import chest_deflection, clip_3ms, femur_load, tibia_index, viscous_criterion
|
|
|
|
|
|
class TestChestDeflection:
|
|
def test_basic(self, chest_deflection_channel):
|
|
result = chest_deflection(channel=chest_deflection_channel)
|
|
assert result.criterion == "Chest Deflection"
|
|
assert result.unit == "mm"
|
|
assert 30.0 < result.value < 40.0 # ~35mm in fixture
|
|
|
|
def test_peak_time(self, chest_deflection_channel):
|
|
result = chest_deflection(channel=chest_deflection_channel)
|
|
assert result.time_of_peak is not None
|
|
assert 0.0 < result.time_of_peak < 0.1
|
|
|
|
|
|
class TestClip3ms:
|
|
def test_basic(self, head_accel_x):
|
|
result = clip_3ms(head_accel_x)
|
|
assert result.criterion == "3ms Clip"
|
|
assert result.value > 0
|
|
|
|
def test_body_region(self, head_accel_x):
|
|
result = clip_3ms(head_accel_x)
|
|
assert result.body_region == "Chest"
|
|
|
|
|
|
class TestFemurLoad:
|
|
def test_single_channel(self, femur_left_channel):
|
|
result = femur_load(channel=femur_left_channel, side="left")
|
|
assert result.criterion == "Femur Load Left"
|
|
assert result.unit == "kN"
|
|
assert result.value > 0
|
|
|
|
def test_peak_time(self, femur_left_channel):
|
|
result = femur_load(channel=femur_left_channel, side="left")
|
|
assert result.time_of_peak is not None
|
|
|
|
|
|
class TestTibiaIndex:
|
|
def test_with_all_components(self, time_array, sample_rate):
|
|
from impakt.channel.code import ChannelCode
|
|
from impakt.channel.model import Channel
|
|
|
|
t = time_array
|
|
fz = np.zeros_like(t)
|
|
mx = np.zeros_like(t)
|
|
my = np.zeros_like(t)
|
|
mask = (t >= 0.02) & (t <= 0.08)
|
|
fz[mask] = -5000 * np.sin(np.pi * (t[mask] - 0.02) / 0.06)
|
|
mx[mask] = 50 * np.sin(np.pi * (t[mask] - 0.02) / 0.06)
|
|
my[mask] = 80 * np.sin(np.pi * (t[mask] - 0.02) / 0.06)
|
|
|
|
fz_ch = Channel(
|
|
name="TIBFZ",
|
|
code=ChannelCode.parse("TIBFZ"),
|
|
data=fz,
|
|
time=t,
|
|
unit="N",
|
|
sample_rate=sample_rate,
|
|
)
|
|
mx_ch = Channel(
|
|
name="TIBMX",
|
|
code=ChannelCode.parse("TIBMX"),
|
|
data=mx,
|
|
time=t,
|
|
unit="N·m",
|
|
sample_rate=sample_rate,
|
|
)
|
|
my_ch = Channel(
|
|
name="TIBMY",
|
|
code=ChannelCode.parse("TIBMY"),
|
|
data=my,
|
|
time=t,
|
|
unit="N·m",
|
|
sample_rate=sample_rate,
|
|
)
|
|
|
|
result = tibia_index(fz_channel=fz_ch, mx_channel=mx_ch, my_channel=my_ch)
|
|
assert result.value > 0
|
|
|
|
|
|
class TestViscousCriterion:
|
|
def test_basic(self, chest_deflection_channel):
|
|
result = viscous_criterion(channel=chest_deflection_channel)
|
|
assert result.criterion == "Viscous Criterion"
|
|
assert result.unit == "m/s"
|
|
assert result.value >= 0
|