// Copyright 2009 The Closure Library Authors. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS-IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. goog.provide('goog.testing.AsyncTestCaseSyncTest'); goog.setTestOnly('goog.testing.AsyncTestCaseSyncTest'); goog.require('goog.testing.AsyncTestCase'); goog.require('goog.testing.jsunit'); // Has the setUp() function been called. var setUpCalled = false; // Has the current test function completed. This helps us to ensure that the // next test is not started before the previous completed. var curTestIsDone = true; // For restoring it later. var oldTimeout = window.setTimeout; // Use an asynchronous test runner for our tests. var asyncTestCase = goog.testing.AsyncTestCase.createAndInstall(document.title); /** * Uses window.setTimeout() to perform asynchronous behaviour and uses * asyncTestCase.waitForAsync() and asyncTestCase.continueTesting() to mark * the beginning and end of it. * @param {number} numAsyncCalls The number of asynchronous calls to make. * @param {string} name The name of the current step. */ function doAsyncStuff(numAsyncCalls, name) { if (numAsyncCalls > 0) { curTestIsDone = false; asyncTestCase.waitForAsync( 'doAsyncStuff-' + name + '(' + numAsyncCalls + ')'); window.setTimeout(function() { doAsyncStuff(numAsyncCalls - 1, name); }, 0); } else { curTestIsDone = true; asyncTestCase.continueTesting(); } } function setUpPage() { debug('setUpPage was called.'); // Don't do anything asynchronously. window.setTimeout = function(callback, time) { callback(); }; doAsyncStuff(3, 'setUpPage'); } function setUp() { assertTrue(curTestIsDone); doAsyncStuff(3, 'setUp'); } function tearDown() { assertTrue(curTestIsDone); } function test1() { assertTrue(curTestIsDone); doAsyncStuff(1, 'test1'); } function test2() { assertTrue(curTestIsDone); doAsyncStuff(2, 'test2'); } function test3() { assertTrue(curTestIsDone); doAsyncStuff(5, 'test3'); } var callback = function() { curTestIsDone = true; asyncTestCase.signal(); }; var doAsyncSignals = function() { curTestIsDone = false; window.setTimeout(callback, 0); }; function testSignalsReturn() { doAsyncSignals(); doAsyncSignals(); doAsyncSignals(); asyncTestCase.waitForSignals(3); } function testSignalsCallContinueTestingBeforeFinishing() { doAsyncSignals(); asyncTestCase.waitForSignals(2); window.setTimeout(function() { var thrown = assertThrows(function() { asyncTestCase.continueTesting(); }); assertEquals('Still waiting for 1 signals.', thrown.message); }, 0); doAsyncSignals(); // To not timeout. } function tearDownPage() { debug('tearDownPage was called.'); assertTrue(curTestIsDone); window.setTimeout = oldTimeout; }