@shopware-ag/dive 1.12.1 → 1.14.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.
Files changed (77) hide show
  1. package/build/dive.cjs +458 -405
  2. package/build/dive.cjs.map +1 -1
  3. package/build/dive.d.cts +314 -78
  4. package/build/dive.d.ts +314 -78
  5. package/build/dive.js +430 -377
  6. package/build/dive.js.map +1 -1
  7. package/package.json +1 -1
  8. package/src/__test__/DIVE.test.ts +33 -29
  9. package/src/axiscamera/AxisCamera.ts +1 -1
  10. package/src/axiscamera/__test__/AxisCamera.test.ts +1 -1
  11. package/src/com/Communication.ts +59 -14
  12. package/src/com/__test__/Communication.test.ts +111 -31
  13. package/src/com/actions/index.ts +2 -0
  14. package/src/com/actions/object/addobject.ts +1 -1
  15. package/src/com/actions/object/deleteobject.ts +1 -1
  16. package/src/com/actions/object/deselectobject.ts +1 -1
  17. package/src/com/actions/object/getallobjects.ts +1 -1
  18. package/src/com/actions/object/getobjects.ts +1 -1
  19. package/src/com/actions/object/selectobject.ts +1 -1
  20. package/src/com/actions/object/setparent.ts +9 -0
  21. package/src/com/actions/object/updateobject.ts +1 -1
  22. package/src/com/actions/scene/getallscenedata.ts +1 -1
  23. package/src/com/types/COMBaseEntity.ts +9 -0
  24. package/src/com/types/COMEntity.ts +7 -0
  25. package/src/com/types/COMEntityType.ts +1 -0
  26. package/src/com/types/COMGeometry.ts +6 -0
  27. package/src/com/types/COMGroup.ts +9 -0
  28. package/src/com/types/COMLight.ts +10 -0
  29. package/src/com/types/COMMaterial.ts +12 -0
  30. package/src/com/types/COMModel.ts +12 -0
  31. package/src/com/types/COMPov.ts +8 -0
  32. package/src/com/types/COMPrimitive.ts +12 -0
  33. package/src/com/types/index.ts +21 -0
  34. package/src/dive.ts +9 -16
  35. package/src/grid/Grid.ts +1 -1
  36. package/src/grid/__test__/Grid.test.ts +1 -1
  37. package/src/group/Group.ts +126 -0
  38. package/src/group/__test__/Group.test.ts +100 -0
  39. package/src/helper/findSceneRecursive/findSceneRecursive.ts +1 -1
  40. package/src/light/AmbientLight.ts +3 -0
  41. package/src/light/PointLight.ts +6 -3
  42. package/src/light/SceneLight.ts +2 -0
  43. package/src/light/__test__/PointLight.test.ts +8 -6
  44. package/src/light/__test__/SceneLight.test.ts +8 -6
  45. package/src/loadingmanager/LoadingManager.ts +1 -1
  46. package/src/loadingmanager/__test__/LoadingManager.test.ts +1 -1
  47. package/src/mediacreator/MediaCreator.ts +1 -1
  48. package/src/mediacreator/__test__/MediaCreator.test.ts +6 -4
  49. package/src/model/Model.ts +8 -7
  50. package/src/model/__test__/Model.test.ts +13 -10
  51. package/src/primitive/Primitive.ts +4 -3
  52. package/src/primitive/__test__/Primitive.test.ts +9 -7
  53. package/src/primitive/floor/Floor.ts +1 -1
  54. package/src/primitive/floor/__test__/Floor.test.ts +1 -1
  55. package/src/renderer/__test__/Renderer.test.ts +1 -1
  56. package/src/scene/Scene.ts +29 -9
  57. package/src/scene/__test__/Scene.test.ts +33 -19
  58. package/src/scene/root/Root.ts +239 -72
  59. package/src/scene/root/__test__/Root.test.ts +476 -114
  60. package/src/toolbox/BaseTool.ts +1 -1
  61. package/src/toolbox/Toolbox.ts +1 -1
  62. package/src/toolbox/__test__/BaseTool.test.ts +1 -1
  63. package/src/toolbox/__test__/Toolbox.test.ts +1 -1
  64. package/src/toolbox/select/SelectTool.ts +1 -1
  65. package/src/toolbox/select/__test__/SelectTool.test.ts +11 -9
  66. package/src/toolbox/transform/TransformTool.ts +1 -1
  67. package/src/toolbox/transform/__test__/TransformTool.test.ts +12 -10
  68. package/src/types/SceneObjects.ts +14 -0
  69. package/src/types/index.ts +5 -0
  70. package/src/com/index.ts +0 -3
  71. package/src/com/types.ts +0 -58
  72. package/src/scene/root/lightroot/LightRoot.ts +0 -99
  73. package/src/scene/root/lightroot/__test__/LightRoot.test.ts +0 -145
  74. package/src/scene/root/modelroot/ModelRoot.ts +0 -98
  75. package/src/scene/root/modelroot/__test__/ModelRoot.test.ts +0 -189
  76. package/src/scene/root/primitiveroot/PrimitiveRoot.ts +0 -88
  77. package/src/scene/root/primitiveroot/__test__/PrimitiveRoot.test.ts +0 -181
