From 9d1987419eb41b495c0920cb5152bc61332ba413 Mon Sep 17 00:00:00 2001 From: David Manthey Date: Thu, 8 Feb 2018 10:10:01 -0500 Subject: [PATCH] Harden some tests; fix a typo. Convert some of the throttle tests to use sinon timers for more reliable testing. Fix some tutorial tests since Chrome 64 changed srcdoc in iframe usage. Harden the test to check if a video is ready to play. --- src/gl/polygonFeature.js | 2 +- tests/cases/throttle.js | 32 +++++++++++++++++++++++++++++ tests/tutorials.js | 8 ++++++-- tutorials/common/tutorials.js | 22 +++++++++++++++----- tutorials/video_transport/index.pug | 8 ++++++-- 5 files changed, 62 insertions(+), 10 deletions(-) diff --git a/src/gl/polygonFeature.js b/src/gl/polygonFeature.js index 59d3f20bb6..6ad98efa24 100644 --- a/src/gl/polygonFeature.js +++ b/src/gl/polygonFeature.js @@ -155,7 +155,7 @@ var gl_polygonFeature = function (arg) { }); } - // tranform to map gcs + // transform to map gcs geometry.vertices = transform.transformCoordinates( target_gcs, map_gcs, diff --git a/tests/cases/throttle.js b/tests/cases/throttle.js index a366d938fc..98faca42bc 100644 --- a/tests/cases/throttle.js +++ b/tests/cases/throttle.js @@ -49,6 +49,14 @@ var Helper = function () { describe('geo.util.debounce', function () { 'use strict'; + var clock; + beforeEach(function () { + clock = sinon.useFakeTimers(); + }); + afterEach(function () { + clock.restore(); + }); + it('at_begin=false, accumulator=undefined', function (done) { var helper = new Helper(); var wrapped = geo.util.debounce(100, helper.delay); @@ -90,6 +98,12 @@ describe('geo.util.debounce', function () { helper.expect('accum'); done(); }, 600); + clock.tick(1); // 1 + clock.tick(4); // 5 + clock.tick(10); // 15 + clock.tick(185); // 200 + clock.tick(50); // 250 + clock.tick(350); // 600 }); it('at_begin=false, accumulator=defined', function (done) { @@ -133,6 +147,12 @@ describe('geo.util.debounce', function () { helper.expect('accum', args); done(); }, 600); + clock.tick(1); // 1 + clock.tick(4); // 5 + clock.tick(10); // 15 + clock.tick(185); // 200 + clock.tick(50); // 250 + clock.tick(350); // 600 }); it('at_begin=true, accumulator=undefined', function (done) { @@ -176,6 +196,12 @@ describe('geo.util.debounce', function () { helper.expect('accum'); done(); }, 600); + clock.tick(1); // 1 + clock.tick(4); // 5 + clock.tick(10); // 15 + clock.tick(185); // 200 + clock.tick(50); // 250 + clock.tick(350); // 600 }); it('at_begin=true, accumulator=defined', function (done) { @@ -219,6 +245,12 @@ describe('geo.util.debounce', function () { helper.expect('accum', args); done(); }, 600); + clock.tick(1); // 1 + clock.tick(4); // 5 + clock.tick(10); // 15 + clock.tick(185); // 200 + clock.tick(50); // 250 + clock.tick(350); // 600 }); }); diff --git a/tests/tutorials.js b/tests/tutorials.js index cce4e3d3ec..506f4ea3c0 100644 --- a/tests/tutorials.js +++ b/tests/tutorials.js @@ -18,9 +18,13 @@ describe('tutorials', function () { describe('Test ' + tutorialName, function () { /* Load the tutorial in the test iframe */ beforeEach(function (done) { - $('#map').one('load', done); + sinon.stub(console, 'warn', function () {}); + $('#map').one('load', function () { window.setTimeout(done, 1); }); $('#map').attr('src', '/tutorials/' + tutorialName + '/index.html'); }); + afterEach(function () { + console.warn.restore(); + }); it('Run tutorial tests', function (done) { var base$, tests; @@ -53,7 +57,7 @@ describe('tutorials', function () { deferreds.push(defer); var idle = targetWindow.eval(idleFunc); if (!tut$.isFunction(idle)) { - idle = idle.done; + idle = idle.then || idle.done; } idle(function () { defer.resolve(); diff --git a/tutorials/common/tutorials.js b/tutorials/common/tutorials.js index d97b202595..21e5e01e7b 100644 --- a/tutorials/common/tutorials.js +++ b/tutorials/common/tutorials.js @@ -78,6 +78,7 @@ function run_block(selector, notLast, debounce, forceRun) { * process. */ function process_block(selector) { + processBlockInfo.lastelem = null; var elem = $(selector).closest('.codeblock'), target = elem.attr('target'), targetelem = $('#' + target), @@ -134,11 +135,10 @@ function process_block(selector) { js + '\ngeo.util.restoreVGLRenderer();\n'; } - /* If we are in a test environment, redirect the console to the parent - * window to make debugging easier. */ + /* If we are in a test environment, redirect the tutorial's console to the + * test's parent window to make debugging easier. */ if (window.parent && window.parent !== window) { js = 'window.console = window.parent.parent.console;\n' + - 'window.parent.console = window.parent.parent.console;\n' + 'console.log("Testing " + window.parent.document.title);\n' + js; } @@ -153,6 +153,7 @@ function process_block(selector) { * Although (a) is the most compatible, it doesn't allow access to local * urls from within the iframe. (c) solves this, but requires extra work * for browsers that don't support srcdoc. */ + processBlockInfo.lastsrc = html; targetelem.attr('srcdoc', html); if (!processBlockInfo.srcdocSupport) { jsurl = 'javascript: window.frameElement.getAttribute("srcdoc");'; @@ -161,7 +162,6 @@ function process_block(selector) { } targetelem.attr('src', jsurl); } - processBlockInfo.lastsrc = html; /* Expose the frame's global variables in the 'tutorial' variable. If * there are multiple tutorials (multiple iframes), then this is the last * one executed. All of them will be accessible in the 'tutorials' @@ -186,7 +186,7 @@ function process_block_debounce(selector, debounce) { processBlockInfo.timer = null; } if (!selector.is(processBlockInfo.lastelem) || !debounce) { - if (processBlockInfo.lastelem) { + if (processBlockInfo.lastelem && !selector.is(processBlockInfo.lastelem)) { process_block(processBlockInfo.lastelem); } processBlockInfo.lastelem = selector; @@ -296,6 +296,11 @@ function start_keeper(alwaysKeep) { * parameter is not specified. */ function start_tutorial(useCodeMirror, alwaysKeep) { + /* If we are in a test environment, redirect the test's console to the parent + * window to make debugging easier. */ + if (window.parent && window.parent !== window) { + window.console = window.parent.console; + } /* clean up whitespace and store a default value for each code block */ $('.codeblock').each(function () { var elem = $('textarea', this), @@ -327,6 +332,13 @@ function start_tutorial(useCodeMirror, alwaysKeep) { } /* Check if iframe srcdoc support is present */ processBlockInfo.srcdocSupport = !!('srcdoc' in document.createElement('iframe')); + /* Chrome 64 introduced a change which removes some srcdoc support, so + * mark it as unavailable in Chrome. It would be nicer to not have user + * agent testings, but doing this generically causes problems in Firefox + * headless tests. */ + if (/Chrome\//.test(navigator.userAgent)) { + processBlockInfo.srcdocSupport = false; + } start_keeper(alwaysKeep); run_tutorial(); } diff --git a/tutorials/video_transport/index.pug b/tutorials/video_transport/index.pug index 495dd56df0..3b4e51c7ad 100644 --- a/tutorials/video_transport/index.pug +++ b/tutorials/video_transport/index.pug @@ -110,9 +110,13 @@ block mainTutorial 'map.layers()[0].features()[0] instanceof geo.quadFeature' ], [ 'waitForLoadAndMap = function (done) {\n' + - ' $(video).on("loadeddata", function () {\n' + + ' if (video.HAVE_CURRENT_DATA !== undefined && video.readyState >= video.HAVE_CURRENT_DATA) {\n' + ' map.onIdle(done);\n' + - ' });\n' + + ' } else {\n' + + ' $(video).on("loadeddata", function () {\n' + + ' map.onIdle(done);\n' + + ' });\n' + + ' }\n' + '}' ])