blob: c8a31bba9602929c077c614a32ffd5e8b2a63975 [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.combine</title>
<script src="../base.js"></script>
<script>
goog.require('goog.Timer');
goog.require('goog.array');
goog.require('goog.result');
goog.require('goog.testing.MockClock');
goog.require('goog.testing.jsunit');
goog.require('goog.testing.recordFunction');
</script>
</head>
<body>
<script>
var result1, result2, result3, result4, resultCallback;
var combinedResult, successCombinedResult, mockClock;
function setUpPage() {
mockClock = new goog.testing.MockClock();
mockClock.install();
}
function tearDownPage() {
goog.dispose(mockClock);
}
function setUp() {
mockClock.reset();
result1 = new goog.result.SimpleResult();
result2 = new goog.result.SimpleResult();
result3 = new goog.result.SimpleResult();
result4 = new goog.result.SimpleResult();
combinedResult = goog.result.combine(result1, result2, result3, result4);
successCombinedResult =
goog.result.combineOnSuccess(result1, result2, result3, result4);
resultCallback = goog.testing.recordFunction();
}
function tearDown() {
result1 = result2 = result3 = result4 = resultCallback = null;
combinedResult = successCombinedResult = null;
}
function testSynchronousCombine() {
resolveAllGivenResultsToSuccess();
newCombinedResult = goog.result.combine(result1, result2, result3, result4);
goog.result.wait(newCombinedResult, resultCallback);
assertSuccessCall(newCombinedResult, resultCallback);
}
function testCombineWhenAllResultsSuccess() {
goog.result.wait(combinedResult, resultCallback);
resolveAllGivenResultsToSuccess();
assertSuccessCall(combinedResult, resultCallback);
}
function testAsyncCombineWhenAllResultsSuccess() {
goog.result.wait(combinedResult, resultCallback);
goog.Timer.callOnce(function() { resolveAllGivenResultsToSuccess(); });
mockClock.tick();
assertSuccessCall(combinedResult, resultCallback);
}
function testCombineWhenAllResultsFail() {
goog.result.wait(combinedResult, resultCallback);
resolveAllGivenResultsToError();
assertSuccessCall(combinedResult, resultCallback);
}
function testAsyncCombineWhenAllResultsFail() {
goog.result.wait(combinedResult, resultCallback);
goog.Timer.callOnce(function() { resolveAllGivenResultsToError(); });
mockClock.tick();
assertSuccessCall(combinedResult, resultCallback);
}
function testCombineWhenSomeResultsSuccess() {
goog.result.wait(combinedResult, resultCallback);
resolveSomeGivenResultsToSuccess();
assertSuccessCall(combinedResult, resultCallback);
}
function testAsyncCombineWhenSomeResultsSuccess() {
goog.result.wait(combinedResult, resultCallback);
goog.Timer.callOnce(function() { resolveSomeGivenResultsToSuccess(); });
mockClock.tick();
assertSuccessCall(combinedResult, resultCallback);
}
function testCombineOnSuccessWhenAllResultsSuccess() {
goog.result.wait(successCombinedResult, resultCallback);
resolveAllGivenResultsToSuccess();
assertSuccessCall(successCombinedResult, resultCallback);
}
function testAsyncCombineOnSuccessWhenAllResultsSuccess() {
goog.result.wait(successCombinedResult, resultCallback);
goog.Timer.callOnce(function() { resolveAllGivenResultsToSuccess(); });
mockClock.tick();
assertSuccessCall(successCombinedResult, resultCallback);
}
function testCombineOnSuccessWhenAllResultsFail() {
goog.result.wait(successCombinedResult, resultCallback);
resolveAllGivenResultsToError();
assertErrorCall(successCombinedResult, resultCallback);
}
function testAsyncCombineOnSuccessWhenAllResultsFail() {
goog.result.wait(successCombinedResult, resultCallback);
goog.Timer.callOnce(function() { resolveAllGivenResultsToError(); });
mockClock.tick();
assertErrorCall(successCombinedResult, resultCallback);
}
function testCombineOnSuccessWhenSomeResultsSuccess() {
goog.result.wait(successCombinedResult, resultCallback);
resolveSomeGivenResultsToSuccess();
assertErrorCall(successCombinedResult, resultCallback);
}
function testAsyncCombineOnSuccessWhenSomeResultsSuccess() {
goog.result.wait(successCombinedResult, resultCallback);
goog.Timer.callOnce(function() { resolveSomeGivenResultsToSuccess(); });
mockClock.tick();
assertErrorCall(successCombinedResult, resultCallback);
}
function testCancelParentResults() {
goog.result.wait(combinedResult, resultCallback);
goog.result.cancelParentResults(combinedResult);
assertArgumentContainsGivenResults(combinedResult.getValue())
goog.array.forEach([result1, result2, result3, result4],
function(result) {
assertTrue(result.isCanceled());
});
}
function assertSuccessCall(combinedResult, resultCallback) {
assertEquals(goog.result.Result.State.SUCCESS, combinedResult.getState());
assertEquals(1, resultCallback.getCallCount());
var result = resultCallback.popLastCall().getArgument(0);
assertEquals(combinedResult, result);
assertArgumentContainsGivenResults(result.getValue());
}
function assertErrorCall(combinedResult, resultCallback) {
assertEquals(goog.result.Result.State.ERROR,
combinedResult.getState());
assertEquals(1, resultCallback.getCallCount());
var result = resultCallback.popLastCall().getArgument(0);
assertEquals(combinedResult, result);
assertArgumentContainsGivenResults(combinedResult.getError());
}
function assertArgumentContainsGivenResults(resultsArray) {
assertEquals(4, resultsArray.length);
goog.array.forEach([result1, result2, result3, result4], function(res) {
assertTrue(goog.array.contains(resultsArray, res));
});
}
function resolveAllGivenResultsToSuccess() {
goog.array.forEach([result1, result2, result3, result4], function(res) {
res.setValue(1);
});
}
function resolveAllGivenResultsToError() {
goog.array.forEach([result1, result2, result3, result4], function(res) {
res.setError();
});
}
function resolveSomeGivenResultsToSuccess() {
goog.array.forEach([result2, result3, result4], function(res) {
res.setValue(1);
});
result1.setError();
}
</script>
</body>
</html>