From be65b615a289518465b51601ce1015989db6e22c Mon Sep 17 00:00:00 2001
From: Paul Kaplan <pkaplan@media.mit.edu>
Date: Wed, 5 Dec 2018 11:35:22 -0500
Subject: [PATCH] Add a test and fix for not serializing top-level variable
 reporters

---
 src/serialization/sb3.js                      |   2 +-
 test/fixtures/top-level-variable-reporter.sb2 | Bin 0 -> 4031 bytes
 test/unit/serialization_sb3.js                |  14 ++++++++++++++
 3 files changed, 15 insertions(+), 1 deletion(-)
 create mode 100644 test/fixtures/top-level-variable-reporter.sb2

diff --git a/src/serialization/sb3.js b/src/serialization/sb3.js
index df367cf1b..21c5c5f85 100644
--- a/src/serialization/sb3.js
+++ b/src/serialization/sb3.js
@@ -325,7 +325,7 @@ const serializeBlocks = function (blocks) {
         // a shadow block, and there are no blocks that reference it, otherwise
         // they would have been compressed in the last pass)
         if (Array.isArray(serializedBlock) &&
-            [VAR_PRIMITIVE, LIST_PRIMITIVE].indexOf(serializedBlock) < 0) {
+            [VAR_PRIMITIVE, LIST_PRIMITIVE].indexOf(serializedBlock[0]) < 0) {
             log.warn(`Found an unexpected top level primitive with block ID: ${
                 blockID}; deleting it from serialized blocks.`);
             delete obj[blockID];
diff --git a/test/fixtures/top-level-variable-reporter.sb2 b/test/fixtures/top-level-variable-reporter.sb2
new file mode 100644
index 0000000000000000000000000000000000000000..5c50402173e68021a92223b2fd5a3ef8d3a922db
GIT binary patch
literal 4031
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
OzygGqf%G*#5Dx&Uh8-jT

literal 0
HcmV?d00001

diff --git a/test/unit/serialization_sb3.js b/test/unit/serialization_sb3.js
index caf31e2a8..01da2d75f 100644
--- a/test/unit/serialization_sb3.js
+++ b/test/unit/serialization_sb3.js
@@ -7,6 +7,7 @@ const exampleProjectPath = path.resolve(__dirname, '../fixtures/clone-cleanup.sb
 const commentsSB2ProjectPath = path.resolve(__dirname, '../fixtures/comments.sb2');
 const commentsSB3ProjectPath = path.resolve(__dirname, '../fixtures/comments.sb3');
 const commentsSB3NoDupeIds = path.resolve(__dirname, '../fixtures/comments_no_duplicate_id_serialization.sb3');
+const variableReporterSB2ProjectPath = path.resolve(__dirname, '../fixtures/top-level-variable-reporter.sb2');
 const FakeRenderer = require('../fixtures/fake-renderer');
 
 test('serialize', t => {
@@ -236,3 +237,16 @@ test('getExtensionIdForOpcode', t => {
 
     t.end();
 });
+
+test('(#1608) serializeBlocks maintains top level variable reporters', t => {
+    const vm = new VirtualMachine();
+    vm.loadProject(readFileToBuffer(variableReporterSB2ProjectPath))
+        .then(() => {
+            const blocks = vm.runtime.targets[0].blocks._blocks;
+            const result = sb3.serialize(vm.runtime).targets[0].blocks;
+            // Project should have 1 block, a top-level variable reporter
+            t.equal(Object.keys(blocks).length, 1);
+            t.equal(Object.keys(result).length, 1);
+            t.end();
+        });
+});