diff --git a/artifact.1/tests/test_core.py b/artifact.1/tests/test_core.py new file mode 100644 index 0000000..ae6cc91 --- /dev/null +++ b/artifact.1/tests/test_core.py @@ -0,0 +1,64 @@ +import pytest +from typing import List, Dict +from src.artifact_1 import core + + +class TestResult: + def __init__(self, group: str, pinned_status: str, warn_rate: float, unknown_rate: float, delta_t_rate: float): + self.group = group + self.pinned_status = pinned_status + self.warn_rate = warn_rate + self.unknown_rate = unknown_rate + self.delta_t_rate = delta_t_rate + + +def make_sample_data() -> List[TestResult]: + return [ + TestResult('A', 'pinned', 0.1, 0.05, 0.02), + TestResult('A', 'pinned', 0.2, 0.1, 0.03), + TestResult('A', 'unpinned', 0.3, 0.15, 0.04), + TestResult('B', 'pinned', 0.15, 0.07, 0.01), + TestResult('B', 'unpinned', 0.35, 0.12, 0.08), + TestResult('B', 'unpinned', 0.4, 0.18, 0.06), + ] + + +def test_analyze_ab_data_structure(): + data = make_sample_data() + result = core.analyze_ab_data(data) + assert isinstance(result, dict) + # groups should contain A and B, with pinned/unpinned stratum inside + for group_key in ['A', 'B']: + assert group_key in result + assert 'pinned' in result[group_key] or 'unpinned' in result[group_key] + + +def test_aggregation_values(): + data = make_sample_data() + result = core.analyze_ab_data(data) + # A-pinned + a_pinned = result['A']['pinned'] + assert pytest.approx(a_pinned['warn_rate_mean'], rel=1e-6) == (0.1 + 0.2) / 2 + assert pytest.approx(a_pinned['unknown_rate_mean'], rel=1e-6) == (0.05 + 0.1) / 2 + assert pytest.approx(a_pinned['delta_t_rate_mean'], rel=1e-6) == (0.02 + 0.03) / 2 + + # B-unpinned + b_unpinned = result['B']['unpinned'] + assert pytest.approx(b_unpinned['warn_rate_mean'], rel=1e-6) == (0.35 + 0.4) / 2 + assert pytest.approx(b_unpinned['unknown_rate_mean'], rel=1e-6) == (0.12 + 0.18) / 2 + assert pytest.approx(b_unpinned['delta_t_rate_mean'], rel=1e-6) == (0.08 + 0.06) / 2 + + +def test_invalid_input_raises(): + # Input validation should fail for non-list input + with pytest.raises((TypeError, ValueError)): + core.analyze_ab_data('invalid_input') + + # Input validation should fail for missing attributes + class Bad: + def __init__(self): + self.group = 'A' + + bad_data = [Bad()] + with pytest.raises((AttributeError, ValueError)): + core.analyze_ab_data(bad_data)