You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

393 lines
10 KiB

var Q = require('../kew')
var originalQ = require('q')
// create a promise from a literal
exports.testQResolve = function (test) {
var val = "ok"
Q.resolve(val)
.then(function (data) {
test.equal(data, val, "Promise successfully returned")
test.done()
})
}
// create a failed promise from an error literal
exports.testQReject = function (test) {
var err = new Error("hello")
Q.reject(err)
.fail(function (e) {
test.equal(e, err, "Promise successfully failed")
test.done()
})
}
// Test Q.stats
exports.testQStatistics = function (test) {
var err = new Error("hello")
var errorsEmitted = Q.stats.errorsEmitted
var errorsHandled = Q.stats.errorsHandled
var rejected = Q.reject(err)
test.equal(errorsEmitted + 1, Q.stats.errorsEmitted, "One additional error emitted")
test.equal(errorsHandled, Q.stats.errorsHandled, "Error hasn't been handled yet")
rejected.fail(function (e) {
test.equal(e, err, "Promise successfully failed")
test.equal(errorsEmitted + 1, Q.stats.errorsEmitted, "One additional error emitted")
test.equal(errorsHandled + 1, Q.stats.errorsHandled, "One additional error handled")
})
rejected.fail(function (e) {
test.equal(e, err, "Promise successfully failed")
test.equal(errorsEmitted + 1, Q.stats.errorsEmitted, "One additional error emitted")
test.equal(errorsHandled + 1, Q.stats.errorsHandled, "Only count error handling once")
})
test.done()
}
exports.testQDeferredStatistics = function (test) {
var err = new Error("hello")
var errorsEmitted = Q.stats.errorsEmitted
var errorsHandled = Q.stats.errorsHandled
var deferred = Q.defer()
deferred.fail(function (e) {
test.equal(e, err, "Promise successfully failed")
test.equal(errorsEmitted + 1, Q.stats.errorsEmitted, "One additional error emitted")
test.equal(errorsHandled + 1, Q.stats.errorsHandled, "One additional error handled")
test.done()
})
var rejected = deferred.reject(err)
}
// test Q.all with an empty array
exports.testQEmptySuccess = function (test) {
var promises = []
// make sure all results come back
Q.all(promises)
.then(function (data) {
test.equal(data.length, 0, "No records should be returned")
test.done()
})
}
// test Q.all with only literals
exports.testQAllLiteralsSuccess = function (test) {
var vals = [3, 2, 1]
var promises = []
promises.push(vals[0])
promises.push(vals[1])
promises.push(vals[2])
// make sure all results come back
Q.all(promises)
.then(function (data) {
test.equal(data[0], vals[0], "First val should be returned")
test.equal(data[1], vals[1], "Second val should be returned")
test.equal(data[2], vals[2], "Third val should be returned")
test.done()
})
}
// test Q.all with only promises
exports.testQAllPromisesSuccess = function (test) {
var vals = [3, 2, 1]
var promises = []
promises.push(Q.resolve(vals[0]))
promises.push(Q.resolve(vals[1]))
promises.push(Q.resolve(vals[2]))
// make sure all results come back
Q.all(promises)
.then(function (data) {
test.equal(data[0], vals[0], "First val should be returned")
test.equal(data[1], vals[1], "Second val should be returned")
test.equal(data[2], vals[2], "Third val should be returned")
test.done()
})
}
// create a promise which waits for other promises
exports.testQAllAssortedSuccess = function (test) {
var vals = [3, 2, 1]
var promises = []
// a promise that returns the value immediately
promises.push(Q.resolve(vals[0]))
// the value itself
promises.push(vals[1])
// a promise which returns in 10ms
var defer = Q.defer()
promises.push(defer.promise)
setTimeout(function () {
defer.resolve(vals[2])
}, 10)
// make sure all results come back
Q.all(promises)
.then(function (data) {
test.equal(data[0], vals[0], "First val should be returned")
test.equal(data[1], vals[1], "Second val should be returned")
test.equal(data[2], vals[2], "Third val should be returned")
test.done()
})
}
// test Q.all with a failing promise
exports.testQAllError = function (test) {
var vals = [3, 2, 1]
var err = new Error("hello")
var promises = []
promises.push(vals[0])
promises.push(vals[1])
var defer = Q.defer()
promises.push(defer.promise)
defer.reject(err)
// make sure all results come back
Q.all(promises)
.fail(function (e) {
test.equal(e, err)
test.done()
})
}
// test all var_args
exports.testAllVarArgs = function (test) {
var promises = ['a', 'b']
Q.all.apply(Q, promises)
.then(function (results) {
test.equal(promises[0], results[0], "First element should be returned")
test.equal(promises[1], results[1], "Second element should be returned")
test.done()
})
}
// test all array
exports.testAllArray = function (test) {
var promises = ['a', 'b']
Q.all(promises)
.then(function (results) {
test.equal(promises[0], results[0], "First element should be returned")
test.equal(promises[1], results[1], "Second element should be returned")
test.done()
})
}
exports.testAllIsPromiseLike = function(test) {
var promises = ['a', originalQ('b')]
Q.all(promises)
.then(function (results) {
test.equal(promises[0], 'a', "First element should be returned")
test.equal(promises[1], 'b', "Second element should be returned")
test.done()
})
}
// test delay
exports.testDelay = function (test) {
var val = "Hello, there"
var startTime = Date.now()
Q.resolve(val)
.then(function (v) {
return Q.delay(v, 1000)
})
.then(function (returnVal) {
test.equal(returnVal, val, "Val should be passed through")
var diff = Date.now() - startTime
// clock granularity may be off by 15
test.equal(diff >= 1000 - 15, true, "Should have waited a second. Actually waited " + diff)
test.done()
})
}
// test fcall
exports.testFcall = function (test) {
var calledYet = false
var adder = function (a, b) {
calledYet = true
return a + b
}
Q.fcall(adder, 2, 3)
.then(function (val) {
test.equal(val, 5, "Val should be 2 + 3")
test.done()
})
test.ok(!calledYet, "fcall() should delay function invocation until next tick")
}
// test fcall
exports.testFcallError = function (test) {
var error = function () {
throw new Error('my error')
}
Q.fcall(error)
.then(function (val) {
test.fail('fcall should throw exception')
}, function (err) {
test.equal('my error', err.message)
})
.then(function () {
test.done()
})
}
// test fcall works when fn returns a promise
exports.testFcallGivenPromise = function (test) {
var calledYet = false
var eventualAdd = function (a, b) {
calledYet = true
return Q.resolve(a + b)
}
Q.fcall(eventualAdd, 2, 3)
.then(function (val) {
test.equal(val, 5, "Val should be 2 + 3")
test.done()
})
test.ok(!calledYet, "fcall() should delay function invocation until next tick")
}
// test nfcall, successful case
exports.testNfcall = function (test) {
var nodeStyleEventualAdder = function (a, b, callback) {
setTimeout(function () {
callback(undefined, a + b)
}, 2)
}
Q.nfcall(nodeStyleEventualAdder, 2, 3)
.then(function (val) {
test.equal(val, 5, "Val should be 2 + 3")
test.done()
})
}
// test nfcall, error case
exports.testNfcallErrors = function (test) {
var err = new Error('fail')
var nodeStyleFailer = function (a, b, callback) {
setTimeout(function() {
callback(err)
}, 2)
}
Q.nfcall(nodeStyleFailer, 2, 3)
.fail(function (e) {
test.equal(e, err, "Promise successfully failed")
test.done()
})
}
// test fcall
exports.testNFcallErrorSync = function (test) {
var error = function () {
throw new Error('my error')
}
Q.nfcall(error)
.then(function (val) {
test.fail('nfcall should throw exception')
}, function (err) {
test.equal('my error', err.message)
})
.then(function () {
test.done()
})
}
exports.testNcall = function (test) {
function TwoAdder() {
this.a = 2
}
TwoAdder.prototype.add = function (num, callback) {
setTimeout(function () {
callback(null, this.a + num)
}.bind(this), 10)
}
var adder = new TwoAdder()
Q.ncall(adder.add, adder, 3)
.then(function (val) {
test.equal(val, 5, "Val should be 2 + 3")
test.done()
})
}
// test binding a callback function with a promise
exports.testBindPromise = function (test) {
var adder = function (a, b, callback) {
callback(null, a + b)
}
var boundAdder = Q.bindPromise(adder, null, 2)
boundAdder(3)
.then(function (val) {
test.equal(val, 5, "Val should be 2 + 3")
test.done()
})
}
// test checking whether something is a promise
exports.testIsPromise = function (test) {
var kewPromise = Q.defer()
var qPromise = originalQ(10)
var kewLikeObject = {
promise: function () {
return 'not a promise sucka!'
},
then: function (fn) {
fn('like a promise, brah!')
}
}
test.equal(Q.isPromise(kewPromise), true, 'A Kew promise is a promise')
test.equal(Q.isPromise(qPromise), false, 'A Q promise is not a promise')
test.equal(Q.isPromise(kewLikeObject), false, 'A pretend promise is not a promise')
test.done()
}
// test checking whether something is a promise-like object
exports.testIsPromiseLike = function (test) {
var kewPromise = Q.defer()
var qPromise = originalQ(10)
var kewLikeObject = {
promise: function () {
return 'not a promise sucka!'
},
then: function (fn) {
fn('like a promise, brah!')
}
}
var kewLikeFunction = function() {}
kewLikeFunction.then = function(fn) {
fn('like a promise, brah!')
}
test.equal(Q.isPromiseLike(kewPromise), true, 'A Kew promise is promise-like')
test.equal(Q.isPromiseLike(qPromise), true, 'A Q promise is promise-like')
test.equal(Q.isPromiseLike(kewLikeObject), true, 'A pretend promise is a promise-like')
test.equal(Q.isPromiseLike(kewLikeFunction), true, 'A pretend function promise is a promise-like')
test.done()
}