fuzzyworld

explodorama / files / test / targetLabel.test.ts

targetLabel.test.ts

4.3 KB · history · blame

1import { describe, expect, it } from 'vitest'
2import { targetLabel } from '../src/ui/targetLabel'
3import { board, v } from './helpers'
4
5// A roomy empty level, the player in the middle; enemies and bombs are added per case.
6const room = () =>
7 board(`
8 #######
9 #.....#
10 #.....#
11 #..P..#
12 #.....#
13 #.....#
14 #######`)
15
16describe('the controller target label', () => {
17 it('Move, Bomb and Wait', () => {
18 const s = room()
19 expect(targetLabel(s, 'move', v(4, 3))).toBe('Move to this tile')
20 expect(targetLabel(s, 'bomb', v(4, 3))).toBe('Place a bomb on this tile')
21 expect(targetLabel(s, 'wait', null)).toBe('Wait a turn')
22 })
23 it('a button with no tile and no Wait has nothing to do', () => {
24 expect(targetLabel(room(), 'move', null)).toBe('Nothing to do here')
25 })
26 it('Run, Diagonal and Slide are told apart by the tile', () => {
27 const s = room()
28 s.powers.run = true
29 s.powers.diagonal = true
30 expect(targetLabel(s, 'move', v(5, 3))).toBe('Run to this tile')
31 expect(targetLabel(s, 'move', v(4, 2))).toBe('Step diagonally to this tile')
32 })
33 it('Kick, with a bomb next to the player', () => {
34 const s = board(`
35 ######
36 #P3..#
37 ######`)
38 s.powers.kick = true
39 expect(targetLabel(s, 'move', v(2, 1))).toBe('Kick the bomb on this tile')
40 })
41 it('Kick and Bomb Pass together ask which', () => {
42 const s = board(`
43 ######
44 #P8..#
45 ######`)
46 s.powers.kick = true
47 s.powers.bombPass = true
48 expect(targetLabel(s, 'move', v(2, 1))).toBe('Choose what to do with the bomb on this tile')
49 })
50 it('Bomb Pass alone walks onto the bomb', () => {
51 const s = board(`
52 ######
53 #P8..#
54 ######`)
55 s.powers.bombPass = true
56 expect(targetLabel(s, 'move', v(2, 1))).toBe('Walk onto the bomb on this tile')
57 })
58 it('Throw, RPG and Detonator', () => {
59 const s = room()
60 s.powers.throw = true
61 s.powers.rpg = true
62 expect(targetLabel(s, 'bomb', v(5, 3))).toBe('Throw a bomb to this tile')
63 expect(targetLabel(s, 'bomb', v(5, 3))).not.toContain('RPG')
64 // The RPG lands at the end of a straight line, further than a throw reaches.
65 const lane = board(`
66 ########
67 #P.....#
68 ########`)
69 lane.powers.throw = true
70 lane.powers.rpg = true
71 expect(targetLabel(lane, 'bomb', v(3, 1))).toBe('Throw a bomb to this tile')
72 expect(targetLabel(lane, 'bomb', v(6, 1))).toBe('Fire an RPG bomb to this tile')
73 const d = board(`
74 ######
75 #P.7.#
76 ######`)
77 d.powers.detonate = true
78 expect(targetLabel(d, 'bomb', v(3, 1))).toBe('Set off the bomb on this tile')
79 })
80 it('each charge', () => {
81 const s = room()
82 s.charge = { kind: 'nuke', left: 1 }
83 expect(targetLabel(s, 'charged', v(4, 3))).toBe('Place a Nuke bomb on this tile')
84 s.charge = { kind: 'pierce', left: 1 }
85 expect(targetLabel(s, 'charged', v(4, 3))).toBe('Place a Pierce bomb on this tile')
86 s.charge = { kind: 'freeze', left: 1 }
87 expect(targetLabel(s, 'charged', v(3, 3))).toBe('Freeze every enemy')
88 s.charge = { kind: 'decoy', left: 1 }
89 expect(targetLabel(s, 'charged', v(4, 3))).toContain('Put a decoy on this tile')
90 s.charge = { kind: 'icbm', left: 1 }
91 expect(targetLabel(s, 'charged', v(1, 3))).toContain('Launch an ICBM to this tile')
92 s.charge = { kind: 'teleport', left: 1 }
93 expect(targetLabel(s, 'charged', v(5, 4))).toBe('Teleport to this tile')
94 })
95 it('says so when it would cost a life', () => {
96 // A bomb about to go off two tiles away: stepping next to it is deadly.
97 const s = board(`
98 #######
99 #P.1..#
100 #######`)
101 expect(targetLabel(s, 'move', v(2, 1))).toContain('(costs a life!)')
102 })
103 it('a tile that means nothing says so', () => {
104 expect(targetLabel(room(), 'move', v(1, 1))).toBe('Nothing to do here')
105 })
106})
107
108describe('the controller target label: oil', () => {
109 it('a step or a run onto oil slides on', () => {
110 const s = board(`
111 #######
112 #P~~~.#
113 #######`)
114 s.powers.run = true
115 expect(targetLabel(s, 'move', v(2, 1))).toBe('Slide to the end of the oil')
116 expect(targetLabel(s, 'move', v(3, 1))).toBe('Slide to the end of the oil')
117 // A lone oil tile has nowhere to slide on to.
118 const one = board(`
119 ######
120 #P~.##
121 ######`)
122 expect(targetLabel(one, 'move', v(2, 1))).toBe('Move to this tile')
123 })
124})