Files
wechat-minigame/tests/scene-store.test.js
2026-03-29 00:36:28 +08:00

125 lines
4.0 KiB
JavaScript

import test from 'node:test'
import assert from 'node:assert/strict'
import { createContentSystem, createDefaultPlayerState } from '../js/content/index.js'
import { createSceneStore } from '../js/ui/scene-store.js'
test('scene store starts on the home selection page', () => {
const contentSystem = createContentSystem()
const playerState = createDefaultPlayerState()
const sceneStore = createSceneStore({ contentSystem, playerState })
assert.equal(sceneStore.getScene().type, 'home-select')
})
test('scene store opens level selection for unlocked city and returns back', () => {
const contentSystem = createContentSystem()
const playerState = createDefaultPlayerState()
const sceneStore = createSceneStore({ contentSystem, playerState })
const openedHome = sceneStore.openHomeTile('asia')
const opened = sceneStore.openCity('beijing')
assert.equal(openedHome.opened, true)
assert.equal(opened, true)
assert.equal(sceneStore.getScene().type, 'level-select')
assert.equal(sceneStore.getScene().cityId, 'beijing')
sceneStore.goBack()
assert.equal(sceneStore.getScene().type, 'city-select')
})
test('scene store opens gameplay scene from a valid level', () => {
const contentSystem = createContentSystem()
const playerState = createDefaultPlayerState()
const sceneStore = createSceneStore({ contentSystem, playerState })
sceneStore.openHomeTile('asia')
sceneStore.openCity('beijing')
const opened = sceneStore.openLevel('beijing', 1)
assert.equal(opened, true)
assert.equal(sceneStore.getScene().type, 'gameplay')
assert.equal(sceneStore.getScene().session.cityId, 'beijing')
assert.equal(sceneStore.getScene().session.levelId, 1)
})
test('scene store awards magnets, stamps, and unlocks the next city on completion', () => {
const contentSystem = createContentSystem()
const playerState = createDefaultPlayerState()
const sceneStore = createSceneStore({
contentSystem,
playerState,
now: () => new Date('2026-03-28T12:00:00.000Z').getTime(),
})
sceneStore.completeLevel({
cityId: 'beijing',
levelId: 1,
stars: 3,
})
assert.deepEqual(playerState.collectedMagnets, [
{
magnetId: 'magnet_beijing_1',
cityId: 'beijing',
levelId: 1,
acquiredDate: '2026-03-28T12:00:00.000Z',
},
])
for (let levelId = 2; levelId <= 6; levelId += 1) {
sceneStore.completeLevel({
cityId: 'beijing',
levelId,
stars: 3,
})
}
assert.equal(playerState.collectedCats.includes('beijing'), true)
assert.equal(playerState.passportStamps.includes('beijing'), true)
assert.equal(playerState.unlockedCities.includes('tokyo'), true)
assert.deepEqual(playerState.collectedStamps, [
{
stampId: 'stamp_beijing',
cityId: 'beijing',
acquiredDate: '2026-03-28T12:00:00.000Z',
},
])
})
test('scene store reports locked and placeholder home tiles without leaving the home scene', () => {
const contentSystem = createContentSystem()
const playerState = createDefaultPlayerState()
const sceneStore = createSceneStore({ contentSystem, playerState })
const locked = sceneStore.openHomeTile('europe')
const soon = sceneStore.openHomeTile('coming_soon')
assert.deepEqual(locked, { opened: false, reason: 'locked' })
assert.deepEqual(soon, { opened: false, reason: 'coming-soon' })
assert.equal(sceneStore.getScene().type, 'home-select')
})
test('scene store opens the gift zone and switches between MVP tabs', () => {
const contentSystem = createContentSystem()
const playerState = createDefaultPlayerState()
const sceneStore = createSceneStore({ contentSystem, playerState })
const opened = sceneStore.openGiftZone()
assert.equal(opened, true)
assert.equal(sceneStore.getScene().type, 'gift-zone')
assert.equal(sceneStore.getScene().selectedTab, 'magnets')
const switched = sceneStore.selectGiftTab('stamps')
assert.equal(switched, true)
assert.equal(sceneStore.getScene().selectedTab, 'stamps')
sceneStore.goBack()
assert.equal(sceneStore.getScene().type, 'home-select')
})