| <!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.chain</title> |
| <script src="../base.js"></script> |
| <script> |
| |
| goog.require('goog.Timer'); |
| goog.require('goog.result'); |
| goog.require('goog.testing.MockClock'); |
| goog.require('goog.testing.jsunit'); |
| goog.require('goog.testing.recordFunction'); |
| |
| </script> |
| </head> |
| <body> |
| <script> |
| |
| var givenResult, dependentResult, counter, actionCallback; |
| var mockClock; |
| |
| function setUpPage() { |
| mockClock = new goog.testing.MockClock(); |
| mockClock.install(); |
| } |
| |
| function setUp() { |
| mockClock.reset(); |
| givenResult = new goog.result.SimpleResult(); |
| dependentResult = new goog.result.SimpleResult(); |
| counter = new goog.testing.recordFunction(); |
| actionCallback = goog.testing.recordFunction(function(result) { |
| return dependentResult; |
| }); |
| } |
| |
| function tearDown() { |
| givenResult = dependentResult = counter = null; |
| } |
| |
| function tearDownPage() { |
| mockClock.uninstall(); |
| } |
| |
| // SYNCHRONOUS TESTS: |
| |
| function testChainWhenBothResultsSuccess() { |
| var finalResult = goog.result.chain(givenResult, actionCallback); |
| goog.result.wait(finalResult, counter); |
| |
| givenResult.setValue(1); |
| dependentResult.setValue(2); |
| |
| assertSuccess(actionCallback, givenResult, 1); |
| assertSuccess(counter, finalResult, 2); |
| } |
| |
| function testChainWhenFirstResultError() { |
| var finalResult = goog.result.chain(givenResult, actionCallback); |
| goog.result.wait(finalResult, counter); |
| |
| givenResult.setError(4); |
| |
| assertNoCall(actionCallback); |
| assertError(counter, finalResult, 4); |
| } |
| |
| function testChainWhenSecondResultError() { |
| var finalResult = goog.result.chain(givenResult, actionCallback); |
| goog.result.wait(finalResult, counter); |
| |
| givenResult.setValue(1); |
| dependentResult.setError(5); |
| |
| assertSuccess(actionCallback, givenResult, 1); |
| assertError(counter, finalResult, 5); |
| } |
| |
| function testChainCancelFirstResult() { |
| var finalResult = goog.result.chain(givenResult, actionCallback); |
| goog.result.wait(finalResult, counter); |
| |
| goog.result.cancelParentResults(finalResult); |
| |
| assertNoCall(actionCallback); |
| assertTrue(givenResult.isCanceled()); |
| assertTrue(finalResult.isCanceled()); |
| } |
| |
| function testChainCancelSecondResult() { |
| var finalResult = goog.result.chain(givenResult, actionCallback); |
| goog.result.wait(finalResult, counter); |
| |
| givenResult.setValue(1); |
| goog.result.cancelParentResults(finalResult); |
| |
| assertSuccess(actionCallback, givenResult, 1); |
| assertTrue(dependentResult.isCanceled()); |
| assertTrue(finalResult.isCanceled()); |
| } |
| |
| function testDoubleChainCancel() { |
| var intermediateResult = goog.result.chain(givenResult, actionCallback); |
| var finalResult = goog.result.chain(intermediateResult, actionCallback); |
| |
| assertTrue(goog.result.cancelParentResults(finalResult)); |
| assertTrue(finalResult.isCanceled()); |
| assertTrue(intermediateResult.isCanceled()); |
| assertFalse(givenResult.isCanceled()); |
| assertFalse(goog.result.cancelParentResults(finalResult)); |
| } |
| |
| function testCustomScope() { |
| var scope = {}; |
| var finalResult = goog.result.chain(givenResult, actionCallback, scope); |
| goog.result.wait(finalResult, counter); |
| |
| givenResult.setValue(1); |
| dependentResult.setValue(2); |
| |
| assertEquals(scope, actionCallback.popLastCall().getThis()); |
| } |
| |
| |
| // ASYNCHRONOUS TESTS: |
| |
| function testChainAsyncWhenBothResultsSuccess() { |
| var finalResult = goog.result.chain(givenResult, actionCallback); |
| goog.result.wait(finalResult, counter); |
| |
| goog.Timer.callOnce(function() { givenResult.setValue(1); }); |
| mockClock.tick(); |
| |
| assertSuccess(actionCallback, givenResult, 1); |
| |
| goog.Timer.callOnce(function() { dependentResult.setValue(2); }); |
| mockClock.tick(); |
| |
| assertSuccess(counter, finalResult, 2); |
| } |
| |
| function testChainAsyncWhenFirstResultError() { |
| var finalResult = goog.result.chain(givenResult, actionCallback); |
| goog.result.wait(finalResult, counter); |
| |
| goog.Timer.callOnce(function() { givenResult.setError(6); }); |
| mockClock.tick(); |
| |
| assertNoCall(actionCallback); |
| assertError(counter, finalResult, 6); |
| } |
| |
| function testChainAsyncWhenSecondResultError() { |
| var finalResult = goog.result.chain(givenResult, actionCallback); |
| goog.result.wait(finalResult, counter); |
| |
| goog.Timer.callOnce(function() { givenResult.setValue(1); }); |
| mockClock.tick(); |
| |
| assertSuccess(actionCallback, givenResult, 1); |
| |
| goog.Timer.callOnce(function() { dependentResult.setError(7); }); |
| mockClock.tick(); |
| |
| assertError(counter, finalResult, 7); |
| } |
| |
| function testChainAsyncCancelFirstResult() { |
| var finalResult = goog.result.chain(givenResult, actionCallback); |
| goog.result.wait(finalResult, counter); |
| |
| goog.Timer.callOnce(function() { |
| goog.result.cancelParentResults(finalResult); |
| }); |
| mockClock.tick(); |
| |
| assertNoCall(actionCallback); |
| assertTrue(givenResult.isCanceled()); |
| assertTrue(finalResult.isCanceled()); |
| } |
| |
| function testChainAsyncCancelSecondResult() { |
| var finalResult = goog.result.chain(givenResult, actionCallback); |
| goog.result.wait(finalResult, counter); |
| |
| goog.Timer.callOnce(function() { givenResult.setValue(1); }); |
| mockClock.tick(); |
| |
| assertSuccess(actionCallback, givenResult, 1); |
| |
| goog.Timer.callOnce(function() { |
| goog.result.cancelParentResults(finalResult); |
| }); |
| mockClock.tick(); |
| |
| assertTrue(dependentResult.isCanceled()); |
| assertTrue(finalResult.isCanceled()); |
| } |
| |
| // HELPER FUNCTIONS: |
| |
| // Assert that the recordFunction was called once with an argument of |
| // 'result' (the second argument) which has a state of SUCCESS and |
| // a value of 'value' (the third argument). |
| function assertSuccess(recordFunction, result, value) { |
| assertEquals(1, recordFunction.getCallCount()); |
| var res = recordFunction.popLastCall().getArgument(0); |
| assertEquals(result, res); |
| assertEquals(goog.result.Result.State.SUCCESS, res.getState()); |
| assertEquals(value, res.getValue()); |
| } |
| |
| // Assert that the recordFunction was called once with an argument of |
| // 'result' (the second argument) which has a state of ERROR. |
| function assertError(recordFunction, result, value) { |
| assertEquals(1, recordFunction.getCallCount()); |
| var res = recordFunction.popLastCall().getArgument(0); |
| assertEquals(result, res); |
| assertEquals(goog.result.Result.State.ERROR, res.getState()); |
| assertEquals(value, res.getError()); |
| } |
| |
| // Assert that the recordFunction wasn't called |
| function assertNoCall(recordFunction) { |
| assertEquals(0, recordFunction.getCallCount()); |
| } |
| |
| </script> |
| </body> |
| </html> |