blob: 6bd105bcdfc9d92b9c227aa42135c75a145b1646 [file] [log] [blame]
// Copyright 2008 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.async.ConditionalDelayTest');
goog.setTestOnly('goog.async.ConditionalDelayTest');
goog.require('goog.async.ConditionalDelay');
goog.require('goog.testing.MockClock');
goog.require('goog.testing.jsunit');
var invoked = false;
var delay = null;
var clock = null;
var returnValue = true;
var onSuccessCalled = false;
var onFailureCalled = false;
function callback() {
invoked = true;
return returnValue;
}
function setUp() {
clock = new goog.testing.MockClock(true);
invoked = false;
returnValue = true;
onSuccessCalled = false;
onFailureCalled = false;
delay = new goog.async.ConditionalDelay(callback);
delay.onSuccess = function() {
onSuccessCalled = true;
};
delay.onFailure = function() {
onFailureCalled = true;
};
}
function tearDown() {
clock.dispose();
delay.dispose();
}
function testDelay() {
delay.start(200, 200);
assertFalse(invoked);
clock.tick(100);
assertFalse(invoked);
clock.tick(100);
assertTrue(invoked);
}
function testStop() {
delay.start(200, 500);
assertTrue(delay.isActive());
clock.tick(100);
assertFalse(invoked);
delay.stop();
clock.tick(100);
assertFalse(invoked);
assertFalse(delay.isActive());
}
function testIsActive() {
assertFalse(delay.isActive());
delay.start(200, 200);
assertTrue(delay.isActive());
clock.tick(200);
assertFalse(delay.isActive());
}
function testRestart() {
delay.start(200, 50000);
clock.tick(100);
delay.stop();
assertFalse(invoked);
delay.start(200, 50000);
clock.tick(199);
assertFalse(invoked);
clock.tick(1);
assertTrue(invoked);
invoked = false;
delay.start(200, 200);
clock.tick(200);
assertTrue(invoked);
assertFalse(delay.isActive());
}
function testDispose() {
delay.start(200, 200);
delay.dispose();
assertTrue(delay.isDisposed());
clock.tick(500);
assertFalse(invoked);
}
function testConditionalDelay_Success() {
returnValue = false;
delay.start(100, 300);
clock.tick(99);
assertFalse(invoked);
clock.tick(1);
assertTrue(invoked);
assertTrue(delay.isActive());
assertFalse(delay.isDone());
assertFalse(onSuccessCalled);
assertFalse(onFailureCalled);
returnValue = true;
invoked = false;
clock.tick(100);
assertTrue(invoked);
assertFalse(delay.isActive());
assertTrue(delay.isDone());
assertTrue(onSuccessCalled);
assertFalse(onFailureCalled);
invoked = false;
clock.tick(200);
assertFalse(invoked);
}
function testConditionalDelay_Failure() {
returnValue = false;
delay.start(100, 300);
clock.tick(99);
assertFalse(invoked);
clock.tick(1);
assertTrue(invoked);
assertTrue(delay.isActive());
assertFalse(delay.isDone());
assertFalse(onSuccessCalled);
assertFalse(onFailureCalled);
invoked = false;
clock.tick(100);
assertTrue(invoked);
assertFalse(onSuccessCalled);
assertFalse(onFailureCalled);
invoked = false;
clock.tick(90);
assertFalse(invoked);
clock.tick(10);
assertTrue(invoked);
assertFalse(delay.isActive());
assertFalse(delay.isDone());
assertFalse(onSuccessCalled);
assertTrue(onFailureCalled);
}
function testInfiniteDelay() {
returnValue = false;
delay.start(100, -1);
// Test in a big enough loop.
for (var i = 0; i < 1000; ++i) {
clock.tick(80);
assertTrue(delay.isActive());
assertFalse(delay.isDone());
assertFalse(onSuccessCalled);
assertFalse(onFailureCalled);
}
delay.stop();
assertFalse(delay.isActive());
assertFalse(delay.isDone());
assertFalse(onSuccessCalled);
assertFalse(onFailureCalled);
}
function testCallbackScope() {
var callbackCalled = false;
var scopeObject = {};
function internalCallback() {
assertEquals(this, scopeObject);
callbackCalled = true;
return true;
}
delay = new goog.async.ConditionalDelay(internalCallback, scopeObject);
delay.start(200, 200);
clock.tick(201);
assertTrue(callbackCalled);
}