blob: e2b302225778613be1a5e84e59efdf97728c7f9c [file] [log] [blame]
// 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;
}