@@ -1,189 +0,0 @@
1
- import DIVEModelRoot from '../ModelRoot';
2
- import DIVECommunication from '../../../../com/Communication';
3
- import { DIVEMoveable } from '../../../../interface/Moveable';
4
- import type DIVEScene from '../../../Scene';
5
- import { type COMMaterial } from '../../../../com/types';
6
-
7
- const mock_LoadGLTF = jest.fn().mockResolvedValue({});
8
- const mock_SetPosition = jest.fn();
9
- const mock_SetRotation = jest.fn();
10
- const mock_SetScale = jest.fn();
11
- const mock_PlaceOnFloor = jest.fn();
12
- const mock_SetModel = jest.fn();
13
-
14
- jest.mock('../../../../com/types.ts', () => {
15
- return {
16
- COMModel: {},
17
- }
18
- });
19
-
20
- jest.mock('../../../../loadingmanager/LoadingManager.ts', () => {
21
- return jest.fn(function () {
22
- this.LoadGLTF = mock_LoadGLTF;
23
- return this;
24
- });
25
- });
26
-
27
- jest.mock('../../../../com/Communication.ts', () => {
28
- return {
29
- get: jest.fn(() => {
30
- return {
31
- PerformAction: jest.fn(),
32
- }
33
- }),
34
- }
35
- });
36
-
37
- jest.mock('../../../../model/Model.ts', () => {
38
- return jest.fn(function () {
39
- this.isObject3D = true;
40
- this.parent = null;
41
- this.dispatchEvent = jest.fn();
42
- this.userData = {
43
- id: undefined,
44
- };
45
- this.SetModel = mock_SetModel;
46
- this.SetPosition = mock_SetPosition;
47
- this.SetRotation = mock_SetRotation;
48
- this.SetScale = mock_SetScale;
49
- this.SetVisibility = jest.fn();
50
- this.SetMaterial = jest.fn();
51
- this.PlaceOnFloor = mock_PlaceOnFloor;
52
- this.removeFromParent = jest.fn();
53
- return this;
54
- });
55
- });
56
-
57
- jest.spyOn(DIVECommunication, 'get').mockReturnValue({ PerformAction: jest.fn() } as unknown as DIVECommunication);
58
-
59
- const consoleWarnSpy = jest.spyOn(console, 'warn').mockImplementation(() => { });
60
-
61
- describe('dive/scene/root/modelroot/DIVEModelRoot', () => {
62
- beforeEach(() => {
63
- consoleWarnSpy.mockClear();
64
- });
65
-
66
- it('should instantiate', () => {
67
- const modelRoot = new DIVEModelRoot();
68
- expect(modelRoot).toBeDefined();
69
- });
70
-
71
- it('should not add incorrect model', async () => {
72
- const modelRoot = new DIVEModelRoot();
73
- await expect(() => modelRoot.UpdateModel({ id: undefined })).not.toThrow();
74
- expect(consoleWarnSpy).toHaveBeenCalled();
75
- expect(modelRoot.children).toHaveLength(0);
76
- });
77
-
78
- it('should add basic model', async () => {
79
- const modelRoot = new DIVEModelRoot();
80
- await expect(() => modelRoot.UpdateModel({
81
- id: 'test_id',
82
- uri: 'not a real uri',
83
- visible: false,
84
- })).not.toThrow();
85
- expect(mock_LoadGLTF).toHaveBeenCalledTimes(1);
86
- expect(mock_SetModel).toHaveBeenCalledTimes(1);
87
- expect(modelRoot.children).toHaveLength(1);
88
- expect(modelRoot.children[0].userData.id).toBe('test_id');
89
- });
90
-
91
- it('should add configured model', async () => {
92
- const modelRoot = new DIVEModelRoot();
93
- modelRoot.userData.id = 'something';
94
- await expect(() => modelRoot.UpdateModel({
95
- id: 'test_id',
96
- uri: 'not a real uri',
97
- position: { x: 1, y: 2, z: 3 },
98
- rotation: { x: 1, y: 2, z: 3 },
99
- scale: { x: 1, y: 2, z: 3 },
100
- material: {} as COMMaterial,
101
- })).not.toThrow();
102
-
103
- jest.spyOn(DIVECommunication, 'get').mockReturnValueOnce(undefined);
104
- await expect(() => modelRoot.UpdateModel({
105
- id: 'test_id',
106
- uri: 'not a real uri',
107
- position: { x: 1, y: 2, z: 3 },
108
- rotation: { x: 1, y: 2, z: 3 },
109
- scale: { x: 1, y: 2, z: 3 },
110
- })).not.toThrow();
111
-
112
- expect(modelRoot.children).toHaveLength(1);
113
- expect(mock_SetPosition).toHaveBeenCalledTimes(2);
114
- expect(mock_SetRotation).toHaveBeenCalledTimes(2);
115
- expect(mock_SetScale).toHaveBeenCalledTimes(2);
116
- });
117
-
118
- it('should not place incorrect model on floor', async () => {
119
- const modelRoot = new DIVEModelRoot();
120
- expect(() => modelRoot.PlaceOnFloor({ id: undefined })).not.toThrow();
121
- expect(consoleWarnSpy).toHaveBeenCalled();
122
- expect(mock_PlaceOnFloor).toHaveBeenCalledTimes(0);
123
- });
124
-
125
- it('should not place non-existing model on floor', async () => {
126
- const modelRoot = new DIVEModelRoot();
127
- modelRoot.PlaceOnFloor({ id: 'test_id' });
128
- expect(mock_PlaceOnFloor).toHaveBeenCalledTimes(0);
129
- });
130
-
131
- it('should place model on floor', async () => {
132
- const modelRoot = new DIVEModelRoot();
133
- await modelRoot.UpdateModel({
134
- id: 'test_id',
135
- uri: 'not a real uri',
136
- position: { x: 1, y: 2, z: 3 },
137
- rotation: { x: 1, y: 2, z: 3 },
138
- scale: { x: 1, y: 2, z: 3 },
139
- });
140
- modelRoot.PlaceOnFloor({ id: 'test_id' });
141
- expect(mock_PlaceOnFloor).toHaveBeenCalledTimes(1);
142
- });
143
-
144
- it('should get model', async () => {
145
- const modelRoot = new DIVEModelRoot();
146
- expect(() => modelRoot.GetModel({ id: undefined })).not.toThrow();
147
- expect(consoleWarnSpy).toHaveBeenCalled();
148
- expect(modelRoot.GetModel({ id: 'test_id' })).toBeUndefined();
149
- await expect(() => modelRoot.UpdateModel({
150
- id: 'test_id',
151
- uri: 'not a real uri',
152
- position: { x: 1, y: 2, z: 3 },
153
- rotation: { x: 1, y: 2, z: 3 },
154
- scale: { x: 1, y: 2, z: 3 },
155
- })).not.toThrow();
156
- expect(modelRoot.GetModel({ id: 'test_id' })).toBeDefined();
157
- });
158
-
159
- it('should delete model', async () => {
160
- const modelRoot = new DIVEModelRoot();
161
-
162
- const sceneParent = {
163
- parent: null,
164
- children: [
165
- {
166
- isTransformControls: true,
167
- detach: jest.fn(),
168
- }
169
- ],
170
- }
171
- modelRoot.parent = sceneParent as unknown as DIVEScene;
172
-
173
- expect(() => modelRoot.DeleteModel({ id: undefined })).not.toThrow();
174
- expect(consoleWarnSpy).toHaveBeenCalled();
175
- consoleWarnSpy.mockClear();
176
- expect(() => modelRoot.DeleteModel({ id: 'test_id' })).not.toThrow();
177
- expect(consoleWarnSpy).toHaveBeenCalled();
178
- await expect(() => modelRoot.UpdateModel({
179
- id: 'test_id',
180
- uri: 'not a real uri',
181
- position: { x: 1, y: 2, z: 3 },
182
- rotation: { x: 1, y: 2, z: 3 },
183
- scale: { x: 1, y: 2, z: 3 },
184
- })).not.toThrow();
185
- (modelRoot.children[0] as unknown as DIVEMoveable).isMoveable = true;
186
- expect(() => modelRoot.DeleteModel({ id: 'test_id' })).not.toThrow();
187
- expect(modelRoot.children).toHaveLength(0);
188
- });
189
- });
@@ -1,88 +0,0 @@
1
- import { Object3D } from "three";
2
- import { DIVEPrimitive } from "../../../primitive/Primitive.ts";
3
- import type DIVEScene from "../../Scene.ts";
4
- import { type COMPrimitive } from "../../../com/types";
5
- import { type TransformControls } from "three/examples/jsm/controls/TransformControls";
6
-
7
- /**
8
- * A basic scene node to hold all primitives.
9
- *
10
- * @module
11
- */
12
- export class DIVEPrimitiveRoot extends Object3D {
13
- constructor() {
14
- super();
15
- this.name = "PrimitiveRoot";
16
- }
17
-
18
- public GetPrimitive(object: Partial<COMPrimitive>): Object3D | undefined {
19
- if (object.id === undefined) {
20
- console.warn('PrimitiveRoot.GetPrimitive: object.id is undefined')
21
- return undefined;
22
- }
23
- return this.children.find(object3D => object3D.userData.id === object.id);
24
- }
25
-
26
- public UpdatePrimitive(object: Partial<COMPrimitive>): void {
27
- if (object.id === undefined) {
28
- console.warn('PrimitiveRoot.UpdatePrimitive: object.id is undefined')
29
- return;
30
- }
31
-
32
- let sceneObject = this.children.find(object3D => object3D.userData.id === object.id);
33
- if (!sceneObject && object.geometry !== undefined) {
34
- const primitive = new DIVEPrimitive();
35
- primitive.SetGeometry(object.geometry);
36
- sceneObject = primitive;
37
- sceneObject.userData.id = object.id;
38
- this.add(sceneObject);
39
- }
40
-
41
- if (object.position !== undefined) (sceneObject as DIVEPrimitive).SetPosition(object.position);
42
- if (object.rotation !== undefined) (sceneObject as DIVEPrimitive).SetRotation(object.rotation);
43
- if (object.scale !== undefined) (sceneObject as DIVEPrimitive).SetScale(object.scale);
44
- if (object.visible !== undefined) (sceneObject as DIVEPrimitive).SetVisibility(object.visible);
45
- if (object.material !== undefined) (sceneObject as DIVEPrimitive).SetMaterial(object.material);
46
- }
47
-
48
- public DeletePrimitive(object: Partial<COMPrimitive>): void {
49
- if (object.id === undefined) {
50
- console.warn(`PrimitiveRoot.DeletePrimitive: object.id is undefined`)
51
- return;
52
- }
53
-
54
- const sceneObject = this.children.find(object3D => object3D.userData.id === object.id);
55
- if (!sceneObject) {
56
- console.warn(`PrimitiveRoot.DeletePrimitive: Primitive with id ${object.id} not found`);
57
- return;
58
- }
59
-
60
- // _______________________________________________________
61
- // this is only neccessary due to using the old TransformControls instead of the new DIVEGizmo
62
- const findScene = (object: Object3D): DIVEScene => {
63
- if (object.parent !== null) {
64
- return findScene(object.parent);
65
- };
66
- return object as DIVEScene;
67
- }
68
-
69
- const scene = findScene(sceneObject);
70
- scene.children.find((object) => {
71
- if ('isTransformControls' in object) {
72
- (object as TransformControls).detach();
73
- }
74
- });
75
- // _______________________________________________________
76
-
77
- this.remove(sceneObject);
78
- }
79
-
80
- public PlaceOnFloor(object: Partial<COMPrimitive>): void {
81
- if (object.id === undefined) console.warn('PrimitiveRoot.PlaceOnFloor: object.id is undefined');
82
-
83
- const sceneObject = this.children.find(object3D => object3D.userData.id === object.id);
84
- if (!sceneObject) return;
85
-
86
- (sceneObject as DIVEPrimitive).PlaceOnFloor();
87
- }
88
- }
@@ -1,181 +0,0 @@
1
- import DIVECommunication from '../../../../com/Communication';
2
- import { DIVEPrimitiveRoot } from '../PrimitiveRoot';
3
- import type DIVEScene from '../../../Scene';
4
- import { type DIVEMoveable } from '../../../../interface/Moveable';
5
- import { type COMMaterial, type COMGeometry } from '../../../../com/types';
6
-
7
- const mock_SetPosition = jest.fn();
8
- const mock_SetRotation = jest.fn();
9
- const mock_SetScale = jest.fn();
10
- const mock_PlaceOnFloor = jest.fn();
11
- const mock_SetGeometry = jest.fn();
12
- const mock_SetMaterial = jest.fn();
13
-
14
- jest.mock('../../../../com/types.ts', () => {
15
- return {
16
- COMPrimitive: {},
17
- }
18
- });
19
-
20
- jest.mock('../../../../com/Communication.ts', () => {
21
- return {
22
- get: jest.fn(() => {
23
- return {
24
- PerformAction: jest.fn(),
25
- }
26
- }),
27
- }
28
- });
29
-
30
- jest.mock('../../../../primitive/Primitive.ts', () => {
31
- return {
32
- DIVEPrimitive: jest.fn(function () {
33
- this.isObject3D = true;
34
- this.parent = null;
35
- this.dispatchEvent = jest.fn();
36
- this.userData = {
37
- id: undefined,
38
- };
39
- this.SetGeometry = mock_SetGeometry;
40
- this.SetMaterial = mock_SetMaterial;
41
- this.SetPosition = mock_SetPosition;
42
- this.SetRotation = mock_SetRotation;
43
- this.SetScale = mock_SetScale;
44
- this.SetVisibility = jest.fn();
45
- this.PlaceOnFloor = mock_PlaceOnFloor;
46
- this.removeFromParent = jest.fn();
47
- return this;
48
- })
49
- };
50
- });
51
-
52
- jest.spyOn(DIVECommunication, 'get').mockReturnValue({ PerformAction: jest.fn() } as unknown as DIVECommunication);
53
-
54
- const consoleWarnSpy = jest.spyOn(console, 'warn').mockImplementation(() => { });
55
- let primitiveRoot = new DIVEPrimitiveRoot();
56
-
57
- describe('dive/scene/root/primitiveroot/DIVEPrimitiveRoot', () => {
58
- beforeEach(() => {
59
- consoleWarnSpy.mockClear();
60
-
61
- primitiveRoot = new DIVEPrimitiveRoot();
62
- });
63
-
64
- it('should instantiate', () => {
65
- expect(primitiveRoot).toBeDefined();
66
- });
67
-
68
- it('should not add incorrect primitive', async () => {
69
- expect(() => primitiveRoot.UpdatePrimitive({ id: undefined })).not.toThrow();
70
- expect(consoleWarnSpy).toHaveBeenCalled();
71
- expect(primitiveRoot.children).toHaveLength(0);
72
- });
73
-
74
- it('should add basic primitive', async () => {
75
- expect(() => primitiveRoot.UpdatePrimitive({
76
- id: 'test_id',
77
- geometry: {} as COMGeometry,
78
- visible: false,
79
- })).not.toThrow();
80
- expect(mock_SetGeometry).toHaveBeenCalledTimes(1);
81
- expect(primitiveRoot.children).toHaveLength(1);
82
- expect(primitiveRoot.children[0].userData.id).toBe('test_id');
83
- });
84
-
85
- it('should add configured primitive', async () => {
86
- primitiveRoot.userData.id = 'something';
87
- expect(() => primitiveRoot.UpdatePrimitive({
88
- id: 'test_id',
89
- position: { x: 1, y: 2, z: 3 },
90
- rotation: { x: 1, y: 2, z: 3 },
91
- scale: { x: 1, y: 2, z: 3 },
92
- geometry: {} as COMGeometry,
93
- material: {} as COMMaterial,
94
- })).not.toThrow();
95
-
96
- jest.spyOn(DIVECommunication, 'get').mockReturnValueOnce(undefined);
97
- expect(() => primitiveRoot.UpdatePrimitive({
98
- id: 'test_id',
99
- position: { x: 1, y: 2, z: 3 },
100
- rotation: { x: 1, y: 2, z: 3 },
101
- scale: { x: 1, y: 2, z: 3 },
102
- geometry: {} as COMGeometry,
103
- material: {} as COMMaterial,
104
- }
105
- )).not.toThrow();
106
-
107
- expect(primitiveRoot.children).toHaveLength(1);
108
- expect(mock_SetPosition).toHaveBeenCalledTimes(2);
109
- expect(mock_SetRotation).toHaveBeenCalledTimes(2);
110
- expect(mock_SetScale).toHaveBeenCalledTimes(2);
111
- expect(mock_SetGeometry).toHaveBeenCalledTimes(2);
112
- expect(mock_SetMaterial).toHaveBeenCalledTimes(2);
113
- });
114
-
115
- it('should not place incorrect primitive on floor', async () => {
116
- expect(() => primitiveRoot.PlaceOnFloor({ id: undefined })).not.toThrow();
117
- expect(consoleWarnSpy).toHaveBeenCalled();
118
- expect(mock_PlaceOnFloor).toHaveBeenCalledTimes(0);
119
- });
120
-
121
- it('should not place non-existing primitive on floor', async () => {
122
- primitiveRoot.PlaceOnFloor({ id: 'test_id' });
123
- expect(mock_PlaceOnFloor).toHaveBeenCalledTimes(0);
124
- });
125
-
126
- it('should place primitive on floor', async () => {
127
- primitiveRoot.UpdatePrimitive({
128
- id: 'test_id',
129
- position: { x: 1, y: 2, z: 3 },
130
- rotation: { x: 1, y: 2, z: 3 },
131
- scale: { x: 1, y: 2, z: 3 },
132
- geometry: {} as COMGeometry,
133
- });
134
- primitiveRoot.PlaceOnFloor({ id: 'test_id' });
135
- expect(mock_PlaceOnFloor).toHaveBeenCalledTimes(1);
136
- });
137
-
138
- it('should get primitive', async () => {
139
- expect(() => primitiveRoot.GetPrimitive({ id: undefined })).not.toThrow();
140
- expect(consoleWarnSpy).toHaveBeenCalled();
141
- expect(primitiveRoot.GetPrimitive({ id: 'test_id' })).toBeUndefined();
142
- expect(() => primitiveRoot.UpdatePrimitive({
143
- id: 'test_id',
144
- position: { x: 1, y: 2, z: 3 },
145
- rotation: { x: 1, y: 2, z: 3 },
146
- scale: { x: 1, y: 2, z: 3 },
147
- geometry: {} as COMGeometry,
148
- })).not.toThrow();
149
- expect(primitiveRoot.GetPrimitive({ id: 'test_id' })).toBeDefined();
150
- });
151
-
152
- it('should delete primitive', async () => {
153
-
154
- const sceneParent = {
155
- parent: null,
156
- children: [
157
- {
158
- isTransformControls: true,
159
- detach: jest.fn(),
160
- }
161
- ],
162
- }
163
- primitiveRoot.parent = sceneParent as unknown as DIVEScene;
164
-
165
- expect(() => primitiveRoot.DeletePrimitive({ id: undefined })).not.toThrow();
166
- expect(consoleWarnSpy).toHaveBeenCalled();
167
- consoleWarnSpy.mockClear();
168
- expect(() => primitiveRoot.DeletePrimitive({ id: 'test_id' })).not.toThrow();
169
- expect(consoleWarnSpy).toHaveBeenCalled();
170
- expect(() => primitiveRoot.UpdatePrimitive({
171
- id: 'test_id',
172
- position: { x: 1, y: 2, z: 3 },
173
- rotation: { x: 1, y: 2, z: 3 },
174
- scale: { x: 1, y: 2, z: 3 },
175
- geometry: {} as COMGeometry,
176
- })).not.toThrow();
177
- (primitiveRoot.children[0] as unknown as DIVEMoveable).isMoveable = true;
178
- expect(() => primitiveRoot.DeletePrimitive({ id: 'test_id' })).not.toThrow();
179
- expect(primitiveRoot.children).toHaveLength(0);
180
- });
181
- });