brick-engine-js 1.0.1 → 1.0.2

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.
Files changed (225) hide show
  1. package/dist/docs/GAME_DEVELOPER_GUIDE.html +1 -1
  2. package/dist/docs/brick-engine-guide.html +1 -1
  3. package/dist/docs/getting-started.html +1 -1
  4. package/dist/docs/jsdoc_standard.html +1 -1
  5. package/dist/docs/publishing.html +1 -1
  6. package/dist/docs/reference/interfaces/modules/Session.html +1 -1
  7. package/dist/docs/reference/modules/GameMenu.html +1 -1
  8. package/dist/docs/reference/modules/GameSession.html +1 -1
  9. package/dist/docs/reference/modules/InitialStateSnapshot.html +1 -1
  10. package/dist/docs/reference/modules/SessionModal.html +1 -1
  11. package/dist/docs/testing_best_practices.html +1 -1
  12. package/package.json +7 -1
  13. package/.env.local.example +0 -2
  14. package/.github/workflows/publish.yml +0 -73
  15. package/.prettierignore +0 -2
  16. package/.prettierrc.json +0 -8
  17. package/eslint.config.mjs +0 -29
  18. package/public/CNAME +0 -1
  19. package/public/docs/GAME_DEVELOPER_GUIDE.html +0 -727
  20. package/public/docs/brick-engine-guide.html +0 -610
  21. package/public/docs/diagrams/lifecycle.mmd +0 -19
  22. package/public/docs/documentation_style_guide.html +0 -994
  23. package/public/docs/getting-started.html +0 -648
  24. package/public/docs/images/lifecycle.svg +0 -1
  25. package/public/docs/index.html +0 -593
  26. package/public/docs/jsdoc_standard.html +0 -656
  27. package/public/docs/publishing.html +0 -573
  28. package/public/docs/reference/enums/Color.html +0 -533
  29. package/public/docs/reference/enums/ControlEventType.html +0 -505
  30. package/public/docs/reference/enums/ControlKey.html +0 -529
  31. package/public/docs/reference/enums/FontAlignment.html +0 -545
  32. package/public/docs/reference/enums/FontSize.html +0 -517
  33. package/public/docs/reference/enums/Sound.html +0 -558
  34. package/public/docs/reference/enums/StateProperty.html +0 -525
  35. package/public/docs/reference/helpers/CellHelper.html +0 -520
  36. package/public/docs/reference/helpers/ControlInputHandlerHelper.html +0 -569
  37. package/public/docs/reference/helpers/CoordinateHelper.html +0 -703
  38. package/public/docs/reference/helpers/RelativeValuesHelper.html +0 -560
  39. package/public/docs/reference/interfaces/Debuggable.html +0 -501
  40. package/public/docs/reference/interfaces/GameModules.html +0 -544
  41. package/public/docs/reference/interfaces/Initializable.html +0 -495
  42. package/public/docs/reference/interfaces/RendererInitializable.html +0 -517
  43. package/public/docs/reference/interfaces/StateSyncable.html +0 -542
  44. package/public/docs/reference/interfaces/modules/Control.html +0 -648
  45. package/public/docs/reference/interfaces/modules/Grid.html +0 -1256
  46. package/public/docs/reference/interfaces/modules/Renderer.html +0 -522
  47. package/public/docs/reference/interfaces/modules/RendererComposite.html +0 -577
  48. package/public/docs/reference/interfaces/modules/Score.html +0 -669
  49. package/public/docs/reference/interfaces/modules/Session.html +0 -585
  50. package/public/docs/reference/interfaces/modules/State.html +0 -897
  51. package/public/docs/reference/interfaces/modules/Text.html +0 -668
  52. package/public/docs/reference/interfaces/modules/Time.html +0 -684
  53. package/public/docs/reference/modules/Debugger.html +0 -579
  54. package/public/docs/reference/modules/DisplayRenderer.html +0 -557
  55. package/public/docs/reference/modules/Game.html +0 -909
  56. package/public/docs/reference/modules/GameControl.html +0 -716
  57. package/public/docs/reference/modules/GameGrid.html +0 -1910
  58. package/public/docs/reference/modules/GameHudGrid.html +0 -508
  59. package/public/docs/reference/modules/GameMenu.html +0 -538
  60. package/public/docs/reference/modules/GameRenderer.html +0 -589
  61. package/public/docs/reference/modules/GameScore.html +0 -664
  62. package/public/docs/reference/modules/GameSession.html +0 -533
  63. package/public/docs/reference/modules/GameSound.html +0 -636
  64. package/public/docs/reference/modules/GameState.html +0 -922
  65. package/public/docs/reference/modules/GameText.html +0 -701
  66. package/public/docs/reference/modules/GameTime.html +0 -696
  67. package/public/docs/reference/modules/HudRenderer.html +0 -568
  68. package/public/docs/reference/modules/InitialStateSnapshot.html +0 -557
  69. package/public/docs/reference/modules/SessionModal.html +0 -520
  70. package/public/docs/reference/types/Axis.html +0 -505
  71. package/public/docs/reference/types/Cell.html +0 -514
  72. package/public/docs/reference/types/ControlCallback.html +0 -488
  73. package/public/docs/reference/types/Coordinate.html +0 -510
  74. package/public/docs/reference/types/GameEntry.html +0 -514
  75. package/public/docs/reference/types/GameEvent.html +0 -514
  76. package/public/docs/reference/types/Piece.html +0 -506
  77. package/public/docs/reference/types/RendererMetrics.html +0 -514
  78. package/public/docs/reference/types/Vector.html +0 -509
  79. package/public/docs/testing_best_practices.html +0 -770
  80. package/public/favicon.ico +0 -0
  81. package/public/fonts/digital-7.monoitalic.ttf +0 -0
  82. package/public/images/cell.svg +0 -32
  83. package/public/images/close.png +0 -0
  84. package/public/images/games.png +0 -0
  85. package/public/images/github.png +0 -0
  86. package/public/images/letter-a.png +0 -0
  87. package/public/images/letter-d.png +0 -0
  88. package/public/images/letter-j.png +0 -0
  89. package/public/images/letter-s.png +0 -0
  90. package/public/images/letter-w.png +0 -0
  91. package/public/images/meta-image.png +0 -0
  92. package/public/images/number-1.png +0 -0
  93. package/public/images/number-2.png +0 -0
  94. package/public/images/number-3.png +0 -0
  95. package/public/images/number-4.png +0 -0
  96. package/public/images/number-5.png +0 -0
  97. package/public/images/number-6.png +0 -0
  98. package/public/images/splash.gif +0 -0
  99. package/public/index.html +0 -15
  100. package/public/sounds/sound_00.wav +0 -0
  101. package/public/sounds/sound_01.wav +0 -0
  102. package/public/sounds/sound_02.wav +0 -0
  103. package/public/sounds/sound_03.wav +0 -0
  104. package/public/sounds/sound_04.wav +0 -0
  105. package/public/sounds/sound_05.wav +0 -0
  106. package/public/sounds/sound_06.wav +0 -0
  107. package/public/sounds/sound_07.wav +0 -0
  108. package/public/sounds/sound_08.wav +0 -0
  109. package/public/sounds/sound_09.wav +0 -0
  110. package/public/sounds/sound_10.wav +0 -0
  111. package/public/sounds/sound_11.wav +0 -0
  112. package/public/sounds/sound_12.wav +0 -0
  113. package/public/sounds/sound_13.wav +0 -0
  114. package/public/sounds/sound_14.wav +0 -0
  115. package/public/sounds/sound_15.wav +0 -0
  116. package/public/style/body.css +0 -86
  117. package/public/style/buttons.css +0 -233
  118. package/public/style/debugger.css +0 -117
  119. package/public/style/sessionModal.css +0 -155
  120. package/public/style/sourceCodeAndCommands.css +0 -74
  121. package/public/style/splash.css +0 -13
  122. package/public/style/theme.css +0 -137
  123. package/scripts/generate-diagrams.sh +0 -20
  124. package/scripts/generate-docs.js +0 -111
  125. package/src/client-game.d.ts +0 -1
  126. package/src/config/configs.test.ts +0 -20
  127. package/src/config/configs.ts +0 -197
  128. package/src/config/env.test.ts +0 -59
  129. package/src/config/env.ts +0 -7
  130. package/src/config/styles.ts +0 -5
  131. package/src/core/Game.test.ts +0 -167
  132. package/src/core/Game.ts +0 -307
  133. package/src/core/InitialStateSnapshot.test.ts +0 -51
  134. package/src/core/InitialStateSnapshot.ts +0 -46
  135. package/src/core/helpers/CellHelper.test.ts +0 -33
  136. package/src/core/helpers/CellHelper.ts +0 -21
  137. package/src/core/helpers/ControlInputHandlerHelper.test.ts +0 -116
  138. package/src/core/helpers/ControlInputHandlerHelper.ts +0 -68
  139. package/src/core/helpers/CoordinateHelper.test.ts +0 -113
  140. package/src/core/helpers/CoordinateHelper.ts +0 -82
  141. package/src/core/helpers/InterfaceIdentifierHelper.test.ts +0 -122
  142. package/src/core/helpers/InterfaceIdentifierHelper.ts +0 -43
  143. package/src/core/helpers/RelativeValuesHelper.test.ts +0 -47
  144. package/src/core/helpers/RelativeValuesHelper.ts +0 -29
  145. package/src/core/module/control/GameControl.test.ts +0 -82
  146. package/src/core/module/control/GameControl.ts +0 -142
  147. package/src/core/module/control/GameControlKeyBinding.test.ts +0 -59
  148. package/src/core/module/control/GameControlKeyBinding.ts +0 -92
  149. package/src/core/module/grid/GameGrid.test.ts +0 -83
  150. package/src/core/module/grid/GameGrid.ts +0 -610
  151. package/src/core/module/grid/GameHudGrid.test.ts +0 -22
  152. package/src/core/module/grid/GameHudGrid.ts +0 -40
  153. package/src/core/module/grid/engines/GridAnalysisEngine.test.ts +0 -157
  154. package/src/core/module/grid/engines/GridAnalysisEngine.ts +0 -124
  155. package/src/core/module/grid/engines/GridLineEngine.test.ts +0 -132
  156. package/src/core/module/grid/engines/GridLineEngine.ts +0 -165
  157. package/src/core/module/grid/engines/GridMovementEngine.test.ts +0 -125
  158. package/src/core/module/grid/engines/GridMovementEngine.ts +0 -113
  159. package/src/core/module/grid/engines/GridRegionEngine.test.ts +0 -136
  160. package/src/core/module/grid/engines/GridRegionEngine.ts +0 -52
  161. package/src/core/module/grid/engines/GridTransformEngine.test.ts +0 -98
  162. package/src/core/module/grid/engines/GridTransformEngine.ts +0 -70
  163. package/src/core/module/renderer/DisplayRenderer.test.ts +0 -86
  164. package/src/core/module/renderer/DisplayRenderer.ts +0 -152
  165. package/src/core/module/renderer/GameRenderer.test.ts +0 -103
  166. package/src/core/module/renderer/GameRenderer.ts +0 -144
  167. package/src/core/module/renderer/HudRenderer.test.ts +0 -108
  168. package/src/core/module/renderer/HudRenderer.ts +0 -203
  169. package/src/core/module/score/GameScore.test.ts +0 -71
  170. package/src/core/module/score/GameScore.ts +0 -188
  171. package/src/core/module/session/GameSession.test.ts +0 -176
  172. package/src/core/module/session/GameSession.ts +0 -103
  173. package/src/core/module/sound/GameSound.test.ts +0 -117
  174. package/src/core/module/sound/GameSound.ts +0 -229
  175. package/src/core/module/state/GameState.test.ts +0 -101
  176. package/src/core/module/state/GameState.ts +0 -339
  177. package/src/core/module/text/GameText.test.ts +0 -87
  178. package/src/core/module/text/GameText.ts +0 -150
  179. package/src/core/module/time/GameTime.test.ts +0 -86
  180. package/src/core/module/time/GameTime.ts +0 -144
  181. package/src/core/types/Interfaces.ts +0 -59
  182. package/src/core/types/Types.ts +0 -124
  183. package/src/core/types/enums.ts +0 -113
  184. package/src/core/types/modules.ts +0 -841
  185. package/src/index.test.ts +0 -15
  186. package/src/index.ts +0 -9
  187. package/src/main.test.ts +0 -137
  188. package/src/main.ts +0 -77
  189. package/src/menu/GameMenu.test.ts +0 -157
  190. package/src/menu/GameMenu.ts +0 -124
  191. package/src/menu/GameMenuSingleton.test.ts +0 -26
  192. package/src/menu/GameMenuSingleton.ts +0 -13
  193. package/src/menu/GameRepository.test.ts +0 -46
  194. package/src/menu/GameRepository.ts +0 -47
  195. package/src/menu/manager/GameManager.test.ts +0 -68
  196. package/src/menu/manager/GameManager.ts +0 -50
  197. package/src/types/global.d.ts +0 -8
  198. package/src/types/interfaces.ts +0 -5
  199. package/src/view/Debugger.test.ts +0 -152
  200. package/src/view/Debugger.ts +0 -124
  201. package/src/view/GameView.test.ts +0 -95
  202. package/src/view/GameView.ts +0 -244
  203. package/src/view/SessionModal.test.ts +0 -141
  204. package/src/view/SessionModal.ts +0 -73
  205. package/src/view/components/layout/ButtonLayout.test.ts +0 -28
  206. package/src/view/components/layout/ButtonLayout.ts +0 -63
  207. package/src/view/components/layout/ContainerLayout.test.ts +0 -48
  208. package/src/view/components/layout/ContainerLayout.ts +0 -50
  209. package/src/view/components/layout/FrameLayout.test.ts +0 -24
  210. package/src/view/components/layout/FrameLayout.ts +0 -25
  211. package/src/view/components/ui/BigButton.test.ts +0 -28
  212. package/src/view/components/ui/BigButton.ts +0 -31
  213. package/src/view/components/ui/Button.test.ts +0 -30
  214. package/src/view/components/ui/Button.ts +0 -30
  215. package/src/view/components/ui/Canvas.test.ts +0 -32
  216. package/src/view/components/ui/Canvas.ts +0 -34
  217. package/src/view/components/ui/SmallButton.test.ts +0 -48
  218. package/src/view/components/ui/SmallButton.ts +0 -32
  219. package/src/view/theme/applyColors.test.ts +0 -47
  220. package/src/view/theme/applyColors.ts +0 -38
  221. package/src/view/theme/dimensions.test.ts +0 -34
  222. package/src/view/theme/dimensions.ts +0 -53
  223. package/tsconfig.json +0 -16
  224. package/vitest.config.ts +0 -14
  225. package/webpack.config.js +0 -133
