177 lines
4.9 KiB
JavaScript
177 lines
4.9 KiB
JavaScript
|
|
|
||
|
|
'use strict';
|
||
|
|
|
||
|
|
var tap = require('tap')
|
||
|
|
, test = tap.test
|
||
|
|
, sinon = require('sinon')
|
||
|
|
, shimmer = require('../index.js')
|
||
|
|
;
|
||
|
|
|
||
|
|
var outsider = 0;
|
||
|
|
function counter() { return ++outsider; }
|
||
|
|
function anticounter() { return --outsider; }
|
||
|
|
|
||
|
|
var generator = {
|
||
|
|
inc : counter,
|
||
|
|
dec : anticounter
|
||
|
|
};
|
||
|
|
|
||
|
|
var arrow = {
|
||
|
|
in : counter,
|
||
|
|
out : anticounter
|
||
|
|
};
|
||
|
|
|
||
|
|
var nester = {
|
||
|
|
in : counter,
|
||
|
|
out : anticounter
|
||
|
|
};
|
||
|
|
|
||
|
|
test("should wrap multiple functions safely", function (t) {
|
||
|
|
t.plan(9);
|
||
|
|
|
||
|
|
t.equal(counter, generator.inc, "basic function equality testing should work");
|
||
|
|
t.equal(anticounter, generator.dec, "basic function equality testing should work");
|
||
|
|
t.doesNotThrow(function () { generator.inc(); });
|
||
|
|
t.doesNotThrow(function () { generator.dec(); });
|
||
|
|
t.equal(0, outsider, "calls have side effects");
|
||
|
|
|
||
|
|
var count = 0;
|
||
|
|
function wrapper(original) {
|
||
|
|
return function () {
|
||
|
|
count++;
|
||
|
|
var returned = original.apply(this, arguments);
|
||
|
|
count++;
|
||
|
|
return returned;
|
||
|
|
};
|
||
|
|
}
|
||
|
|
shimmer.massWrap(generator, ['inc', 'dec'], wrapper);
|
||
|
|
|
||
|
|
t.doesNotThrow(function () { generator.inc(); });
|
||
|
|
t.doesNotThrow(function () { generator.dec(); });
|
||
|
|
t.equal(4, count, "both pre and post increments should have happened");
|
||
|
|
t.equal(0, outsider, "original function has still been called");
|
||
|
|
});
|
||
|
|
|
||
|
|
test("should wrap multiple functions on multiple modules safely", function (t) {
|
||
|
|
t.plan(15);
|
||
|
|
|
||
|
|
t.equal(counter, arrow.in, "basic function equality testing should work");
|
||
|
|
t.equal(counter, nester.in, "basic function equality testing should work");
|
||
|
|
t.equal(anticounter, arrow.out, "basic function equality testing should work");
|
||
|
|
t.equal(anticounter, nester.out, "basic function equality testing should work");
|
||
|
|
|
||
|
|
t.doesNotThrow(function () { arrow.in(); });
|
||
|
|
t.doesNotThrow(function () { nester.in(); });
|
||
|
|
t.doesNotThrow(function () { arrow.out(); });
|
||
|
|
t.doesNotThrow(function () { nester.out(); });
|
||
|
|
|
||
|
|
t.equal(0, outsider, "calls have side effects");
|
||
|
|
|
||
|
|
var count = 0;
|
||
|
|
function wrapper(original) {
|
||
|
|
return function () {
|
||
|
|
count++;
|
||
|
|
var returned = original.apply(this, arguments);
|
||
|
|
count++;
|
||
|
|
return returned;
|
||
|
|
};
|
||
|
|
}
|
||
|
|
shimmer.massWrap([arrow, nester], ['in', 'out'], wrapper);
|
||
|
|
|
||
|
|
t.doesNotThrow(function () { arrow.in(); });
|
||
|
|
t.doesNotThrow(function () { arrow.out(); });
|
||
|
|
t.doesNotThrow(function () { nester.in(); });
|
||
|
|
t.doesNotThrow(function () { nester.out(); });
|
||
|
|
|
||
|
|
t.equal(8, count, "both pre and post increments should have happened");
|
||
|
|
t.equal(0, outsider, "original function has still been called");
|
||
|
|
});
|
||
|
|
|
||
|
|
test("wrap called with no arguments", function (t) {
|
||
|
|
t.plan(2);
|
||
|
|
|
||
|
|
var mock = sinon.expectation
|
||
|
|
.create('logger')
|
||
|
|
.twice();
|
||
|
|
shimmer({logger : mock});
|
||
|
|
|
||
|
|
t.doesNotThrow(function () {
|
||
|
|
shimmer.massWrap();
|
||
|
|
}, "wrapping with no arguments doesn't throw");
|
||
|
|
|
||
|
|
t.doesNotThrow(function () {
|
||
|
|
mock.verify();
|
||
|
|
}, "logger was called with the expected message");
|
||
|
|
});
|
||
|
|
|
||
|
|
test("wrap called with module but nothing else", function (t) {
|
||
|
|
t.plan(2);
|
||
|
|
|
||
|
|
var mock = sinon.expectation
|
||
|
|
.create('logger')
|
||
|
|
.withExactArgs("must provide one or more functions to wrap on modules")
|
||
|
|
.once();
|
||
|
|
shimmer({logger : mock});
|
||
|
|
|
||
|
|
t.doesNotThrow(function () {
|
||
|
|
shimmer.massWrap(generator);
|
||
|
|
}, "wrapping with only 1 argument doesn't throw");
|
||
|
|
|
||
|
|
t.doesNotThrow(function () {
|
||
|
|
mock.verify();
|
||
|
|
}, "logger was called with the expected message");
|
||
|
|
});
|
||
|
|
|
||
|
|
test("wrap called with original but no wrapper", function (t) {
|
||
|
|
t.plan(2);
|
||
|
|
|
||
|
|
var mock = sinon.expectation
|
||
|
|
.create('logger')
|
||
|
|
.twice();
|
||
|
|
shimmer({logger : mock});
|
||
|
|
|
||
|
|
t.doesNotThrow(function () {
|
||
|
|
shimmer.massWrap(generator, ['inc']);
|
||
|
|
}, "wrapping with only original function doesn't throw");
|
||
|
|
|
||
|
|
t.doesNotThrow(function () {
|
||
|
|
mock.verify();
|
||
|
|
}, "logger was called with the expected message");
|
||
|
|
});
|
||
|
|
|
||
|
|
test("wrap called with non-function original", function (t) {
|
||
|
|
t.plan(2);
|
||
|
|
|
||
|
|
var mock = sinon.expectation
|
||
|
|
.create('logger')
|
||
|
|
.withExactArgs("must provide one or more functions to wrap on modules")
|
||
|
|
.once();
|
||
|
|
shimmer({logger : mock});
|
||
|
|
|
||
|
|
t.doesNotThrow(function () {
|
||
|
|
shimmer.massWrap({orange : 'slices'}, 'orange', function () {});
|
||
|
|
}, "wrapping non-function original doesn't throw");
|
||
|
|
|
||
|
|
t.doesNotThrow(function () {
|
||
|
|
mock.verify();
|
||
|
|
}, "logger was called with the expected message");
|
||
|
|
});
|
||
|
|
|
||
|
|
test("wrap called with non-function wrapper", function (t) {
|
||
|
|
t.plan(2);
|
||
|
|
|
||
|
|
var mock = sinon.expectation
|
||
|
|
.create('logger')
|
||
|
|
.withArgs("must provide one or more functions to wrap on modules")
|
||
|
|
.once();
|
||
|
|
shimmer({logger : mock});
|
||
|
|
|
||
|
|
t.doesNotThrow(function () {
|
||
|
|
shimmer.massWrap({orange : function () {}}, 'orange', 'hamchunx');
|
||
|
|
}, "wrapping with non-function wrapper doesn't throw");
|
||
|
|
|
||
|
|
t.doesNotThrow(function () {
|
||
|
|
mock.verify();
|
||
|
|
}, "logger was called with the expected message");
|
||
|
|
});
|