| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 | "use strict"var maybe = require("../")var assert = require("assert")var Promise = global.Promise || require("promise")describe("maybe", function () {  it("should call the callback with result the promise is resolved to", function (done) {    var f = function f (cb) {      return maybe(cb, new Promise(function (resolve, reject) {        process.nextTick(function () {          return resolve("hi")        })      }))    }    f(function (err, result) {      assert.ifError(err, "no error")      assert.strictEqual(result, "hi")      return done()    })  })  it("should call the callback with the error the promise is rejected with", function (done) {    var f = function f (cb) {      return maybe(cb, new Promise(function (resolve, reject) {        process.nextTick(function () {          return reject(new Error("boom"))        })      }))    }    f(function (err, result) {      assert(err, "we got an error")      assert.strictEqual(result, undefined, "we got undefined result")      assert(err instanceof Error, "error is an Error")      assert.strictEqual(err.message, "boom", "error message is boom")      return done()    })  })  it("should return undefined when called with a callback", function () {    var f = function f (cb) {      return maybe(cb, new Promise(function (resolve, reject) {        //...      }))    }    var returnVal = f(function (err, result) {})    assert.strictEqual(returnVal, undefined, "returned val is undefined")  })  it("should return the same promise when no callback is provided", function () {    var p    var f = function f (cb) {      p = new Promise(function (resolve, reject) {        process.nextTick(function () {          return resolve("hi")        })      })      return maybe(cb, p)    }    var returnVal = f()    assert(p instanceof Promise, "returned val is a Promise")    assert.strictEqual(returnVal, p, "returned val is same obj (not a new Promise)")  })  it("should allow errors thrown in the callback to be uncaught", function (done) {    var mochaHandler    // Temporarily remove Mocha's global error handling so we can    // verify error is indeed uncaught by installing our own    // global error handler.    if (process.browser) {      mochaHandler = global.onerror      global.onerror = handleUncaughtException    }    else {      mochaHandler = process.listeners("uncaughtException").pop()      process.removeListener("uncaughtException", mochaHandler)      process.once("uncaughtException", handleUncaughtException)    }    var f = function f (cb) {      return maybe(cb, new Promise(function (resolve, reject) {        process.nextTick(function () {          return resolve("hi")        })      }))    }    f(function (err, result) {      throw new Error("yep")    })    function handleUncaughtException (err) {      // `err` is either an Error when running under Node, or a      // string if running under a browser.      var msg = err.message || err      assert(msg.match(/\byep\b/), "got expected error")      // Restore Mocha's global error handler.      if (process.browser) {        global.onerror = mochaHandler      }      else {        process.on("uncaughtException", mochaHandler)      }      done()      // Don't leak error to browser console      return true    }  })  it("should not let the callback be called more than once", function (done) {    var f = function f (cb) {      return maybe(cb, new Promise(function (resolve, reject) {        process.nextTick(function () {          resolve("foo")        })      }))    }    var called = 0    f(function (err, result) {      called++      assert(called <= 1, "called only once")      setTimeout(function () { done() }, 100)      return Promise.reject(new Error("bah"))    })  })})
 |