| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 | 
describe('Function', function() {    "use strict";    describe('bind', function() {        var actual, expected,            testSubject;                testSubject = {            push: function(o) {                this.a.push(o);            }        };                function func() {            Array.prototype.forEach.call(arguments, function(a) {                this.push(a);            }, this);            return this;        };                beforeEach(function() {            actual = [];            testSubject.a = [];        });                it('binds properly without a context', function() {            var context;            testSubject.func = function() {                context = this;            }.bind();            testSubject.func();            expect(context).toBe(function() {return this}.call());        });        it('binds properly without a context, and still supplies bound arguments', function() {            var a, context;            testSubject.func = function() {                a = Array.prototype.slice.call(arguments);                context = this;            }.bind(undefined, 1,2,3);            testSubject.func(1,2,3);            expect(a).toEqual([1,2,3,1,2,3]);            expect(context).toBe(function() {return this}.call());        });        it('binds a context properly', function() {            testSubject.func = func.bind(actual);            testSubject.func(1,2,3);            expect(actual).toEqual([1,2,3]);            expect(testSubject.a).toEqual([]);        });        it('binds a context and supplies bound arguments', function() {            testSubject.func = func.bind(actual, 1,2,3);            testSubject.func(4,5,6);            expect(actual).toEqual([1,2,3,4,5,6]);            expect(testSubject.a).toEqual([]);        });                it('returns properly without binding a context', function() {            testSubject.func = function() {                return this;            }.bind();            var context = testSubject.func();            expect(context).toBe(function() {return this}.call());        });        it('returns properly without binding a context, and still supplies bound arguments', function() {            var context;            testSubject.func = function() {                context = this;                return Array.prototype.slice.call(arguments);            }.bind(undefined, 1,2,3);            actual = testSubject.func(1,2,3);            expect(context).toBe(function() {return this}.call());            expect(actual).toEqual([1,2,3,1,2,3]);        });        it('returns properly while binding a context properly', function() {            var ret;            testSubject.func = func.bind(actual);            ret = testSubject.func(1,2,3);            expect(ret).toBe(actual);            expect(ret).not.toBe(testSubject);        });        it('returns properly while binding a context and supplies bound arguments', function() {            var ret;            testSubject.func = func.bind(actual, 1,2,3);            ret = testSubject.func(4,5,6);            expect(ret).toBe(actual);            expect(ret).not.toBe(testSubject);        });        it('passes the correct arguments as a constructor', function() {            var ret, expected = { name: "Correct" };            testSubject.func = function(arg) {                return arg;            }.bind({ name: "Incorrect" });            ret = new testSubject.func(expected);            expect(ret).toBe(expected);        });        it('returns the return value of the bound function when called as a constructor', function () {            var oracle = [1, 2, 3];            var subject = function () {                return oracle;            }.bind(null);            var result = new subject;            expect(result).toBe(oracle);        });        it('returns the correct value if constructor returns primitive', function() {            var oracle = [1, 2, 3];            var subject = function () {                return oracle;            }.bind(null);            var result = new subject;            expect(result).toBe(oracle);            oracle = {};            result = new subject;            expect(result).toBe(oracle);            oracle = function(){};            result = new subject;            expect(result).toBe(oracle);            oracle = "asdf";            result = new subject;            expect(result).not.toBe(oracle);            oracle = null;            result = new subject;            expect(result).not.toBe(oracle);            oracle = true;            result = new subject;            expect(result).not.toBe(oracle);            oracle = 1;            result = new subject;            expect(result).not.toBe(oracle);        });        it('returns the value that instance of original "class" when called as a constructor', function() {            var classA = function(x) {                this.name = x || "A";            }            var classB = classA.bind(null, "B");                        var result = new classB;            expect(result instanceof classA).toBe(true);            expect(result instanceof classB).toBe(true);        });    });});
 |