1 var Q = require('../kew')
2 var originalQ = require('q')
4 // create a promise from a literal
5 exports.testQResolve = function (test) {
9 .then(function (data) {
10 test.equal(data, val, "Promise successfully returned")
15 // create a failed promise from an error literal
16 exports.testQReject = function (test) {
17 var err = new Error("hello")
21 test.equal(e, err, "Promise successfully failed")
27 exports.testQStatistics = function (test) {
28 var err = new Error("hello")
30 var errorsEmitted = Q.stats.errorsEmitted
31 var errorsHandled = Q.stats.errorsHandled
33 var rejected = Q.reject(err)
34 test.equal(errorsEmitted + 1, Q.stats.errorsEmitted, "One additional error emitted")
35 test.equal(errorsHandled, Q.stats.errorsHandled, "Error hasn't been handled yet")
37 rejected.fail(function (e) {
38 test.equal(e, err, "Promise successfully failed")
39 test.equal(errorsEmitted + 1, Q.stats.errorsEmitted, "One additional error emitted")
40 test.equal(errorsHandled + 1, Q.stats.errorsHandled, "One additional error handled")
43 rejected.fail(function (e) {
44 test.equal(e, err, "Promise successfully failed")
45 test.equal(errorsEmitted + 1, Q.stats.errorsEmitted, "One additional error emitted")
46 test.equal(errorsHandled + 1, Q.stats.errorsHandled, "Only count error handling once")
51 exports.testQDeferredStatistics = function (test) {
52 var err = new Error("hello")
54 var errorsEmitted = Q.stats.errorsEmitted
55 var errorsHandled = Q.stats.errorsHandled
57 var deferred = Q.defer()
59 deferred.fail(function (e) {
60 test.equal(e, err, "Promise successfully failed")
61 test.equal(errorsEmitted + 1, Q.stats.errorsEmitted, "One additional error emitted")
62 test.equal(errorsHandled + 1, Q.stats.errorsHandled, "One additional error handled")
66 var rejected = deferred.reject(err)
70 // test Q.all with an empty array
71 exports.testQEmptySuccess = function (test) {
74 // make sure all results come back
76 .then(function (data) {
77 test.equal(data.length, 0, "No records should be returned")
82 // test Q.all with only literals
83 exports.testQAllLiteralsSuccess = function (test) {
87 promises.push(vals[0])
88 promises.push(vals[1])
89 promises.push(vals[2])
91 // make sure all results come back
93 .then(function (data) {
94 test.equal(data[0], vals[0], "First val should be returned")
95 test.equal(data[1], vals[1], "Second val should be returned")
96 test.equal(data[2], vals[2], "Third val should be returned")
101 // test Q.all with only promises
102 exports.testQAllPromisesSuccess = function (test) {
106 promises.push(Q.resolve(vals[0]))
107 promises.push(Q.resolve(vals[1]))
108 promises.push(Q.resolve(vals[2]))
110 // make sure all results come back
112 .then(function (data) {
113 test.equal(data[0], vals[0], "First val should be returned")
114 test.equal(data[1], vals[1], "Second val should be returned")
115 test.equal(data[2], vals[2], "Third val should be returned")
120 // create a promise which waits for other promises
121 exports.testQAllAssortedSuccess = function (test) {
125 // a promise that returns the value immediately
126 promises.push(Q.resolve(vals[0]))
129 promises.push(vals[1])
131 // a promise which returns in 10ms
132 var defer = Q.defer()
133 promises.push(defer.promise)
134 setTimeout(function () {
135 defer.resolve(vals[2])
138 // make sure all results come back
140 .then(function (data) {
141 test.equal(data[0], vals[0], "First val should be returned")
142 test.equal(data[1], vals[1], "Second val should be returned")
143 test.equal(data[2], vals[2], "Third val should be returned")
148 // test Q.all with a failing promise
149 exports.testQAllError = function (test) {
151 var err = new Error("hello")
154 promises.push(vals[0])
155 promises.push(vals[1])
157 var defer = Q.defer()
158 promises.push(defer.promise)
161 // make sure all results come back
170 exports.testAllVarArgs = function (test) {
171 var promises = ['a', 'b']
173 Q.all.apply(Q, promises)
174 .then(function (results) {
175 test.equal(promises[0], results[0], "First element should be returned")
176 test.equal(promises[1], results[1], "Second element should be returned")
182 exports.testAllArray = function (test) {
183 var promises = ['a', 'b']
186 .then(function (results) {
187 test.equal(promises[0], results[0], "First element should be returned")
188 test.equal(promises[1], results[1], "Second element should be returned")
193 exports.testAllIsPromiseLike = function(test) {
194 var promises = ['a', originalQ('b')]
197 .then(function (results) {
198 test.equal(promises[0], 'a', "First element should be returned")
199 test.equal(promises[1], 'b', "Second element should be returned")
205 exports.testDelay = function (test) {
206 var val = "Hello, there"
207 var startTime = Date.now()
211 return Q.delay(v, 1000)
213 .then(function (returnVal) {
214 test.equal(returnVal, val, "Val should be passed through")
216 var diff = Date.now() - startTime
218 // clock granularity may be off by 15
219 test.equal(diff >= 1000 - 15, true, "Should have waited a second. Actually waited " + diff)
225 exports.testFcall = function (test) {
226 var calledYet = false
227 var adder = function (a, b) {
233 .then(function (val) {
234 test.equal(val, 5, "Val should be 2 + 3")
237 test.ok(!calledYet, "fcall() should delay function invocation until next tick")
241 exports.testFcallError = function (test) {
242 var error = function () {
243 throw new Error('my error')
247 .then(function (val) {
248 test.fail('fcall should throw exception')
250 test.equal('my error', err.message)
257 // test fcall works when fn returns a promise
258 exports.testFcallGivenPromise = function (test) {
259 var calledYet = false
260 var eventualAdd = function (a, b) {
262 return Q.resolve(a + b)
265 Q.fcall(eventualAdd, 2, 3)
266 .then(function (val) {
267 test.equal(val, 5, "Val should be 2 + 3")
270 test.ok(!calledYet, "fcall() should delay function invocation until next tick")
273 // test nfcall, successful case
274 exports.testNfcall = function (test) {
275 var nodeStyleEventualAdder = function (a, b, callback) {
276 setTimeout(function () {
277 callback(undefined, a + b)
281 Q.nfcall(nodeStyleEventualAdder, 2, 3)
282 .then(function (val) {
283 test.equal(val, 5, "Val should be 2 + 3")
288 // test nfcall, error case
289 exports.testNfcallErrors = function (test) {
290 var err = new Error('fail')
292 var nodeStyleFailer = function (a, b, callback) {
293 setTimeout(function() {
298 Q.nfcall(nodeStyleFailer, 2, 3)
300 test.equal(e, err, "Promise successfully failed")
306 exports.testNFcallErrorSync = function (test) {
307 var error = function () {
308 throw new Error('my error')
312 .then(function (val) {
313 test.fail('nfcall should throw exception')
315 test.equal('my error', err.message)
322 exports.testNcall = function (test) {
323 function TwoAdder() {
326 TwoAdder.prototype.add = function (num, callback) {
327 setTimeout(function () {
328 callback(null, this.a + num)
331 var adder = new TwoAdder()
332 Q.ncall(adder.add, adder, 3)
333 .then(function (val) {
334 test.equal(val, 5, "Val should be 2 + 3")
339 // test binding a callback function with a promise
340 exports.testBindPromise = function (test) {
341 var adder = function (a, b, callback) {
342 callback(null, a + b)
345 var boundAdder = Q.bindPromise(adder, null, 2)
347 .then(function (val) {
348 test.equal(val, 5, "Val should be 2 + 3")
353 // test checking whether something is a promise
354 exports.testIsPromise = function (test) {
355 var kewPromise = Q.defer()
356 var qPromise = originalQ(10)
357 var kewLikeObject = {
358 promise: function () {
359 return 'not a promise sucka!'
361 then: function (fn) {
362 fn('like a promise, brah!')
365 test.equal(Q.isPromise(kewPromise), true, 'A Kew promise is a promise')
366 test.equal(Q.isPromise(qPromise), false, 'A Q promise is not a promise')
367 test.equal(Q.isPromise(kewLikeObject), false, 'A pretend promise is not a promise')
371 // test checking whether something is a promise-like object
372 exports.testIsPromiseLike = function (test) {
373 var kewPromise = Q.defer()
374 var qPromise = originalQ(10)
375 var kewLikeObject = {
376 promise: function () {
377 return 'not a promise sucka!'
379 then: function (fn) {
380 fn('like a promise, brah!')
383 var kewLikeFunction = function() {}
384 kewLikeFunction.then = function(fn) {
385 fn('like a promise, brah!')
387 test.equal(Q.isPromiseLike(kewPromise), true, 'A Kew promise is promise-like')
388 test.equal(Q.isPromiseLike(qPromise), true, 'A Q promise is promise-like')
389 test.equal(Q.isPromiseLike(kewLikeObject), true, 'A pretend promise is a promise-like')
390 test.equal(Q.isPromiseLike(kewLikeFunction), true, 'A pretend function promise is a promise-like')