Files
2025-07-24 17:21:45 +08:00

152 lines
4.6 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"use strict";
var assert = require("assert");
var testFulfilled = require("./helpers/testThreeCases").testFulfilled;
var adapter = global.adapter;
var resolved = adapter.resolved;
var deferred = adapter.deferred;
var dummy = { dummy: "dummy" }; // we fulfill or reject with this when we don't intend to test against it
var sentinel = { sentinel: "sentinel" }; // a sentinel fulfillment value to test for with strict equality
describe("2.2.2: If `onFulfilled` is a function,", function () {
describe("2.2.2.1: it must be called after `promise` is fulfilled, with `promise`s fulfillment value as its " +
"first argument.", function () {
testFulfilled(sentinel, function (promise, done) {
promise.then(function onFulfilled(value) {
assert.strictEqual(value, sentinel);
done();
});
});
});
describe("2.2.2.2: it must not be called before `promise` is fulfilled", function () {
specify("fulfilled after a delay", function (done) {
var d = deferred();
var isFulfilled = false;
d.promise.then(function onFulfilled() {
assert.strictEqual(isFulfilled, true);
done();
});
setTimeout(function () {
d.resolve(dummy);
isFulfilled = true;
}, 50);
});
specify("never fulfilled", function (done) {
var d = deferred();
var onFulfilledCalled = false;
d.promise.then(function onFulfilled() {
onFulfilledCalled = true;
done();
});
setTimeout(function () {
assert.strictEqual(onFulfilledCalled, false);
done();
}, 150);
});
});
describe("2.2.2.3: it must not be called more than once.", function () {
specify("already-fulfilled", function (done) {
var timesCalled = 0;
resolved(dummy).then(function onFulfilled() {
assert.strictEqual(++timesCalled, 1);
done();
});
});
specify("trying to fulfill a pending promise more than once, immediately", function (done) {
var d = deferred();
var timesCalled = 0;
d.promise.then(function onFulfilled() {
assert.strictEqual(++timesCalled, 1);
done();
});
d.resolve(dummy);
d.resolve(dummy);
});
specify("trying to fulfill a pending promise more than once, delayed", function (done) {
var d = deferred();
var timesCalled = 0;
d.promise.then(function onFulfilled() {
assert.strictEqual(++timesCalled, 1);
done();
});
setTimeout(function () {
d.resolve(dummy);
d.resolve(dummy);
}, 50);
});
specify("trying to fulfill a pending promise more than once, immediately then delayed", function (done) {
var d = deferred();
var timesCalled = 0;
d.promise.then(function onFulfilled() {
assert.strictEqual(++timesCalled, 1);
done();
});
d.resolve(dummy);
setTimeout(function () {
d.resolve(dummy);
}, 50);
});
specify("when multiple `then` calls are made, spaced apart in time", function (done) {
var d = deferred();
var timesCalled = [0, 0, 0];
d.promise.then(function onFulfilled() {
assert.strictEqual(++timesCalled[0], 1);
});
setTimeout(function () {
d.promise.then(function onFulfilled() {
assert.strictEqual(++timesCalled[1], 1);
});
}, 50);
setTimeout(function () {
d.promise.then(function onFulfilled() {
assert.strictEqual(++timesCalled[2], 1);
done();
});
}, 100);
setTimeout(function () {
d.resolve(dummy);
}, 150);
});
specify("when `then` is interleaved with fulfillment", function (done) {
var d = deferred();
var timesCalled = [0, 0];
d.promise.then(function onFulfilled() {
assert.strictEqual(++timesCalled[0], 1);
});
d.resolve(dummy);
d.promise.then(function onFulfilled() {
assert.strictEqual(++timesCalled[1], 1);
done();
});
});
});
});