volleyballsimtypes 0.0.7 → 0.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +5 -5
- package/src/data/index.ts +0 -2
- package/src/data/models/block.ts +0 -159
- package/src/data/models/coach.ts +0 -94
- package/src/data/models/country.ts +0 -105
- package/src/data/models/event.ts +0 -83
- package/src/data/models/index.ts +0 -22
- package/src/data/models/league.ts +0 -90
- package/src/data/models/libero-replacement.ts +0 -104
- package/src/data/models/match-set-stats.ts +0 -204
- package/src/data/models/match-set.ts +0 -152
- package/src/data/models/match.ts +0 -106
- package/src/data/models/performance-stats.ts +0 -136
- package/src/data/models/player.ts +0 -370
- package/src/data/models/rally-position.ts +0 -79
- package/src/data/models/rally.ts +0 -229
- package/src/data/models/reception.ts +0 -113
- package/src/data/models/score.ts +0 -99
- package/src/data/models/season-teams.ts +0 -67
- package/src/data/models/season.ts +0 -103
- package/src/data/models/serve.ts +0 -113
- package/src/data/models/set.ts +0 -113
- package/src/data/models/spike.ts +0 -113
- package/src/data/models/substitution.ts +0 -98
- package/src/data/models/team.ts +0 -193
- package/src/data/transformers/block.ts +0 -117
- package/src/data/transformers/coach.ts +0 -33
- package/src/data/transformers/country.ts +0 -23
- package/src/data/transformers/court-position.ts +0 -43
- package/src/data/transformers/court-target.ts +0 -58
- package/src/data/transformers/event-type.ts +0 -35
- package/src/data/transformers/formation.ts +0 -16
- package/src/data/transformers/index.ts +0 -27
- package/src/data/transformers/league.ts +0 -26
- package/src/data/transformers/libero-replacement.ts +0 -62
- package/src/data/transformers/match-set-stats.ts +0 -101
- package/src/data/transformers/match-set.ts +0 -59
- package/src/data/transformers/match.ts +0 -48
- package/src/data/transformers/performance-stats.ts +0 -40
- package/src/data/transformers/player.ts +0 -109
- package/src/data/transformers/rally-position.ts +0 -24
- package/src/data/transformers/rally.ts +0 -139
- package/src/data/transformers/reception.ts +0 -98
- package/src/data/transformers/role.ts +0 -31
- package/src/data/transformers/score.ts +0 -43
- package/src/data/transformers/season.ts +0 -42
- package/src/data/transformers/serve.ts +0 -100
- package/src/data/transformers/set.ts +0 -98
- package/src/data/transformers/spike.ts +0 -102
- package/src/data/transformers/substitution.ts +0 -42
- package/src/data/transformers/team.ts +0 -45
- package/src/data/transformers/trait.ts +0 -37
- package/src/index.ts +0 -7
- package/src/routing/events.ts +0 -60
- package/src/routing/index.ts +0 -5
- package/src/routing/league.ts +0 -15
- package/src/routing/match.ts +0 -52
- package/src/routing/player.ts +0 -24
- package/src/routing/team.ts +0 -14
- package/src/service/coach/__stubs__/index.ts +0 -46
- package/src/service/coach/coach.test.ts +0 -10
- package/src/service/coach/coach.ts +0 -30
- package/src/service/coach/formation.test.ts +0 -10
- package/src/service/coach/formation.ts +0 -160
- package/src/service/coach/index.ts +0 -2
- package/src/service/country/__stubs__/index.ts +0 -13
- package/src/service/country/country.test.ts +0 -10
- package/src/service/country/country.ts +0 -23
- package/src/service/country/index.ts +0 -1
- package/src/service/event/__stubs__/index.ts +0 -25
- package/src/service/event/block.test.ts +0 -100
- package/src/service/event/block.ts +0 -69
- package/src/service/event/in-play-event.ts +0 -37
- package/src/service/event/libero-replacement.test.ts +0 -37
- package/src/service/event/libero-replacement.ts +0 -25
- package/src/service/event/rally-event.ts +0 -33
- package/src/service/event/reception.test.ts +0 -50
- package/src/service/event/reception.ts +0 -38
- package/src/service/event/score.test.ts +0 -29
- package/src/service/event/score.ts +0 -22
- package/src/service/event/serve.test.ts +0 -50
- package/src/service/event/serve.ts +0 -39
- package/src/service/event/set.test.ts +0 -50
- package/src/service/event/set.ts +0 -38
- package/src/service/event/spike.test.ts +0 -64
- package/src/service/event/spike.ts +0 -46
- package/src/service/event/substitution.ts +0 -16
- package/src/service/index.ts +0 -17
- package/src/service/league/index.ts +0 -3
- package/src/service/league/league.ts +0 -112
- package/src/service/league/season.ts +0 -41
- package/src/service/league/standing.ts +0 -82
- package/src/service/main.ts +0 -52
- package/src/service/match/__stubs__/index.ts +0 -119
- package/src/service/match/court-position.test.ts +0 -73
- package/src/service/match/court-position.ts +0 -46
- package/src/service/match/court-target.test.ts +0 -39
- package/src/service/match/court-target.ts +0 -30
- package/src/service/match/index.ts +0 -6
- package/src/service/match/match-set.test.ts +0 -174
- package/src/service/match/match-set.ts +0 -140
- package/src/service/match/match-team.test.ts +0 -16
- package/src/service/match/match-team.ts +0 -13
- package/src/service/match/match.test.ts +0 -80
- package/src/service/match/match.ts +0 -63
- package/src/service/match/rally.test.ts +0 -94
- package/src/service/match/rally.ts +0 -79
- package/src/service/player/__stubs__/index.ts +0 -1433
- package/src/service/player/index.ts +0 -5
- package/src/service/player/performance-stats.test.ts +0 -24
- package/src/service/player/performance-stats.ts +0 -47
- package/src/service/player/player.test.ts +0 -51
- package/src/service/player/player.ts +0 -101
- package/src/service/player/role.test.ts +0 -29
- package/src/service/player/role.ts +0 -33
- package/src/service/player/stats.test.ts +0 -23
- package/src/service/player/stats.ts +0 -29
- package/src/service/player/trait.test.ts +0 -10
- package/src/service/player/trait.ts +0 -124
- package/src/service/team/__stubs__/index.ts +0 -290
- package/src/service/team/index.ts +0 -1
- package/src/service/team/team.test.ts +0 -30
- package/src/service/team/team.ts +0 -45
- package/src/service/utils/enum-utils.test.ts +0 -10
- package/src/service/utils/enum-utils.ts +0 -6
- package/src/service/utils/index.ts +0 -4
- package/src/service/utils/object-utils.ts +0 -1
- package/src/service/utils/rng-utils.test.ts +0 -32
- package/src/service/utils/rng-utils.ts +0 -41
- package/src/service/utils/string-utils.test.ts +0 -28
- package/src/service/utils/string-utils.ts +0 -13
- package/src/service/utils/testing-utils.ts +0 -2
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
import { describe, expect, test } from '@jest/globals'
|
|
2
|
-
import { Match } from './match'
|
|
3
|
-
import { noLiberoTeam, team } from '../team/__stubs__'
|
|
4
|
-
import { Team } from '../team'
|
|
5
|
-
import { finishedSet, inProgressSet, newSet } from './__stubs__'
|
|
6
|
-
import { MatchTeam } from './match-team'
|
|
7
|
-
|
|
8
|
-
describe('Match Test Module', () => {
|
|
9
|
-
let match: Match
|
|
10
|
-
|
|
11
|
-
beforeEach(() => {
|
|
12
|
-
match = new Match({
|
|
13
|
-
id: '1f7f63bc-6bfd-4f3d-bc46-b8c6d210664e',
|
|
14
|
-
sets: [],
|
|
15
|
-
homeTeam: team,
|
|
16
|
-
awayTeam: noLiberoTeam,
|
|
17
|
-
scheduledDate: new Date('2020-01-01')
|
|
18
|
-
})
|
|
19
|
-
})
|
|
20
|
-
|
|
21
|
-
test('Should instantiate object properly', () => {
|
|
22
|
-
expect(match.id).toBe('1f7f63bc-6bfd-4f3d-bc46-b8c6d210664e')
|
|
23
|
-
expect(match.homeTeam.id).toBe(team.id)
|
|
24
|
-
expect(match.awayTeam.id).toBe(noLiberoTeam.id)
|
|
25
|
-
expect(match.sets.length).toBe(0)
|
|
26
|
-
expect(match.scheduledDate.toUTCString()).toBe('Wed, 01 Jan 2020 00:00:00 GMT')
|
|
27
|
-
})
|
|
28
|
-
// addSet Tests
|
|
29
|
-
test('Should add a set to sets array', () => {
|
|
30
|
-
expect(match.sets.length).toBe(0)
|
|
31
|
-
match.addSet(newSet)
|
|
32
|
-
expect(match.sets.length).toBe(1)
|
|
33
|
-
})
|
|
34
|
-
test('Should throw an Error when trying to add a set after limit was reached', () => {
|
|
35
|
-
match.addSet(newSet)
|
|
36
|
-
match.addSet(newSet)
|
|
37
|
-
match.addSet(newSet)
|
|
38
|
-
|
|
39
|
-
function add (): void { match.addSet(newSet) }
|
|
40
|
-
|
|
41
|
-
expect(add).toThrow(/^SET_AMOUNT_EXCEEDED$/)
|
|
42
|
-
})
|
|
43
|
-
// getTeamSets Tests
|
|
44
|
-
test('Should return proper amount of sets per team', () => {
|
|
45
|
-
expect(match.getTeamSets(MatchTeam.HOME)).toBe(0)
|
|
46
|
-
match.addSet(finishedSet)
|
|
47
|
-
expect(match.getTeamSets(MatchTeam.HOME)).toBe(1)
|
|
48
|
-
expect(match.getTeamSets(MatchTeam.AWAY)).toBe(0)
|
|
49
|
-
match.addSet(inProgressSet)
|
|
50
|
-
expect(match.getTeamSets(MatchTeam.AWAY)).toBe(0)
|
|
51
|
-
})
|
|
52
|
-
// isOver Tests
|
|
53
|
-
test('Should return false when match is not over', () => {
|
|
54
|
-
expect(match.isOver()).toBe(false)
|
|
55
|
-
match.addSet(finishedSet)
|
|
56
|
-
expect(match.isOver()).toBe(false)
|
|
57
|
-
})
|
|
58
|
-
test('Should return true when match is over', () => {
|
|
59
|
-
match.addSet(finishedSet)
|
|
60
|
-
match.addSet(finishedSet)
|
|
61
|
-
match.addSet(finishedSet)
|
|
62
|
-
|
|
63
|
-
expect(match.isOver()).toBe(true)
|
|
64
|
-
})
|
|
65
|
-
// getWinner Tests
|
|
66
|
-
test('Should throw an Error when getting winner of unfinished match', () => {
|
|
67
|
-
function win (): void { match.getWinner() }
|
|
68
|
-
|
|
69
|
-
expect(win).toThrow(/^UNFINISHED_MATCH$/)
|
|
70
|
-
})
|
|
71
|
-
test('Should return winning team', () => {
|
|
72
|
-
match.addSet(finishedSet)
|
|
73
|
-
match.addSet(finishedSet)
|
|
74
|
-
match.addSet(finishedSet)
|
|
75
|
-
|
|
76
|
-
const winner: Team = match.getWinner()
|
|
77
|
-
|
|
78
|
-
expect(winner.id).toBe('426b5b9b-5be7-4963-92eb-71b7a3b29ffd')
|
|
79
|
-
})
|
|
80
|
-
})
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
import { MatchSet } from './match-set'
|
|
2
|
-
import { Team } from '../team'
|
|
3
|
-
import { validateUUID } from '../utils'
|
|
4
|
-
import { MatchTeam } from './match-team'
|
|
5
|
-
|
|
6
|
-
interface MatchOpts {
|
|
7
|
-
readonly id: string
|
|
8
|
-
readonly homeTeam: Team
|
|
9
|
-
readonly awayTeam: Team
|
|
10
|
-
readonly scheduledDate: Date
|
|
11
|
-
readonly sets: MatchSet[]
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export class Match {
|
|
15
|
-
static readonly BEST_OF = 5
|
|
16
|
-
readonly id: string
|
|
17
|
-
readonly homeTeam: Team
|
|
18
|
-
readonly awayTeam: Team
|
|
19
|
-
readonly sets: MatchSet[]
|
|
20
|
-
readonly scheduledDate: Date
|
|
21
|
-
|
|
22
|
-
constructor ({ id, homeTeam, awayTeam, scheduledDate, sets }: MatchOpts) {
|
|
23
|
-
validateUUID(id)
|
|
24
|
-
|
|
25
|
-
this.id = id
|
|
26
|
-
this.homeTeam = homeTeam
|
|
27
|
-
this.awayTeam = awayTeam
|
|
28
|
-
this.scheduledDate = scheduledDate
|
|
29
|
-
this.sets = sets
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
public addSet (set: MatchSet): void {
|
|
33
|
-
if (this.sets.length >= Match.BEST_OF) throw new Error('SET_AMOUNT_EXCEEDED')
|
|
34
|
-
|
|
35
|
-
this.sets.push(set)
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
public getTeamSets (team: MatchTeam): number {
|
|
39
|
-
return this.sets.reduce((sets, set) => sets + (!set.isOver() ? 0 : set.getWinner() === team ? 1 : 0), 0)
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
public isOver (): boolean {
|
|
43
|
-
const gamesRequired: number = Math.ceil(Match.BEST_OF / 2)
|
|
44
|
-
const lastSet: MatchSet | undefined = this.sets.at(-1)
|
|
45
|
-
|
|
46
|
-
if (lastSet == null || !lastSet.isOver() || this.sets.length < gamesRequired) return false
|
|
47
|
-
|
|
48
|
-
const homeSets: number = this.getTeamSets(MatchTeam.HOME)
|
|
49
|
-
const awaySets: number = this.getTeamSets(MatchTeam.AWAY)
|
|
50
|
-
|
|
51
|
-
// Check if any of the teams has enough sets to win.
|
|
52
|
-
return !(homeSets < gamesRequired && awaySets < gamesRequired)
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
public getWinner (): Team {
|
|
56
|
-
if (!this.isOver()) throw new Error('UNFINISHED_MATCH')
|
|
57
|
-
|
|
58
|
-
const homeSets: number = this.getTeamSets(MatchTeam.HOME)
|
|
59
|
-
const awaySets: number = this.getTeamSets(MatchTeam.AWAY)
|
|
60
|
-
|
|
61
|
-
return homeSets > awaySets ? this.homeTeam : this.awayTeam
|
|
62
|
-
}
|
|
63
|
-
}
|
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
import { describe, expect, test } from '@jest/globals'
|
|
2
|
-
import { Rally, RallyState } from './rally'
|
|
3
|
-
import { score, serve } from '../event/__stubs__'
|
|
4
|
-
import { EventType } from '../event/rally-event'
|
|
5
|
-
import { team } from '../team/__stubs__'
|
|
6
|
-
|
|
7
|
-
describe('Rally Test Module', () => {
|
|
8
|
-
let rally: Rally
|
|
9
|
-
|
|
10
|
-
beforeEach(() => {
|
|
11
|
-
rally = new Rally({
|
|
12
|
-
events: [],
|
|
13
|
-
order: 0,
|
|
14
|
-
servingTeam: team,
|
|
15
|
-
id: '0ac3ba3a-d710-42dc-a1e7-7066b8df5fd9',
|
|
16
|
-
homePlayerPosition: [],
|
|
17
|
-
awayPlayerPosition: []
|
|
18
|
-
})
|
|
19
|
-
})
|
|
20
|
-
|
|
21
|
-
test('Should instantiate the object properly', () => {
|
|
22
|
-
expect(rally.id).toBe('0ac3ba3a-d710-42dc-a1e7-7066b8df5fd9')
|
|
23
|
-
expect(rally.servingTeam.id).toBe('426b5b9b-5be7-4963-92eb-71b7a3b29ffd')
|
|
24
|
-
expect(rally.events.length).toBe(0)
|
|
25
|
-
expect(rally.state).toBe(0)
|
|
26
|
-
})
|
|
27
|
-
// nextState Tests
|
|
28
|
-
test('Should cycle through states correctly', () => {
|
|
29
|
-
expect(rally.state).toBe(0)
|
|
30
|
-
rally.nextState()
|
|
31
|
-
expect(rally.state).toBe(1)
|
|
32
|
-
rally.nextState()
|
|
33
|
-
expect(rally.state).toBe(2)
|
|
34
|
-
rally.nextState()
|
|
35
|
-
expect(rally.state).toBe(3)
|
|
36
|
-
})
|
|
37
|
-
test('Should throw Error when trying to get next state after FINISHED', () => {
|
|
38
|
-
function state (): void {
|
|
39
|
-
rally.nextState()
|
|
40
|
-
rally.nextState()
|
|
41
|
-
rally.nextState()
|
|
42
|
-
rally.nextState()
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
expect(state).toThrow(/^CANT_GET_STATE_AFTER: FINISHED$/)
|
|
46
|
-
})
|
|
47
|
-
// addEvent Tests
|
|
48
|
-
test('Should add event to event array', () => {
|
|
49
|
-
expect(rally.events.length).toBe(0)
|
|
50
|
-
rally.addEvent(serve)
|
|
51
|
-
expect(rally.events.at(-1)?.eventType).toBe(EventType.SERVE)
|
|
52
|
-
})
|
|
53
|
-
// isOver Tests
|
|
54
|
-
test('Should return false if rally state is not FINISHED', () => {
|
|
55
|
-
expect(rally.state).toBe(0)
|
|
56
|
-
expect(rally.isOver()).toBe(false)
|
|
57
|
-
})
|
|
58
|
-
test('Should return true if rally state is FINISHED', () => {
|
|
59
|
-
rally.nextState()
|
|
60
|
-
rally.nextState()
|
|
61
|
-
rally.nextState()
|
|
62
|
-
|
|
63
|
-
expect(rally.state).toBe(3)
|
|
64
|
-
expect(rally.isOver()).toBe(true)
|
|
65
|
-
})
|
|
66
|
-
// getScore Tests
|
|
67
|
-
test('Should return undefined if events array does not contain a Score', () => {
|
|
68
|
-
rally.addEvent(serve)
|
|
69
|
-
expect(rally.score).toBeUndefined()
|
|
70
|
-
})
|
|
71
|
-
test('Should return Score if events array contains a Score', () => {
|
|
72
|
-
rally.addEvent(score)
|
|
73
|
-
expect(rally.score).not.toBeUndefined()
|
|
74
|
-
expect(rally.score?.eventType).toBe(EventType.SCORE)
|
|
75
|
-
})
|
|
76
|
-
// RallyState Tests
|
|
77
|
-
test('Should get next state', () => {
|
|
78
|
-
expect(RallyState.nextState(0)).toBe(1)
|
|
79
|
-
expect(RallyState.nextState(1)).toBe(2)
|
|
80
|
-
})
|
|
81
|
-
test('Should throw Error for state outside range', () => {
|
|
82
|
-
function fn1 (): void { RallyState.nextState(-1) }
|
|
83
|
-
|
|
84
|
-
function fn2 (): void { RallyState.nextState(4) }
|
|
85
|
-
|
|
86
|
-
expect(fn1).toThrow(/^STATE_INDEX_OUT_OF_BOUNDS$/)
|
|
87
|
-
expect(fn2).toThrow(/^STATE_INDEX_OUT_OF_BOUNDS$/)
|
|
88
|
-
})
|
|
89
|
-
test('Should throw Error for last state', () => {
|
|
90
|
-
function fn (): void { RallyState.nextState(3) }
|
|
91
|
-
|
|
92
|
-
expect(fn).toThrow(/^CANT_GET_STATE_AFTER: FINISHED$/)
|
|
93
|
-
})
|
|
94
|
-
})
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
import { validateUUID } from '../utils'
|
|
2
|
-
import { Team } from '../team'
|
|
3
|
-
import { CourtPosition } from './court-position'
|
|
4
|
-
import { EventType, RallyEvent } from '../event/rally-event'
|
|
5
|
-
import { Score } from '../event/score'
|
|
6
|
-
|
|
7
|
-
interface RallyOpts {
|
|
8
|
-
readonly id: string
|
|
9
|
-
readonly order: number
|
|
10
|
-
readonly servingTeam: Team
|
|
11
|
-
readonly events: RallyEvent[]
|
|
12
|
-
readonly homePlayerPosition: PlayerPosition[]
|
|
13
|
-
readonly awayPlayerPosition: PlayerPosition[]
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export interface PlayerPosition {
|
|
17
|
-
position: CourtPosition
|
|
18
|
-
playerId: string
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export enum RallyState {
|
|
22
|
-
NEW = 0,
|
|
23
|
-
MANAGEMENT = 1,
|
|
24
|
-
IN_PLAY = 2,
|
|
25
|
-
FINISHED = 3
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
// eslint-disable-next-line @typescript-eslint/no-namespace
|
|
29
|
-
export namespace RallyState {
|
|
30
|
-
export function nextState (state: number): RallyState {
|
|
31
|
-
if (state < 0 || state > 3) throw new Error('STATE_INDEX_OUT_OF_BOUNDS')
|
|
32
|
-
if (state === 3) throw new Error(`CANT_GET_STATE_AFTER: ${RallyState[state]}`)
|
|
33
|
-
|
|
34
|
-
return state + 1
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
export class Rally {
|
|
39
|
-
readonly id: string
|
|
40
|
-
readonly servingTeam: Team
|
|
41
|
-
readonly events: RallyEvent[]
|
|
42
|
-
readonly homePlayerPosition: PlayerPosition[]
|
|
43
|
-
readonly awayPlayerPosition: PlayerPosition[]
|
|
44
|
-
readonly order: number
|
|
45
|
-
|
|
46
|
-
constructor ({ id, order, servingTeam, homePlayerPosition, awayPlayerPosition, events }: RallyOpts) {
|
|
47
|
-
validateUUID(id)
|
|
48
|
-
|
|
49
|
-
this.id = id
|
|
50
|
-
this.order = order
|
|
51
|
-
this.servingTeam = servingTeam
|
|
52
|
-
this.homePlayerPosition = homePlayerPosition
|
|
53
|
-
this.awayPlayerPosition = awayPlayerPosition
|
|
54
|
-
this.events = events
|
|
55
|
-
this._state = RallyState.NEW
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
private _state: RallyState
|
|
59
|
-
|
|
60
|
-
get state (): RallyState {
|
|
61
|
-
return this._state
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
public get score (): Score | undefined {
|
|
65
|
-
return this.events.find(e => e.eventType === EventType.SCORE) as Score
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
public isOver (): boolean {
|
|
69
|
-
return this._state === RallyState.FINISHED
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
public addEvent (event: RallyEvent): void {
|
|
73
|
-
this.events.push(event)
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
public nextState (): void {
|
|
77
|
-
this._state = RallyState.nextState(this._state)
|
|
78
|
-
}
|
|
79
|
-
}
|