@satelliteoflove/godot-mcp 0.1.5 → 0.1.6

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 (33) hide show
  1. package/dist/__tests__/helpers/mock-godot.d.ts +17 -0
  2. package/dist/__tests__/helpers/mock-godot.d.ts.map +1 -0
  3. package/dist/__tests__/helpers/mock-godot.js +33 -0
  4. package/dist/__tests__/helpers/mock-godot.js.map +1 -0
  5. package/dist/__tests__/tools/animation.test.d.ts +2 -0
  6. package/dist/__tests__/tools/animation.test.d.ts.map +1 -0
  7. package/dist/__tests__/tools/animation.test.js +315 -0
  8. package/dist/__tests__/tools/animation.test.js.map +1 -0
  9. package/dist/__tests__/tools/node.test.d.ts +2 -0
  10. package/dist/__tests__/tools/node.test.d.ts.map +1 -0
  11. package/dist/__tests__/tools/node.test.js +173 -0
  12. package/dist/__tests__/tools/node.test.js.map +1 -0
  13. package/dist/__tests__/tools/scene.test.d.ts +2 -0
  14. package/dist/__tests__/tools/scene.test.d.ts.map +1 -0
  15. package/dist/__tests__/tools/scene.test.js +127 -0
  16. package/dist/__tests__/tools/scene.test.js.map +1 -0
  17. package/dist/__tests__/tools/tilemap.test.d.ts +2 -0
  18. package/dist/__tests__/tools/tilemap.test.d.ts.map +1 -0
  19. package/dist/__tests__/tools/tilemap.test.js +333 -0
  20. package/dist/__tests__/tools/tilemap.test.js.map +1 -0
  21. package/dist/tools/animation.d.ts +152 -216
  22. package/dist/tools/animation.d.ts.map +1 -1
  23. package/dist/tools/animation.js +324 -372
  24. package/dist/tools/animation.js.map +1 -1
  25. package/dist/tools/tilemap.d.ts +267 -253
  26. package/dist/tools/tilemap.d.ts.map +1 -1
  27. package/dist/tools/tilemap.js +273 -304
  28. package/dist/tools/tilemap.js.map +1 -1
  29. package/package.json +4 -2
  30. package/dist/__tests__/registry.test.d.ts +0 -2
  31. package/dist/__tests__/registry.test.d.ts.map +0 -1
  32. package/dist/__tests__/registry.test.js +0 -116
  33. package/dist/__tests__/registry.test.js.map +0 -1
