const tap = require('tap'); const Runtime = require('../../src/engine/runtime'); const {Map} = require('immutable'); const test = tap.test; test('setFramerate emits an event', t => { t.plan(1); const rt = new Runtime(); rt.addListener('FRAMERATE_CHANGED', framerate => { if (framerate === 13) { t.pass(); } }); rt.setFramerate(13); t.end(); }); test('setFramerate and setCompatibilityMode do not emit a stop event if not running', t => { const rt = new Runtime(); rt.addListener('RUNTIME_STOPPED', () => { t.fail(); }); rt.setFramerate(13); rt.setCompatibilityMode(true); t.end(); }); test('setInterpolation emits an event', t => { t.plan(1); const rt = new Runtime(); rt.addListener('INTERPOLATION_CHANGED', enabled => { if (enabled) { t.pass(); } }); rt.setInterpolation(true); t.end(); }); test('setInterpolation does not restart runtime if not running', t => { const rt = new Runtime(); let started = false; let stopped = false; rt.addListener('RUNTIME_STARTED', () => { started = true; }); rt.addListener('RUNTIME_STOPPED', () => { stopped = true; }); rt.setInterpolation(true); t.equal(started, false); t.equal(stopped, false); t.end(); }); test('Stopping the runtime emits an event', t => { const rt = new Runtime(); rt.start(); let stopped = false; rt.addListener('RUNTIME_STOPPED', () => { stopped = true; }); rt.stop(); t.equal(stopped, true); t.end(); }); test('Stop does not emit an event if already stopped', t => { const rt = new Runtime(); let stopped = false; rt.addListener('RUNTIME_STOPPED', () => { stopped = true; }); rt.stop(); t.equal(stopped, false); t.end(); }); test('setRuntimeOptions emits an event', t => { t.plan(1); const rt = new Runtime(); rt.addListener('RUNTIME_OPTIONS_CHANGED', options => { if (options.option === 17) { t.pass(); } }); rt.setRuntimeOptions({option: 17}); t.end(); }); test('setRuntimeOptions supports partial updates', t => { t.plan(1); const rt = new Runtime(); rt.setRuntimeOptions({option: 17}); rt.addListener('RUNTIME_OPTIONS_CHANGED', options => { if (options.option === 17) { t.pass(); } }); rt.setRuntimeOptions({otherOption: 1}); t.end(); }); test('setCompilerOptions emits an event', t => { t.plan(1); const rt = new Runtime(); rt.addListener('COMPILER_OPTIONS_CHANGED', options => { if (options.option === 17) { t.pass(); } }); rt.setCompilerOptions({option: 17}); t.end(); }); test('setCompilerOptions supports partial updates', t => { t.plan(1); const rt = new Runtime(); rt.setCompilerOptions({option: 17}); rt.addListener('COMPILER_OPTIONS_CHANGED', options => { if (options.option === 17) { t.pass(); } }); rt.setCompilerOptions({otherOption: 1}); t.end(); }); test('maxClones runtime option', t => { const rt = new Runtime(); rt.setRuntimeOptions({maxClones: 10}); for (let i = 0; i < 10; i++) { t.equal(rt.clonesAvailable(), true); rt.changeCloneCounter(1); } rt.changeCloneCounter(1); t.equal(rt.clonesAvailable(), false); t.end(); }); test('stageWidth and stageHeight', t => { const rt = new Runtime(); t.equal(rt.stageWidth, 480); t.equal(rt.stageHeight, 360); t.end(); }); test('debug', t => { const rt = new Runtime(); t.equal(rt.debug, false); rt.enableDebug(); t.equal(rt.debug, true); t.end(); }); test('setStageSize preserves monitor position relative to center of stage', t => { const rt = new Runtime(); rt.requestAddMonitor(new Map([ ['id', 'abc'], // top right corner ['x', 0], ['y', 0] ])); rt.setStageSize(640, 362); const finalState = rt.getMonitorState().get('abc'); t.equal(finalState.get('x'), 80); t.equal(finalState.get('y'), 1); t.end(); }); test('setStageSize argument range', t => { const rt = new Runtime(); rt.once('STAGE_SIZE_CHANGED', (width, height) => { t.equal(width, 101); t.equal(height, 103); }); rt.setStageSize(101, 103); rt.once('STAGE_SIZE_CHANGED', (width, height) => { t.equal(width, 1); t.equal(height, 1); }); rt.setStageSize(-3.1, 0); rt.once('STAGE_SIZE_CHANGED', (width, height) => { t.equal(width, 99); t.equal(height, 10000); }); rt.setStageSize(99.3, 10000); t.end(); }); test('getNumberOfCloudVariables', t => { const rt = new Runtime(); t.equal(rt.getNumberOfCloudVariables(), 0); rt.addCloudVariable(); t.equal(rt.getNumberOfCloudVariables(), 1); rt.addCloudVariable(); t.equal(rt.getNumberOfCloudVariables(), 2); rt.removeCloudVariable(); t.equal(rt.getNumberOfCloudVariables(), 1); rt.removeCloudVariable(); t.equal(rt.getNumberOfCloudVariables(), 0); rt.dispose(); t.equal(rt.getNumberOfCloudVariables(), 0); rt.addCloudVariable(); t.equal(rt.getNumberOfCloudVariables(), 1); t.end(); }); test('currentStepTime default value', t => { const rt = new Runtime(); t.type(rt.currentStepTime, 'number'); t.ok(rt.currentStepTime > 0); t.end(); }); test('convertToPackagedRuntime', t => { const rt = new Runtime(); t.equal(rt.isPackaged, false); rt.convertToPackagedRuntime(); t.equal(rt.isPackaged, true); t.end(); }); test('convertToPackagedRuntime and attachStorage call order', t => { try { const rt1 = new Runtime(); rt1.attachStorage({}); rt1.convertToPackagedRuntime(); } catch (e) { t.equal(e.message, 'convertToPackagedRuntime must be called before attachStorage'); } const rt2 = new Runtime(); rt2.convertToPackagedRuntime(); rt2.attachStorage({}); t.end(); });