135 lines
3.4 KiB
JavaScript
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);
|
|
});
|
|
});
|
|
});
|