@@ -1,197 +0,0 @@
1
- export default {
2
- /** Colors used for styling the game interface. */
3
- colors: {
4
- /** Primary background color for the game screen. */
5
- background: 'rgb(172, 189, 173)',
6
- /** Active Font/Cell color. */
7
- active: 'rgb(19, 26, 18)',
8
- /** Inactive Font/Cell color. */
9
- inactive: 'rgba(161, 178, 160, 1)',
10
-
11
- /** Main theme color for the game device body. */
12
- bodyMain: 'rgb(0, 68, 187)',
13
- /** Secondary theme color for the buttons on the device body. */
14
- bodyButton: 'rgb(247, 222, 57)',
15
- },
16
- /** Screen layout configurations. */
17
- screenLayout: {
18
- /** Main game grid dimensions. */
19
- grid: {
20
- columns: 11,
21
- rows: 18,
22
- },
23
-
24
- /** Head-Up Display (HUD) grid dimensions. */
25
- hudGrid: {
26
- columns: 4,
27
- rows: 4,
28
- },
29
-
30
- /** Logical display settings within the container. */
31
- display: {
32
- width: 0.65,
33
- height: 0.956,
34
- margin: 0.022,
35
- borderWeight: 0.0075,
36
- },
37
-
38
- /** Predefined font scale factors relative to container size. */
39
- fontSize: {
40
- extraSmall: 0.05,
41
- small: 0.065,
42
- medium: 0.1,
43
- large: 0.125,
44
- extraLarge: 0.15,
45
- },
46
-
47
- /** Sizing and spacing for individual grid cells. */
48
- cell: {
49
- margin: 0.1,
50
- padding: 0.3,
51
- strokeWeight: 0.075,
52
- },
53
- },
54
- /** View layout configurations. */
55
- viewLayout: {
56
- /** Aspect ratio multiplier for the device body height relative to width. */
57
- bodyHeightWidthMultiplier: 1.9,
58
-
59
- /** Screen width threshold for switching to mobile layout (in pixels). */
60
- mobileBreakpoint: 600,
61
-
62
- /** Responsive canvas scaling and aspect ratio settings. */
63
- canvas: {
64
- widthRatio: 0.7,
65
- aspectRatio: 1.114, // Height relative to width
66
- },
67
-
68
- /** Delay before hiding the splash screen after initialization (in milliseconds). */
69
- splashHideDelayMs: 250,
70
-
71
- /** Dimensions and ratios for the game interface. */
72
- dimensions: {
73
- /** Border radius as a ratio of container width. */
74
- borderRadiusRatio: 0.05,
75
- /** Border width as a ratio of container width. */
76
- borderWidthRatio: 0.006,
77
-
78
- /** Button-specific scaling factors. */
79
- button: {
80
- /** Small button size ratio. */
81
- smSizeRatio: 0.08,
82
- /** Medium/Standard button size ratio. */
83
- mdSizeRatio: 0.18,
84
- /** Large action button size ratio. */
85
- lgSizeRatio: 0.25,
86
-
87
- /** Scaling factors specifically for mobile viewports. */
88
- mobile: {
89
- /** Mobile small button size ratio. */
90
- smSizeRatio: 0.13,
91
- /** Mobile medium/standard button size ratio. */
92
- mdSizeRatio: 0.26,
93
- /** Mobile large action button size ratio. */
94
- lgSizeRatio: 0.35,
95
- /** Standard font ratio for mobile buttons. */
96
- fontRatio: 0.05,
97
- /** Small font ratio for mobile buttons. */
98
- smFontRatio: 0.04,
99
- /** Large font ratio for mobile buttons. */
100
- lgFontRatio: 0.055,
101
- /** Spacing ratio between mobile buttons. */
102
- spacingRatio: 0.018,
103
- },
104
- /** Button border width as a ratio of container width. */
105
- borderRatio: 0.0045,
106
- /** Duration for button press animations. */
107
- animationDuration: '0.15s',
108
- },
109
- },
110
-
111
- /** Standard shadow dispersion size for UI depth. */
112
- shadowDispersion: '3px',
113
- },
114
- /** Input query parameters. */
115
- inputQueryParams: {
116
- /** Key for customizing the device body main color. */
117
- mainColor: 'body-color',
118
- /** Key for customizing the device body button color. */
119
- buttonColor: 'button-color',
120
- /** Key for detecting if the game is running on a mobile app wrapper. */
121
- runningOnApp: 'mobile',
122
- },
123
- /** Selectors for DOM elements. */
124
- selectors: {
125
- /** Root container where the p5 instance is attached. */
126
- parent: '#brick-game',
127
-
128
- /** Splash screen shown during initial load. */
129
- splash: '#splash',
130
-
131
- /** Modal IDs used for session continuation. */
132
- modalIds: {
133
- /** Modal shown when continuing a previous session. */
134
- sessionModal: '#session-modal',
135
- /** Confirmation button in the session modal. */
136
- sessionContinueYes: '#session-modal-yes',
137
- /** Cancellation button in the session modal. */
138
- sessionContinueNo: '#session-modal-no',
139
- },
140
-
141
- /** Explicit IDs assigned to dynamically created DOM elements. */
142
- viewElementIds: {
143
- canvas: 'brick-game-canvas',
144
- container: 'container',
145
- frame: 'frame',
146
- buttonContainer: 'button-container',
147
- smallButtonContainer: 'small-button-container',
148
- innerButtonContainer: 'inner-button-container',
149
- mediumButtonContainer: 'medium-button-container',
150
- directionVerticalContainer: 'direction-vertical-container',
151
- directionHorizontalContainer: 'direction-horizontal-container',
152
- largeButtonContainer: 'large-button-container',
153
- },
154
- },
155
- /** Storage keys for persisting data in LocalStorage. */
156
- storageKeys: {
157
- /** Key for audio muting preference. */
158
- muted: 'STATE.MUTED',
159
- /** Key for color mode preference. */
160
- colorEnabled: 'STATE.COLOR_ENABLED',
161
-
162
- /** Key for the current game grid state. */
163
- grid: 'GAME.GRID',
164
- /** Key for the current HUD grid state. */
165
- hudGrid: 'GAME.HUD_GRID',
166
- /** Key for the game speed/tick interval. */
167
- tickInterval: 'GAME.TICK_INTERVAL',
168
- /** Key for the user's high score. */
169
- score: 'GAME.SCORE',
170
- },
171
- /** Button hold settings. */
172
- buttonHold: {
173
- /** Initial delay before a held button starts repeating (in milliseconds). */
174
- holdDelayMs: 250,
175
- /** Interval between repeated actions while a button is held (in milliseconds). */
176
- holdIntervalMs: 50,
177
- },
178
- /** Game settings. */
179
- game: {
180
- /** Interval between game ticks (in milliseconds). */
181
- tickInterval: 1000 / 30, // 30 ticks per second
182
- /** Minimum interval between game ticks (in milliseconds). */
183
- minTickInterval: 1000 / 60, // 60 ticks per second
184
-
185
- /** Performance Monitor settings. */
186
- debugger: {
187
- /** Number of milliseconds to count before updating the performance. */
188
- msInterval: 100,
189
- /** Enable performance overlay. */
190
- enabled: true,
191
- },
192
-
193
- sound: {
194
- volume: 0.025,
195
- },
196
- },
197
- } as const;
@@ -1,59 +0,0 @@
1
- import { describe, it, expect, afterEach } from 'vitest';
2
- import { isClientMode, isServerMode } from './env';
3
-
4
- describe('env configuration', () => {
5
- const originalEnv = process.env;
6
-
7
- afterEach(() => {
8
- // Restore original env after each test
9
- process.env = { ...originalEnv };
10
- });
11
-
12
- describe('isClientMode', () => {
13
- it('should return true when APP_MODE is client', () => {
14
- // [ARRANGE]
15
- process.env.APP_MODE = 'client';
16
-
17
- // [ACT]
18
- const result = isClientMode();
19
-
20
- // [ASSERT]
21
- expect(result).toBe(true);
22
- });
23
-
24
- it('should return false when APP_MODE is not client', () => {
25
- // [ARRANGE]
26
- process.env.APP_MODE = 'server';
27
-
28
- // [ACT]
29
- const result = isClientMode();
30
-
31
- // [ASSERT]
32
- expect(result).toBe(false);
33
- });
34
- });
35
-
36
- describe('isServerMode', () => {
37
- it('should return true when APP_MODE is server', () => {
38
- // [ARRANGE]
39
- process.env.APP_MODE = 'server';
40
-
41
- // [ACT]
42
- const result = isServerMode();
43
-
44
- // [ASSERT]
45
- expect(result).toBe(true);
46
- });
47
-
48
- it('should return false when APP_MODE is not server', () => {
49
- // [ARRANGE]
50
- process.env.APP_MODE = 'client';
51
-
52
- // [ACT]
53
- const result = isServerMode();
54
-
55
- // [ASSERT]
56
- expect(result).toBe(false);
57
- });
58
- });
59
- });
package/src/config/env.ts DELETED
@@ -1,7 +0,0 @@
1
- export function isClientMode() {
2
- return process.env.APP_MODE === 'client';
3
- }
4
-
5
- export function isServerMode() {
6
- return process.env.APP_MODE === 'server';
7
- }
@@ -1,5 +0,0 @@
1
- /**
2
- * Dynamically load all CSS files from the public/style directory.
3
- * This allows Webpack to bundle them without needing explicit imports for each file.
4
- */
5
- require.context('../../public/style', true, /\.css$/);
@@ -1,167 +0,0 @@
1
- /** @vitest-environment jsdom */
2
- import { describe, it, expect, vi, beforeEach } from 'vitest';
3
- import Game from './Game';
4
- import p5 from 'p5';
5
- import type GameView from '../view/GameView';
6
- import { ControlEventType, ControlKey } from './types/Types';
7
-
8
- // Mock localStorage
9
- const localStorageMock = (() => {
10
- let store: Record<string, string> = {};
11
- return {
12
- getItem: vi.fn((key: string) => store[key] || null),
13
- setItem: vi.fn((key: string, value: string) => {
14
- store[key] = value.toString();
15
- }),
16
- removeItem: vi.fn((key: string) => {
17
- delete store[key];
18
- }),
19
- clear: vi.fn(() => {
20
- store = {};
21
- }),
22
- };
23
- })();
24
- vi.stubGlobal('localStorage', localStorageMock);
25
- vi.stubGlobal(
26
- 'AudioContext',
27
- vi.fn().mockImplementation(function () {
28
- return {
29
- createGain: vi.fn().mockReturnValue({
30
- connect: vi.fn(),
31
- gain: { setValueAtTime: vi.fn() },
32
- }),
33
- destination: {},
34
- };
35
- }),
36
- );
37
-
38
- class MockGame extends Game {
39
- update = vi.fn();
40
- render = vi.fn();
41
- setupGame = vi.fn();
42
- getPersistenceKey = () => 'test-game';
43
- drawTitleScreen = vi.fn();
44
- drawGameOverScreen = vi.fn();
45
- }
46
-
47
- describe('Game', () => {
48
- let game: MockGame;
49
- let mockP5: Record<string, unknown>;
50
- let mockView: GameView;
51
-
52
- beforeEach(() => {
53
- mockP5 = {
54
- deltaTime: 16.6,
55
- noLoop: vi.fn(),
56
- push: vi.fn(),
57
- pop: vi.fn(),
58
- translate: vi.fn(),
59
- strokeWeight: vi.fn(),
60
- stroke: vi.fn(),
61
- noFill: vi.fn(),
62
- rect: vi.fn(),
63
- fill: vi.fn(),
64
- text: vi.fn(),
65
- textFont: vi.fn(),
66
- textSize: vi.fn(),
67
- textAlign: vi.fn(),
68
- image: vi.fn(),
69
- createGraphics: vi.fn().mockReturnValue({
70
- background: vi.fn(),
71
- strokeWeight: vi.fn(),
72
- noFill: vi.fn(),
73
- stroke: vi.fn(),
74
- rect: vi.fn(),
75
- }),
76
- };
77
- mockView = {
78
- build: vi.fn(),
79
- bindControls: vi.fn(),
80
- showSessionModal: vi.fn(),
81
- onModal: vi.fn(),
82
- } as unknown as GameView;
83
-
84
- game = new MockGame(mockP5 as unknown as p5, mockView);
85
- });
86
-
87
- describe('setup', () => {
88
- it('should initialize all modules and sync state', () => {
89
- // [ACT]
90
- game.setup();
91
-
92
- // [ASSERT]
93
- expect(game.modules).toBeDefined();
94
- expect(game.modules.state).toBeDefined();
95
- expect(game.modules.grid).toBeDefined();
96
- expect(mockView.build).toHaveBeenCalled();
97
- expect(game.setupGame).toHaveBeenCalled();
98
- });
99
- });
100
-
101
- describe('draw', () => {
102
- beforeEach(() => {
103
- game.setup();
104
- });
105
-
106
- it('should render title screen if game is ON but not STARTED', () => {
107
- // [ARRANGE]
108
- game.modules.state.turnOn();
109
- // state.isStarted() is false by default
110
-
111
- // [ACT]
112
- game.draw();
113
-
114
- // [ASSERT]
115
- expect(game.drawTitleScreen).toHaveBeenCalled();
116
- });
117
-
118
- it('should update and render if game is PLAYING', () => {
119
- // [ARRANGE]
120
- game.modules.state.turnOn();
121
- game.modules.state.startGame(); // sets started and playing to true
122
-
123
- // Mock time to trigger tick
124
- // Tick interval is in configs, let's assume 1000ms
125
- game.modules.time.update(2000);
126
-
127
- // [ACT]
128
- game.draw();
129
-
130
- // [ASSERT]
131
- expect(game.update).toHaveBeenCalled();
132
- expect(game.render).toHaveBeenCalled();
133
- });
134
- });
135
-
136
- describe('System Controls', () => {
137
- beforeEach(() => {
138
- game.setup();
139
- });
140
-
141
- it('should handle POWER button press', () => {
142
- const control = game.modules.control;
143
- const state = game.modules.state;
144
-
145
- // Simulate Power Press
146
- control.notify(ControlKey.POWER, ControlEventType.PRESSED);
147
- expect(state.isOn()).toBe(true);
148
-
149
- control.notify(ControlKey.POWER, ControlEventType.PRESSED);
150
- expect(state.isOn()).toBe(false);
151
- });
152
-
153
- it('should handle RESET button press', () => {
154
- const control = game.modules.control;
155
- const state = game.modules.state;
156
- const grid = game.modules.grid;
157
-
158
- state.turnOn();
159
- const spy = vi.spyOn(grid, 'resetGrid');
160
-
161
- control.notify(ControlKey.RESET, ControlEventType.PRESSED);
162
-
163
- expect(spy).toHaveBeenCalled();
164
- expect(state.isStarted()).toBe(true);
165
- });
166
- });
167
- });