mirror of
https://github.com/jcwimer/wrestlingApp
synced 2026-04-12 16:25:41 +00:00
New stats page, scoreboard, and live scores pages.
This commit is contained in:
94
test/javascript/match_state/presenters.test.js
Normal file
94
test/javascript/match_state/presenters.test.js
Normal file
@@ -0,0 +1,94 @@
|
||||
import { describe, expect, it } from "vitest"
|
||||
import { getMatchStateConfig } from "match-state-config"
|
||||
import { buildInitialState } from "match-state-engine"
|
||||
import {
|
||||
buttonClassForParticipant,
|
||||
choiceViewModel,
|
||||
displayLabelForParticipant,
|
||||
eventLogSections,
|
||||
humanizeChoice
|
||||
} from "match-state-presenters"
|
||||
|
||||
describe("match state presenters", () => {
|
||||
it("maps assignment to display labels and button classes", () => {
|
||||
const assignment = { w1: "green", w2: "red" }
|
||||
|
||||
expect(displayLabelForParticipant(assignment, "w1")).toBe("Green")
|
||||
expect(displayLabelForParticipant(assignment, "w2")).toBe("Red")
|
||||
expect(buttonClassForParticipant(assignment, "w1")).toBe("btn-success")
|
||||
expect(buttonClassForParticipant(assignment, "w2")).toBe("btn-danger")
|
||||
expect(humanizeChoice("defer")).toBe("Defer")
|
||||
})
|
||||
|
||||
it("builds choice view model with defer blocking another defer", () => {
|
||||
const config = getMatchStateConfig("folkstyle_usa", "Bracket Round of 64")
|
||||
const state = buildInitialState(config)
|
||||
const phase = config.phaseSequence[1]
|
||||
state.events = [{
|
||||
id: 1,
|
||||
phaseKey: phase.key,
|
||||
phaseLabel: phase.label,
|
||||
clockSeconds: 0,
|
||||
participantKey: "w1",
|
||||
actionKey: "choice_defer"
|
||||
}]
|
||||
|
||||
const viewModel = choiceViewModel(config, state, phase, {
|
||||
w1: { name: "Wrestler 1" },
|
||||
w2: { name: "Wrestler 2" }
|
||||
})
|
||||
|
||||
expect(viewModel.label).toBe("Choose wrestler and position")
|
||||
expect(viewModel.selectionText).toContain("Green deferred")
|
||||
expect(viewModel.buttons.map((button) => [button.participantKey, button.choiceKey])).toEqual([
|
||||
["w2", "top"],
|
||||
["w2", "bottom"],
|
||||
["w2", "neutral"]
|
||||
])
|
||||
})
|
||||
|
||||
it("builds event log sections with formatted action labels", () => {
|
||||
const config = getMatchStateConfig("folkstyle_usa", "Bracket Round of 64")
|
||||
const state = buildInitialState(config)
|
||||
state.events = [
|
||||
{
|
||||
id: 1,
|
||||
phaseKey: "period_1",
|
||||
phaseLabel: "Period 1",
|
||||
clockSeconds: 100,
|
||||
participantKey: "w1",
|
||||
actionKey: "takedown_3"
|
||||
},
|
||||
{
|
||||
id: 2,
|
||||
phaseKey: "period_1",
|
||||
phaseLabel: "Period 1",
|
||||
clockSeconds: 80,
|
||||
participantKey: "w2",
|
||||
actionKey: "timer_used_blood",
|
||||
elapsedSeconds: 15
|
||||
}
|
||||
]
|
||||
|
||||
const sections = eventLogSections(config, state, (seconds) => `F-${seconds}`)
|
||||
|
||||
expect(sections).toHaveLength(1)
|
||||
expect(sections[0].label).toBe("Period 1")
|
||||
expect(sections[0].items).toEqual([
|
||||
{
|
||||
id: 2,
|
||||
participantKey: "w2",
|
||||
colorLabel: "Red",
|
||||
actionLabel: "Blood Time Used: F-15",
|
||||
clockLabel: "F-80"
|
||||
},
|
||||
{
|
||||
id: 1,
|
||||
participantKey: "w1",
|
||||
colorLabel: "Green",
|
||||
actionLabel: "Takedown +3",
|
||||
clockLabel: "F-100"
|
||||
}
|
||||
])
|
||||
})
|
||||
})
|
||||
Reference in New Issue
Block a user