import pandas as pd from models.strikeout_probability_engine_v2 import build_strikeout_probability_result_v2 def test_strikeout_probability_result_v2_missing_inputs(): result = build_strikeout_probability_result_v2( pitcher_statcast_df=pd.DataFrame(), pitcher_name="", line=None, selection_side=None, ) assert result["formula_version"] == "strikeout_v2_live" assert result["expected_strikeouts"] is None assert result["skipped_layers"] == "missing_pitcher_or_line" assert result["confidence_score"] is None assert result["confidence_component_bonuses"] == [] assert result["confidence_component_penalties"] == [] def test_strikeout_probability_result_v2_exposes_canonical_opportunity_outputs(): pitcher_df = pd.DataFrame( [ { "player_name": "Ace Arm", "release_speed": 96.1, "release_spin_rate": 2450, "release_extension": 6.4, "description": "swinging_strike", } ] * 220 ) result = build_strikeout_probability_result_v2( pitcher_statcast_df=pitcher_df, pitcher_name="Ace Arm", batter_statcast_df=pd.DataFrame(), opponent_batters=["A", "B", "C", "D", "E", "F", "G", "H", "I"], opponent_team="Away", line=6.5, selection_side="over", game_row={ "projected_starter_available": True, "projected_starter_match_status": "matched_projected_home", "team_total": 4.2, }, ) assert result["fair_prob"] is not None assert result["expected_strikeouts"] is not None assert result["projected_pitch_count"] is not None assert result["projected_batters_faced"] is not None assert result["projected_innings"] is not None assert result["pitches_per_bf"] is not None assert result["role_certainty_score"] is not None assert result["confidence_source"] == "strikeout_v2_live"