| <!DOCTYPE HTML> | |
| <html> | |
| <head> | |
| <title>Async Tests and Promises</title> | |
| </head> | |
| <body> | |
| <h1>Async Tests and Promises</h1> | |
| <p>This test assumes ECMAScript 6 Promise support. Some failures are expected.</p> | |
| <div id="log"></div> | |
| <script src="../testharness.js"></script> | |
| <script src="../testharnessreport.js"></script> | |
| <script> | |
| test(function() { | |
| var p = new Promise(function(resolve, reject) {}); | |
| assert_true('then' in p); | |
| assert_equals(typeof Promise.resolve, 'function'); | |
| assert_equals(typeof Promise.reject, 'function'); | |
| }, "Promises are supported in your browser"); | |
| (function() { | |
| var t = async_test("Promise resolution"); | |
| t.step(function() { | |
| Promise.resolve('x').then( | |
| t.step_func(function(value) { | |
| assert_equals(value, 'x'); | |
| t.done(); | |
| }), | |
| t.unreached_func('Promise should not reject') | |
| ); | |
| }); | |
| }()); | |
| (function() { | |
| var t = async_test("Promise rejection"); | |
| t.step(function() { | |
| Promise.reject(Error('fail')).then( | |
| t.unreached_func('Promise should reject'), | |
| t.step_func(function(reason) { | |
| assert_true(reason instanceof Error); | |
| assert_equals(reason.message, 'fail'); | |
| t.done(); | |
| }) | |
| ); | |
| }); | |
| }()); | |
| (function() { | |
| var t = async_test("Promises resolution chaining"); | |
| t.step(function() { | |
| var resolutions = []; | |
| Promise.resolve('a').then( | |
| t.step_func(function(value) { | |
| resolutions.push(value); | |
| return 'b'; | |
| }) | |
| ).then( | |
| t.step_func(function(value) { | |
| resolutions.push(value); | |
| return 'c'; | |
| }) | |
| ).then( | |
| t.step_func(function(value) { | |
| resolutions.push(value); | |
| assert_array_equals(resolutions, ['a', 'b', 'c']); | |
| t.done(); | |
| }) | |
| ).catch( | |
| t.unreached_func('promise should not have rejected') | |
| ); | |
| }); | |
| }()); | |
| (function() { | |
| var t = async_test("Use of step_func with Promises"); | |
| t.step(function() { | |
| var resolutions = []; | |
| Promise.resolve('x').then( | |
| t.step_func_done(), | |
| t.unreached_func('Promise should not have rejected') | |
| ); | |
| }); | |
| }()); | |
| (function() { | |
| var t = async_test("Promises and test assertion failures (should fail)"); | |
| t.step(function() { | |
| var resolutions = []; | |
| Promise.resolve('x').then( | |
| t.step_func(function(value) { | |
| assert_true(false, 'This failure is expected'); | |
| }) | |
| ).then( | |
| t.unreached_func('Promise should not have resolved') | |
| ).catch( | |
| t.unreached_func('Promise should not have rejected') | |
| ); | |
| }); | |
| }()); | |
| (function() { | |
| var t = async_test("Use of unreached_func with Promises (should fail)"); | |
| t.step(function() { | |
| var resolutions = []; | |
| var r; | |
| var p = new Promise(function(resolve, reject) { | |
| // Reject instead of resolve, to demonstrate failure. | |
| reject(123); | |
| }); | |
| p.then( | |
| function(value) { | |
| assert_equals(value, 123, 'This should not actually happen'); | |
| }, | |
| t.unreached_func('This failure is expected') | |
| ); | |
| }); | |
| }()); | |
| </script> |