/*! * bind-context * * Copyright (c) 2015-2016 Charlike Mike Reagent <@tunnckoCore> (http://www.tunnckocore.tk) * Released under the MIT license. */ /* jshint asi:true */ 'use strict' var test = require('assertit') var util = require('util') var bindContext = require('./index') function hello (a) { // `this` context is `{foo: 'bar'}` return this.foo + (a || '') } test('should throw TypeError if not a function', function (done) { function fixture () { bindContext(123) } test.throws(fixture, TypeError) test.throws(fixture, /expect `fn` be function/) done() }) test('should bind passed `ctx` to passed `fn`', function (done) { var aa = bindContext({foo: 'aaa'}, hello) test.strictEqual(typeof aa, 'function') test.strictEqual(util.inspect(aa), '[Function: hello]') test.strictEqual(aa(), 'aaa') test.strictEqual(aa.toString(), hello.toString()) test.strictEqual(aa.name, 'hello') test.strictEqual(aa.name, hello.name) done() }) test('should bind `ctx` and rename `fn` to passed `name`', function (done) { var bb = bindContext({foo: 'boo'}, hello, 'barlo') test.strictEqual(typeof bb, 'function') test.strictEqual(util.inspect(bb), '[Function: barlo]') test.strictEqual(bb(), 'boo') test.strictEqual(bb.name, 'barlo') test.strictEqual(bb.name !== hello.name, true) var helloStr = hello.toString().slice(14) var barloStr = bb.toString().slice(14) test.strictEqual(barloStr, helloStr) done() }) test('should work to bind context with bindContext.call(ctx, fn)', function (done) { var cc = bindContext.call({foo: 'ccc'}, hello) test.strictEqual(typeof cc, 'function') test.strictEqual(util.inspect(cc), '[Function: hello]') test.strictEqual(cc(), 'ccc') test.strictEqual(cc.name, 'hello') test.strictEqual(cc.name === hello.name, true) var hi = hello.toString().slice(14) var ci = cc.toString().slice(14) test.strictEqual(hi, ci) done() }) test('should work to give a name of anonymous function', function (done) { var zz = bindContext(function () {}, 'xxx') test.strictEqual(typeof zz, 'function') test.strictEqual(util.inspect(zz), '[Function: xxx]') test.strictEqual(zz(), undefined) test.strictEqual(zz.name, 'xxx') done() }) test('should work for anonymous function', function (done) { var ww = bindContext(function () {}) test.strictEqual(typeof ww, 'function') test.strictEqual(util.inspect(ww), '[Function]') test.strictEqual(ww(), undefined) test.strictEqual(ww.name, '') done() }) test('should have proper .toString method', function (done) { function foo () { return this.foo ? this.foo : false } var fn = bindContext({foo: 'bar'}, foo) test.equal(typeof fn.toString, 'function') test.equal(fn.name, 'foo') test.equal(fn(), 'bar') test.ok(fn.toString().indexOf('function foo()') !== -1) test.ok(fn.toString().indexOf('return this.foo') !== -1) done() }) test('should use previous function context', function (done) { var hi = hello.bind({foo: 'fez'}) var ee = bindContext(hi) test.strictEqual(typeof ee, 'function') test.strictEqual(util.inspect(ee), '[Function: hello]') test.strictEqual(ee(), 'fez') test.strictEqual(ee.name, 'hello') test.strictEqual(ee.name === hello.name, true) var helloStr = hello.toString().slice(14) var boundStr = ee.toString().slice(14) // () { [native code] } test.notStrictEqual(helloStr, boundStr) done() })