@inglorious/engine 0.1.1 → 0.2.0
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/README.md +39 -36
- package/package.json +10 -22
- package/src/engine/ai/movement/dynamic/align.js +63 -63
- package/src/engine/ai/movement/dynamic/arrive.js +42 -43
- package/src/engine/ai/movement/dynamic/evade.js +38 -38
- package/src/engine/ai/movement/dynamic/face.js +19 -20
- package/src/engine/ai/movement/dynamic/flee.js +45 -45
- package/src/engine/ai/movement/dynamic/look-where-youre-going.js +16 -17
- package/src/engine/ai/movement/dynamic/match-velocity.js +51 -50
- package/src/engine/ai/movement/dynamic/pursue.js +38 -38
- package/src/engine/ai/movement/dynamic/seek.js +44 -44
- package/src/engine/ai/movement/dynamic/wander.js +31 -32
- package/src/engine/ai/movement/kinematic/align.js +37 -37
- package/src/engine/ai/movement/kinematic/arrive.js +42 -42
- package/src/engine/ai/movement/kinematic/face.js +19 -20
- package/src/engine/ai/movement/kinematic/flee.js +26 -26
- package/src/engine/ai/movement/kinematic/seek.js +26 -26
- package/src/engine/ai/movement/kinematic/seek.test.js +42 -42
- package/src/engine/ai/movement/kinematic/wander-as-seek.js +31 -31
- package/src/engine/ai/movement/kinematic/wander.js +27 -27
- package/src/engine/animation/sprite.js +101 -0
- package/src/engine/animation/ticker.js +38 -0
- package/src/engine/behaviors/camera.js +68 -0
- package/src/engine/behaviors/controls/dynamic/modern.js +76 -0
- package/src/engine/behaviors/controls/dynamic/shooter.js +84 -0
- package/src/engine/behaviors/controls/dynamic/tank.js +69 -0
- package/src/engine/behaviors/controls/event-handlers.js +17 -0
- package/src/engine/behaviors/controls/kinematic/modern.js +76 -0
- package/src/engine/behaviors/controls/kinematic/shooter.js +82 -0
- package/src/engine/behaviors/controls/kinematic/tank.js +67 -0
- package/src/engine/behaviors/debug/collision.js +35 -0
- package/src/engine/behaviors/fps.js +29 -0
- package/src/engine/behaviors/fsm.js +33 -0
- package/src/{game/decorators → engine/behaviors}/fsm.test.js +49 -56
- package/src/engine/behaviors/game.js +15 -0
- package/src/engine/behaviors/input/controls.js +37 -0
- package/src/engine/behaviors/input/gamepad.js +114 -0
- package/src/engine/behaviors/input/input.js +48 -0
- package/src/engine/behaviors/input/keyboard.js +64 -0
- package/src/engine/behaviors/input/mouse.js +91 -0
- package/src/engine/behaviors/physics/bouncy.js +25 -0
- package/src/engine/behaviors/physics/clamped.js +36 -0
- package/src/{game/decorators/collisions.js → engine/behaviors/physics/collidable.js} +20 -24
- package/src/engine/behaviors/physics/jumpable.js +145 -0
- package/src/engine/behaviors/ui/button.js +17 -0
- package/src/engine/collision/detection.js +110 -115
- package/src/engine/core/api.js +34 -0
- package/src/engine/core/dev-tools.js +135 -0
- package/src/engine/core/engine.js +119 -0
- package/src/engine/core/loop.js +15 -0
- package/src/engine/{loop → core/loops}/animation-frame.js +25 -26
- package/src/engine/{loop → core/loops}/elapsed.js +22 -23
- package/src/engine/{loop → core/loops}/fixed.js +27 -28
- package/src/engine/{loop → core/loops}/flash.js +13 -14
- package/src/engine/{loop → core/loops}/lag.js +26 -27
- package/src/engine/core/select.js +26 -0
- package/src/engine/core/store.js +178 -0
- package/src/engine/core/store.test.js +110 -0
- package/src/engine/movement/dynamic/modern.js +21 -24
- package/src/engine/movement/dynamic/tank.js +43 -43
- package/src/engine/movement/kinematic/modern.js +16 -16
- package/src/engine/movement/kinematic/modern.test.js +27 -27
- package/src/engine/movement/kinematic/tank.js +27 -27
- package/src/engine/physics/bounds.js +138 -0
- package/src/engine/physics/position.js +43 -0
- package/src/engine/physics/position.test.js +80 -0
- package/src/engine/systems/sprite-animation.js +27 -0
- package/src/main.js +10 -5
- package/src/renderers/canvas/absolute-position.js +18 -0
- package/src/renderers/canvas/camera.js +13 -0
- package/src/renderers/canvas/canvas-renderer.js +68 -0
- package/src/{ui → renderers}/canvas/character.js +38 -35
- package/src/{ui → renderers}/canvas/form/button.js +25 -25
- package/src/{ui → renderers}/canvas/fps.js +18 -18
- package/src/renderers/canvas/image/hitmask.js +51 -0
- package/src/{ui → renderers}/canvas/image/image.js +34 -37
- package/src/{ui → renderers}/canvas/image/sprite.js +49 -49
- package/src/{ui → renderers}/canvas/image/tilemap.js +66 -64
- package/src/{ui → renderers}/canvas/mouse.js +37 -37
- package/src/renderers/canvas/rendering-system.js +79 -0
- package/src/{ui → renderers}/canvas/shapes/circle.js +29 -31
- package/src/{ui → renderers}/canvas/shapes/rectangle.js +27 -31
- package/src/renderers/react/game/character/index.jsx +20 -0
- package/src/{ui → renderers}/react/game/cursor/index.jsx +20 -20
- package/src/{ui → renderers}/react/game/form/fields/field/index.jsx +56 -56
- package/src/{ui → renderers}/react/game/form/fields/index.jsx +12 -12
- package/src/{ui → renderers}/react/game/form/index.jsx +22 -22
- package/src/{ui → renderers}/react/game/fps/index.jsx +16 -16
- package/src/{ui → renderers}/react/game/game.jsx +72 -71
- package/src/{ui → renderers}/react/game/index.jsx +29 -29
- package/src/{ui → renderers}/react/game/platform/index.jsx +30 -30
- package/src/{ui → renderers}/react/game/scene/index.jsx +27 -25
- package/src/{ui → renderers}/react/game/sprite/index.jsx +60 -58
- package/src/{ui → renderers}/react/game/stats/index.jsx +22 -22
- package/src/{ui → renderers}/react/hocs/with-absolute-position/index.jsx +20 -20
- package/src/{ui → renderers}/react/index.jsx +9 -9
- package/src/utils/algorithms/decision-tree.js +24 -24
- package/src/utils/algorithms/decision-tree.test.js +153 -102
- package/src/utils/algorithms/path-finding.js +155 -155
- package/src/utils/algorithms/path-finding.test.js +151 -151
- package/src/utils/data-structures/array.js +83 -83
- package/src/utils/data-structures/array.test.js +173 -173
- package/src/utils/data-structures/board.js +159 -159
- package/src/utils/data-structures/board.test.js +242 -242
- package/src/utils/data-structures/boolean.js +9 -9
- package/src/utils/data-structures/heap.js +164 -164
- package/src/utils/data-structures/heap.test.js +103 -103
- package/src/utils/data-structures/object.js +138 -102
- package/src/utils/data-structures/object.test.js +218 -121
- package/src/utils/data-structures/objects.js +66 -48
- package/src/utils/data-structures/objects.test.js +99 -99
- package/src/utils/data-structures/tree.js +36 -36
- package/src/utils/data-structures/tree.test.js +33 -33
- package/src/utils/functions/functions.js +19 -19
- package/src/utils/functions/functions.test.js +23 -23
- package/src/utils/math/geometry/circle.js +70 -117
- package/src/utils/math/geometry/circle.test.js +97 -97
- package/src/utils/math/geometry/hitmask.js +70 -39
- package/src/utils/math/geometry/hitmask.test.js +155 -84
- package/src/utils/math/geometry/line.js +35 -35
- package/src/utils/math/geometry/line.test.js +49 -49
- package/src/utils/math/geometry/point.js +78 -71
- package/src/utils/math/geometry/point.test.js +81 -81
- package/src/utils/math/geometry/rectangle.js +76 -45
- package/src/utils/math/geometry/rectangle.test.js +42 -42
- package/src/utils/math/geometry/segment.js +80 -80
- package/src/utils/math/geometry/segment.test.js +183 -183
- package/src/utils/math/geometry/triangle.js +15 -15
- package/src/utils/math/geometry/triangle.test.js +11 -11
- package/src/utils/math/linear-algebra/2d.js +28 -28
- package/src/utils/math/linear-algebra/2d.test.js +17 -17
- package/src/utils/math/linear-algebra/quaternion.js +22 -22
- package/src/utils/math/linear-algebra/quaternion.test.js +25 -25
- package/src/utils/math/linear-algebra/quaternions.js +20 -20
- package/src/utils/math/linear-algebra/quaternions.test.js +29 -29
- package/src/utils/math/linear-algebra/vector.js +327 -302
- package/src/utils/math/linear-algebra/vector.test.js +265 -257
- package/src/utils/math/linear-algebra/vectors.js +122 -122
- package/src/utils/math/linear-algebra/vectors.test.js +65 -65
- package/src/utils/math/linear-interpolation.js +9 -0
- package/src/utils/math/numbers.js +90 -90
- package/src/utils/math/numbers.test.js +137 -137
- package/src/utils/math/rng.js +44 -44
- package/src/utils/math/rng.test.js +39 -39
- package/src/utils/math/statistics.js +43 -43
- package/src/utils/math/statistics.test.js +47 -47
- package/src/utils/math/trigonometry.js +89 -89
- package/src/utils/math/trigonometry.test.js +52 -52
- package/src/utils/physics/acceleration.js +61 -63
- package/src/utils/physics/friction.js +28 -30
- package/src/utils/physics/friction.test.js +42 -44
- package/src/utils/physics/gravity.js +69 -71
- package/src/utils/physics/gravity.test.js +77 -80
- package/src/utils/physics/jump.js +31 -41
- package/src/utils/physics/velocity.js +36 -38
- package/src/engine/loop.js +0 -15
- package/src/engine/store.js +0 -174
- package/src/engine/store.test.js +0 -256
- package/src/engine.js +0 -74
- package/src/game/animation.js +0 -26
- package/src/game/bounds.js +0 -66
- package/src/game/decorators/character.js +0 -5
- package/src/game/decorators/clamp-to-bounds.js +0 -15
- package/src/game/decorators/controls/dynamic/modern.js +0 -48
- package/src/game/decorators/controls/dynamic/shooter.js +0 -47
- package/src/game/decorators/controls/dynamic/tank.js +0 -55
- package/src/game/decorators/controls/kinematic/modern.js +0 -49
- package/src/game/decorators/controls/kinematic/shooter.js +0 -45
- package/src/game/decorators/controls/kinematic/tank.js +0 -52
- package/src/game/decorators/debug/collisions.js +0 -32
- package/src/game/decorators/double-jump.js +0 -70
- package/src/game/decorators/fps.js +0 -30
- package/src/game/decorators/fsm.js +0 -27
- package/src/game/decorators/game.js +0 -11
- package/src/game/decorators/image/image.js +0 -5
- package/src/game/decorators/image/sprite.js +0 -5
- package/src/game/decorators/image/tilemap.js +0 -5
- package/src/game/decorators/input/controls.js +0 -27
- package/src/game/decorators/input/gamepad.js +0 -74
- package/src/game/decorators/input/input.js +0 -41
- package/src/game/decorators/input/keyboard.js +0 -49
- package/src/game/decorators/input/mouse.js +0 -65
- package/src/game/decorators/jump.js +0 -72
- package/src/game/decorators/platform.js +0 -5
- package/src/game/decorators/ui/button.js +0 -21
- package/src/game/sprite.js +0 -119
- package/src/ui/canvas/absolute-position.js +0 -17
- package/src/ui/canvas/image/hitmask.js +0 -37
- package/src/ui/canvas.js +0 -81
- package/src/ui/react/game/character/index.jsx +0 -30
- package/src/utils/math/geometry/platform.js +0 -42
- package/src/utils/math/geometry/platform.test.js +0 -133
- /package/src/{ui → renderers}/react/game/character/character.module.scss +0 -0
- /package/src/{ui → renderers}/react/game/cursor/cursor.module.scss +0 -0
- /package/src/{ui → renderers}/react/game/form/fields/field/field.module.scss +0 -0
- /package/src/{ui → renderers}/react/game/form/fields/fields.module.scss +0 -0
- /package/src/{ui → renderers}/react/game/form/form.module.scss +0 -0
- /package/src/{ui → renderers}/react/game/platform/platform.module.scss +0 -0
- /package/src/{ui → renderers}/react/game/scene/scene.module.scss +0 -0
- /package/src/{ui → renderers}/react/game/sprite/sprite.module.css +0 -0
- /package/src/{ui → renderers}/react/hocs/with-absolute-position/with-absolute-position.module.scss +0 -0
|
@@ -1,242 +1,242 @@
|
|
|
1
|
-
import { mod } from "@inglorious/utils/math/numbers.js"
|
|
2
|
-
import { expect, test } from "vitest"
|
|
3
|
-
|
|
4
|
-
import {
|
|
5
|
-
createBoard,
|
|
6
|
-
down,
|
|
7
|
-
downLeft,
|
|
8
|
-
downRight,
|
|
9
|
-
left,
|
|
10
|
-
right,
|
|
11
|
-
toString,
|
|
12
|
-
up,
|
|
13
|
-
upLeft,
|
|
14
|
-
upRight,
|
|
15
|
-
} from "./board.js"
|
|
16
|
-
|
|
17
|
-
test("it should create an empty board", () => {
|
|
18
|
-
const size = [4, 4]
|
|
19
|
-
const expectedResult = [
|
|
20
|
-
null,
|
|
21
|
-
null,
|
|
22
|
-
null,
|
|
23
|
-
null,
|
|
24
|
-
null,
|
|
25
|
-
null,
|
|
26
|
-
null,
|
|
27
|
-
null,
|
|
28
|
-
null,
|
|
29
|
-
null,
|
|
30
|
-
null,
|
|
31
|
-
null,
|
|
32
|
-
null,
|
|
33
|
-
null,
|
|
34
|
-
null,
|
|
35
|
-
null,
|
|
36
|
-
]
|
|
37
|
-
|
|
38
|
-
expect(createBoard(size)).toStrictEqual(expectedResult)
|
|
39
|
-
})
|
|
40
|
-
|
|
41
|
-
test("it should create a checkerboard", () => {
|
|
42
|
-
const size = [4, 4]
|
|
43
|
-
const filler = (i, j) => (!mod(i + j, 2) ? 1 : 0)
|
|
44
|
-
const expectedResult = [1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1]
|
|
45
|
-
|
|
46
|
-
expect(createBoard(size, filler)).toStrictEqual(expectedResult)
|
|
47
|
-
})
|
|
48
|
-
|
|
49
|
-
test("it should return the coordinates of the cell downward", () => {
|
|
50
|
-
const size = [8, 8]
|
|
51
|
-
const coordinates = [3, 4]
|
|
52
|
-
const expectedResult = [4, 4]
|
|
53
|
-
|
|
54
|
-
expect(down(coordinates, size)).toStrictEqual(expectedResult)
|
|
55
|
-
})
|
|
56
|
-
|
|
57
|
-
test("it should throw going down if cell is downmost", () => {
|
|
58
|
-
const size = [8, 8]
|
|
59
|
-
const coordinates = [7, 4]
|
|
60
|
-
|
|
61
|
-
expect(() => down(coordinates, size)).toThrow()
|
|
62
|
-
})
|
|
63
|
-
|
|
64
|
-
test("it should return the coordinates of the cell down left", () => {
|
|
65
|
-
const size = [8, 8]
|
|
66
|
-
const coordinates = [3, 4]
|
|
67
|
-
const expectedResult = [4, 3]
|
|
68
|
-
|
|
69
|
-
expect(downLeft(coordinates, size)).toStrictEqual(expectedResult)
|
|
70
|
-
})
|
|
71
|
-
|
|
72
|
-
test("it should throw going down left if cell is downmost", () => {
|
|
73
|
-
const size = [8, 8]
|
|
74
|
-
const coordinates = [7, 4]
|
|
75
|
-
|
|
76
|
-
expect(() => downLeft(coordinates, size)).toThrow()
|
|
77
|
-
})
|
|
78
|
-
|
|
79
|
-
test("it should throw going down left if cell is downmost", () => {
|
|
80
|
-
const size = [8, 8]
|
|
81
|
-
const coordinates = [3, 0]
|
|
82
|
-
|
|
83
|
-
expect(() => downLeft(coordinates, size)).toThrow()
|
|
84
|
-
})
|
|
85
|
-
|
|
86
|
-
test("it should throw going down left if cell is on the angle", () => {
|
|
87
|
-
const size = [8, 8]
|
|
88
|
-
const coordinates = [7, 0]
|
|
89
|
-
|
|
90
|
-
expect(() => downLeft(coordinates, size)).toThrow()
|
|
91
|
-
})
|
|
92
|
-
|
|
93
|
-
test("it should return the coordinates of the cell down right", () => {
|
|
94
|
-
const size = [8, 8]
|
|
95
|
-
const coordinates = [3, 4]
|
|
96
|
-
const expectedResult = [4, 5]
|
|
97
|
-
|
|
98
|
-
expect(downRight(coordinates, size)).toStrictEqual(expectedResult)
|
|
99
|
-
})
|
|
100
|
-
|
|
101
|
-
test("it should throw going down right if cell is downmost", () => {
|
|
102
|
-
const size = [8, 8]
|
|
103
|
-
const coordinates = [7, 4]
|
|
104
|
-
|
|
105
|
-
expect(() => downRight(coordinates, size)).toThrow()
|
|
106
|
-
})
|
|
107
|
-
|
|
108
|
-
test("it should throw going down right if cell is downmost", () => {
|
|
109
|
-
const size = [8, 8]
|
|
110
|
-
const coordinates = [3, 7]
|
|
111
|
-
|
|
112
|
-
expect(() => downRight(coordinates, size)).toThrow()
|
|
113
|
-
})
|
|
114
|
-
|
|
115
|
-
test("it should throw going down right if cell is on the angle", () => {
|
|
116
|
-
const size = [8, 8]
|
|
117
|
-
const coordinates = [7, 7]
|
|
118
|
-
|
|
119
|
-
expect(() => downRight(coordinates, size)).toThrow()
|
|
120
|
-
})
|
|
121
|
-
|
|
122
|
-
test("it should return the coordinates of the cell to the left", () => {
|
|
123
|
-
const size = [8, 8]
|
|
124
|
-
const coordinates = [3, 4]
|
|
125
|
-
const expectedResult = [3, 3]
|
|
126
|
-
|
|
127
|
-
expect(left(coordinates, size)).toStrictEqual(expectedResult)
|
|
128
|
-
})
|
|
129
|
-
|
|
130
|
-
test("it should not return coordinates to the left if cell is leftmost", () => {
|
|
131
|
-
const size = [8, 8]
|
|
132
|
-
const coordinates = [3, 0]
|
|
133
|
-
|
|
134
|
-
expect(() => left(coordinates, size)).toThrow()
|
|
135
|
-
})
|
|
136
|
-
|
|
137
|
-
test("it should return the coordinates of the cell to the right", () => {
|
|
138
|
-
const size = [8, 8]
|
|
139
|
-
const coordinates = [3, 4]
|
|
140
|
-
const expectedResult = [3, 5]
|
|
141
|
-
|
|
142
|
-
expect(right(coordinates, size)).toStrictEqual(expectedResult)
|
|
143
|
-
})
|
|
144
|
-
|
|
145
|
-
test("it should not return coordinates to the right if cell is rightmost", () => {
|
|
146
|
-
const size = [8, 8]
|
|
147
|
-
const coordinates = [3, 7]
|
|
148
|
-
|
|
149
|
-
expect(() => right(coordinates, size)).toThrow()
|
|
150
|
-
})
|
|
151
|
-
|
|
152
|
-
test("it should return a string representation of the given board", () => {
|
|
153
|
-
const board = [1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1]
|
|
154
|
-
|
|
155
|
-
expect(toString(board, [4, 4])).toBe(`1 0 1 0
|
|
156
|
-
0 1 0 1
|
|
157
|
-
1 0 1 0
|
|
158
|
-
0 1 0 1`)
|
|
159
|
-
})
|
|
160
|
-
|
|
161
|
-
test("it should return a custom string representation of the given board", () => {
|
|
162
|
-
const board = [1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1]
|
|
163
|
-
const cellToString = (cell) => cell.toFixed(1)
|
|
164
|
-
|
|
165
|
-
expect(toString(board, [4, 4], cellToString)).toBe(`1.0 0.0 1.0 0.0
|
|
166
|
-
0.0 1.0 0.0 1.0
|
|
167
|
-
1.0 0.0 1.0 0.0
|
|
168
|
-
0.0 1.0 0.0 1.0`)
|
|
169
|
-
})
|
|
170
|
-
|
|
171
|
-
test("it should return the coordinates of the cell upward", () => {
|
|
172
|
-
const size = [8, 8]
|
|
173
|
-
const coordinates = [3, 4]
|
|
174
|
-
const expectedResult = [2, 4]
|
|
175
|
-
|
|
176
|
-
expect(up(coordinates, size)).toStrictEqual(expectedResult)
|
|
177
|
-
})
|
|
178
|
-
|
|
179
|
-
test("it should throw going upward if cell is topmost", () => {
|
|
180
|
-
const size = [8, 8]
|
|
181
|
-
const coordinates = [0, 4]
|
|
182
|
-
|
|
183
|
-
expect(() => up(coordinates, size)).toThrow()
|
|
184
|
-
})
|
|
185
|
-
|
|
186
|
-
test("it should return the coordinates of the cell up left", () => {
|
|
187
|
-
const size = [8, 8]
|
|
188
|
-
const coordinates = [3, 4]
|
|
189
|
-
const expectedResult = [2, 3]
|
|
190
|
-
|
|
191
|
-
expect(upLeft(coordinates, size)).toStrictEqual(expectedResult)
|
|
192
|
-
})
|
|
193
|
-
|
|
194
|
-
test("it should throw going up left if cell is upmost", () => {
|
|
195
|
-
const size = [8, 8]
|
|
196
|
-
const coordinates = [0, 4]
|
|
197
|
-
|
|
198
|
-
expect(() => upLeft(coordinates, size)).toThrow()
|
|
199
|
-
})
|
|
200
|
-
|
|
201
|
-
test("it should throw going up left if cell is leftmost", () => {
|
|
202
|
-
const size = [8, 8]
|
|
203
|
-
const coordinates = [3, 0]
|
|
204
|
-
|
|
205
|
-
expect(() => upLeft(coordinates, size)).toThrow()
|
|
206
|
-
})
|
|
207
|
-
|
|
208
|
-
test("it should throw going up left if cell is on the angle", () => {
|
|
209
|
-
const size = [8, 8]
|
|
210
|
-
const coordinates = [0, 0]
|
|
211
|
-
|
|
212
|
-
expect(() => upLeft(coordinates, size)).toThrow()
|
|
213
|
-
})
|
|
214
|
-
|
|
215
|
-
test("it should return the coordinates of the cell up right", () => {
|
|
216
|
-
const size = [8, 8]
|
|
217
|
-
const coordinates = [3, 4]
|
|
218
|
-
const expectedResult = [2, 5]
|
|
219
|
-
|
|
220
|
-
expect(upRight(coordinates, size)).toStrictEqual(expectedResult)
|
|
221
|
-
})
|
|
222
|
-
|
|
223
|
-
test("it should throw going up right if cell is upmost", () => {
|
|
224
|
-
const size = [8, 8]
|
|
225
|
-
const coordinates = [0, 4]
|
|
226
|
-
|
|
227
|
-
expect(() => upRight(coordinates, size)).toThrow()
|
|
228
|
-
})
|
|
229
|
-
|
|
230
|
-
test("it should throw going down right if cell is rightmost", () => {
|
|
231
|
-
const size = [8, 8]
|
|
232
|
-
const coordinates = [3, 7]
|
|
233
|
-
|
|
234
|
-
expect(() => upRight(coordinates, size)).toThrow()
|
|
235
|
-
})
|
|
236
|
-
|
|
237
|
-
test("it should throw going down right if cell is on the angle", () => {
|
|
238
|
-
const size = [8, 8]
|
|
239
|
-
const coordinates = [0, 7]
|
|
240
|
-
|
|
241
|
-
expect(() => upRight(coordinates, size)).toThrow()
|
|
242
|
-
})
|
|
1
|
+
import { mod } from "@inglorious/utils/math/numbers.js"
|
|
2
|
+
import { expect, test } from "vitest"
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
createBoard,
|
|
6
|
+
down,
|
|
7
|
+
downLeft,
|
|
8
|
+
downRight,
|
|
9
|
+
left,
|
|
10
|
+
right,
|
|
11
|
+
toString,
|
|
12
|
+
up,
|
|
13
|
+
upLeft,
|
|
14
|
+
upRight,
|
|
15
|
+
} from "./board.js"
|
|
16
|
+
|
|
17
|
+
test("it should create an empty board", () => {
|
|
18
|
+
const size = [4, 4]
|
|
19
|
+
const expectedResult = [
|
|
20
|
+
null,
|
|
21
|
+
null,
|
|
22
|
+
null,
|
|
23
|
+
null,
|
|
24
|
+
null,
|
|
25
|
+
null,
|
|
26
|
+
null,
|
|
27
|
+
null,
|
|
28
|
+
null,
|
|
29
|
+
null,
|
|
30
|
+
null,
|
|
31
|
+
null,
|
|
32
|
+
null,
|
|
33
|
+
null,
|
|
34
|
+
null,
|
|
35
|
+
null,
|
|
36
|
+
]
|
|
37
|
+
|
|
38
|
+
expect(createBoard(size)).toStrictEqual(expectedResult)
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
test("it should create a checkerboard", () => {
|
|
42
|
+
const size = [4, 4]
|
|
43
|
+
const filler = (i, j) => (!mod(i + j, 2) ? 1 : 0)
|
|
44
|
+
const expectedResult = [1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1]
|
|
45
|
+
|
|
46
|
+
expect(createBoard(size, filler)).toStrictEqual(expectedResult)
|
|
47
|
+
})
|
|
48
|
+
|
|
49
|
+
test("it should return the coordinates of the cell downward", () => {
|
|
50
|
+
const size = [8, 8]
|
|
51
|
+
const coordinates = [3, 4]
|
|
52
|
+
const expectedResult = [4, 4]
|
|
53
|
+
|
|
54
|
+
expect(down(coordinates, size)).toStrictEqual(expectedResult)
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
test("it should throw going down if cell is downmost", () => {
|
|
58
|
+
const size = [8, 8]
|
|
59
|
+
const coordinates = [7, 4]
|
|
60
|
+
|
|
61
|
+
expect(() => down(coordinates, size)).toThrow()
|
|
62
|
+
})
|
|
63
|
+
|
|
64
|
+
test("it should return the coordinates of the cell down left", () => {
|
|
65
|
+
const size = [8, 8]
|
|
66
|
+
const coordinates = [3, 4]
|
|
67
|
+
const expectedResult = [4, 3]
|
|
68
|
+
|
|
69
|
+
expect(downLeft(coordinates, size)).toStrictEqual(expectedResult)
|
|
70
|
+
})
|
|
71
|
+
|
|
72
|
+
test("it should throw going down left if cell is downmost", () => {
|
|
73
|
+
const size = [8, 8]
|
|
74
|
+
const coordinates = [7, 4]
|
|
75
|
+
|
|
76
|
+
expect(() => downLeft(coordinates, size)).toThrow()
|
|
77
|
+
})
|
|
78
|
+
|
|
79
|
+
test("it should throw going down left if cell is downmost", () => {
|
|
80
|
+
const size = [8, 8]
|
|
81
|
+
const coordinates = [3, 0]
|
|
82
|
+
|
|
83
|
+
expect(() => downLeft(coordinates, size)).toThrow()
|
|
84
|
+
})
|
|
85
|
+
|
|
86
|
+
test("it should throw going down left if cell is on the angle", () => {
|
|
87
|
+
const size = [8, 8]
|
|
88
|
+
const coordinates = [7, 0]
|
|
89
|
+
|
|
90
|
+
expect(() => downLeft(coordinates, size)).toThrow()
|
|
91
|
+
})
|
|
92
|
+
|
|
93
|
+
test("it should return the coordinates of the cell down right", () => {
|
|
94
|
+
const size = [8, 8]
|
|
95
|
+
const coordinates = [3, 4]
|
|
96
|
+
const expectedResult = [4, 5]
|
|
97
|
+
|
|
98
|
+
expect(downRight(coordinates, size)).toStrictEqual(expectedResult)
|
|
99
|
+
})
|
|
100
|
+
|
|
101
|
+
test("it should throw going down right if cell is downmost", () => {
|
|
102
|
+
const size = [8, 8]
|
|
103
|
+
const coordinates = [7, 4]
|
|
104
|
+
|
|
105
|
+
expect(() => downRight(coordinates, size)).toThrow()
|
|
106
|
+
})
|
|
107
|
+
|
|
108
|
+
test("it should throw going down right if cell is downmost", () => {
|
|
109
|
+
const size = [8, 8]
|
|
110
|
+
const coordinates = [3, 7]
|
|
111
|
+
|
|
112
|
+
expect(() => downRight(coordinates, size)).toThrow()
|
|
113
|
+
})
|
|
114
|
+
|
|
115
|
+
test("it should throw going down right if cell is on the angle", () => {
|
|
116
|
+
const size = [8, 8]
|
|
117
|
+
const coordinates = [7, 7]
|
|
118
|
+
|
|
119
|
+
expect(() => downRight(coordinates, size)).toThrow()
|
|
120
|
+
})
|
|
121
|
+
|
|
122
|
+
test("it should return the coordinates of the cell to the left", () => {
|
|
123
|
+
const size = [8, 8]
|
|
124
|
+
const coordinates = [3, 4]
|
|
125
|
+
const expectedResult = [3, 3]
|
|
126
|
+
|
|
127
|
+
expect(left(coordinates, size)).toStrictEqual(expectedResult)
|
|
128
|
+
})
|
|
129
|
+
|
|
130
|
+
test("it should not return coordinates to the left if cell is leftmost", () => {
|
|
131
|
+
const size = [8, 8]
|
|
132
|
+
const coordinates = [3, 0]
|
|
133
|
+
|
|
134
|
+
expect(() => left(coordinates, size)).toThrow()
|
|
135
|
+
})
|
|
136
|
+
|
|
137
|
+
test("it should return the coordinates of the cell to the right", () => {
|
|
138
|
+
const size = [8, 8]
|
|
139
|
+
const coordinates = [3, 4]
|
|
140
|
+
const expectedResult = [3, 5]
|
|
141
|
+
|
|
142
|
+
expect(right(coordinates, size)).toStrictEqual(expectedResult)
|
|
143
|
+
})
|
|
144
|
+
|
|
145
|
+
test("it should not return coordinates to the right if cell is rightmost", () => {
|
|
146
|
+
const size = [8, 8]
|
|
147
|
+
const coordinates = [3, 7]
|
|
148
|
+
|
|
149
|
+
expect(() => right(coordinates, size)).toThrow()
|
|
150
|
+
})
|
|
151
|
+
|
|
152
|
+
test("it should return a string representation of the given board", () => {
|
|
153
|
+
const board = [1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1]
|
|
154
|
+
|
|
155
|
+
expect(toString(board, [4, 4])).toBe(`1 0 1 0
|
|
156
|
+
0 1 0 1
|
|
157
|
+
1 0 1 0
|
|
158
|
+
0 1 0 1`)
|
|
159
|
+
})
|
|
160
|
+
|
|
161
|
+
test("it should return a custom string representation of the given board", () => {
|
|
162
|
+
const board = [1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1]
|
|
163
|
+
const cellToString = (cell) => cell.toFixed(1)
|
|
164
|
+
|
|
165
|
+
expect(toString(board, [4, 4], cellToString)).toBe(`1.0 0.0 1.0 0.0
|
|
166
|
+
0.0 1.0 0.0 1.0
|
|
167
|
+
1.0 0.0 1.0 0.0
|
|
168
|
+
0.0 1.0 0.0 1.0`)
|
|
169
|
+
})
|
|
170
|
+
|
|
171
|
+
test("it should return the coordinates of the cell upward", () => {
|
|
172
|
+
const size = [8, 8]
|
|
173
|
+
const coordinates = [3, 4]
|
|
174
|
+
const expectedResult = [2, 4]
|
|
175
|
+
|
|
176
|
+
expect(up(coordinates, size)).toStrictEqual(expectedResult)
|
|
177
|
+
})
|
|
178
|
+
|
|
179
|
+
test("it should throw going upward if cell is topmost", () => {
|
|
180
|
+
const size = [8, 8]
|
|
181
|
+
const coordinates = [0, 4]
|
|
182
|
+
|
|
183
|
+
expect(() => up(coordinates, size)).toThrow()
|
|
184
|
+
})
|
|
185
|
+
|
|
186
|
+
test("it should return the coordinates of the cell up left", () => {
|
|
187
|
+
const size = [8, 8]
|
|
188
|
+
const coordinates = [3, 4]
|
|
189
|
+
const expectedResult = [2, 3]
|
|
190
|
+
|
|
191
|
+
expect(upLeft(coordinates, size)).toStrictEqual(expectedResult)
|
|
192
|
+
})
|
|
193
|
+
|
|
194
|
+
test("it should throw going up left if cell is upmost", () => {
|
|
195
|
+
const size = [8, 8]
|
|
196
|
+
const coordinates = [0, 4]
|
|
197
|
+
|
|
198
|
+
expect(() => upLeft(coordinates, size)).toThrow()
|
|
199
|
+
})
|
|
200
|
+
|
|
201
|
+
test("it should throw going up left if cell is leftmost", () => {
|
|
202
|
+
const size = [8, 8]
|
|
203
|
+
const coordinates = [3, 0]
|
|
204
|
+
|
|
205
|
+
expect(() => upLeft(coordinates, size)).toThrow()
|
|
206
|
+
})
|
|
207
|
+
|
|
208
|
+
test("it should throw going up left if cell is on the angle", () => {
|
|
209
|
+
const size = [8, 8]
|
|
210
|
+
const coordinates = [0, 0]
|
|
211
|
+
|
|
212
|
+
expect(() => upLeft(coordinates, size)).toThrow()
|
|
213
|
+
})
|
|
214
|
+
|
|
215
|
+
test("it should return the coordinates of the cell up right", () => {
|
|
216
|
+
const size = [8, 8]
|
|
217
|
+
const coordinates = [3, 4]
|
|
218
|
+
const expectedResult = [2, 5]
|
|
219
|
+
|
|
220
|
+
expect(upRight(coordinates, size)).toStrictEqual(expectedResult)
|
|
221
|
+
})
|
|
222
|
+
|
|
223
|
+
test("it should throw going up right if cell is upmost", () => {
|
|
224
|
+
const size = [8, 8]
|
|
225
|
+
const coordinates = [0, 4]
|
|
226
|
+
|
|
227
|
+
expect(() => upRight(coordinates, size)).toThrow()
|
|
228
|
+
})
|
|
229
|
+
|
|
230
|
+
test("it should throw going down right if cell is rightmost", () => {
|
|
231
|
+
const size = [8, 8]
|
|
232
|
+
const coordinates = [3, 7]
|
|
233
|
+
|
|
234
|
+
expect(() => upRight(coordinates, size)).toThrow()
|
|
235
|
+
})
|
|
236
|
+
|
|
237
|
+
test("it should throw going down right if cell is on the angle", () => {
|
|
238
|
+
const size = [8, 8]
|
|
239
|
+
const coordinates = [0, 7]
|
|
240
|
+
|
|
241
|
+
expect(() => upRight(coordinates, size)).toThrow()
|
|
242
|
+
})
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Converts a boolean value to its string representation.
|
|
3
|
-
*
|
|
4
|
-
* @param {boolean} bool - The boolean value to convert.
|
|
5
|
-
* @returns {string} The string "true" if the input is true, otherwise "false".
|
|
6
|
-
*/
|
|
7
|
-
export function toString(bool) {
|
|
8
|
-
return bool ? "true" : "false"
|
|
9
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Converts a boolean value to its string representation.
|
|
3
|
+
*
|
|
4
|
+
* @param {boolean} bool - The boolean value to convert.
|
|
5
|
+
* @returns {string} The string "true" if the input is true, otherwise "false".
|
|
6
|
+
*/
|
|
7
|
+
export function toString(bool) {
|
|
8
|
+
return bool ? "true" : "false"
|
|
9
|
+
}
|