var reduce = require('../'); var test = require('tape'); test('numeric reduces', function (t) { t.plan(6); var xs = [ 1, 2, 3, 4 ]; t.equal( reduce(xs, function (acc, x) { return acc + x }, 0), 10 ); t.equal( reduce(xs, function (acc, x) { return acc + x }, 100), 110 ); t.equal( reduce(xs, function (acc, x) { return acc + x }), 10 ); var ys = cripple([ 1, 2, 3, 4 ]); t.equal( reduce(ys, function (acc, x) { return acc + x }, 0), 10 ); t.equal( reduce(ys, function (acc, x) { return acc + x }, 100), 110 ); t.equal( reduce(ys, function (acc, x) { return acc + x }), 10 ); }); test('holes', function (t) { t.plan(4); var xs = Array(10); xs[2] = 5; xs[4] = 6; xs[8] = 4; t.equal( reduce(xs, function (acc, x) { return acc + x }), 15 ); t.equal( reduce(xs, function (acc, x) { return acc + x }, 100), 115 ); var ys = cripple(Array(10)); ys[2] = 5; ys[4] = 6; ys[8] = 4; t.equal( reduce(ys, function (acc, x) { return acc + x }), 15 ); t.equal( reduce(ys, function (acc, x) { return acc + x }, 100), 115 ); }); test('object', function (t) { t.plan(1); var obj = { a: 3, b: 4, c: 5 }; var res = reduce(objectKeys(obj), function (acc, key) { acc[key.toUpperCase()] = obj[key] * 111; return acc; }, {}); t.deepEqual(res, { A: 333, B: 444, C: 555 }); }); function cripple (xs) { xs.reduce = undefined; return xs; } var objectKeys = function (obj) { var keys = []; for (var key in obj) { if (hasOwn.call(obj, key)) keys.push(key); } return keys; }; var hasOwn = Object.prototype.hasOwnProperty;