blob: fdba6dcae6fef0afd7508b3103ac0c2c6cf9de11 [file] [log] [blame]
<!DOCTYPE html>
<html>
<!--
Copyright 2012 The Closure Library Authors. All Rights Reserved.
Use of this source code is governed by the Apache License, Version 2.0.
See the COPYING file for details.
-->
<head>
<title>Closure Unit Tests - goog.result.wait</title>
<script src="../base.js"></script>
<script>
goog.require('goog.Timer');
goog.require('goog.result.SimpleResult');
goog.require('goog.result');
goog.require('goog.testing.MockClock');
goog.require('goog.testing.jsunit');
goog.require('goog.testing.recordFunction');
</script>
</head>
<body>
<script>
var result, waitCallback, waitOnSuccessCallback, waitOnErrorCallback;
var mockClock, propertyReplacer;
function setUpPage() {
mockClock = new goog.testing.MockClock();
mockClock.install();
}
function setUp() {
mockClock.reset();
result = new goog.result.SimpleResult();
propertyReplacer = new goog.testing.PropertyReplacer();
waitCallback = new goog.testing.recordFunction();
waitOnSuccessCallback = new goog.testing.recordFunction();
waitOnErrorCallback = new goog.testing.recordFunction();
}
function tearDown() {
result = waitCallback = waitOnSuccessCallback = waitOnErrorCallback = null;
propertyReplacer.reset();
}
function tearDownPage() {
mockClock.uninstall();
}
function testSynchronousSuccess() {
assertEquals(goog.result.Result.State.PENDING, result.getState());
assertUndefined(result.getValue());
goog.result.wait(result, waitCallback);
goog.result.waitOnSuccess(result, waitOnSuccessCallback);
goog.result.waitOnError(result, waitOnErrorCallback);
result.setValue(1);
assertEquals(goog.result.Result.State.SUCCESS, result.getState());
assertEquals(1, result.getValue());
assertWaitCall(waitCallback, result);
assertCall(waitOnSuccessCallback, 1, result);
assertNoCall(waitOnErrorCallback);
}
function testAsynchronousSuccess() {
goog.result.wait(result, waitCallback);
goog.result.waitOnSuccess(result, waitOnSuccessCallback);
goog.result.waitOnError(result, waitOnErrorCallback);
goog.Timer.callOnce(function() {
result.setValue(1);
});
assertUndefined(result.getValue());
assertEquals(goog.result.Result.State.PENDING, result.getState());
assertNoCall(waitCallback);
assertNoCall(waitOnSuccessCallback);
assertNoCall(waitOnErrorCallback);
mockClock.tick();
assertEquals(goog.result.Result.State.SUCCESS, result.getState());
assertEquals(1, result.getValue());
assertWaitCall(waitCallback, result);
assertCall(waitOnSuccessCallback, 1, result);
assertNoCall(waitOnErrorCallback);
}
function testSynchronousError() {
assertEquals(goog.result.Result.State.PENDING, result.getState());
assertUndefined(result.getValue());
goog.result.wait(result, waitCallback);
goog.result.waitOnSuccess(result, waitOnSuccessCallback);
goog.result.waitOnError(result, waitOnErrorCallback);
result.setError();
assertEquals(goog.result.Result.State.ERROR, result.getState());
assertUndefined(result.getValue());
assertWaitCall(waitCallback, result);
assertNoCall(waitOnSuccessCallback);
assertCall(waitOnErrorCallback, undefined, result);
}
function testAsynchronousError() {
goog.result.wait(result, waitCallback);
goog.result.waitOnSuccess(result, waitOnSuccessCallback);
goog.result.waitOnError(result, waitOnErrorCallback);
goog.Timer.callOnce(function() {
result.setError();
});
assertEquals(goog.result.Result.State.PENDING, result.getState());
assertUndefined(result.getValue());
assertNoCall(waitCallback);
assertNoCall(waitOnSuccessCallback);
assertNoCall(waitOnErrorCallback);
mockClock.tick();
assertEquals(goog.result.Result.State.ERROR, result.getState());
assertUndefined(result.getValue());
assertWaitCall(waitCallback, result);
assertNoCall(waitOnSuccessCallback);
assertCall(waitOnErrorCallback, undefined, result);
}
function testCustomScope() {
var scope = {};
goog.result.wait(result, waitCallback, scope);
result.setValue(1);
assertEquals(scope, waitCallback.popLastCall().getThis());
}
function testDefaultScope() {
goog.result.wait(result, waitCallback);
result.setValue(1);
assertEquals(goog.global, waitCallback.popLastCall().getThis());
}
function testOnSuccessScope() {
var scope = {};
goog.result.waitOnSuccess(result, waitOnSuccessCallback, scope);
result.setValue(1);
assertCall(waitOnSuccessCallback, 1, result, scope);
}
function testOnErrorScope() {
var scope = {};
goog.result.waitOnError(result, waitOnErrorCallback, scope);
result.setError();
assertCall(waitOnErrorCallback, undefined, result, scope);
}
/**
* Assert that a callback function stubbed out with goog.recordFunction was
* called with the expected arguments by goog.result.waitOnSuccess/Error.
* @param {Function} recordedFunction The callback function.
* @param {?} value The value stored in the result.
* @param {!goog.result.Result} result The result that was resolved to SUCCESS
* or ERROR.
* @param {Object=} opt_scope Optional scope that the test function should be
* called in. By default, it is goog.global.
*/
function assertCall(recordedFunction, value, result, opt_scope) {
var scope = opt_scope || goog.global;
assertEquals(1, recordedFunction.getCallCount());
var call = recordedFunction.popLastCall();
assertEquals(2, call.getArguments().length);
assertEquals(value, call.getArgument(0));
assertEquals(result, call.getArgument(1));
assertEquals(scope, call.getThis());
}
/**
* Assert that a callback function stubbed out with goog.recordFunction was
* called with the expected arguments by goog.result.wait.
* @param {Function} recordedFunction The callback function.
* @param {!goog.result.Result} result The result that was resolved to SUCCESS
* or ERROR.
* @param {Object=} opt_scope Optional scope that the test function should be
* called in. By default, it is goog.global.
*/
function assertWaitCall(recordedFunction, result, opt_scope) {
var scope = opt_scope || goog.global;
assertEquals(1, recordedFunction.getCallCount());
var call = recordedFunction.popLastCall();
assertEquals(1, call.getArguments().length);
assertEquals(result, call.getArgument(0));
assertEquals(scope, call.getThis());
}
function assertNoCall(recordedFunction) {
assertEquals(0, recordedFunction.getCallCount());
}
</script>
</body>
</html>