Index: LayoutTests/fast/js/Promise-bindings-check-exception.html |
diff --git a/LayoutTests/fast/js/Promise-bindings-check-exception.html b/LayoutTests/fast/js/Promise-bindings-check-exception.html |
new file mode 100644 |
index 0000000000000000000000000000000000000000..46149dd2a4f4f3f19c6e99f529c11ecf9cb00511 |
--- /dev/null |
+++ b/LayoutTests/fast/js/Promise-bindings-check-exception.html |
@@ -0,0 +1,91 @@ |
+<!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); |
+ |
+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(undefined, function(e) { |
+ testFailed('An exception is thrown from a method'); |
+ debug(e); |
+}).then(finishJSTest, finishJSTest); |
+</script> |