Files
CustomBingo/tests/test_card_generator.py

109 lines
3.7 KiB
Python

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