Files
dice-counter/tests/test_stats.py
T
gitea-actionsandClaude Opus 5 d7c63cf98b stats: síň slávy a kariérní statistiky
- rekordy: nejvyšší tah, nejvyšší konečné skóre, nejrychlejší výhra
- kariéra: počet her, výher, úspěšnost, průměrné pořadí, průměr na tah
  a kolikrát koho postihlo vynulování
- do statistik jdou jen dohrané hry, nedohrané a opuštěné se ignorují
- celkové skóre počítá SQL stejným pravidlem jako core.Game.totals(),
  tedy součet tahů po posledním vynulování; testem ověřeno, že se obě
  cesty shodují
- vědomě chybí celkový součet bodů napříč hrami — cílové skóre je u každé
  hry jiné, metrika by odměňovala jen toho, kdo hrál nejvíc
- README se spuštěním a přehledem modulů

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-20 19:04:50 +02:00

101 lines
2.8 KiB
Python

import pytest
import stats
import storage
@pytest.fixture
def conn(tmp_path):
connection = storage.connect(tmp_path / "test.db")
yield connection
connection.close()
def play(conn, names, final_score, values, finish=True):
game_id = storage.create_game(conn, names, final_score)
game = storage.load_game(conn, game_id)
for value in values:
storage.add_turn(conn, game_id, game.add_score(value).turn)
if finish and game.winner:
storage.finish_game(conn, game_id, game.winner)
return game_id
def by_name(table):
return {row["name"]: row for row in table}
def test_prazdna_sin_slavy(conn):
found = stats.records(conn)
assert found["best_turn"] is None
assert found["best_score"] is None
assert found["fastest"] is None
assert stats.careers(conn) == []
def test_rekordy(conn):
play(conn, ["Adam", "Eva"], 1000, [600, 200, 500, 100])
found = stats.records(conn)
assert found["best_turn"]["name"] == "Adam"
assert found["best_turn"]["value"] == 600
assert found["best_score"]["name"] == "Adam"
assert found["best_score"]["total"] == 1100
assert found["fastest"]["name"] == "Adam"
assert found["fastest"]["rounds"] == 2
def test_kariera_pocita_vyhry_a_uspesnost(conn):
play(conn, ["Adam", "Eva"], 1000, [600, 200, 500, 100])
play(conn, ["Adam", "Eva"], 1000, [100, 600, 200, 500])
table = by_name(stats.careers(conn))
assert table["Adam"]["games"] == 2
assert table["Adam"]["wins"] == 1
assert table["Adam"]["share"] == 0.5
assert table["Eva"]["wins"] == 1
def test_nedohrane_hry_se_nepocitaji(conn):
play(conn, ["Adam", "Eva"], 1000, [600, 200, 500, 100])
play(conn, ["Adam", "Eva"], 5000, [100, 100], finish=False)
table = by_name(stats.careers(conn))
assert table["Adam"]["games"] == 1
def test_vynulovani_se_pocita(conn):
# Eva vyhraje, Adam se cestou třikrát vynuluje.
play(conn, ["Adam", "Eva"], 1000, [300, 400, 0, 300, 0, 200, 0, 500])
table = by_name(stats.careers(conn))
assert table["Adam"]["wipeouts"] == 1
assert table["Eva"]["wipeouts"] == 0
def test_prumerne_poradi(conn):
play(conn, ["Adam", "Eva", "Petr"], 1000, [600, 300, 100, 500, 200, 50])
table = by_name(stats.careers(conn))
assert table["Adam"]["placing"] == 1
assert table["Eva"]["placing"] == 2
assert table["Petr"]["placing"] == 3
def test_soucty_v_sql_respektuji_vynulovani(conn):
"""SQL musí počítat celkové skóre stejně jako core.Game.totals()."""
game_id = play(conn, ["Adam", "Eva"], 1000, [300, 100, 0, 100, 0, 100, 0, 900])
game = storage.load_game(conn, game_id)
best = stats.records(conn)["best_score"]
assert game.totals()["Adam"] == 0
assert best["name"] == "Eva"
assert best["total"] == game.totals()["Eva"]