@@ -0,0 +1,127 @@
1
+ import { describe, it, expect, beforeEach } from 'vitest';
2
+ import { createMockGodot, createToolContext } from '../helpers/mock-godot.js';
3
+ import { getSceneTree, openScene, saveScene, createScene } from '../../tools/scene.js';
4
+ describe('Scene Tools', () => {
5
+ let mock;
6
+ beforeEach(() => {
7
+ mock = createMockGodot();
8
+ });
9
+ describe('get_scene_tree', () => {
10
+ it('sends get_scene_tree command to Godot', async () => {
11
+ mock.mockResponse({ tree: { name: 'Root', children: [] } });
12
+ const ctx = createToolContext(mock);
13
+ await getSceneTree.execute({}, ctx);
14
+ expect(mock.calls).toHaveLength(1);
15
+ expect(mock.calls[0].command).toBe('get_scene_tree');
16
+ });
17
+ it('returns formatted JSON tree', async () => {
18
+ const tree = { name: 'Main', type: 'Node2D', children: [{ name: 'Player', type: 'CharacterBody2D' }] };
19
+ mock.mockResponse({ tree });
20
+ const ctx = createToolContext(mock);
21
+ const result = await getSceneTree.execute({}, ctx);
22
+ expect(result).toBe(JSON.stringify(tree, null, 2));
23
+ });
24
+ it('accepts empty params', () => {
25
+ const result = getSceneTree.schema.safeParse({});
26
+ expect(result.success).toBe(true);
27
+ });
28
+ });
29
+ describe('open_scene', () => {
30
+ it('sends open_scene command with scene_path', async () => {
31
+ mock.mockResponse({});
32
+ const ctx = createToolContext(mock);
33
+ await openScene.execute({ scene_path: 'res://scenes/main.tscn' }, ctx);
34
+ expect(mock.calls).toHaveLength(1);
35
+ expect(mock.calls[0].command).toBe('open_scene');
36
+ expect(mock.calls[0].params).toEqual({ scene_path: 'res://scenes/main.tscn' });
37
+ });
38
+ it('returns confirmation message with path', async () => {
39
+ mock.mockResponse({});
40
+ const ctx = createToolContext(mock);
41
+ const result = await openScene.execute({ scene_path: 'res://levels/level1.tscn' }, ctx);
42
+ expect(result).toBe('Opened scene: res://levels/level1.tscn');
43
+ });
44
+ it('requires scene_path param', () => {
45
+ const result = openScene.schema.safeParse({});
46
+ expect(result.success).toBe(false);
47
+ });
48
+ it('accepts valid scene_path', () => {
49
+ const result = openScene.schema.safeParse({ scene_path: 'res://test.tscn' });
50
+ expect(result.success).toBe(true);
51
+ });
52
+ });
53
+ describe('save_scene', () => {
54
+ it('sends save_scene command', async () => {
55
+ mock.mockResponse({ path: 'res://scenes/saved.tscn' });
56
+ const ctx = createToolContext(mock);
57
+ await saveScene.execute({}, ctx);
58
+ expect(mock.calls).toHaveLength(1);
59
+ expect(mock.calls[0].command).toBe('save_scene');
60
+ });
61
+ it('passes optional path param', async () => {
62
+ mock.mockResponse({ path: 'res://new_location.tscn' });
63
+ const ctx = createToolContext(mock);
64
+ await saveScene.execute({ path: 'res://new_location.tscn' }, ctx);
65
+ expect(mock.calls[0].params).toEqual({ path: 'res://new_location.tscn' });
66
+ });
67
+ it('returns saved path from Godot response', async () => {
68
+ mock.mockResponse({ path: 'res://scenes/current.tscn' });
69
+ const ctx = createToolContext(mock);
70
+ const result = await saveScene.execute({}, ctx);
71
+ expect(result).toBe('Saved scene: res://scenes/current.tscn');
72
+ });
73
+ it('accepts empty params', () => {
74
+ const result = saveScene.schema.safeParse({});
75
+ expect(result.success).toBe(true);
76
+ });
77
+ });
78
+ describe('create_scene', () => {
79
+ it('sends create_scene command with all params', async () => {
80
+ mock.mockResponse({});
81
+ const ctx = createToolContext(mock);
82
+ await createScene.execute({
83
+ root_type: 'Node2D',
84
+ root_name: 'GameRoot',
85
+ scene_path: 'res://scenes/game.tscn',
86
+ }, ctx);
87
+ expect(mock.calls).toHaveLength(1);
88
+ expect(mock.calls[0].command).toBe('create_scene');
89
+ expect(mock.calls[0].params).toEqual({
90
+ root_type: 'Node2D',
91
+ root_name: 'GameRoot',
92
+ scene_path: 'res://scenes/game.tscn',
93
+ });
94
+ });
95
+ it('uses root_type as default root_name', async () => {
96
+ mock.mockResponse({});
97
+ const ctx = createToolContext(mock);
98
+ await createScene.execute({
99
+ root_type: 'Control',
100
+ scene_path: 'res://ui/menu.tscn',
101
+ }, ctx);
102
+ expect(mock.calls[0].params.root_name).toBe('Control');
103
+ });
104
+ it('returns confirmation message', async () => {
105
+ mock.mockResponse({});
106
+ const ctx = createToolContext(mock);
107
+ const result = await createScene.execute({
108
+ root_type: 'Node3D',
109
+ scene_path: 'res://levels/world.tscn',
110
+ }, ctx);
111
+ expect(result).toBe('Created scene: res://levels/world.tscn with root node type Node3D');
112
+ });
113
+ it('requires root_type and scene_path', () => {
114
+ expect(createScene.schema.safeParse({}).success).toBe(false);
115
+ expect(createScene.schema.safeParse({ root_type: 'Node2D' }).success).toBe(false);
116
+ expect(createScene.schema.safeParse({ scene_path: 'res://test.tscn' }).success).toBe(false);
117
+ });
118
+ it('accepts valid params', () => {
119
+ const result = createScene.schema.safeParse({
120
+ root_type: 'Node2D',
121
+ scene_path: 'res://test.tscn',
122
+ });
123
+ expect(result.success).toBe(true);
124
+ });
125
+ });
126
+ });
127
+ //# sourceMappingURL=scene.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scene.test.js","sourceRoot":"","sources":["../../../src/__tests__/tools/scene.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tilemap.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tilemap.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/tools/tilemap.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,333 @@
1
+ import { describe, it, expect, beforeEach } from 'vitest';
2
+ import { createMockGodot, createToolContext } from '../helpers/mock-godot.js';
3
+ import { tilemapQuery, tilemapEdit, gridmapQuery, gridmapEdit } from '../../tools/tilemap.js';
4
+ describe('tilemap_query', () => {
5
+ let mock;
6
+ beforeEach(() => {
7
+ mock = createMockGodot();
8
+ });
9
+ it('list_layers sends command and formats empty result', async () => {
10
+ mock.mockResponse({ tilemap_layers: [] });
11
+ const ctx = createToolContext(mock);
12
+ const result = await tilemapQuery.execute({ action: 'list_layers' }, ctx);
13
+ expect(mock.calls[0].command).toBe('list_tilemap_layers');
14
+ expect(result).toBe('No TileMapLayer nodes found in scene');
15
+ });
16
+ it('list_layers formats found layers', async () => {
17
+ mock.mockResponse({
18
+ tilemap_layers: [
19
+ { path: '/root/Ground', name: 'Ground' },
20
+ { path: '/root/Walls', name: 'Walls' },
21
+ ],
22
+ });
23
+ const ctx = createToolContext(mock);
24
+ const result = await tilemapQuery.execute({ action: 'list_layers' }, ctx);
25
+ expect(result).toContain('Found 2 TileMapLayer(s)');
26
+ expect(result).toContain('/root/Ground');
27
+ });
28
+ it('get_info sends command and returns JSON', async () => {
29
+ const info = { name: 'Ground', enabled: true, used_cells_count: 100 };
30
+ mock.mockResponse(info);
31
+ const ctx = createToolContext(mock);
32
+ const result = await tilemapQuery.execute({
33
+ action: 'get_info',
34
+ node_path: '/root/Ground',
35
+ }, ctx);
36
+ expect(mock.calls[0].command).toBe('get_tilemap_layer_info');
37
+ expect(result).toBe(JSON.stringify(info, null, 2));
38
+ });
39
+ it('get_tileset_info sends command and returns JSON', async () => {
40
+ const info = { tile_size: { x: 16, y: 16 }, source_count: 1 };
41
+ mock.mockResponse(info);
42
+ const ctx = createToolContext(mock);
43
+ const result = await tilemapQuery.execute({
44
+ action: 'get_tileset_info',
45
+ node_path: '/root/Ground',
46
+ }, ctx);
47
+ expect(mock.calls[0].command).toBe('get_tileset_info');
48
+ expect(result).toBe(JSON.stringify(info, null, 2));
49
+ });
50
+ it('get_used_cells sends command and returns JSON', async () => {
51
+ const cells = { cells: [{ x: 0, y: 0 }, { x: 1, y: 0 }], count: 2 };
52
+ mock.mockResponse(cells);
53
+ const ctx = createToolContext(mock);
54
+ const result = await tilemapQuery.execute({
55
+ action: 'get_used_cells',
56
+ node_path: '/root/Ground',
57
+ }, ctx);
58
+ expect(mock.calls[0].command).toBe('get_used_cells');
59
+ expect(result).toBe(JSON.stringify(cells, null, 2));
60
+ });
61
+ it('get_cell sends command with coords', async () => {
62
+ const cell = { coords: { x: 5, y: 10 }, empty: false, source_id: 0 };
63
+ mock.mockResponse(cell);
64
+ const ctx = createToolContext(mock);
65
+ const result = await tilemapQuery.execute({
66
+ action: 'get_cell',
67
+ node_path: '/root/Ground',
68
+ coords: { x: 5, y: 10 },
69
+ }, ctx);
70
+ expect(mock.calls[0].command).toBe('get_cell');
71
+ expect(mock.calls[0].params.coords).toEqual({ x: 5, y: 10 });
72
+ expect(result).toBe(JSON.stringify(cell, null, 2));
73
+ });
74
+ it('get_cells_in_region sends command with bounds', async () => {
75
+ const region = { cells: [], count: 0 };
76
+ mock.mockResponse(region);
77
+ const ctx = createToolContext(mock);
78
+ const result = await tilemapQuery.execute({
79
+ action: 'get_cells_in_region',
80
+ node_path: '/root/Ground',
81
+ min_coords: { x: 0, y: 0 },
82
+ max_coords: { x: 10, y: 10 },
83
+ }, ctx);
84
+ expect(mock.calls[0].command).toBe('get_cells_in_region');
85
+ expect(mock.calls[0].params.min_coords).toEqual({ x: 0, y: 0 });
86
+ expect(mock.calls[0].params.max_coords).toEqual({ x: 10, y: 10 });
87
+ expect(result).toBe(JSON.stringify(region, null, 2));
88
+ });
89
+ it('convert_coords sends command with local_position', async () => {
90
+ const converted = { direction: 'local_to_map', map_coords: { x: 2, y: 3 } };
91
+ mock.mockResponse(converted);
92
+ const ctx = createToolContext(mock);
93
+ const result = await tilemapQuery.execute({
94
+ action: 'convert_coords',
95
+ node_path: '/root/Ground',
96
+ local_position: { x: 32, y: 48 },
97
+ }, ctx);
98
+ expect(mock.calls[0].command).toBe('convert_coords');
99
+ expect(mock.calls[0].params.local_position).toEqual({ x: 32, y: 48 });
100
+ expect(result).toBe(JSON.stringify(converted, null, 2));
101
+ });
102
+ it('throws on error from Godot', async () => {
103
+ mock.mockError(new Error('Node not found'));
104
+ const ctx = createToolContext(mock);
105
+ await expect(tilemapQuery.execute({
106
+ action: 'get_info',
107
+ node_path: '/root/Missing',
108
+ }, ctx)).rejects.toThrow('Node not found');
109
+ });
110
+ });
111
+ describe('tilemap_edit', () => {
112
+ let mock;
113
+ beforeEach(() => {
114
+ mock = createMockGodot();
115
+ });
116
+ it('set_cell sends command and returns confirmation', async () => {
117
+ mock.mockResponse({
118
+ coords: { x: 3, y: 4 },
119
+ source_id: 1,
120
+ atlas_coords: { x: 2, y: 0 },
121
+ alternative_tile: 0,
122
+ });
123
+ const ctx = createToolContext(mock);
124
+ const result = await tilemapEdit.execute({
125
+ action: 'set_cell',
126
+ node_path: '/root/Ground',
127
+ coords: { x: 3, y: 4 },
128
+ source_id: 1,
129
+ atlas_coords: { x: 2, y: 0 },
130
+ }, ctx);
131
+ expect(mock.calls[0].command).toBe('set_cell');
132
+ expect(mock.calls[0].params.coords).toEqual({ x: 3, y: 4 });
133
+ expect(mock.calls[0].params.source_id).toBe(1);
134
+ expect(result).toContain('Set cell at (3, 4)');
135
+ });
136
+ it('erase_cell sends command and returns confirmation', async () => {
137
+ mock.mockResponse({ erased: { x: 5, y: 6 } });
138
+ const ctx = createToolContext(mock);
139
+ const result = await tilemapEdit.execute({
140
+ action: 'erase_cell',
141
+ node_path: '/root/Ground',
142
+ coords: { x: 5, y: 6 },
143
+ }, ctx);
144
+ expect(mock.calls[0].command).toBe('erase_cell');
145
+ expect(result).toBe('Erased cell at (5, 6)');
146
+ });
147
+ it('clear_layer sends command and returns cell count', async () => {
148
+ mock.mockResponse({ cleared: true, cells_removed: 100 });
149
+ const ctx = createToolContext(mock);
150
+ const result = await tilemapEdit.execute({
151
+ action: 'clear_layer',
152
+ node_path: '/root/Ground',
153
+ }, ctx);
154
+ expect(mock.calls[0].command).toBe('clear_layer');
155
+ expect(result).toBe('Cleared layer: 100 cells removed');
156
+ });
157
+ it('set_cells_batch sends command and returns count', async () => {
158
+ mock.mockResponse({ cells_set: 5 });
159
+ const ctx = createToolContext(mock);
160
+ const result = await tilemapEdit.execute({
161
+ action: 'set_cells_batch',
162
+ node_path: '/root/Ground',
163
+ cells: [
164
+ { coords: { x: 0, y: 0 } },
165
+ { coords: { x: 1, y: 0 } },
166
+ { coords: { x: 2, y: 0 } },
167
+ { coords: { x: 3, y: 0 } },
168
+ { coords: { x: 4, y: 0 } },
169
+ ],
170
+ }, ctx);
171
+ expect(mock.calls[0].command).toBe('set_cells_batch');
172
+ expect(mock.calls[0].params.cells).toHaveLength(5);
173
+ expect(result).toBe('Set 5 cells');
174
+ });
175
+ it('set_cells_batch requires non-empty cells array', () => {
176
+ expect(tilemapEdit.schema.safeParse({
177
+ action: 'set_cells_batch',
178
+ node_path: '/root/Ground',
179
+ cells: [],
180
+ }).success).toBe(false);
181
+ });
182
+ });
183
+ describe('gridmap_query', () => {
184
+ let mock;
185
+ beforeEach(() => {
186
+ mock = createMockGodot();
187
+ });
188
+ it('list sends command and formats empty result', async () => {
189
+ mock.mockResponse({ gridmaps: [] });
190
+ const ctx = createToolContext(mock);
191
+ const result = await gridmapQuery.execute({ action: 'list' }, ctx);
192
+ expect(mock.calls[0].command).toBe('list_gridmaps');
193
+ expect(result).toBe('No GridMap nodes found in scene');
194
+ });
195
+ it('list formats found gridmaps', async () => {
196
+ mock.mockResponse({
197
+ gridmaps: [
198
+ { path: '/root/Floor', name: 'Floor' },
199
+ { path: '/root/Walls', name: 'Walls' },
200
+ ],
201
+ });
202
+ const ctx = createToolContext(mock);
203
+ const result = await gridmapQuery.execute({ action: 'list' }, ctx);
204
+ expect(result).toContain('Found 2 GridMap(s)');
205
+ expect(result).toContain('/root/Floor');
206
+ });
207
+ it('get_info sends command and returns JSON', async () => {
208
+ const info = { name: 'Floor', cell_size: { x: 2, y: 2, z: 2 }, used_cells_count: 50 };
209
+ mock.mockResponse(info);
210
+ const ctx = createToolContext(mock);
211
+ const result = await gridmapQuery.execute({
212
+ action: 'get_info',
213
+ node_path: '/root/Floor',
214
+ }, ctx);
215
+ expect(mock.calls[0].command).toBe('get_gridmap_info');
216
+ expect(result).toBe(JSON.stringify(info, null, 2));
217
+ });
218
+ it('get_meshlib_info sends command and returns JSON', async () => {
219
+ const info = { item_count: 3, items: [{ index: 0, name: 'Cube' }] };
220
+ mock.mockResponse(info);
221
+ const ctx = createToolContext(mock);
222
+ const result = await gridmapQuery.execute({
223
+ action: 'get_meshlib_info',
224
+ node_path: '/root/Floor',
225
+ }, ctx);
226
+ expect(mock.calls[0].command).toBe('get_meshlib_info');
227
+ expect(result).toBe(JSON.stringify(info, null, 2));
228
+ });
229
+ it('get_used_cells sends command and returns JSON', async () => {
230
+ const cells = { cells: [{ x: 0, y: 0, z: 0 }], count: 1 };
231
+ mock.mockResponse(cells);
232
+ const ctx = createToolContext(mock);
233
+ const result = await gridmapQuery.execute({
234
+ action: 'get_used_cells',
235
+ node_path: '/root/Floor',
236
+ }, ctx);
237
+ expect(mock.calls[0].command).toBe('get_gridmap_used_cells');
238
+ expect(result).toBe(JSON.stringify(cells, null, 2));
239
+ });
240
+ it('get_cell sends command with 3D coords', async () => {
241
+ const cell = { coords: { x: 1, y: 2, z: 3 }, empty: false, item: 0 };
242
+ mock.mockResponse(cell);
243
+ const ctx = createToolContext(mock);
244
+ const result = await gridmapQuery.execute({
245
+ action: 'get_cell',
246
+ node_path: '/root/Floor',
247
+ coords: { x: 1, y: 2, z: 3 },
248
+ }, ctx);
249
+ expect(mock.calls[0].command).toBe('get_gridmap_cell');
250
+ expect(mock.calls[0].params.coords).toEqual({ x: 1, y: 2, z: 3 });
251
+ expect(result).toBe(JSON.stringify(cell, null, 2));
252
+ });
253
+ it('get_cells_by_item sends command with item index', async () => {
254
+ const cells = { item: 0, cells: [{ x: 0, y: 0, z: 0 }], count: 1 };
255
+ mock.mockResponse(cells);
256
+ const ctx = createToolContext(mock);
257
+ const result = await gridmapQuery.execute({
258
+ action: 'get_cells_by_item',
259
+ node_path: '/root/Floor',
260
+ item: 0,
261
+ }, ctx);
262
+ expect(mock.calls[0].command).toBe('get_cells_by_item');
263
+ expect(mock.calls[0].params.item).toBe(0);
264
+ expect(result).toBe(JSON.stringify(cells, null, 2));
265
+ });
266
+ });
267
+ describe('gridmap_edit', () => {
268
+ let mock;
269
+ beforeEach(() => {
270
+ mock = createMockGodot();
271
+ });
272
+ it('set_cell sends command and returns confirmation', async () => {
273
+ mock.mockResponse({ coords: { x: 1, y: 0, z: 1 }, item: 2, orientation: 4 });
274
+ const ctx = createToolContext(mock);
275
+ const result = await gridmapEdit.execute({
276
+ action: 'set_cell',
277
+ node_path: '/root/Floor',
278
+ coords: { x: 1, y: 0, z: 1 },
279
+ item: 2,
280
+ orientation: 4,
281
+ }, ctx);
282
+ expect(mock.calls[0].command).toBe('set_gridmap_cell');
283
+ expect(mock.calls[0].params.item).toBe(2);
284
+ expect(mock.calls[0].params.orientation).toBe(4);
285
+ expect(result).toContain('Set cell at (1, 0, 1)');
286
+ expect(result).toContain('item 2');
287
+ });
288
+ it('clear_cell sends command and returns confirmation', async () => {
289
+ mock.mockResponse({ cleared: { x: 2, y: 1, z: 3 } });
290
+ const ctx = createToolContext(mock);
291
+ const result = await gridmapEdit.execute({
292
+ action: 'clear_cell',
293
+ node_path: '/root/Floor',
294
+ coords: { x: 2, y: 1, z: 3 },
295
+ }, ctx);
296
+ expect(mock.calls[0].command).toBe('clear_gridmap_cell');
297
+ expect(result).toBe('Cleared cell at (2, 1, 3)');
298
+ });
299
+ it('clear sends command and returns cell count', async () => {
300
+ mock.mockResponse({ cleared: true, cells_removed: 50 });
301
+ const ctx = createToolContext(mock);
302
+ const result = await gridmapEdit.execute({
303
+ action: 'clear',
304
+ node_path: '/root/Floor',
305
+ }, ctx);
306
+ expect(mock.calls[0].command).toBe('clear_gridmap');
307
+ expect(result).toBe('Cleared GridMap: 50 cells removed');
308
+ });
309
+ it('set_cells_batch sends command and returns count', async () => {
310
+ mock.mockResponse({ cells_set: 3 });
311
+ const ctx = createToolContext(mock);
312
+ const result = await gridmapEdit.execute({
313
+ action: 'set_cells_batch',
314
+ node_path: '/root/Floor',
315
+ cells: [
316
+ { coords: { x: 0, y: 0, z: 0 }, item: 1 },
317
+ { coords: { x: 1, y: 0, z: 0 }, item: 1 },
318
+ { coords: { x: 2, y: 0, z: 0 }, item: 1 },
319
+ ],
320
+ }, ctx);
321
+ expect(mock.calls[0].command).toBe('set_gridmap_cells_batch');
322
+ expect(mock.calls[0].params.cells).toHaveLength(3);
323
+ expect(result).toBe('Set 3 cells');
324
+ });
325
+ it('set_cells_batch requires non-empty cells array', () => {
326
+ expect(gridmapEdit.schema.safeParse({
327
+ action: 'set_cells_batch',
328
+ node_path: '/root/Floor',
329
+ cells: [],
330
+ }).success).toBe(false);
331
+ });
332
+ });
333
+ //# sourceMappingURL=tilemap.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tilemap.test.js","sourceRoot":"","sources":["../../../src/__tests__/tools/tilemap.test.ts"],"names":[],"mappings":"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"}