From ab8d7f57e985583bd6314721a774996a1baca946 Mon Sep 17 00:00:00 2001 From: mmcwilliams Date: Tue, 28 May 2019 09:02:55 -0400 Subject: [PATCH] Add a mocha-style test for mscript, related to issue #3 --- app/test/mscript.test.js | 204 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 204 insertions(+) create mode 100644 app/test/mscript.test.js diff --git a/app/test/mscript.test.js b/app/test/mscript.test.js new file mode 100644 index 0000000..55b4f14 --- /dev/null +++ b/app/test/mscript.test.js @@ -0,0 +1,204 @@ +'use strict'; + +const Mscript = require('../lib/mscript'); +const mscript = new Mscript(); + +const assert = require('assert') + +describe(`Basic functions`, () => { + const script1 = 'CF\nPF\nCB\nPB\nBF\nBB'; + const script2 = `CF 3\nPF 3` + const script3 = `CF\nPF` + + mscript.interpret(script1, (obj) => { + assert.ok(obj.success, `Simple script1 compiles`) + assert.equal(obj.cam, 0, 'Camera gets equaled out'); + assert.equal(obj.proj, 0, 'Projector gets cancelled out'); + assert.equal(obj.arr.length, 6, 'Generate sequence of 6 steps'); + }); + + mscript.interpret(script2, (obj) => { + let pass = false; + if (obj.success === true + && obj.cam === 3 + && obj.proj === 3 + && obj.arr.length === 6) { + pass = true; + } + assert.ok(pass, `Simple script2 compiles`) + }); + + let obj = mscript.interpret(script3) + assert.ok(true, 'Simple script3 with implied counts compiles') + //console.log(obj) +}); + +describe(`Commands with integers`, () => { + const script = 'CF 5\nPF 5\nCB 5\nPB 5\nBF 3\nBB 3'; + + mscript.interpret(script, (obj) => { + let pass = false; + if (obj.success === true + && obj.cam === 0 + && obj.proj === 0 + && obj.arr.length === 26) { + pass = true; + } + assert.ok(pass, `Script with integers cancels out count, but generates list of commands`) + }); +}) + + +describe('State', () => { + const script = 'CF 1000\nCB 1000\nSET PROJ 200\nPB 200'; + + mscript.interpret(script, (obj) => { + let pass = false; + if (obj.success === true + && obj.cam === 0 + && obj.proj === 0) { + pass = true; + } + assert.ok(pass, `Basic state test`); + }); +}); + +describe('Loop', () => { + const script1 = 'LOOP 10\nCF 3\nPF 1\nEND LOOP'; + + mscript.interpret(script1, (obj) => { + let pass = false; + if (obj.success === true + && obj.cam === 30 + && obj.proj === 10 + && obj.arr.length === 40) { + pass = true; + } + assert.ok(pass, 'Basic loop'); + + }); + const script2 = 'LOOP 4\nLOOP 4\nPF\nBF\nEND LOOP\nEND LOOP'; + mscript.interpret(script2, (obj) => { + let pass = false; + if (obj.success === true + && obj.cam === 16 + && obj.proj === 16 + && obj.arr.length === 32) { + pass = true; + } + assert.ok(pass, 'Recursive loop'); + }); + //LOOP W/ CAM and PROJ + const script3 = 'LOOP 2\nCAM 4\nPROJ 4\nEND'; + mscript.interpret(script3, (obj) => { + let pass = false; + if (obj.success === true + && obj.cam === 8 + && obj.proj === 8 + && obj.arr.length === 16 + && obj.light.length === 16 + && obj.light[0] === '0,0,0') { + pass = true; + } + assert.ok(pass, 'Basic cam/proj loop'); + }); +}); + +describe('Light', () => { + //Lighting tests + const script1 = 'L 255,255,255\nCF\nPF'; + + mscript.interpret(script1, (obj) => { + let pass = false; + if (obj.success === true + && obj.cam === 1 + && obj.proj === 1 + && obj.arr.length === 2 + && obj.light.length === 2 + && obj.light[0] === '255,255,255' + && obj.light[1] === '') { + pass = true; + } + assert.ok(pass, 'Basic light'); + }); + + const script2 = 'L 255,255,255\nCF\nPF\nBF'; + mscript.interpret(script2, (obj) => { + let pass = false; + if (obj.success === true + && obj.cam === 2 + && obj.proj === 1 + && obj.arr.length === 3 + && obj.light.length === 3 + && obj.light[0] === '255,255,255' + && obj.light[1] === '' + && obj.light[2] === '0,0,0') { + pass = true; + } + assert.ok(pass, 'Basic black'); + }); + const script3 = 'LOOP 2\nL 1,1,1\nCF\nL 2,2,2\nCF\nEND'; + mscript.interpret(script3, (obj) => { + let pass = false; + if (obj.success === true + && obj.cam === 4 + && obj.proj === 0 + && obj.arr.length === 4 + && obj.light.length === 4 + && obj.light[0] === '1,1,1' + && obj.light[3] === '2,2,2') { + pass = true; + } + assert.ok(pass, 'Basic light'); + }); +}); + +describe('Fade', () => { + + const script1 = +`F 72 0,0,0 10,20,30 +CF +END +PF 10` + mscript.interpret(script1, (obj) => { + //console.dir(obj) + assert.ok(obj.success, 'Basic fade compiles'); + assert.equal(obj.cam, 72, `Camera moves forward 72 frames`); + assert.equal(obj.proj, 10, 'Projector moves forward 10 frames'); + assert.equal(obj.arr.length, 82, 'Generates 82 steps'); + assert.equal(obj.light[0], '0,0,0', 'Fade starts with starting color'); + assert.equal(obj.light[71], '10,20,30', 'Fade ends with ending color'); + assert.equal(obj.light[72], '', 'Frame after fade is default color'); + }); + + const script2 = +` +F 24 25,255,125 225,125,10 +CF +END +L 225,125,10 +CF 10` + mscript.interpret(script2, (obj) => { + //console.dir(obj) + assert.ok(obj.success, 'Mscript labeled output success'); + assert.equal(obj.cam, 34, 'There are 34 camera frames'); + assert.equal(obj.arr.length, 34, 'There are 34 steps in the script'); + assert.equal(obj.light[0], '25,255,125', 'First frame is equal to start color'); + assert.equal(obj.light[23], '225,125,10', 'Last frame in fade is equal to end color'); + assert.equal(obj.light[24], '225,125,10', 'First frame after fade is set using Light command'); + }); +}) + +describe('Variables', () => { + const script1 = +`@LIGHT=200,200,200 +@COUNT=1 +CF 20 +PF +@COUNT++ +` + mscript.interpret(script1, obj => { + //console.dir(obj) + assert.ok(true) + }) +}) \ No newline at end of file