-
Notifications
You must be signed in to change notification settings - Fork 8
Expand file tree
/
Copy pathCoreContributions.spec.ts
More file actions
173 lines (152 loc) · 8.36 KB
/
Copy pathCoreContributions.spec.ts
File metadata and controls
173 lines (152 loc) · 8.36 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
import { describe, it, expect } from 'vitest';
// Import Actual Manifests
import transformManifest from '@core/components/definitions/transform';
import meshRendererManifest from '@core/components/definitions/meshRenderer';
import rigidBodyManifest from '@core/components/definitions/rigidBody';
import meshColliderManifest from '@core/components/definitions/meshCollider';
import cameraManifest from '@core/components/definitions/camera';
// Import Data Types and Contribution Interfaces
import { IRenderingContributions, IPhysicsContributions } from '@core/components/types';
import { TransformData } from './transform'; // Assuming transform.ts exports TransformData
import { MeshRendererData } from './meshRenderer'; // Assuming meshRenderer.ts exports MeshRendererData
import { RigidBodyData } from './rigidBody'; // Assuming rigidBody.ts exports RigidBodyData
import { MeshColliderData } from './meshCollider'; // Assuming meshCollider.ts exports MeshColliderData
import { CameraData } from './camera'; // Assuming camera.ts exports CameraData
describe('Core Component Manifest Contributions', () => {
describe(transformManifest.id + ' Contributions', () => {
it('should not have getRenderingContributions defined', () => {
expect(transformManifest.getRenderingContributions).toBeUndefined();
});
it('should not have getPhysicsContributions defined', () => {
expect(transformManifest.getPhysicsContributions).toBeUndefined();
});
});
describe(meshRendererManifest.id + ' Contributions', () => {
it('should return correct rendering contributions with default data', () => {
const defaultData = meshRendererManifest.getDefaultData();
// Manifest guarantees getRenderingContributions exists
const contributions = meshRendererManifest.getRenderingContributions!(defaultData);
expect(contributions.meshType).toBe('Cube'); // Default meshId is 'cube'
expect(contributions.visible).toBe(true); // Default enabled is true
expect(contributions.castShadow).toBe(true); // Default castShadows is true
expect(contributions.receiveShadow).toBe(true); // Default receiveShadows is true
expect(contributions.material?.color).toBe('#3399ff'); // Default color
expect(contributions.material?.metalness).toBe(0.0);
expect(contributions.material?.roughness).toBe(0.5);
expect(contributions.material?.emissive).toBe('#000000');
expect(contributions.material?.emissiveIntensity).toBe(0.0);
});
it('should reflect custom data in rendering contributions', () => {
const customData: MeshRendererData = {
meshId: 'sphere',
materialId: 'customMat',
enabled: false,
castShadows: false,
receiveShadows: false,
material: { color: '#FF0000', metalness: 0.8, roughness: 0.2, emissive: '#00FF00', emissiveIntensity: 0.5 },
};
const contributions = meshRendererManifest.getRenderingContributions!(customData);
expect(contributions.meshType).toBe('Sphere');
expect(contributions.visible).toBe(false);
expect(contributions.castShadow).toBe(false);
expect(contributions.receiveShadow).toBe(false); // Based on castShadows: false, receiveShadows: false
expect(contributions.material?.color).toBe('#FF0000');
expect(contributions.material?.metalness).toBe(0.8);
expect(contributions.material?.roughness).toBe(0.2);
expect(contributions.material?.emissive).toBe('#00FF00');
expect(contributions.material?.emissiveIntensity).toBe(0.5);
});
});
describe(rigidBodyManifest.id + ' Contributions', () => {
it('should return correct physics contributions with default data', () => {
const defaultData = rigidBodyManifest.getDefaultData();
const contributions = rigidBodyManifest.getPhysicsContributions!(defaultData);
expect(contributions.enabled).toBe(true);
expect(contributions.rigidBodyProps?.type).toBe('dynamic');
expect(contributions.rigidBodyProps?.mass).toBe(1);
expect(contributions.rigidBodyProps?.gravityScale).toBe(1);
expect(contributions.rigidBodyProps?.canSleep).toBe(true);
expect(contributions.rigidBodyProps?.linearDamping).toBe(0);
expect(contributions.rigidBodyProps?.angularDamping).toBe(0);
expect(contributions.rigidBodyProps?.friction).toBe(0.7);
expect(contributions.rigidBodyProps?.restitution).toBe(0.3);
expect(contributions.rigidBodyProps?.density).toBe(1);
});
it('should reflect custom data in physics contributions', () => {
const customData: RigidBodyData = {
bodyType: 'static',
mass: 100,
enabled: false,
gravityScale: 0,
canSleep: false,
linearDamping: 0.5,
angularDamping: 0.5,
material: { friction: 0.2, restitution: 0.8, density: 2 },
};
const contributions = rigidBodyManifest.getPhysicsContributions!(customData);
expect(contributions.enabled).toBe(false);
expect(contributions.rigidBodyProps?.type).toBe('static');
expect(contributions.rigidBodyProps?.mass).toBe(100);
expect(contributions.rigidBodyProps?.gravityScale).toBe(0);
expect(contributions.rigidBodyProps?.canSleep).toBe(false);
expect(contributions.rigidBodyProps?.linearDamping).toBe(0.5);
expect(contributions.rigidBodyProps?.angularDamping).toBe(0.5);
expect(contributions.rigidBodyProps?.friction).toBe(0.2);
expect(contributions.rigidBodyProps?.restitution).toBe(0.8);
expect(contributions.rigidBodyProps?.density).toBe(2);
});
});
describe(meshColliderManifest.id + ' Contributions', () => {
it('should return correct physics contributions with default data', () => {
const defaultData = meshColliderManifest.getDefaultData();
const contributions = meshColliderManifest.getPhysicsContributions!(defaultData);
expect(contributions.enabled).toBe(true);
// MeshCollider primarily contributes material properties to rigidBodyProps
expect(contributions.rigidBodyProps?.friction).toBe(0.7);
expect(contributions.rigidBodyProps?.restitution).toBe(0.3);
expect(contributions.rigidBodyProps?.density).toBe(1);
// It doesn't define body type or mass itself
expect(contributions.rigidBodyProps?.type).toBeUndefined();
expect(contributions.rigidBodyProps?.mass).toBeUndefined();
});
it('should reflect custom data in physics contributions', () => {
const customData: MeshColliderData = {
enabled: false,
colliderType: 'sphere', // This doesn't directly affect contributions structure here
isTrigger: true, // This also doesn't directly affect contributions structure here
center: [0,0,0],
size: { radius: 1 },
physicsMaterial: { friction: 0.1, restitution: 0.9, density: 0.5 },
};
const contributions = meshColliderManifest.getPhysicsContributions!(customData);
expect(contributions.enabled).toBe(false);
expect(contributions.rigidBodyProps?.friction).toBe(0.1);
expect(contributions.rigidBodyProps?.restitution).toBe(0.9);
expect(contributions.rigidBodyProps?.density).toBe(0.5);
});
it('should return enabled: false if data.enabled is false', () => {
const customData: MeshColliderData = {
...meshColliderManifest.getDefaultData(),
enabled: false,
};
const contributions = meshColliderManifest.getPhysicsContributions!(customData);
expect(contributions.enabled).toBe(false);
// rigidBodyProps might be undefined or empty if enabled is false,
// depending on implementation, current implementation still returns them.
// Let's check they are still there based on current manifest logic.
expect(contributions.rigidBodyProps?.friction).toBe(0.7);
});
});
describe(cameraManifest.id + ' Contributions', () => {
it('should return correct rendering contributions with default data', () => {
const defaultData = cameraManifest.getDefaultData();
const contributions = cameraManifest.getRenderingContributions!(defaultData);
expect(contributions.meshType).toBe('CameraGizmo');
expect(contributions.visible).toBe(true);
expect(contributions.castShadow).toBe(false);
expect(contributions.receiveShadow).toBe(false);
});
// Camera's getRenderingContributions is not data-dependent, so one test is sufficient.
// If it became data-dependent, more tests would be needed.
});
});