promise bug fixes (work in progress)

This commit is contained in:
Leo Horie 2016-05-28 01:12:20 -04:00
parent 3c9ec0d2d6
commit 3bb0a6287f
2 changed files with 132 additions and 20 deletions

View file

@ -133,6 +133,22 @@ o.spec("promise", function() {
promise.then(null, done)
})
o("non-function onFulfilled is ignored", function(done) {
var promise = Promise.resolve(1)
promise.then(null, null).then(function(value) {
o(value).equals(1)
done()
})
})
o("non-function onFulfilled is ignored", function(done) {
var promise = Promise.resolve(1)
promise.then(null).then(function(value) {
o(value).equals(1)
done()
})
})
})
o.spec("reject", function() {
o("rejects once", function(done) {
@ -247,6 +263,14 @@ o.spec("promise", function() {
done()
})
})
o("non-function onRejected is ignored", function(done) {
var promise = Promise.reject(1)
promise.then(function() {}, null).then(null, function(value) {
o(value).equals(1)
done()
})
})
})
o.spec("promise absorption", function() {
o("absorbs resolved promise via static resolver", function(done) {
@ -440,6 +464,37 @@ o.spec("promise", function() {
done()
})
})
o("promise stays pending if absorbed promise is pending", function(done) {
var promise = new Promise(function(resolve) {resolve()})
var fulfilled = false, rejected = false
promise.then(function() {
return new Promise(function() {})
}).then(function() {
fulfilled = true
}, function() {
rejected = false
})
setTimeout(function() {
o(fulfilled).equals(false)
o(rejected).equals(false)
done()
}, 10)
})
o("absorbs early resolved promise", function(done, t) {
var resolved = Promise.resolve(1)
var promise = new Promise(function(resolve) {
setTimeout(function() {
resolve(resolved)
}, 10)
})
promise.then(function(value) {
o(value).equals(1)
done()
})
})
})
o.spec("race", function() {
o("resolves to first resolved", function(done) {
@ -496,4 +551,43 @@ o.spec("promise", function() {
})
})
})
o.spec("A+ compliance", function() {
o("accesses then only once", function(done) {
var readCount = 0
var promise = Promise.resolve(1).then(function() {
return Object.create(null, {
then: {
get: function () {
++readCount
return function(onFulfilled) {
onFulfilled()
}
}
}
})
})
promise.then(function(value) {
o(readCount).equals(1)
done()
})
})
o("works if thennable resolves twice", function(done) {
var promise = Promise.resolve({
then: function(res) {
res({
then: function(resolve) {
setTimeout(function() {resolve(2)})
}
})
res(1)
}
})
promise.then(function(value) {
o(value).equals(2)
done()
})
})
})
})