61 lines
2.5 KiB
TypeScript
61 lines
2.5 KiB
TypeScript
import { describe, expect, it } from 'vitest';
|
|
import { CreateAssetCommand } from '../../src/core/commands/assetCommands';
|
|
import { CommandStack } from '../../src/core/commands/CommandStack';
|
|
import { PlaceAssetCommand, SetOverrideCommand } from '../../src/core/commands/sceneObjectCommands';
|
|
import { createEmptyProject } from '../../src/core/model/Project';
|
|
import { deserializeProject, serializeProject } from '../../src/core/store/serialize';
|
|
|
|
describe('serialize', () => {
|
|
it('round-trips a project', () => {
|
|
const project = createEmptyProject('p1', 'Round trip');
|
|
const stack = new CommandStack(project);
|
|
const scene = new CreateAssetCommand('scene', 'Level');
|
|
const sprite = new CreateAssetCommand('sprite', 'Box');
|
|
stack.execute(scene);
|
|
stack.execute(sprite);
|
|
const place = new PlaceAssetCommand(scene.asset.id, sprite.asset.id, { x: 7, y: 8 });
|
|
stack.execute(place);
|
|
stack.execute(new SetOverrideCommand(scene.asset.id, place.objectId, 'width', 33));
|
|
|
|
const copy = deserializeProject(JSON.parse(JSON.stringify(serializeProject(project))));
|
|
expect(copy).toEqual(project);
|
|
});
|
|
|
|
it('repairs broken documents', () => {
|
|
const project = deserializeProject(
|
|
{
|
|
name: 'Broken',
|
|
activeSceneId: 'missing',
|
|
assets: [
|
|
{ id: 's1', type: 'scene', name: 'Scene', props: { backgroundColor: '#000000', junk: 1 }, objects: [
|
|
{ id: 'o1', assetId: 'sp1', position: { x: '5', y: null }, overrides: { color: '#00ff00', width: -3, foo: 1 } },
|
|
{ id: 'o2', assetId: 'nope', position: {} },
|
|
{ id: 'o3', assetId: 's1', position: {} },
|
|
] },
|
|
{ id: 'sp1', type: 'sprite', props: { width: 10 } },
|
|
{ id: 'x', type: 'texture' },
|
|
{ type: 'camera' },
|
|
],
|
|
},
|
|
'fallback-id',
|
|
);
|
|
expect(project.id).toBe('fallback-id');
|
|
expect(project.activeSceneId).toBe('s1');
|
|
expect(project.assets.map((a) => a.id)).toEqual(['s1', 'sp1']);
|
|
const scene = project.assets[0]!;
|
|
expect(scene.type === 'scene' && scene.props).toEqual({ backgroundColor: 0 });
|
|
const objects = scene.type === 'scene' ? scene.objects : [];
|
|
expect(objects).toHaveLength(1);
|
|
expect(objects[0]).toEqual({
|
|
id: 'o1',
|
|
assetId: 'sp1',
|
|
name: '',
|
|
position: { x: 5, y: 0, z: 0 },
|
|
overrides: { color: 0x00ff00, width: 1 },
|
|
ownerId: '',
|
|
});
|
|
expect(project.assets[1]!.name).toBe('sprite');
|
|
expect(project.assets[1]!.props).toEqual({ width: 10, height: 100, color: 0xe0553f });
|
|
});
|
|
});
|