diff --git a/lib/common.js b/lib/common.js index 1a3de1a..5645e26 100755 --- a/lib/common.js +++ b/lib/common.js @@ -77,6 +77,7 @@ function boolFromString(value, default_, errName) { */ function jsonStream(arr, stream) { stream = stream || process.stdout; + arr.forEach(function (elem) { stream.write(JSON.stringify(elem) + '\n'); }); @@ -89,6 +90,9 @@ function jsonStream(arr, stream) { * @param {Array} valid (optional) - an array to validate pairs */ function kvToObj(kvs, valid) { + assert.arrayOfString(kvs); + assert.optionalArrayOfString(valid); + var o = {}; for (var i = 0; i < kvs.length; i++) { var kv = kvs[i]; @@ -99,7 +103,7 @@ function kvToObj(kvs, valid) { kv)); var k = kv.slice(0, idx); var v = kv.slice(idx + 1); - if (valid.indexOf(k) === -1) + if (valid && valid.indexOf(k) === -1) throw new errors.UsageError(format( 'invalid filter name: "%s" (must be one of "%s")', k, valid.join('", "'))); diff --git a/test/unit/common.test.js b/test/unit/common.test.js index c32079f..169bc96 100644 --- a/test/unit/common.test.js +++ b/test/unit/common.test.js @@ -23,6 +23,152 @@ var log = require('../lib/log'); // ---- tests +test('objCopy+deepObjCopy', function (t) { + var o1 = {foo: 'bar'}; + var o2 = {arr: [1,2,3]}; + + // shallow copy + var c1 = common.objCopy(o1); + var c2 = common.objCopy(o2); + + t.notEqual(c1, o1); + t.deepEqual(c1, o1); + + t.notEqual(c2, o2); + t.deepEqual(c2, o2); + + t.equal(c2.arr, o2.arr); + + var foo = {}; + common.objCopy(o1, foo); + t.notEqual(foo, o1); + t.deepEqual(foo, o1); + + // deep copy + var d1 = common.deepObjCopy(o1); + var d2 = common.deepObjCopy(o2); + + t.notEqual(d1, o1); + t.deepEqual(d1, o1); + + t.notEqual(d2, o2); + t.deepEqual(d2, o2); + + t.notEqual(d2.arr, o2.arr); + t.deepEqual(d2.arr, o2.arr); + + t.end(); +}); + +test('zeroPad', function (t) { + var zp = common.zeroPad; + + t.equal(zp(5, 3), '005'); + t.equal(zp(50, 3), '050'); + t.equal(zp(500, 3), '500'); + + t.equal(zp('5', 3), '005'); + t.equal(zp('50', 3), '050'); + t.equal(zp('500', 3), '500'); + + t.end(); +}); + +test('boolFromString', function (t) { + var bfs = common.boolFromString; + + t.equal(bfs(true), true); + t.equal(bfs('true'), true); + t.equal(bfs('1'), true); + + t.equal(bfs(false), false); + t.equal(bfs('false'), false); + t.equal(bfs('0'), false); + + t.equal(bfs(undefined, false), false); + t.equal(bfs(undefined, true), true); + t.equal(bfs(undefined, 'foo'), 'foo'); + + t.throws(bfs.bind(null, '2')); + t.throws(bfs.bind(null, 500)); + t.throws(bfs.bind(null, Infinity)); + t.throws(bfs.bind(null, NaN)); + + t.end(); +}); + +test('jsonStream', function (t) { + // TODO this is a lame excuse for a stream + var s = ''; + var stream = { + write: function (o) { s += o; } + }; + + var obj = [ + 'foo', + 'bar', + 'baz' + ]; + + common.jsonStream(obj, stream); + t.equal(s, '"foo"\n"bar"\n"baz"\n'); + + t.end(); +}); + +test('kvToObj', function (t) { + var arr = ['foo=1', 'bar=2', 'baz=3']; + var o = { + foo: '1', + bar: '2', + baz: '3' + }; + var kv; + + // no valid parameter + kv = common.kvToObj(arr); + t.deepEqual(kv, o); + + // valid parameters + kv = common.kvToObj(arr, ['foo', 'bar', 'baz']); + t.deepEqual(kv, o); + + // invalid parameters + t.throws(function () { + common.kvToObj(arr, ['uh-oh']); + }); + + t.end(); +}); + +test('longAgo', function (t) { + var la = common.longAgo; + var now = new Date(); + var then; + + t.equal(la(now, now), '0s'); + + then = now - 1000; + t.equal(la(then, now), '1s'); + + then = now - 60 * 1000; + t.equal(la(then, now), '1m'); + + then = now - 60 * 60 * 1000; + t.equal(la(then, now), '1h'); + + then = now - 24 * 60 * 60 * 1000; + t.equal(la(then, now), '1d'); + + then = now - 7 * 24 * 60 * 60 * 1000; + t.equal(la(then, now), '1w'); + + then = now - 365 * 24 * 60 * 60 * 1000; + t.equal(la(then, now), '1y'); + + t.end(); +}); + test('humanDurationFromMs', function (t) { var humanDurationFromMs = common.humanDurationFromMs; var ms = 1000;