feat: scaffold mvp shell and content runtime
This commit is contained in:
140
tests/game-session.test.js
Normal file
140
tests/game-session.test.js
Normal file
@@ -0,0 +1,140 @@
|
||||
import test from 'node:test'
|
||||
import assert from 'node:assert/strict'
|
||||
|
||||
import { createContentSystem } from '../js/content/index.js'
|
||||
import { createGameSession } from '../js/gameplay/session/index.js'
|
||||
|
||||
test('pickPiece adds a clickable piece to the slot', () => {
|
||||
const session = createGameSession({
|
||||
cityId: 'beijing',
|
||||
levelId: 1,
|
||||
seed: 11001,
|
||||
contentSystem: createContentSystem(),
|
||||
})
|
||||
const clickablePiece = session.getClickablePieces()[0]
|
||||
|
||||
const result = session.pickPiece(clickablePiece.id)
|
||||
|
||||
assert.equal(result.status, 'picked')
|
||||
assert.equal(session.getState().slot.length, 1)
|
||||
assert.equal(session.getState().slot[0].pieceId, clickablePiece.id)
|
||||
})
|
||||
|
||||
test('pickPiece auto clears triples from the slot', () => {
|
||||
const contentSystem = createContentSystem()
|
||||
const session = createGameSession({
|
||||
cityId: 'beijing',
|
||||
levelId: 1,
|
||||
seed: 11001,
|
||||
contentSystem,
|
||||
boardState: {
|
||||
boardId: 'test',
|
||||
cityId: 'beijing',
|
||||
levelId: 1,
|
||||
seed: 1,
|
||||
pieces: [
|
||||
{ id: 'p1', elementId: 'beijing_01', layer: 0, x: 0, y: 0, width: 64, height: 64, rotation: 0, removed: false },
|
||||
{ id: 'p2', elementId: 'beijing_01', layer: 0, x: 70, y: 0, width: 64, height: 64, rotation: 0, removed: false },
|
||||
{ id: 'p3', elementId: 'beijing_01', layer: 0, x: 140, y: 0, width: 64, height: 64, rotation: 0, removed: false },
|
||||
{ id: 'p4', elementId: 'beijing_02', layer: 0, x: 0, y: 70, width: 64, height: 64, rotation: 0, removed: false },
|
||||
{ id: 'p5', elementId: 'beijing_02', layer: 0, x: 70, y: 70, width: 64, height: 64, rotation: 0, removed: false },
|
||||
{ id: 'p6', elementId: 'beijing_02', layer: 0, x: 140, y: 70, width: 64, height: 64, rotation: 0, removed: false },
|
||||
],
|
||||
overlapGraph: {
|
||||
p1: [],
|
||||
p2: [],
|
||||
p3: [],
|
||||
p4: [],
|
||||
p5: [],
|
||||
p6: [],
|
||||
},
|
||||
metrics: {},
|
||||
},
|
||||
})
|
||||
|
||||
session.pickPiece('p1')
|
||||
session.pickPiece('p2')
|
||||
const third = session.pickPiece('p3')
|
||||
|
||||
assert.equal(third.status, 'matched')
|
||||
assert.equal(session.getState().slot.length, 0)
|
||||
assert.equal(session.getState().removedPieceIds.length, 3)
|
||||
})
|
||||
|
||||
test('session fails when slot fills without a match', () => {
|
||||
const session = createGameSession({
|
||||
cityId: 'beijing',
|
||||
levelId: 1,
|
||||
seed: 11001,
|
||||
contentSystem: createContentSystem(),
|
||||
boardState: {
|
||||
boardId: 'full-slot',
|
||||
cityId: 'beijing',
|
||||
levelId: 1,
|
||||
seed: 2,
|
||||
pieces: ['a', 'b', 'c', 'd', 'e', 'f', 'g'].map((key, index) => ({
|
||||
id: `p${index + 1}`,
|
||||
elementId: key,
|
||||
layer: 0,
|
||||
x: index * 70,
|
||||
y: 0,
|
||||
width: 64,
|
||||
height: 64,
|
||||
rotation: 0,
|
||||
removed: false,
|
||||
})),
|
||||
overlapGraph: {
|
||||
p1: [],
|
||||
p2: [],
|
||||
p3: [],
|
||||
p4: [],
|
||||
p5: [],
|
||||
p6: [],
|
||||
p7: [],
|
||||
},
|
||||
metrics: {},
|
||||
},
|
||||
})
|
||||
|
||||
for (let index = 1; index <= 6; index += 1) {
|
||||
session.pickPiece(`p${index}`)
|
||||
}
|
||||
|
||||
const last = session.pickPiece('p7')
|
||||
|
||||
assert.equal(last.status, 'failed')
|
||||
assert.equal(session.getState().status, 'failed')
|
||||
})
|
||||
|
||||
test('session wins when the final triple clears the board', () => {
|
||||
const session = createGameSession({
|
||||
cityId: 'beijing',
|
||||
levelId: 1,
|
||||
seed: 11001,
|
||||
contentSystem: createContentSystem(),
|
||||
boardState: {
|
||||
boardId: 'win-state',
|
||||
cityId: 'beijing',
|
||||
levelId: 1,
|
||||
seed: 3,
|
||||
pieces: [
|
||||
{ id: 'p1', elementId: 'beijing_01', layer: 0, x: 0, y: 0, width: 64, height: 64, rotation: 0, removed: false },
|
||||
{ id: 'p2', elementId: 'beijing_01', layer: 0, x: 70, y: 0, width: 64, height: 64, rotation: 0, removed: false },
|
||||
{ id: 'p3', elementId: 'beijing_01', layer: 0, x: 140, y: 0, width: 64, height: 64, rotation: 0, removed: false },
|
||||
],
|
||||
overlapGraph: {
|
||||
p1: [],
|
||||
p2: [],
|
||||
p3: [],
|
||||
},
|
||||
metrics: {},
|
||||
},
|
||||
})
|
||||
|
||||
session.pickPiece('p1')
|
||||
session.pickPiece('p2')
|
||||
const third = session.pickPiece('p3')
|
||||
|
||||
assert.equal(third.status, 'won')
|
||||
assert.equal(session.getState().status, 'won')
|
||||
})
|
||||
Reference in New Issue
Block a user