import { describe, expect, it } from 'vitest'; import { SetOverrideCommand } from '../../src/core/commands/sceneObjectCommands'; import { deserializeProject } from '../../src/core/store/serialize'; import { makeSpriteScene, place, roundTrip } from '../helpers'; describe('serialize', () => { it('round-trips a project', () => { const f = makeSpriteScene(); const box = place(f, f.spriteId, { x: 7, y: 8 }); f.stack.execute(new SetOverrideCommand(f.sceneId, box, 'width', 33)); expect(roundTrip(f.project)).toEqual(f.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 } }, // An asset type this build does not know (a newer document, a renamed type). { id: 'x', type: 'sound' }, { 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 }, editorOffset: { x: 0, y: 0 }, overrides: { color: 0x00ff00, width: 1 }, parentId: '', instanceEdits: {}, }); expect(project.assets[1]!.name).toBe('sprite'); expect(project.assets[1]!.props).toEqual({ enabled: true, scale: 1, rotation: 0, mirrorX: false, mirrorY: false, width: 10, height: 100, color: 0xffffff, texture: '', shader: '', }); }); });