import pytest from custom_bingo.card_generator import generate_single_card, generate_bingo_cards def test_generate_single_card(): """Test generating a single BINGO card from input data.""" input_data = { 'B': ['B1', 'B2', 'B3', 'B4', 'B5'], 'I': ['I1', 'I2', 'I3', 'I4', 'I5'], 'N': ['N1', 'N2', 'N3', 'N4', 'N5'], # 5 values for N column 'G': ['G1', 'G2', 'G3', 'G4', 'G5'], 'O': ['O1', 'O2', 'O3', 'O4', 'O5'] } card = generate_single_card(input_data) # Check that card is 5x5 assert len(card) == 5 for row in card: assert len(row) == 5 # Check that each column contains values from the correct input column for i in range(5): assert card[i][0] in input_data['B'] # B column assert card[i][1] in input_data['I'] # I column assert card[i][3] in input_data['G'] # G column assert card[i][4] in input_data['O'] # O column # For N column, 4 positions should have values from input, and position 2 should be "FREE" n_values = [card[i][2] for i in range(5)] free_count = n_values.count("FREE") assert free_count == 1 # Exactly one FREE space assert n_values[2] == "FREE" # FREE space is in the center (row 2) # The other N values should come from the input data actual_n_values = [val for val in n_values if val != "FREE"] for val in actual_n_values: assert val in input_data['N'] def test_generate_single_card_with_insufficient_data(): """Test generating a card when there's insufficient data.""" input_data = { 'B': ['B1', 'B2'], # Only 2 values, need 5 'I': ['I1', 'I2', 'I3', 'I4', 'I5'], 'N': ['N1', 'N2'], # Only 2 values, need 4 for sampling + 1 FREE 'G': ['G1', 'G2', 'G3', 'G4', 'G5'], 'O': ['O1', 'O2', 'O3', 'O4', 'O5'] } card = generate_single_card(input_data) # Check that card is 5x5 assert len(card) == 5 for row in card: assert len(row) == 5 # B column should have 2 values from input and 3 empty strings b_values = [card[i][0] for i in range(5)] input_b_values = [val for val in b_values if val != ''] assert all(val in input_data['B'] for val in input_b_values) assert len(input_b_values) == 2 # N column should have 2 values from input, 1 FREE space, and 2 empty strings n_values = [card[i][2] for i in range(5)] free_count = n_values.count("FREE") assert free_count == 1 # Exactly one FREE space assert n_values[2] == "FREE" # FREE space is in the center (row 2) actual_n_values = [val for val in n_values if val not in ["FREE", ""]] assert all(val in input_data['N'] for val in actual_n_values) assert len(actual_n_values) == min(2, 4) # Should have min(available, 4) values def test_generate_bingo_cards(): """Test generating multiple BINGO cards.""" input_data = { 'B': ['B1', 'B2', 'B3', 'B4', 'B5'], 'I': ['I1', 'I2', 'I3', 'I4', 'I5'], 'N': ['N1', 'N2', 'N4', 'N5', 'N6'], 'G': ['G1', 'G2', 'G3', 'G4', 'G5'], 'O': ['O1', 'O2', 'O3', 'O4', 'O5'] } # Generate 3 cards cards = generate_bingo_cards(input_data, 3) assert len(cards) == 3 # Each card should be 5x5 for card in cards: assert len(card) == 5 for row in card: assert len(row) == 5 def test_generate_bingo_cards_zero_cards(): """Test generating zero BINGO cards returns empty list.""" input_data = { 'B': ['B1', 'B2', 'B3', 'B4', 'B5'], 'I': ['I1', 'I2', 'I3', 'I4', 'I5'], 'N': ['N1', 'N2', 'N4', 'N5', 'N6'], 'G': ['G1', 'G2', 'G3', 'G4', 'G5'], 'O': ['O1', 'O2', 'O3', 'O4', 'O5'] } cards = generate_bingo_cards(input_data, 0) assert len(cards) == 0