[
  {
    "case": "european_straight_5",
    "input": { "wheel": "european", "bet": "straight", "stake": 5, "planned_spins": 1 },
    "expected": { "pockets": 37, "winning_pockets": 1, "win_probability": "2.70%", "payout": "35:1", "loss_rate": "2.70%", "expected_loss_per_spin": "$0.14" },
    "limit": "Educational roulette math only; not a live-wheel prediction."
  },
  {
    "case": "american_red_10",
    "input": { "wheel": "american", "bet": "red", "stake": 10, "planned_spins": 1 },
    "expected": { "pockets": 38, "winning_pockets": 18, "win_probability": "47.37%", "payout": "1:1", "loss_rate": "5.26%", "expected_loss_per_spin": "$0.53" },
    "limit": "Zero and double zero are losing pockets for red/black unless a visible table rule says otherwise."
  },
  {
    "case": "french_even_money_la_partage_20",
    "input": { "wheel": "french", "bet": "even", "stake": 20, "planned_spins": 1 },
    "expected": { "pockets": 37, "winning_pockets": 18, "win_probability": "48.65%", "payout": "1:1", "loss_rate": "1.35%", "expected_loss_per_spin": "$0.27" },
    "limit": "Reduced edge applies only when La Partage or En Prison wording is visible for the exact even-money bet."
  },
  {
    "case": "triple_zero_straight_5",
    "input": { "wheel": "triplezero", "bet": "straight", "stake": 5, "planned_spins": 1 },
    "expected": { "pockets": 39, "winning_pockets": 1, "win_probability": "2.56%", "payout": "35:1", "loss_rate": "7.69%", "expected_loss_per_spin": "$0.38" },
    "limit": "Triple-zero adds a 000 pocket and requires visible table-rule verification."
  },
  {
    "case": "american_basket_5",
    "input": { "wheel": "american", "bet": "basket_0_00_1_2_3", "stake": 5, "planned_spins": 1 },
    "expected": { "pockets": 38, "winning_pockets": 5, "win_probability": "13.16%", "payout": "6:1", "loss_rate": "7.89%", "expected_loss_per_spin": "$0.39" },
    "limit": "Basket/top-line exceptions must be verified on the visible payout table."
  },
  {
    "case": "multi_chip_duplicate_coverage",
    "input": { "wheel": "european", "chip_amount": 1, "chips": { "17": 2, "20": 1 } },
    "expected": { "covered_pockets": 2, "total_chips": 3, "total_stake": "$3.00", "hit_probability": "5.41%", "expected_loss_per_spin": "$0.08", "duplicate_coverage": true },
    "limit": "Visual layout covers straight-number chips only, not neighbor, racetrack or progression systems."
  },
  {
    "case": "session_pace_american",
    "input": { "wheel": "american", "stake": 10, "spins_per_hour": 60, "session_hours": 2 },
    "expected": { "total_spins": 120, "total_wagered": "$1,200.00", "expected_loss_per_hour": "$31.58", "expected_session_loss": "$63.16" },
    "limit": "Expected loss is long-run cost context, not a session forecast."
  },
  {
    "case": "streak_european_red_five",
    "input": { "wheel": "european", "event": "red", "streak_length": 5 },
    "expected": { "specific_sequence_probability": "2.72%", "next_spin_probability": "48.65%", "signal": "no" },
    "limit": "Past spins do not make a color or number due."
  },
  {
    "case": "at_least_once_european_straight_100",
    "input": { "wheel": "european", "bet": "straight", "spins": 100 },
    "expected": { "single_spin_probability": "2.70%", "at_least_one_hit": "93.54%", "miss_every_spin": "6.46%", "signal": "no" },
    "limit": "At-least-once probability does not make the next spin due."
  },
  {
    "case": "table_rule_evidence_complete",
    "input": { "wheel_visible": true, "payout_visible": true, "zero_rule_visible": true, "limits_visible": true, "exception_visible": true, "privacy_safe_screenshot": true },
    "expected": { "confidence": "higher", "private_data_allowed": false },
    "limit": "Evidence confidence is not operator approval, legal advice or payout assurance."
  },
  {
    "case": "invalid_stake",
    "input": { "stake": 0 },
    "expected": { "validation_message": "Enter a stake above $0.", "calculation_updates": false },
    "limit": "Invalid inputs should not produce new roulette outputs."
  },
  {
    "case": "stake_over_practice_bankroll",
    "input": { "stake": 101, "practice_bankroll": 100 },
    "expected": { "validation_message": "Stake cannot exceed the current practice bankroll.", "spin_blocked": true },
    "limit": "Practice bankroll is an exposure warning, not a bankroll plan."
  },
  {
    "case": "la_partage_boundary",
    "input": { "wheel": "french", "bet": "dozen", "stake": 20 },
    "expected": { "loss_rate": "2.70%", "reduced_edge_applied": false },
    "limit": "La Partage is modeled only for even-money bets."
  }
]
