import pytest from sqlmodel import Session, select, func from command_logic.logic_gameplay import advance_runners, gb_result_10, gb_result_11, gb_result_13, gb_result_2, gb_result_3, gb_result_4, gb_result_5, gb_result_6, gb_result_7, gb_result_8, gb_result_9, singles, doubles, triples, gb_result_1, complete_play, log_run_scored, strikeouts, steals, undo_play, xchecks from in_game.gameplay_models import Lineup, Play from tests.factory import session_fixture, Game def test_groundball_1(session: Session): game_1 = session.get(Game, 2) play_1 = session.get(Play, 1) play_1.hit, play_1.batter_final = 1, 2 play_2 = complete_play(session, play_1) play_2 = gb_result_1(session, play_2) ending = complete_play(session, play_2) assert ending.on_second == play_2.on_second assert play_2.batter_final == None async def test_groundball_2_1(session: Session): play_1 = session.get(Play, 2) play_1 = await singles(session, None, play_1, '*') play_2 = complete_play(session, play_1) play_2 = gb_result_2(session, play_2) ending = complete_play(session, play_2) assert ending.starting_outs == 0 assert ending.on_base_code == 0 async def test_groundball_2_2(session: Session): play_1 = session.get(Play, 2) play_1 = await doubles(session, None, play_1, '**') play_1.starting_outs = 0 play_2 = complete_play(session, play_1) play_2 = gb_result_2(session, play_2) ending = complete_play(session, play_2) assert ending.starting_outs == 2 assert ending.on_third == play_2.on_second async def test_groundball_2_3(session: Session): play_1 = session.get(Play, 2) play_1 = await triples(session, None, play_1) play_1.starting_outs = 0 play_2 = complete_play(session, play_1) play_2 = gb_result_2(session, play_2) ending = complete_play(session, play_2) assert ending.starting_outs == 2 assert ending.on_base_code == 0 assert ending.away_score == 1 async def test_groundball_3_1(session: Session): play_1 = session.get(Play, 2) play_1 = await singles(session, None, play_1, '*') play_2 = complete_play(session, play_1) play_2 = gb_result_3(session, play_2) ending = complete_play(session, play_2) assert ending.starting_outs == 2 assert ending.on_base_code == 2 assert ending.away_score == 0 async def test_groundball_3_2(session: Session): play_1 = session.get(Play, 2) play_1 = await doubles(session, None, play_1, '**') play_2 = complete_play(session, play_1) play_2 = gb_result_3(session, play_2) ending = complete_play(session, play_2) assert ending.starting_outs == 2 assert ending.on_base_code == 3 assert ending.away_score == 0 async def test_groundball_3_3(session: Session): play_1 = session.get(Play, 2) play_1 = await triples(session, None, play_1,) play_2 = complete_play(session, play_1) play_2 = gb_result_3(session, play_2) ending = complete_play(session, play_2) assert ending.starting_outs == 2 assert ending.on_base_code == 0 assert ending.away_score == 1 async def test_groundball_4_1(session: Session): play_1 = session.get(Play, 2) play_1 = await singles(session, None, play_1, '*') play_2 = complete_play(session, play_1) play_2 = gb_result_4(session, play_2) ending = complete_play(session, play_2) assert ending.starting_outs == 2 assert ending.on_base_code == 1 assert ending.on_first == play_2.batter async def test_groundball_4_2(session: Session): play_1 = session.get(Play, 2) play_1 = await singles(session, None, play_1, '*') play_2 = complete_play(session, play_1) play_2 = await singles(session, None, play_2, '**') play_3 = complete_play(session, play_2) play_3 = gb_result_4(session, play_3) ending = complete_play(session, play_3) assert ending.starting_outs == 2 assert ending.on_base_code == 1 assert ending.on_first == play_3.batter # Current batter reaches first (gb_4 rule: batter safe at first) assert ending.away_score == 1 async def test_groundball_5_1(session: Session): play_1 = session.get(Play, 2) play_1 = await triples(session, None, play_1) play_2 = complete_play(session, play_1) play_2 = gb_result_5(session, play_2, True) ending = complete_play(session, play_2) assert ending.starting_outs == 2 assert ending.on_base_code == 0 assert ending.away_score == 1 async def test_groundball_5_2(session: Session): play_1 = session.get(Play, 2) play_1 = await triples(session, None, play_1) play_2 = complete_play(session, play_1) play_2 = gb_result_5(session, play_2, False) ending = complete_play(session, play_2) assert ending.starting_outs == 2 assert ending.on_base_code == 3 assert ending.away_score == 0 async def test_groundball_6_1(session: Session): play_1 = session.get(Play, 2) play_1 = await doubles(session, None, play_1, '**') play_2 = complete_play(session, play_1) play_2 = gb_result_6(session, play_2, True) ending = complete_play(session, play_2) assert ending.starting_outs == 2 assert ending.on_base_code == 3 async def test_groundball_6_2(session: Session): play_1 = session.get(Play, 2) play_1 = await doubles(session, None, play_1, '**') play_2 = complete_play(session, play_1) play_2 = gb_result_6(session, play_2, False) ending = complete_play(session, play_2) assert ending.starting_outs == 2 assert ending.on_base_code == 2 async def test_groundball_7_1(session: Session): play_1 = session.get(Play, 2) play_1 = await triples(session, None, play_1) play_2 = complete_play(session, play_1) play_2 = gb_result_7(session, play_2) ending = complete_play(session, play_2) assert ending.starting_outs == 2 assert ending.on_base_code == 3 assert ending.away_score == 0 async def test_groundball_7_2(session: Session): play_1 = session.get(Play, 2) play_1 = await singles(session, None, play_1, '*') play_2 = complete_play(session, play_1) play_2 = await singles(session, None, play_2, '**') play_3 = complete_play(session, play_2) play_3 = gb_result_7(session, play_3) ending = complete_play(session, play_3) assert ending.starting_outs == 2 assert ending.on_base_code == 6 assert ending.away_score == 0 async def test_groundball_8_1(session: Session): play_1 = session.get(Play, 2) play_1 = await triples(session, None, play_1) play_2 = complete_play(session, play_1) play_2 = gb_result_8(session, play_2) ending = complete_play(session, play_2) assert ending.starting_outs == 2 assert ending.on_base_code == 3 assert ending.away_score == 0 async def test_groundball_8_2(session: Session): play_1 = session.get(Play, 2) play_1 = await singles(session, None, play_1, '*') play_2 = complete_play(session, play_1) play_2 = await singles(session, None, play_2, '**') play_3 = complete_play(session, play_2) play_3 = gb_result_8(session, play_3) ending = complete_play(session, play_3) assert ending.starting_outs == 2 assert ending.on_base_code == 6 assert ending.away_score == 0 async def test_groundball_9_1(session: Session): play_1 = session.get(Play, 2) play_1 = await singles(session, None, play_1, '*') play_2 = complete_play(session, play_1) play_2 = await singles(session, None, play_2, '**') play_3 = complete_play(session, play_2) play_3 = gb_result_9(session, play_3) ending = complete_play(session, play_3) assert ending.starting_outs == 2 assert ending.on_base_code == 6 assert ending.away_score == 0 async def test_groundball_10_1(session: Session): play_1 = session.get(Play, 2) play_1 = await singles(session, None, play_1, '*') play_2 = complete_play(session, play_1) play_2 = await singles(session, None, play_2, '*') play_3 = complete_play(session, play_2) play_3 = await singles(session, None, play_3, '*') play_4 = complete_play(session, play_3) play_4 = gb_result_10(session, play_4) ending = complete_play(session, play_4) assert ending.starting_outs == 0 assert ending.on_base_code == 0 assert ending.away_score == 0 async def test_groundball_13_1_1(session: Session): play_1 = session.get(Play, 2) play_1 = await singles(session, None, play_1, '*') play_2 = complete_play(session, play_1) play_2 = await singles(session, None, play_2, '*') play_3 = complete_play(session, play_2) play_3.check_pos == '3B' play_3 = gb_result_13(session, play_3) ending = complete_play(session, play_3) assert ending.starting_outs == 0 assert ending.on_base_code == 0 assert ending.away_score == 0 async def test_groundball_13_1_2(session: Session): play_1 = session.get(Play, 2) play_1.starting_outs = 0 play_1 = await singles(session, None, play_1, '*') play_2 = complete_play(session, play_1) play_2 = await singles(session, None, play_2, '*') play_3 = complete_play(session, play_2) play_3.check_pos = '3B' play_3 = gb_result_13(session, play_3) ending = complete_play(session, play_3) assert ending.starting_outs == 2 assert ending.on_base_code == 1 assert ending.away_score == 0 async def test_groundball_13_1_3(session: Session): play_1 = session.get(Play, 2) play_1.starting_outs = 0 play_1 = await singles(session, None, play_1, '*') play_2 = complete_play(session, play_1) play_2 = await singles(session, None, play_2, '*') play_3 = complete_play(session, play_2) play_3.check_pos == '1B' play_3 = gb_result_13(session, play_3) ending = complete_play(session, play_3) assert ending.starting_outs == 2 assert ending.on_base_code == 3 assert ending.away_score == 0 async def test_groundball_13_2(session: Session): play_1 = session.get(Play, 2) play_1 = await singles(session, None, play_1, '*') play_2 = complete_play(session, play_1) play_2 = await singles(session, None, play_2, '*') play_3 = complete_play(session, play_2) play_3.check_pos == 'C' play_3 = gb_result_13(session, play_3) ending = complete_play(session, play_3) assert ending.starting_outs == 0 assert ending.on_base_code == 0 assert ending.away_score == 0 async def test_groundball_13_3(session: Session): play_1 = session.get(Play, 2) play_1 = await singles(session, None, play_1, '*') play_2 = complete_play(session, play_1) play_2 = await singles(session, None, play_2, '*') play_3 = complete_play(session, play_2) play_3.check_pos == '1B' play_3 = gb_result_13(session, play_3) ending = complete_play(session, play_3) assert ending.starting_outs == 0 assert ending.on_base_code == 0 assert ending.away_score == 0