gecko-dev/dom/promise/tests/test_promise_xrays.html

366 строки
10 KiB
HTML

<!DOCTYPE HTML>
<html>
<!--
https://bugzilla.mozilla.org/show_bug.cgi?id=1170760
-->
<head>
<meta charset="utf-8">
<title>Test for Bug 1170760</title>
<script src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
<link rel="stylesheet" type="text/css" href="chrome://global/skin"/>
<link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css"/>
</head>
<body>
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1170760">Mozilla Bug 1170760</a>
<p id="display"></p>
<div id="content" style="display: none">
<iframe id="t" src="http://example.org/chrome/dom/promise/tests/file_promise_xrays.html"></iframe>
</div>
<pre id="test">
<script type="application/javascript">
var win = $("t").contentWindow;
/** Test for Bug 1170760 **/
SimpleTest.waitForExplicitFinish();
function testLoadComplete() {
is(win.location.href, $("t").src, "Should have loaded the right thing");
nextTest();
}
function testHaveXray() {
is(typeof win.Promise.race, "function", "Should see a race() function");
var exception;
try {
win.Promise.wrappedJSObject.race;
} catch (e) {
exception = e;
}
is(exception, "Getting race", "Should have thrown the right exception");
is(win.wrappedJSObject.setupThrew, false, "Setup should not have thrown");
nextTest();
}
function testConstructor1() {
var p = new win.Promise(function(resolve, reject) { resolve(win.Promise.resolve(5)); });
p.then(
function(arg) {
is(arg, 5, "Content Promise constructor resolved with content promise should work");
},
function(e) {
ok(false, "Content Promise constructor resolved with content promise should not fail");
}
).then(nextTest);
}
function testConstructor2() {
var p = new win.Promise(function(resolve, reject) { resolve(Promise.resolve(5)); });
p.then(
function(arg) {
is(arg, 5, "Content Promise constructor resolved with chrome promise should work");
},
function(e) {
ok(false, "Content Promise constructor resolved with chrome promise should not fail");
}
).then(nextTest);
}
function testRace1() {
var p = win.Promise.race(new win.Array(1, 2));
p.then(
function(arg) {
ok(arg == 1 || arg == 2,
"Should get the right value when racing content-side array");
},
function(e) {
ok(false, "testRace1 threw exception: " + e);
}
).then(nextTest);
}
function testRace2() {
var p = win.Promise.race(
[win.Promise.resolve(1), win.Promise.resolve(2)]);
p.then(
function(arg) {
ok(arg == 1 || arg == 2,
"Should get the right value when racing content-side array of explicit Promises");
},
function(e) {
ok(false, "testRace2 threw exception: " + e);
}
).then(nextTest);
}
function testRace3() {
// This works with a chrome-side array because we do the iteration
// while still in the Xray compartment.
var p = win.Promise.race([1, 2]);
p.then(
function(arg) {
ok(arg == 1 || arg == 2,
"Should get the right value when racing chrome-side array");
},
function(e) {
ok(false, "testRace3 threw exception: " + e);
}
).then(nextTest);
}
function testRace4() {
// This works with both content-side and chrome-side Promises because we want
// it to and go to some lengths to make it work.
var p = win.Promise.race([Promise.resolve(1), win.Promise.resolve(2)]);
p.then(
function(arg) {
ok(arg == 1 || arg == 2,
"Should get the right value when racing chrome-side promises");
},
function(e) {
ok(false, "testRace4 threw exception: " + e);
}
).then(nextTest);
}
function testAll1() {
var p = win.Promise.all(new win.Array(1, 2));
p.then(
function(arg) {
ok(arg instanceof win.Array, "Should get an Array from Promise.all (1)");
is(arg[0], 1, "First entry of Promise.all return value should be correct (1)");
is(arg[1], 2, "Second entry of Promise.all return value should be correct (1)");
},
function(e) {
ok(false, "testAll1 threw exception: " + e);
}
).then(nextTest);
}
function testAll2() {
var p = win.Promise.all(
[win.Promise.resolve(1), win.Promise.resolve(2)]);
p.then(
function(arg) {
ok(arg instanceof win.Array, "Should get an Array from Promise.all (2)");
is(arg[0], 1, "First entry of Promise.all return value should be correct (2)");
is(arg[1], 2, "Second entry of Promise.all return value should be correct (2)");
},
function(e) {
ok(false, "testAll2 threw exception: " + e);
}
).then(nextTest);
}
function testAll3() {
// This works with a chrome-side array because we do the iteration
// while still in the Xray compartment.
var p = win.Promise.all([1, 2]);
p.then(
function(arg) {
ok(arg instanceof win.Array, "Should get an Array from Promise.all (3)");
is(arg[0], 1, "First entry of Promise.all return value should be correct (3)");
is(arg[1], 2, "Second entry of Promise.all return value should be correct (3)");
},
function(e) {
ok(false, "testAll3 threw exception: " + e);
}
).then(nextTest);
}
function testAll4() {
// This works with both content-side and chrome-side Promises because we want
// it to and go to some lengths to make it work.
var p = win.Promise.all([Promise.resolve(1), win.Promise.resolve(2)]);
p.then(
function(arg) {
ok(arg instanceof win.Array, "Should get an Array from Promise.all (4)");
is(arg[0], 1, "First entry of Promise.all return value should be correct (4)");
is(arg[1], 2, "Second entry of Promise.all return value should be correct (4)");
},
function(e) {
ok(false, "testAll4 threw exception: " + e);
}
).then(nextTest);
}
function testAll5() {
var p = win.Promise.all(new win.Array());
p.then(
function(arg) {
ok(arg instanceof win.Array, "Should get an Array from Promise.all (5)");
},
function(e) {
ok(false, "testAll5 threw exception: " + e);
}
).then(nextTest);
}
function testResolve1() {
var p = win.Promise.resolve(5);
ok(p instanceof win.Promise, "Promise.resolve should return a promise");
p.then(
function(arg) {
is(arg, 5, "Should get correct Promise.resolve value");
},
function(e) {
ok(false, "testAll5 threw exception: " + e);
}
).then(nextTest);
}
function testResolve2() {
var p = win.Promise.resolve(5);
var q = win.Promise.resolve(p);
is(q, p, "Promise.resolve should just pass through Promise values");
nextTest();
}
function testResolve3() {
var p = win.Promise.resolve(Promise.resolve(5));
p.then(
function(arg) {
is(arg, 5, "Promise.resolve with chrome Promise should work");
},
function(e) {
ok(false, "Promise.resolve with chrome Promise should not fail");
}
).then(nextTest);
}
function testResolve4() {
var p = new win.Promise((res, rej) => {});
Cu.getJSTestingFunctions().resolvePromise(p, 42);
p.then(
function(arg) {
is(arg, 42, "Resolving an Xray to a promise with TestingFunctions resolvePromise should work");
},
function(e) {
ok(false, "Resolving an Xray to a promise with TestingFunctions resolvePromise should not fail");
}
).then(nextTest);
}
function testReject1() {
var p = win.Promise.reject(5);
ok(p instanceof win.Promise, "Promise.reject should return a promise");
p.then(
function(arg) {
ok(false, "Promise should be rejected");
},
function(e) {
is(e, 5, "Should get correct Promise.reject value");
}
).then(nextTest);
}
function testReject2() {
var p = new win.Promise((res, rej) => {});
Cu.getJSTestingFunctions().rejectPromise(p, 42);
p.then(
function(arg) {
ok(false, "Rejecting an Xray to a promise with TestingFunctions rejectPromise should trigger catch handler");
},
function(e) {
is(e, 42, "Rejecting an Xray to a promise with TestingFunctions rejectPromise should work");
}
).then(nextTest);
}
function testThen1() {
var p = win.Promise.resolve(5);
var q = p.then((x) => x * x);
ok(q instanceof win.Promise,
"Promise.then should return a promise from the right global");
q.then(
function(arg) {
is(arg, 25, "Promise.then should work");
},
function(e) {
ok(false, "Promise.then should not fail");
}
).then(nextTest);
}
function testThen2() {
var p = win.Promise.resolve(5);
var q = p.then((x) => Promise.resolve(x * x));
ok(q instanceof win.Promise,
"Promise.then should return a promise from the right global");
q.then(
function(arg) {
is(arg, 25, "Promise.then resolved with chrome promise should work");
},
function(e) {
ok(false, "Promise.then resolved with chrome promise should not fail");
}
).then(nextTest);
}
function testCatch1() {
var p = win.Promise.reject(5);
ok(p instanceof win.Promise, "Promise.reject should return a promise");
var q = p.catch((x) => x * x);
ok(q instanceof win.Promise,
"Promise.catch should return a promise from the right global");
q.then(
function(arg) {
is(arg, 25, "Promise.catch should work");
},
function(e) {
ok(false, "Promise.catch should not fail");
}
).then(nextTest);
}
function testToStringTag1() {
is(win.Promise.prototype[Symbol.toStringTag], "Promise", "@@toStringTag was incorrect");
var p = win.Promise.resolve();
is(String(p), "[object Promise]", "String() result was incorrect");
is(p.toString(), "[object Promise]", "toString result was incorrect");
is(Object.prototype.toString.call(p), "[object Promise]", "second toString result was incorrect");
nextTest();
}
var tests = [
testLoadComplete,
testHaveXray,
testConstructor1,
testConstructor2,
testRace1,
testRace2,
testRace3,
testRace4,
testAll1,
testAll2,
testAll3,
testAll4,
testAll5,
testResolve1,
testResolve2,
testResolve3,
testResolve4,
testReject1,
testReject2,
testThen1,
testThen2,
testCatch1,
testToStringTag1,
];
function nextTest() {
if (tests.length == 0) {
SimpleTest.finish();
return;
}
tests.shift()();
}
addLoadEvent(nextTest);
</script>
</pre>
</body>
</html>