import pytest from datetime import datetime, timedelta from data_analysis import core @pytest.fixture def sample_run_data(): base_time = datetime(2024, 1, 1, 12, 0, 0) return [ { 'run_id': 'r1', 'timestamp': base_time, 'delta_t': 0.5, 'expiring_at': base_time + timedelta(hours=1) }, { 'run_id': 'r2', 'timestamp': base_time + timedelta(seconds=5), 'delta_t': -0.2, 'expiring_at': base_time + timedelta(hours=2) }, { 'run_id': 'r3', 'timestamp': base_time + timedelta(seconds=10), 'delta_t': 0.0, 'expiring_at': base_time + timedelta(hours=3) } ] def test_analyze_runs_structure(sample_run_data): result = core.analyze_runs(sample_run_data) assert isinstance(result, dict), 'Result must be a dict' expected_keys = {'total_runs', 'negative_dt_count', 'negative_dt_ratio'} for key in expected_keys: assert key in result, f'Missing key: {key}' def test_analyze_runs_negative_count(sample_run_data): result = core.analyze_runs(sample_run_data) assert result['negative_dt_count'] == 1 assert result['total_runs'] == 3 assert result['negative_dt_ratio'] == pytest.approx(1/3, rel=1e-3) def test_analyze_runs_empty_list(): result = core.analyze_runs([]) assert result['total_runs'] == 0 assert result['negative_dt_count'] == 0 assert result['negative_dt_ratio'] == 0.0 def test_analyze_runs_type_validation(): with pytest.raises((TypeError, AssertionError)): core.analyze_runs('invalid_input')