UNPKG

luhn-generator

Version:

A generator of numbers that passes the validation of Luhn algorithm or Luhn formula, also known as the 'modulus 10' or 'mod 10' algorithm

83 lines (72 loc) 2.76 kB
'use strict'; var keys = require('object-keys'); var map = require('array-map'); var define = require('define-properties'); var hasSymbols = typeof Symbol === 'function' && typeof Symbol('foo') === 'symbol'; module.exports = function (entries, t) { var a = {}; var b = {}; var c = {}; var obj = { a: a, b: b, c: c }; t.deepEqual(entries(obj), [['a', a], ['b', b], ['c', c]], 'basic support'); t.deepEqual(entries({ a: a, b: a, c: c }), [['a', a], ['b', a], ['c', c]], 'duplicate entries are included'); t.test('entries are in the same order as keys', function (st) { var object = { a: a, b: b }; object[0] = 3; object.c = c; object[1] = 4; delete object[0]; var objKeys = keys(object); var objEntries = map(objKeys, function (key) { return [key, object[key]]; }); st.deepEqual(entries(object), objEntries, 'entries match key order'); st.end(); }); t.test('non-enumerable properties are omitted', { skip: !Object.defineProperty }, function (st) { var object = { a: a, b: b }; Object.defineProperty(object, 'c', { enumerable: false, value: c }); st.deepEqual(entries(object), [['a', a], ['b', b]], 'non-enumerable property‘s value is omitted'); st.end(); }); t.test('inherited properties are omitted', function (st) { var F = function G() {}; F.prototype.a = a; var f = new F(); f.b = b; st.deepEqual(entries(f), [['b', b]], 'only own properties are included'); st.end(); }); t.test('Symbol properties are omitted', { skip: !hasSymbols }, function (st) { var object = { a: a, b: b, c: c }; var enumSym = Symbol('enum'); var nonEnumSym = Symbol('non enum'); object[enumSym] = enumSym; object.d = enumSym; Object.defineProperty(object, nonEnumSym, { enumerable: false, value: nonEnumSym }); st.deepEqual(entries(object), [['a', a], ['b', b], ['c', c], ['d', enumSym]], 'symbol properties are omitted'); st.end(); }); t.test('not-yet-visited keys deleted on [[Get]] must not show up in output', { skip: !define.supportsDescriptors }, function (st) { var o = { a: 1, b: 2, c: 3 }; Object.defineProperty(o, 'a', { get: function () { delete this.b; return 1; } }); st.deepEqual(entries(o), [['a', 1], ['c', 3]], 'when "b" is deleted prior to being visited, it should not show up'); st.end(); }); t.test('not-yet-visited keys made non-enumerable on [[Get]] must not show up in output', { skip: !define.supportsDescriptors }, function (st) { var o = { a: 'A', b: 'B' }; Object.defineProperty(o, 'a', { get: function () { Object.defineProperty(o, 'b', { enumerable: false }); return 'A'; } }); st.deepEqual(entries(o), [['a', 'A']], 'when "b" is made non-enumerable prior to being visited, it should not show up'); st.end(); }); };