promise bug fixes (work in progress)
This commit is contained in:
parent
3c9ec0d2d6
commit
3bb0a6287f
2 changed files with 132 additions and 20 deletions
|
|
@ -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()
|
||||
})
|
||||
})
|
||||
})
|
||||
})
|
||||
Loading…
Add table
Add a link
Reference in a new issue