From 2c76d3bf71563a1b361f7e4e5ff222ddf14425c5 Mon Sep 17 00:00:00 2001
From: Valerie R Young <valerie@bocoup.com>
Date: Mon, 5 Nov 2018 13:23:31 -0500
Subject: [PATCH] Add unit test for unknown opcode inputs

---
 .../unknown-opcode-as-reporter-block.sb2      | Bin 0 -> 4368 bytes
 .../unknown-opcode-as-reporter-block.js       |  54 ++++++++++++++++++
 2 files changed, 54 insertions(+)
 create mode 100644 test/fixtures/unknown-opcode-as-reporter-block.sb2
 create mode 100644 test/integration/unknown-opcode-as-reporter-block.js

diff --git a/test/fixtures/unknown-opcode-as-reporter-block.sb2 b/test/fixtures/unknown-opcode-as-reporter-block.sb2
new file mode 100644
index 0000000000000000000000000000000000000000..1999dcb9a2e22cb5b0ebb5ef115186cb41c73c6d
GIT binary patch
literal 4368
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
IP#$0a0FgMr&Hw-a

literal 0
HcmV?d00001

diff --git a/test/integration/unknown-opcode-as-reporter-block.js b/test/integration/unknown-opcode-as-reporter-block.js
new file mode 100644
index 000000000..c9dc4a19d
--- /dev/null
+++ b/test/integration/unknown-opcode-as-reporter-block.js
@@ -0,0 +1,54 @@
+const path = require('path');
+const test = require('tap').test;
+const makeTestStorage = require('../fixtures/make-test-storage');
+const readFileToBuffer = require('../fixtures/readProjectFile').readFileToBuffer;
+const VirtualMachine = require('../../src/index');
+
+const uri = path.resolve(__dirname, '../fixtures/unknown-opcode-as-reporter-block.sb2');
+const project = readFileToBuffer(uri);
+
+test('unknown opcode', t => {
+    const vm = new VirtualMachine();
+    vm.attachStorage(makeTestStorage());
+
+    vm.start();
+    vm.clear();
+    vm.setCompatibilityMode(false);
+    vm.setTurboMode(false);
+    vm.loadProject(project).then(() => {
+        vm.greenFlag();
+
+        // The project has 4 blocks in a single stack:
+        //      when green flag
+        //      if "unknown block"
+        //      set volume to "unknown block"
+        //      play sound "unknown block"
+        // the "unknown block" has unknown opcode and was created by
+        // dragging a discontinued extension.
+        // It should be parsed in without error and a shadow block
+        // should be created where appropriate.
+        const blocks = vm.runtime.targets[0].blocks;
+        const topBlockId = blocks.getScripts()[0];
+        const secondBlockId = blocks.getNextBlock(topBlockId);
+        const thirdBlockId = blocks.getNextBlock(secondBlockId);
+        const fourthBlockId = blocks.getNextBlock(thirdBlockId);
+
+        t.equal(blocks.getBlock(topBlockId).opcode, 'event_whenflagclicked');
+        t.equal(blocks.getBlock(secondBlockId).opcode, 'control_wait_until');
+        t.equal(blocks.getBlock(thirdBlockId).opcode, 'sound_setvolumeto');
+        t.equal(blocks.getBlock(fourthBlockId).opcode, 'sound_play');
+
+        const secondBlockInputId = blocks.getBlock(secondBlockId).inputs.CONDITION.block;
+        const thirdBlockInputId =  blocks.getBlock(thirdBlockId).inputs.VOLUME.block;
+        const fourthBlockInputId = blocks.getBlock(fourthBlockId).inputs.SOUND_MENU.block;
+
+        t.equal(secondBlockInputId, null);
+        t.true(blocks.getBlock(thirdBlockInputId).shadow)
+        t.equal(blocks.getBlock(thirdBlockInputId).opcode, 'math_number');
+        t.true(blocks.getBlock(fourthBlockInputId).shadow);
+        t.equal(blocks.getBlock(fourthBlockInputId).opcode, 'sound_sounds_menu');
+
+        t.end();
+        process.nextTick(process.exit);
+    });
+});