diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..096746c --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/node_modules/ \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..d9da436 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1029 @@ +{ + "name": "Code-Challenge", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "ansi-colors": { + "version": "3.2.3", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/ansi-colors/-/ansi-colors-3.2.3.tgz", + "integrity": "sha1-V9NbhoboUeLMBMQD8cACA5dqGBM=", + "dev": true + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha1-5gtrDo8wG9l+U3UhW9pAbIURjAs=", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha1-uqVZ7hTO1zRSIputcyZGfGH6vWA=", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA=", + "dev": true + }, + "chai": { + "version": "4.2.0", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/chai/-/chai-4.2.0.tgz", + "integrity": "sha1-dgqnLPION5XoSxKHfODoNzeqKeU=", + "dev": true, + "requires": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "pathval": "^1.1.0", + "type-detect": "^4.0.5" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "check-error": { + "version": "1.0.2", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha1-NIQi2+gtgAswIu709qwQvy5NG0k=", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha1-Sl7Hxk364iw6FBJNus3uhG2Ay8Q=", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "debug": { + "version": "3.2.6", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/debug/-/debug-3.2.6.tgz", + "integrity": "sha1-6D0X3hbYp++3cX7b5fsQE17uYps=", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "deep-eql": { + "version": "3.0.1", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha1-38lARACtHI/gI+faHfHBR8S0RN8=", + "dev": true, + "requires": { + "type-detect": "^4.0.0" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha1-z4jabL7ib+bbcJT2HYcMvYTO6fE=", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "diff": { + "version": "3.5.0", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/diff/-/diff-3.5.0.tgz", + "integrity": "sha1-gAwN0eCov7yVg1wgKtIg/jF+WhI=", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha1-kzoEBShgyF6DwSJHnEdIqOTHIVY=", + "dev": true + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha1-7SljTRm6ukY7bOa4CjchPqtx7EM=", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "es-abstract": { + "version": "1.13.0", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/es-abstract/-/es-abstract-1.13.0.tgz", + "integrity": "sha1-rIYUX91QmdjdSVWMy6Lq+biOJOk=", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.0", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "is-callable": "^1.1.4", + "is-regex": "^1.0.4", + "object-keys": "^1.0.12" + } + }, + "es-to-primitive": { + "version": "1.2.0", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/es-to-primitive/-/es-to-primitive-1.2.0.tgz", + "integrity": "sha1-7fckeAM0VujdqO8J4ArZZQcH83c=", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha1-E7BM2z5sXRnfkatph6hpVhmwqnE=", + "dev": true + }, + "execa": { + "version": "1.0.0", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/execa/-/execa-1.0.0.tgz", + "integrity": "sha1-xiNqW7TfbW8V6I5/AXeYIWdJ3dg=", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha1-SRafHXmTQwZG2mHsxa41XCHJe3M=", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "flat": { + "version": "4.1.0", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/flat/-/flat-4.1.0.tgz", + "integrity": "sha1-CQvsiwXjnLowl0fx1YjwTbr5jbI=", + "dev": true, + "requires": { + "is-buffer": "~2.0.3" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha1-T5RBKoLbMvNuOwuXQfipf+sDH34=", + "dev": true + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha1-wbJVV189wh1Zv8ec09K0axw6VLU=", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "glob": { + "version": "7.1.3", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/glob/-/glob-7.1.3.tgz", + "integrity": "sha1-OWCDLT8VdBCDQtr9OmezMsCWnfE=", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "growl": { + "version": "1.10.5", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/growl/-/growl-1.10.5.tgz", + "integrity": "sha1-8nNdwig2dPpnR4sQGBBZNVw2nl4=", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/has/-/has-1.0.3.tgz", + "integrity": "sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y=", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "dev": true + }, + "he": { + "version": "1.2.0", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/he/-/he-1.2.0.tgz", + "integrity": "sha1-hK5l+n6vsWX922FWauFLrwVmTw8=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w=", + "dev": true + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha1-c5P1r6Weyf9fZ6J2INEcIm4+7AI=", + "dev": true + }, + "is-buffer": { + "version": "2.0.3", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/is-buffer/-/is-buffer-2.0.3.tgz", + "integrity": "sha1-Ts8/z3ScvR5HJonhCaxmJhol5yU=", + "dev": true + }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha1-HhrfIZ4e62hNaR+dagX/DTCiTXU=", + "dev": true + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "^1.0.1" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-symbol": { + "version": "1.0.2", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha1-oFX2rlcZLK7jKeeoYBGLSXqVDzg=", + "dev": true, + "requires": { + "has-symbols": "^1.0.0" + } + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha1-r/FRswv9+o5J4F2iLnQV6d+jeEc=", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha1-bvXS32DlL4LrIopMNz6NHzlyU88=", + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha1-2+w7OrdZdYBxtY/ln8QYca8hQA4=", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha1-tEf2ZwoEVbv+7dETku/zMOoJdUg=", + "dev": true + }, + "log-symbols": { + "version": "2.2.0", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha1-V0Dhxdbw39pK2TI7UzIQfva0xAo=", + "dev": true, + "requires": { + "chalk": "^2.0.1" + } + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha1-fVg6cwZDTAVf5HSw9FB45uG0uSo=", + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } + }, + "mem": { + "version": "4.3.0", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/mem/-/mem-4.3.0.tgz", + "integrity": "sha1-Rhr0l7xK4JYIzbLmDu+2m/90QXg=", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha1-ftLCzMyvhNP/y3pptXcR/CCDQBs=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "mocha": { + "version": "6.2.0", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/mocha/-/mocha-6.2.0.tgz", + "integrity": "sha1-+Ja2QoQ0RdG7i8pg6r2SBriRblY=", + "dev": true, + "requires": { + "ansi-colors": "3.2.3", + "browser-stdout": "1.3.1", + "debug": "3.2.6", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "find-up": "3.0.0", + "glob": "7.1.3", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "3.13.1", + "log-symbols": "2.2.0", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "ms": "2.1.1", + "node-environment-flags": "1.0.5", + "object.assign": "4.1.0", + "strip-json-comments": "2.0.1", + "supports-color": "6.0.0", + "which": "1.3.1", + "wide-align": "1.1.3", + "yargs": "13.2.2", + "yargs-parser": "13.0.0", + "yargs-unparser": "1.5.0" + } + }, + "mocha-param": { + "version": "2.0.0", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/mocha-param/-/mocha-param-2.0.0.tgz", + "integrity": "sha1-LMH5k5Kn4yDfOw0XcqXFHuT/OeM=", + "dev": true + }, + "ms": { + "version": "2.1.1", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/ms/-/ms-2.1.1.tgz", + "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo=", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha1-ozeKdpbOfSI+iPybdkvX7xCJ42Y=", + "dev": true + }, + "node-environment-flags": { + "version": "1.0.5", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/node-environment-flags/-/node-environment-flags-1.0.5.tgz", + "integrity": "sha1-+pMCdfW/Xa4YjWGSsktMi7rD12o=", + "dev": true, + "requires": { + "object.getownpropertydescriptors": "^2.0.3", + "semver": "^5.7.0" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha1-HEfyct8nfzsdrwYWd9nILiMixg4=", + "dev": true + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha1-lovxEA15Vrs8oIbwBvhGs7xACNo=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.getownpropertydescriptors": { + "version": "2.0.3", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", + "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.5.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha1-qAKm7hfyTBBIOrmTVxnO9O0Wvxo=", + "dev": true, + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-is-promise": { + "version": "2.1.0", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha1-kYzrrqJIpiz3/6uOO8qMX4gvxC4=", + "dev": true + }, + "p-limit": { + "version": "2.2.0", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha1-QXyZQeYCepq8ulCS3SkE4lW1+8I=", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha1-Mi1poFwCZLJZl9n0DNiokasAZKQ=", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha1-yyhoVA4xPWHeWPr741zpAE1VQOY=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "pathval": { + "version": "1.1.0", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/pathval/-/pathval-1.1.0.tgz", + "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", + "dev": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/pump/-/pump-3.0.0.tgz", + "integrity": "sha1-tKIRaBW94vTh6mAjVOjHVWUQemQ=", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha1-0LMp7MfMD2Fkn2IhW+aa9UqomJs=", + "dev": true + }, + "semver": { + "version": "5.7.0", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/semver/-/semver-5.7.0.tgz", + "integrity": "sha1-eQp89v6lRZuslhELKbYEEtyP+Ws=", + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "supports-color": { + "version": "6.0.0", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/supports-color/-/supports-color-6.0.0.tgz", + "integrity": "sha1-ds/nQs8fQbubHCmtAwaMBbTA5Ao=", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha1-dkb7XxiHHPu3dJ5pvTmmOI63RQw=", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/which/-/which-1.3.1.tgz", + "integrity": "sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo=", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha1-rgdOa9wMFKQx6ATmJFScYzsABFc=", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha1-le+U+F7MgdAHwmThkKEg8KPIVms=", + "dev": true + }, + "yargs": { + "version": "13.2.2", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/yargs/-/yargs-13.2.2.tgz", + "integrity": "sha1-DBAfWArpXOp/Odkn53cOP9yX+ZM=", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "os-locale": "^3.1.0", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha1-InZ74htirxCBV0MG9prFG2IgOWE=", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "yargs-parser": { + "version": "13.0.0", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/yargs-parser/-/yargs-parser-13.0.0.tgz", + "integrity": "sha1-P8RPPnaovbHMNgLoYBCGAuXM3os=", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "yargs-unparser": { + "version": "1.5.0", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/yargs-unparser/-/yargs-unparser-1.5.0.tgz", + "integrity": "sha1-8rsqfoPLyHu5XI5XKCigbJrdbg0=", + "dev": true, + "requires": { + "flat": "^4.1.0", + "lodash": "^4.17.11", + "yargs": "^12.0.5" + }, + "dependencies": { + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha1-+Xj6TJDR3+f/LWvtoqUV5xO9z0o=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "yargs": { + "version": "12.0.5", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha1-BfWZe2CWR7ZPZrgeO0sQo2jnrRM=", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://ufginsurance.jfrog.io/ufginsurance/api/npm/npm/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha1-h5oIZZc7yp9rq1y987HGfsfTvPQ=", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..7f70068 --- /dev/null +++ b/package.json @@ -0,0 +1,25 @@ +{ + "name": "Code-Challenge", + "version": "1.0.0", + "description": "Given an array of positive numbers, write a method, that \"adds one\" to the \"number\" represented by the array, like an odometer.", + "main": "src/index.js", + "scripts": { + "test": "mocha --watch src/tests.js" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/dustinyschild/Code-Challenge.git" + }, + "keywords": [], + "author": "", + "license": "ISC", + "bugs": { + "url": "https://github.com/dustinyschild/Code-Challenge/issues" + }, + "homepage": "https://github.com/dustinyschild/Code-Challenge#readme", + "devDependencies": { + "chai": "^4.2.0", + "mocha": "^6.2.0", + "mocha-param": "^2.0.0" + } +} diff --git a/src/index.js b/src/index.js new file mode 100644 index 0000000..641428b --- /dev/null +++ b/src/index.js @@ -0,0 +1,83 @@ +odometer = function(array) { + let addOne = true + + for (let i = array.length; i--; i > -1) { + let digit = array[i] + + if (digit === 9 && addOne) { + array[i] = 0 + addOne = true + } else if (addOne) { + array[i] += 1 + addOne = false + } + } + + return array +} + +odometerReverse = function(array) { + let minusOne = true + + for (let i = array.length - 1; i > -1; i--) { + let digit = array[i] + + if (digit === 0 && minusOne) { + array[i] = 9 + minusOne = true + } else if (minusOne) { + array[i] -= 1 + minusOne = false + } + } + + return array +} + +const odometerVariableRadix = function(array, radix) { + //assuming index 0 can set the expected return type because they should all be strings OR integers + const returnType = typeof array[0] + const carryNumber = parseInt(10, radix) - 1 + let revertToStringValues = false + + let addOne = true + for (let i = array.length; i--; i > -1) { + let digit = parseInt(array[i], radix) + + if (digit === carryNumber && addOne) { + array[i] = 0 + addOne = true + } else if (addOne) { + array[i] = digit += 1 + addOne = false + } + + //convert back to base characters + if (array[i] > 9){ + array[i] = Number(digit).toString(radix).toUpperCase() + } + + //only change type if it does not match the returnType + console.log(returnType) + if (returnType === "number") { + let parseValue = parseInt(array[i], 10) + //if a string cannot be parsed as an integer, default to string values. + if (isNaN(parseValue)) { + revertToStringValues = true + } else { + array[i] = parseValue + } + } + } + + console.log(revertToStringValues || returnType === "string") + if (revertToStringValues || returnType === "string") { + for (i = 0; i < array.length; i++) { + array[i] = array[i].toString(radix) + } + } + + return array +} + +module.exports = { odometer, odometerReverse, odometerVariableRadix }; \ No newline at end of file diff --git a/src/tests.js b/src/tests.js new file mode 100644 index 0000000..a00e63f --- /dev/null +++ b/src/tests.js @@ -0,0 +1,87 @@ +const itParam = require('mocha-param'); +const { expect } = require('chai'); +const { odometer, odometerReverse, odometerVariableRadix } = require("./index"); + +describe("Odometer function", function() { + const cases = [ + {input: [0, 0, 0, 0], output: [0, 0, 0, 1]}, + {input: [4, 3, 9, 5], output: [4, 3, 9, 6]}, + {input: [4, 3, 4, 9], output: [4, 3, 5, 0]}, + {input: [4, 8, 9, 9], output: [4, 9, 0, 0]}, + {input: [4, 9, 9, 9], output: [5, 0, 0, 0]}, + {input: [9, 9, 9, 9], output: [0, 0, 0, 0]}, + ] + itParam("should increment array 'number'", cases, function({input, output}) { + let result = odometer(input) + expect(result).to.eql(output) + }) +}) + +describe("Odometer reverse function", function() { + const cases = [ + {input: [4, 3, 9, 5], output: [4, 3, 9, 4]}, + {input: [4, 3, 4, 0], output: [4, 3, 3, 9]}, + {input: [4, 3, 0, 0], output: [4, 2, 9, 9]}, + {input: [4, 0, 0, 0], output: [3, 9, 9, 9]}, + {input: [0, 0, 0, 0], output: [9, 9, 9, 9]}, + ] + itParam("should decrement array 'number'", cases, function({input, output}) { + let result = odometerReverse(input) + expect(result).to.eql(output) + }) +}) + +describe("Odometer radix agnostic function", function() { + const hexadecimalCases = [ + {input: [4, 3, 9, 3], output: [4, 3, 9, 4], radix: 16}, + {input: ["4", "3", "9", "3"], output: ["4", "3", "9", "4"], radix: 16}, + {input: ["4", "3", "4", "9"], output: ["4", "3", "4", "A"], radix: 16}, + {input: ["4", "3", "0", "A"], output: ["4", "3", "0", "B"], radix: 16}, + {input: ["3", "9", "0", "F"], output: ["3", "9", "1", "0"], radix: 16}, + {input: ["3", "9", "9", "F"], output: ["3", "9", "A", "0"], radix: 16}, + {input: ["3", "9", "A", "F"], output: ["3", "9", "B", "0"], radix: 16}, + {input: ["3", "0", "F", "F"], output: ["3", "1", "0", "0"], radix: 16}, + {input: ["3", "9", "F", "F"], output: ["3", "A", "0", "0"], radix: 16}, + {input: ["3", "A", "F", "F"], output: ["3", "B", "0", "0"], radix: 16}, + {input: ["0", "F", "F", "F"], output: ["1", "0", "0", "0"], radix: 16}, + {input: ["9", "F", "F", "F"], output: ["A", "0", "0", "0"], radix: 16}, + {input: ["A", "F", "F", "F"], output: ["B", "0", "0", "0"], radix: 16}, + {input: ["F", "F", "F", "F"], output: ["0", "0", "0", "0"], radix: 16}, + ] + itParam("should increment array 'number' given a radix of 16", hexadecimalCases, function({input, output, radix}) { + let result = odometerVariableRadix(input, radix) + expect(result).to.eql(output) + }) + + const specialCase = {input: [4, 3, 4, 9], output: ["4", "3", "4", "A"], radix: 16} + it("should return string values if not all values can be parsed as integers", function() { + const { input, output, radix } = specialCase + let result = odometerVariableRadix(input, radix) + expect(result).to.eql(output) + }) + + const decimalCases = [ + {input: [0, 0, 0, 0], output: [0, 0, 0, 1], radix: 10}, + {input: [4, 3, 9, 5], output: [4, 3, 9, 6], radix: 10}, + {input: [4, 3, 4, 9], output: [4, 3, 5, 0], radix: 10}, + {input: [4, 8, 9, 9], output: [4, 9, 0, 0], radix: 10}, + {input: [4, 9, 9, 9], output: [5, 0, 0, 0], radix: 10}, + {input: [9, 9, 9, 9], output: [0, 0, 0, 0], radix: 10}, + ] + itParam("should increment array 'number' given a radix of 10", decimalCases, function({input, output, radix}) { + let result = odometerVariableRadix(input, radix) + expect(result).to.eql(output) + }) + + const octalCases = [ + {input: [4, 3, 4, 3], output: [4, 3, 4, 4], radix: 8}, + {input: [4, 3, 4, 7], output: [4, 3, 5, 0], radix: 8}, + {input: [4, 3, 7, 7], output: [4, 4, 0, 0], radix: 8}, + {input: [4, 7, 7, 7], output: [5, 0, 0, 0], radix: 8}, + {input: [7, 7, 7, 7], output: [0, 0, 0, 0], radix: 8}, + ] + itParam("should increment array 'number' given a radix of 8", octalCases, function({input, output, radix}) { + let result = odometerVariableRadix(input, radix) + expect(result).to.eql(output) + }) +}) \ No newline at end of file