///- --package .

scoreboard (test)

test scoreboard: prelude
///- --test static --symbol

:< testing
:< sm'_operators
:= run_ms () : i32 = client::env_i32 "TIBIA_ARENA_RUN_MS" 150000
:= probe_timeout_ms () : i32 = run_ms () + 50000
:= summary_every () : i32 = 100

:== tally =
    {
        ticks : i32
        heals : i32
        strikes : i32
        holds : i32
        kills : i32
        retreats : i32
        cornered : i32
        gated : i32
        lowest : i32
    }

:== pace = { start_experience : i32; started_at : mut i32; full_experience : i32 }

:= empty () : tally =
    { ticks = 0; heals = 0; strikes = 0; holds = 0; kills = 0; retreats = 0; cornered = 0; gated = 0; lowest = 999 }

:= counted (health : i32) (t : tally) : tally =
    { t ?| ticks = t::ticks + 1; lowest = ? health < t::lowest ?> health |: t::lowest }

:= elapsed (p : pace) : i32 = client::now_ms () - *p::started_at

:= gained (p : pace) : i32 = client::player_experience () - p::start_experience

:= action_counts (t : tally) : string =
    := ticks, heals, strikes, holds = t::ticks, t::heals, t::strikes, t::holds
    "ticks " ++#? ticks ++# " heals " ++#? heals ++# " strikes " ++#? strikes ++# " holds " ++#? holds

:= escape_counts (t : tally) : string =
    := retreats, cornered, gated, kills = t::retreats, t::cornered, t::gated, t::kills
    " retreats " ++#? retreats ++# " cornered " ++#? cornered ++# " gated " ++#? gated ++# " kills " ++#? kills

:= vitals (health : i32) (lowest : i32) (plus : i32) : string =
    " health " ++#? health ++# " lowest " ++#? lowest ++# " experience +" ++#? plus

:= summary_text (health : i32) (plus : i32) (t : tally) : string =
    action_counts t ++# escape_counts t ++# vitals health t::lowest plus

:= summary (p : pace) (t : tally) : string = summary_text (client::player_health ()) (gained p) t

:= due_for_summary (t : tally) : bool = t::ticks % summary_every () = 0

:= trace_every () : i32 = 10

:= due_for_trace (t : tally) : bool = t::ticks % trace_every () = 0

:= pace_from_environment (start_experience : i32) (started_at : mut i32) : pace =
    {
        start_experience = start_experience
        started_at = started_at
        full_experience = client::env_i32 "TIBIA_ARENA_FULL_EXPERIENCE" 90
    }

:= run_complete (p : pace) (t : tally) : () =
    probe::note ("end: " ++# summary p t)
    probe::finish_reporting_parity "run complete"

:= cleared_noted (p : pace) (t : tally) (on_cleared : () -> ()) : () =
    := at = elapsed p
    probe::note ("cleared at " ++#? at ++# " ms")
    probe::note ("cleared: " ++# summary p t)
    on_cleared ()
    probe::finish_reporting_parity "cleared"

:= finish_or_continue (p : pace) (t : tally) (on_cleared : () -> ()) (continue : () -> ()) : () =
    ? elapsed p > run_ms () ?> run_complete p t
    |? gained p >= p::full_experience ?> cleared_noted p t on_cleared
    |: continue ()

counted_ticks_and_keeps_the_lowest_health (test)

test counted_ticks_and_keeps_the_lowest_health: passed
///- --test --symbol
///> lua
///> c

:= t = empty () |> counted 400 |> counted 180 |> counted 300
(t::ticks, t::lowest, due_for_trace t, due_for_summary t, due_for_summary (empty ()))
|> _assert_eq (3i32, 180i32, !-, !-, !+)
__assert_eq { expected = (3, 180, false, false, true) }
lua: unavailable on this machine (`spiral lua --lua-path /tmp/spiral_cells/1793692850528-4/main.lua` was not found)

counters_keep_their_order (test)

test counters_keep_their_order: passed
///- --test --symbol
///> lua
///> c

:= t = { (empty ()) ?| ticks = 100; heals = 4; strikes = 9; kills = 3 }
(action_counts t, escape_counts t)
|> _assert_eq ("ticks 100 heals 4 strikes 9 holds 0", " retreats 0 cornered 0 gated 0 kills 3")
__assert_eq { expected = (ticks 100 heals 4 strikes 9 holds 0,  retreats 0 cornered 0 gated 0 kills 3) }
lua: unavailable on this machine (`spiral lua --lua-path /tmp/spiral_cells/1793692850529-36/main.lua` was not found)

vitals_report_health_lowest_and_experience (test)

test vitals_report_health_lowest_and_experience: passed
///- --test --symbol
///> lua
///> c

vitals 377 210 675 |> _assert_eq " health 377 lowest 210 experience +675"
__assert_eq { expected =  health 377 lowest 210 experience +675 }
lua: unavailable on this machine (`spiral lua --lua-path /tmp/spiral_cells/1793692850590-35/main.lua` was not found)

summary_text_is_counts_then_vitals (test)

test summary_text_is_counts_then_vitals: passed
///- --test --symbol
///> lua
///> c

:= t = { (empty ()) ?| ticks = 100; kills = 3; lowest = 210 }
summary_text 377 675 t |> _assert_eq (action_counts t ++# escape_counts t ++# vitals 377 210 675)
__assert_eq { expected = ticks 100 heals 0 strikes 0 holds 0 retreats 0 cornered 0 gated 0 kills 3 health 377 lowest 210 experience +675 }
lua: unavailable on this machine (`spiral lua --lua-path /tmp/spiral_cells/1793692854222-6530/main.lua` was not found)