From f3d49f75c8e07220fcabd2e6ae3ea1c9c670d846 Mon Sep 17 00:00:00 2001 From: Karishma Chadha Date: Fri, 15 Jun 2018 14:57:49 -0400 Subject: [PATCH] Clean up comment serialization, add tests for new and old serialization (old is still valid, just more verbose). --- src/serialization/sb3.js | 3 +- ...comments_no_duplicate_id_serialization.sb3 | Bin 0 -> 43026 bytes test/unit/serialization_sb3.js | 76 ++++++++++++++++++ 3 files changed, 77 insertions(+), 2 deletions(-) create mode 100644 test/fixtures/comments_no_duplicate_id_serialization.sb3 diff --git a/src/serialization/sb3.js b/src/serialization/sb3.js index 95d5fc311..4f129c171 100644 --- a/src/serialization/sb3.js +++ b/src/serialization/sb3.js @@ -395,7 +395,6 @@ const serializeComments = function (comments) { const comment = comments[commentId]; const serializedComment = Object.create(null); - serializedComment.id = comment.id; serializedComment.blockId = comment.blockId; serializedComment.x = comment.x; serializedComment.y = comment.y; @@ -864,7 +863,7 @@ const parseScratchObject = function (object, runtime, extensions, zip) { for (const commentId in object.comments) { const comment = object.comments[commentId]; const newComment = new Comment( - comment.id, + commentId, comment.text, comment.x, comment.y, diff --git a/test/fixtures/comments_no_duplicate_id_serialization.sb3 b/test/fixtures/comments_no_duplicate_id_serialization.sb3 new file mode 100644 index 0000000000000000000000000000000000000000..64b4117b9ae85dd2fbb21ca5dc74acb66f212a59 GIT binary patch literal 43026 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
UUhv* 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 { const vm = new VirtualMachine(); @@ -66,3 +68,77 @@ test('serialize sb2 project with comments as sb3', t => { t.end(); }); }); + +test('deserialize sb3 project with comments', t => { + const vm = new VirtualMachine(); + vm.loadProject(readFileToBuffer(commentsSB3ProjectPath)) + .then(() => { + const runtime = vm.runtime; + + t.type(runtime.targets, 'object'); + t.equal(Array.isArray(runtime.targets), true); + t.equal(runtime.targets.length, 2); + + const stage = runtime.targets[0]; + t.equal(stage.isStage, true); + // The stage has 0 blocks, and 1 workspace comment + t.type(stage.blocks, 'object'); + t.equal(Object.keys(stage.blocks._blocks).length, 0); + t.type(stage.comments, 'object'); + t.equal(Object.keys(stage.comments).length, 1); + const stageBlockComments = Object.values(stage.comments).filter(comment => !!comment.blockId); + const stageWorkspaceComments = Object.values(stage.comments).filter(comment => comment.blockId === null); + t.equal(stageBlockComments.length, 0); + t.equal(stageWorkspaceComments.length, 1); + + const sprite = runtime.targets[1]; + t.equal(sprite.isStage, false); + t.type(sprite.blocks, 'object'); + // Sprite 1 has 6 blocks, 5 block comments, and 1 workspace comment + t.equal(Object.values(sprite.blocks._blocks).filter(block => !block.shadow).length, 6); + t.type(sprite.comments, 'object'); + t.equal(Object.keys(sprite.comments).length, 6); + + const spriteBlockComments = Object.values(sprite.comments).filter(comment => !!comment.blockId); + const spriteWorkspaceComments = Object.values(sprite.comments).filter(comment => comment.blockId === null); + t.equal(spriteBlockComments.length, 5); + t.equal(spriteWorkspaceComments.length, 1); + + t.end(); + }); +}); + +test('deserialize sb3 project with comments - no duplicate id serialization', t => { + const vm = new VirtualMachine(); + vm.loadProject(readFileToBuffer(commentsSB3NoDupeIds)) + .then(() => { + const runtime = vm.runtime; + + t.type(runtime.targets, 'object'); + t.equal(Array.isArray(runtime.targets), true); + t.equal(runtime.targets.length, 2); + + const stage = runtime.targets[0]; + t.equal(stage.isStage, true); + // The stage has 0 blocks, and 0 workspace comment + t.type(stage.blocks, 'object'); + t.equal(Object.keys(stage.blocks._blocks).length, 0); + t.type(stage.comments, 'object'); + t.equal(Object.keys(stage.comments).length, 0); + + const sprite = runtime.targets[1]; + t.equal(sprite.isStage, false); + t.type(sprite.blocks, 'object'); + // Sprite1 has 1 blocks, 1 block comment, and 1 workspace comment + t.equal(Object.values(sprite.blocks._blocks).filter(block => !block.shadow).length, 1); + t.type(sprite.comments, 'object'); + t.equal(Object.keys(sprite.comments).length, 2); + + const spriteBlockComments = Object.values(sprite.comments).filter(comment => !!comment.blockId); + const spriteWorkspaceComments = Object.values(sprite.comments).filter(comment => comment.blockId === null); + t.equal(spriteBlockComments.length, 1); + t.equal(spriteWorkspaceComments.length, 1); + + t.end(); + }); +});