| <!DOCTYPE html> |
| <html> |
| <head> |
| <!-- TODO(arv): Check in Closue unit tests and make this run as part of the |
| tests --> |
| <script src="http://closure-library.googlecode.com/svn/trunk/closure/goog/base.js"></script> |
| <script src="../cr.js"></script> |
| <script src="promise.js"></script> |
| <script> |
| |
| goog.require('goog.testing.jsunit'); |
| goog.require('goog.testing.MockClock'); |
| |
| </script> |
| </head> |
| <body> |
| <script> |
| |
| var mockClock; |
| |
| function setUp() { |
| mockClock = new goog.testing.MockClock(); |
| mockClock.install(); |
| } |
| |
| function tearDown() { |
| mockClock.uninstall(); |
| } |
| |
| const Promise = cr.Promise; |
| |
| function testCallbacks() { |
| var calls1 = 0; |
| var calls2 = 0; |
| var V = {}; |
| function f1(v) { |
| calls1++; |
| assertEquals(V, v); |
| } |
| function f2(v) { |
| calls2++; |
| assertEquals(V, v); |
| } |
| var p = new Promise; |
| p.addListener(f1); |
| p.addListener(f2); |
| p.value = V; |
| assertEquals(1, calls1); |
| assertEquals(1, calls2); |
| } |
| |
| function testCallbacks2() { |
| var calls1 = 0; |
| var calls2 = 0; |
| var V = {}; |
| function f1(v) { |
| calls1++; |
| assertEquals(V, v); |
| } |
| function f2(v) { |
| calls2++; |
| assertEquals(V, v); |
| } |
| var p = new Promise; |
| p.addListener(f1); |
| p.addListener(f2); |
| p.removeListener(f1); |
| p.value = V; |
| assertEquals(0, calls1); |
| assertEquals(1, calls2); |
| } |
| |
| function testCallbacks3() { |
| var calls1 = 0; |
| var calls2 = 0; |
| var V = {}; |
| function f1(v) { |
| calls1++; |
| assertEquals(V, v); |
| } |
| function f2(v) { |
| calls2++; |
| assertEquals(V, v); |
| } |
| var p = new Promise; |
| p.addListener(f1); |
| assertEquals(0, calls1); |
| assertEquals(0, calls2); |
| p.value = V; |
| assertEquals(1, calls1); |
| assertEquals(0, calls2); |
| p.addListener(f2); |
| assertEquals(1, calls1); |
| assertEquals(1, calls2); |
| } |
| |
| function testCallbacks4() { |
| var calls1 = 0; |
| var calls2 = 0; |
| var V = {}; |
| function f1(v) { |
| calls1++; |
| assertEquals(V, v); |
| } |
| function f2(v) { |
| calls2++; |
| assertEquals(V, v); |
| } |
| var p = new Promise(V); |
| p.addListener(f1); |
| p.addListener(f2); |
| assertEquals(1, calls1); |
| assertEquals(1, calls2); |
| } |
| |
| function testThisInCallback() { |
| var calls = 0; |
| var V = {}; |
| function f(v) { |
| calls++; |
| assertEquals(V, v); |
| assertNotEquals(p, this); |
| } |
| var p = new Promise; |
| p.addListener(f); |
| p.value = V; |
| assertEquals(1, calls); |
| } |
| |
| function testPending() { |
| var p = new Promise; |
| assertEquals(undefined, p.value); |
| assertFalse(p.done); |
| } |
| |
| function testValueCanBeUndefined() { |
| var p = new Promise; |
| p.value = undefined; |
| assertEquals(undefined, p.value); |
| assertTrue(p.done); |
| } |
| |
| function testDone() { |
| var p = new Promise; |
| assertFalse(p.done); |
| p.value = 42; |
| assertTrue(p.done); |
| } |
| |
| function testWhen() { |
| const V = {}; |
| var calls = 0; |
| var p = new Promise; |
| p.value = V; |
| Promise.when(p, function(v) { |
| assertEquals(V, v); |
| calls++; |
| }); |
| assertEquals(1, calls); |
| } |
| |
| function testWhen2() { |
| const V = {}; |
| var calls = 0; |
| var p = new Promise; |
| Promise.when(p, function(v) { |
| assertEquals(V, v); |
| calls++; |
| }); |
| p.value = V; |
| assertEquals(1, calls); |
| } |
| |
| function testWait() { |
| const S = {}; |
| var p = Promise.wait(1000, S); |
| assertFalse(p.done); |
| mockClock.tick(500); |
| assertFalse(p.done); |
| mockClock.tick(500); |
| assertTrue(p.done); |
| assertEquals(S, p.value); |
| } |
| |
| function testAny() { |
| var p1 = new Promise; |
| var p2 = new Promise; |
| var p3 = new Promise; |
| |
| var any = Promise.any(p1, p2, p3); |
| p2.value = 2; |
| assertEquals(2, any.value); |
| p1.value = 1; |
| assertEquals(2, any.value); |
| } |
| |
| function testAll() { |
| var p1 = new Promise; |
| var p2 = new Promise; |
| var p3 = new Promise; |
| |
| var pAll = Promise.all(p1, p2, p3); |
| p1.value = 1; |
| p2.value = 2; |
| p3.value = 3; |
| assertArrayEquals([1, 2, 3], pAll.value); |
| } |
| |
| function testAllEmpty() { |
| var pAll = Promise.all(); |
| assertArrayEquals([], pAll.value); |
| } |
| |
| function testAllAlreadyDone() { |
| var p1 = new Promise(1); |
| var p2 = new Promise(2); |
| var p3 = new Promise(3); |
| |
| var pAll = Promise.all(p1, p2, p3); |
| assertArrayEquals([1, 2, 3], pAll.value); |
| } |
| |
| function testEvent() { |
| var p = Promise.event(document.body, 'foo'); |
| var e = new cr.Event('foo'); |
| document.body.dispatchEvent(e); |
| assertEquals(e, p.value); |
| } |
| |
| function testToString() { |
| var p1 = new Promise; |
| assertEquals('[object Promise]', String(p1)); |
| |
| var p2 = new Promise; |
| p2.value = 'Hello world'; |
| assertEquals('Hello world', String(p2)); |
| } |
| |
| function testValueOf() { |
| var p = new Promise; |
| p.value = 42; |
| |
| assertTrue(p < 43); |
| assertTrue(p > 41); |
| assertTrue(p == 42); |
| } |
| |
| </script> |
| </body> |
| </html> |