node-bluebird/test/mocha/method.js

135 lines
3.4 KiB
JavaScript

"use strict";
var assert = require("assert");
var testUtils = require("./helpers/util.js");
var obj = {};
var error = new Error();
var thrower = Promise.method(function() {
throw error;
});;
var identity = Promise.method(function(val) {
return val;
});
var array = Promise.method(function() {
return [].slice.call(arguments);
});
var receiver = Promise.method(function() {
return this;
});
describe("Promise.method", function(){
specify("should reject when the function throws", function() {
var async = false;
var ret = thrower().then(assert.fail, function(e) {
assert(async);
assert(e === error);
});
async = true;
return ret;
});
specify("should throw when the function is not a function", function() {
try {
Promise.method(null);
}
catch (e) {
assert(e instanceof TypeError);
return;
}
assert.fail();
});
specify("should call the function with the given receiver", function(){
var async = false;
var ret = receiver.call(obj).then(function(val) {
assert(async);
assert(val === obj);
}, assert.fail);
async = true;
return ret;
});
specify("should call the function with the given value", function(){
var async = false;
var ret = identity(obj).then(function(val) {
assert(async);
assert(val === obj);
}, assert.fail);
async = true;
return ret;
});
specify("should apply the function if given value is array", function(){
var async = false;
var ret = array(1, 2, 3).then(function(val) {
assert(async);
assert.deepEqual(val, [1,2,3]);
}, assert.fail);
async = true;
return ret;
});
specify("should unwrap returned promise", function(){
var d = Promise.defer();
var ret = Promise.method(function(){
return d.promise;
})().then(function(v){
assert(v === 3);
})
setTimeout(function(){
d.fulfill(3);
}, 1);
return ret;
});
specify("should unwrap returned thenable", function(){
return Promise.method(function(){
return {
then: function(f, v) {
f(3);
}
}
})().then(function(v){
assert(v === 3);
});
});
specify("should unwrap a following promise", function() {
var resolveF;
var f = new Promise(function() {
resolveF = arguments[0];
});
var v = new Promise(function(f) {
setTimeout(function() {
f(3);
}, 1);
});
resolveF(v);
return Promise.method(function(){
return f;
})().then(function(v){
assert(v === 3);
});
});
specify("zero arguments length should remain zero", function() {
return Promise.method(function(){
assert(arguments.length === 0);
})();
});
specify("should retain binding from returned promise", function() {
var THIS = {};
return Promise.method(function() {
return Promise.bind(THIS, 1);
})().then(function(value) {
assert.strictEqual(THIS, this);
assert.strictEqual(1, value);
});
});
});