| <!DOCTYPE html> |
| <script src="../../resources/js-test.js"></script> |
| <div id="description"></div> |
| <div id="console"></div> |
| <script> |
| // http://heycam.github.io/webidl/#es-operations |
| description('Operations that return a Promise type should handle exceptions ' + |
| 'by returning a rejected Promise with the exception.') |
| |
| window.jsTestIsAsync = true; |
| |
| var reason; |
| |
| function shouldBeRejected(promise, message) { |
| return promise.then(function() { |
| testFailed('Resolved unexpectedly: ' + message); |
| }, function(e) { |
| reason = e; |
| testPassed('Rejected as expected: ' + message); |
| shouldBeTrue('reason instanceof Error'); |
| debug(e); |
| }); |
| } |
| |
| function shouldBeResolved(promise, message) { |
| return promise.then(function() { |
| testPassed('Resolved as expected: ' + message); |
| }, function(e) { |
| testFailed('Rejected unexpectedly: ' + message); |
| reason = e; |
| shouldBeTrue('reason instanceof Error'); |
| debug(e); |
| }); |
| } |
| |
| var check = internals.promiseCheck.bind(internals); |
| var check2 = internals.promiseCheckWithoutExceptionState.bind(internals); |
| var check3 = internals.promiseCheckRange.bind(internals); |
| var check4 = internals.promiseCheckOverload.bind(internals); |
| |
| Promise.resolve().then(function() { |
| return shouldBeRejected(check(), 'no arguments'); |
| }).then(function() { |
| return shouldBeResolved(check(3, true, {}, '', ['']), 'valid arguments'); |
| }).then(function() { |
| return shouldBeResolved(check(null, true, {}, '', []), 'convert(long)'); |
| }).then(function() { |
| return shouldBeResolved(check(3, {}, {}, '', []), 'convert(boolean)'); |
| }).then(function() { |
| return shouldBeRejected(check(3, true, 3, '', []), 'type error(Dictionary)'); |
| }).then(function() { |
| return shouldBeResolved(check(3, true, {}, {}, []), 'convert(String)'); |
| }).then(function() { |
| var x = { |
| toString: function() { |
| throw Error('Thrown from toString'); |
| } |
| }; |
| return shouldBeRejected(check(3, true, {}, x, []), 'conversion error(toString)'); |
| }).then(function() { |
| var x = { |
| toString: function() { |
| throw Error('Thrown from toString'); |
| } |
| }; |
| return shouldBeRejected(check(3, true, {}, '', [x]), 'conversion error([String])'); |
| }).then(function() { |
| return shouldBeRejected(check(3, false, {}, '', []), 'rejected by the impl'); |
| }).then(function() { |
| return shouldBeRejected(check2(), 'no arguments'); |
| }).then(function() { |
| return shouldBeResolved(check2({}, '', '', ''), 'valid arguments'); |
| }).then(function() { |
| return shouldBeResolved(check2({}, ''), 'valid arguments'); |
| }).then(function() { |
| return shouldBeRejected(check2(3, ''), 'type error(Dictionary)'); |
| }).then(function() { |
| return shouldBeResolved(check2({}, '', {}, 3), 'convert(String...)'); |
| }).then(function() { |
| var x = { |
| toString: function() { |
| throw Error('Thrown from toString'); |
| } |
| }; |
| return shouldBeRejected(check2({}, '', '', x), 'conversion error(String...)'); |
| }).then(function() { |
| return shouldBeRejected(check3(-1), 'range error(octet)'); |
| }).then(function() { |
| return shouldBeResolved(check4(location), 'valid argument (Location)'); |
| }).then(function() { |
| return shouldBeResolved(check4(document), 'valid argument (Document)'); |
| }).then(function() { |
| return shouldBeResolved(check4(location, 0, 0), 'valid argument (Location, long, long)'); |
| }).then(function() { |
| return shouldBeRejected(check4({}), 'type error (Object)'); |
| }).then(function() { |
| return shouldBeRejected(check4(location, 0), 'type error (Location, long)'); |
| }).then(undefined, function(e) { |
| testFailed('An exception is thrown from a method'); |
| debug(e); |
| }).then(finishJSTest, finishJSTest); |
| </script> |