array-enhancements
Version:
Many helpful functions for javascript Arrays
356 lines (248 loc) • 9.61 kB
JavaScript
(function () {
"use strict";
require("ass");
var array = require("../index.js"),
tap = require("tap"),
test = tap.test;
test("array.chunk", function (t) {
t.deepEqual(array.chunk(['a', 'b', 'c', 'd', 'e'], 2), [ [ 'a', 'b' ], [ 'c', 'd' ], [ 'e' ] ], "array.chunk 2");
t.deepEqual(array.chunk(['a', 'b', 'c', 'd', 'e'], 2, true), [ [ 'a', 'b' ], [ , , 'c' ], [ , , , 'd' ], [ , , , , 'e' ] ], "array.chunk 2 preserve keys");
t.end();
});
test("array.column", function (t) {
var ar = [{x: 1, y: 2}, {x: 2}, {y: "b"}, {z: {x:1}}];
t.deepEqual(array.column(ar, "x"), [1, 2], "array.column x");
t.deepEqual(array.column(ar, "y"), [2, "b"], "array.column y");
t.deepEqual(array.column(ar, "z"), [{x:1}], "array.column z");
t.end();
});
test("array.combine", function (t) {
var ar = [1,2,3],
ar2 = [4,5,6],
ar3 = [7,8,9],
ar4 = [10];
array.combine(ar, ar2);
t.deepEqual(ar, [1, 2, 3, 4, 5, 6], "combine two args");
array.combine(ar, ar3, ar4);
t.deepEqual(ar, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "combine three args");
t.end();
});
test("array.countValues", function (t) {
var ar = ['J. Karjalainen', 'J. Karjalainen', 60, '60', 'J. Karjalainen', 'j. karjalainen', 'Fastway', 'FASTWAY', 'Fastway', 'fastway', 'YUP'],
r1 = array.countValues(ar, false),
r2 = array.countValues(ar, true);
t.deepEqual(r1, { '60': 2,
'J. Karjalainen': 3,
'j. karjalainen': 1,
Fastway: 2,
FASTWAY: 1,
fastway: 1,
YUP: 1 }, "countValues case");
t.deepEqual(r2, { '60': 2, 'j. karjalainen': 4, fastway: 4, yup: 1 }, "countValues icase");
t.end();
});
test("array.product", function (t) {
var ar = [2, 4, 6, 8],
r1 = array.product(ar);
t.deepEqual(r1, 384, "array.product");
t.end();
});
test("array.dense", function (t) {
var ar = [];
ar[10] = 2;
ar[20] = 4;
t.deepEqual(array.dense(ar), [2,4], "array.dense");
t.end();
});
test("array.ize", function (t) {
t.deepEqual(array.ize(arguments), [ t ], "from args error");
var obj = {x: 1};
t.deepEqual(array.ize(obj), [ obj ], "ize object error");
var num = 1000;
t.deepEqual(array.ize(num), [ num ], "ize number error");
var bool = true;
t.deepEqual(array.ize(bool), [ bool ], "ize boolean error");
var string = "test";
t.deepEqual(array.ize(string), [ string ], "ize string error");
var fn = function () {};
t.deepEqual(array.ize(fn), [ fn ], "ize string error");
t.end();
});
test("array.add", function (t) {
var ar = [1,2,3],
ar2 = [4,5,6],
ar3 = [7,8,9];
t.deepEqual(array.add(ar, ar2), [1, 2, 3, 4, 5, 6], "add two arrays");
t.deepEqual(array.add(ar, ar2, ar3), [1, 2, 3, 4, 5, 6, 7, 8, 9], "add three arrays");
t.end();
});
test("array.clone", function (t) {
var ar = [1,2,3],
ar2 = [4,{},6],
ar3 = ["xxx", true, 1.0];
t.deepEqual(array.clone(ar), ar, "clone an array");
t.deepEqual(array.clone(ar2), ar2, "clone an array");
t.deepEqual(array.clone(ar3), ar3, "clone an array");
t.equal(array.clone(ar3) !== ar3, true, "clone is not the same as the orignal");
t.end();
});
test("array.insertAt", function (t) {
var ar = [1,2,3];
array.insertAt(ar, 4, 3);
console.log(ar);
t.deepEqual(ar, [1, 2, 3, 4], "4 insertAt 3");
array.insertAt(ar, 0, 0);
t.deepEqual(ar, [0, 1, 2, 3, 4], "4 insertAt 3");
array.insertAt(ar, 9, 2);
t.deepEqual(ar, [0, 1, 9, 2, 3, 4], "4 insertAt 3");
array.insertAt(ar, 9, 50);
t.deepEqual(ar, [0, 1, 9, 2, 3, 4], "out of bounds! no insert");
array.insertAt(ar, 9, -1);
t.deepEqual(ar, [0, 1, 9, 2, 3, 4], "out of bounds! no insert");
t.end();
});
test("array.random", function (t) {
var ar = [1,2,3];
t.equal(ar.indexOf(array.random(ar)) !== -1, true, "value is in the array");
t.equal(ar.indexOf(array.random(ar)) !== -1, true, "value is in the array");
t.equal(ar.indexOf(array.random(ar)) !== -1, true, "value is in the array");
t.equal(ar.indexOf(array.random(ar)) !== -1, true, "value is in the array");
t.equal(ar.indexOf(array.random(ar)) !== -1, true, "value is in the array");
t.equal(ar.indexOf(array.random(ar)) !== -1, true, "value is in the array");
t.end();
});
test("array.unique", function (t) {
var ar = [1, 1, 2, 3, 4, 5, 6, 2, 1, 3, 5, 7, 78, 2, 1, "xxx", "yyy", "xxx"];
t.deepEqual(array.unique(ar), [1, 2, 3, 4, 5, 6, 7, 78, "xxx", "yyy"], "uniqueness");
t.end();
});
test("array.kmap", function (t) {
var ar = [
{key: "a", value: 1},
{key: "b", value: 2},
{key: "c", value: 3},
];
t.deepEqual(array.kmap(ar, "key"), {a: {key: "a", value: 1}, b: {key: "b", value: 2}, c: {key: "c", value: 3}}, "array.kmap");
t.end();
});
test("array.sum", function (t) {
t.deepEqual(array.sum([1, 2, 3]), 6, "array.sum");
t.deepEqual(array.sum([1, 2, 3, 4]), 10, "array.sum");
t.deepEqual(isNaN(array.sum([1, 2, 3, 4, "x"])), true, "array.sum NaN");
t.end();
});
test("array.fill", function (t) {
t.deepEqual(array.fill(0, 5, 9), [9,9,9,9,9], "array.fill");
t.deepEqual(array.fill(1, 5, 9), [,9,9,9,9,9], "array.fill");
t.end();
});
test("array.sortObject", function (t) {
t.deepEqual(array.sortObject([
{value: 1},
{value: 7},
{value: 5},
{value: 2}
], "value"), [
{value: 1},
{value: 2},
{value: 5},
{value: 7}
], "array.sortObject");
t.deepEqual(array.sortObject([
{value: "a"},
{value: "z"},
{value: "h"},
{value: "b"}
], "value"), [
{value: "a"},
{value: "b"},
{value: "h"},
{value: "z"}
], "array.sortObject");
t.end();
});
test("array.shuffle", function (t) {
var shu = array.shuffle([1, 2, 3]);
t.deepEqual(shu.length, 3, "array.shuffle");
t.deepEqual(shu.sort(), [1, 2, 3], "array.shuffle");
t.end();
});
test("array.pad", function (t) {
var input = [12, 10, 9];
t.deepEqual(array.pad(input, 5, 0), [12, 10, 9, 0, 0], "array.pad");
t.deepEqual(array.pad(input, -7, -1), [-1, -1, -1, -1, 12, 10, 9], "array.pad");
t.deepEqual(array.pad(input, 2, "noop"), [12, 10, 9], "array.pad");
t.end();
});
test("array.mapAsync", function (t) {
var input = [500,250,1500],
sum = 0,
keys = [];
array.mapAsync(input, function(v, k, done) {
sum += v;
keys.push(k);
setTimeout(done, k * 250);
}, function() {
t.deepEqual(keys, [0, 1, 2], "loop all keys");
t.deepEqual(sum, 2250, "sum is correct");
t.end();
});
});
test("array.oFilter", function (t) {
var input = [{a: 0, b: 1, c: 2}, {a: 1, b: 1, c: 1}, {a: 2, b: 2, c: 2}, {a: 0, b: 0, c: 2}],
sum = 0,
keys = [];
t.deepEqual(array.oFilter(input, {a:0}), [{a: 0, b: 1, c: 2}, {a: 0, b: 0, c: 2}]);
t.deepEqual(array.oFilter(input, {a:0, c:2}), [{a: 0, b: 1, c: 2}, {a: 0, b: 0, c: 2}]);
t.deepEqual(array.oFilter(input, {b:1}), [{a: 0, b: 1, c: 2}, {a: 1, b: 1, c: 1}]);
t.deepEqual(array.oFilter(input, {b:2}), [{a: 2, b: 2, c: 2}]);
t.end();
});
test("array.mapSerial", function (t) {
var input = [500,250,1500],
sum = 0,
keys = [];
array.mapSerial(input, function(v, k, next, end) {
sum += v;
keys.push(k);
setTimeout(next, k * 250);
}, function() {
t.deepEqual(keys, [0, 1, 2], "loop all keys");
t.deepEqual(sum, 2250, "sum is correct");
t.end();
});
});
test("array.mapSerial end", function (t) {
var input = [500,250,1500],
sum = 0,
keys = [];
array.mapSerial(input, function(v, k, next, end) {
sum += v;
keys.push(k);
if (k == 1) {
end();
} else {
setTimeout(next, k * 250);
}
}, function() {
t.deepEqual(keys, [0, 1], "loop all keys");
t.deepEqual(sum, 750, "sum is correct");
t.end();
});
});
test("array.mapSerial keyed result", function (t) {
var input = [500,250,1500],
sum = 0,
keys = ["x", "y", "z"];
array.mapSerial(input, function(v, k, next, end) {
next(input[k], keys[k]);
}, function(result) {
t.deepEqual(result, {
x: 500,
y: 250,
z: 1500
}, "correct result object");
t.end();
});
});
}());