diff --git a/package-lock.json b/package-lock.json index 33b23f7f..44c740dc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -47,6 +47,7 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", "dev": true, + "peer": true, "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/generator": "^7.29.0", @@ -1124,7 +1125,6 @@ "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-6.0.0.tgz", "integrity": "sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w==", "dev": true, - "peer": true, "engines": { "node": ">= 20" } @@ -1153,7 +1153,6 @@ "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-11.0.3.tgz", "integrity": "sha512-FWFlNxghg4HrXkD3ifYbS/IdL/mDHjh9QcsNyhQjN8dplUoZbejsdpmuqdA76nxj2xoWPs7p8uX2SNr9rYu0Ag==", "dev": true, - "peer": true, "dependencies": { "@octokit/types": "^16.0.0", "universal-user-agent": "^7.0.2" @@ -1167,7 +1166,6 @@ "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-9.0.3.tgz", "integrity": "sha512-grAEuupr/C1rALFnXTv6ZQhFuL1D8G5y8CN04RgrO4FIPMrtm+mcZzFG7dcBm+nq+1ppNixu+Jd78aeJOYxlGA==", "dev": true, - "peer": true, "dependencies": { "@octokit/request": "^10.0.6", "@octokit/types": "^16.0.0", @@ -1181,8 +1179,7 @@ "version": "27.0.0", "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-27.0.0.tgz", "integrity": "sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA==", - "dev": true, - "peer": true + "dev": true }, "node_modules/@octokit/plugin-paginate-rest": { "version": "2.21.3", @@ -1244,7 +1241,6 @@ "resolved": "https://registry.npmjs.org/@octokit/request/-/request-10.0.8.tgz", "integrity": "sha512-SJZNwY9pur9Agf7l87ywFi14W+Hd9Jg6Ifivsd33+/bGUQIjNujdFiXII2/qSlN2ybqUHfp5xpekMEjIBTjlSw==", "dev": true, - "peer": true, "dependencies": { "@octokit/endpoint": "^11.0.3", "@octokit/request-error": "^7.0.2", @@ -1262,7 +1258,6 @@ "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-7.1.0.tgz", "integrity": "sha512-KMQIfq5sOPpkQYajXHwnhjCC0slzCNScLHs9JafXc4RAJI+9f+jNDlBNaIMTvazOPLgb4BnlhGJOTbnN0wIjPw==", "dev": true, - "peer": true, "dependencies": { "@octokit/types": "^16.0.0" }, @@ -1459,7 +1454,6 @@ "resolved": "https://registry.npmjs.org/@octokit/types/-/types-16.0.0.tgz", "integrity": "sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg==", "dev": true, - "peer": true, "dependencies": { "@octokit/openapi-types": "^27.0.0" } @@ -1706,6 +1700,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "dev": true, + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -2366,8 +2361,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-4.0.0.tgz", "integrity": "sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ==", - "dev": true, - "peer": true + "dev": true }, "node_modules/bindings": { "version": "1.5.0", @@ -2471,6 +2465,7 @@ "url": "https://github.com/sponsors/ai" } ], + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -3401,6 +3396,7 @@ "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -3456,6 +3452,7 @@ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.2.tgz", "integrity": "sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ==", "dev": true, + "peer": true, "bin": { "eslint-config-prettier": "bin/cli.js" }, @@ -3543,6 +3540,7 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "dev": true, + "peer": true, "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.9", @@ -3612,6 +3610,7 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-8.0.1.tgz", "integrity": "sha512-ZjOjbjEi6jd82rIpFSgagv4CHWzG9xsQAVp1ZPlhRnnYxcTgENUVBvhYmkQ7GvT1QFijUSo69RaiOJKhMu6i8w==", "dev": true, + "peer": true, "dependencies": { "eslint-plugin-es": "^1.3.1", "eslint-utils": "^1.3.1", @@ -3671,6 +3670,7 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.3.1.tgz", "integrity": "sha512-bY2sGqyptzFBDLh/GMbAxfdJC+b0f23ME63FOE4+Jao0oZ3E1LEwFtWJX/1pGMJLiTtrSSern2CRM/g+dfc0eQ==", "dev": true, + "peer": true, "engines": { "node": ">=6" } @@ -3694,6 +3694,7 @@ "url": "https://feross.org/support" } ], + "peer": true, "peerDependencies": { "eslint": ">=5.0.0" } @@ -4197,8 +4198,7 @@ "type": "opencollective", "url": "https://opencollective.com/fastify" } - ], - "peer": true + ] }, "node_modules/fast-deep-equal": { "version": "3.1.3", @@ -7291,8 +7291,7 @@ "version": "3.5.7", "resolved": "https://registry.npmjs.org/json-with-bigint/-/json-with-bigint-3.5.7.tgz", "integrity": "sha512-7ei3MdAI5+fJPVnKlW77TKNKwQ5ppSzWvhPuSuINT/GYW9ZOC1eRKOuhV9yHG5aEsUPj9BBx5JIekkmoLHxZOw==", - "dev": true, - "peer": true + "dev": true }, "node_modules/json5": { "version": "2.2.3", @@ -8463,6 +8462,7 @@ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", "dev": true, + "peer": true, "bin": { "prettier": "bin/prettier.cjs" }, @@ -8800,6 +8800,7 @@ "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", "dev": true, + "peer": true, "dependencies": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", @@ -10212,8 +10213,7 @@ "version": "7.0.3", "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.3.tgz", "integrity": "sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==", - "dev": true, - "peer": true + "dev": true }, "node_modules/universalify": { "version": "2.0.1", diff --git a/package.json b/package.json index 068403cd..d8c89d94 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "scripts": { "init": "mate-scripts init", "start": "mate-scripts start", - "format": "prettier --ignore-path .prettierignore --write './src/**/*.js'", + "format": "prettier --ignore-path .prettierignore --write src/**/*.js", "lint": "npm run format && mate-scripts lint", "test:only": "mate-scripts test", "update": "mate-scripts update", diff --git a/src/splitInteger.test.js b/src/splitInteger.test.js index 24003dd5..dc63c742 100644 --- a/src/splitInteger.test.js +++ b/src/splitInteger.test.js @@ -2,12 +2,86 @@ const splitInteger = require('./splitInteger'); -test(`should split a number into equal parts - if a value is divisible by a numberOfParts`, () => {}); +describe('splitInteger', () => { + // Provided examples + test('should return [8] for splitInteger(8, 1)', () => { + expect(splitInteger(8, 1)).toEqual([8]); + }); -test(`should return a part equals to a value - when splitting into 1 part`, () => {}); + test('should return [3, 3] for splitInteger(6, 2)', () => { + expect(splitInteger(6, 2)).toEqual([3, 3]); + }); -test('should sort parts ascending if they are not equal', () => {}); + test('should return [4, 4, 4, 5] for splitInteger(17, 4)', () => { + expect(splitInteger(17, 4)).toEqual([4, 4, 4, 5]); + }); -test('should add zeros if value < numberOfParts', () => {}); + test('should return [5, 5, 5, 5, 6, 6] for splitInteger(32, 6)', () => { + expect(splitInteger(32, 6)).toEqual([5, 5, 5, 5, 6, 6]); + }); + + // General property checks + describe('general properties', () => { + const testCases = [ + { value: 10, parts: 3, expected: [3, 3, 4] }, + { value: 7, parts: 3, expected: [2, 2, 3] }, + { + value: 100, + parts: 10, + expected: [10, 10, 10, 10, 10, 10, 10, 10, 10, 10], + }, + { value: 5, parts: 2, expected: [2, 3] }, + { value: 1, parts: 3, expected: [0, 0, 1] }, + ]; + + test.each(testCases)( + 'should split $value into $parts parts', + ({ value, parts, expected }) => { + const result = splitInteger(value, parts); + + // 1. Correct length + expect(result).toHaveLength(parts); + + // 2. Sum equals original value + const sum = result.reduce((acc, num) => acc + num, 0); + + expect(sum).toBe(value); + + // 3. Difference between max and min is <= 1 + const max = Math.max(...result); + const min = Math.min(...result); + + expect(max - min).toBeLessThanOrEqual(1); + + // 4. Sorted ascending + const sortedResult = [...result].sort((a, b) => a - b); + + expect(result).toEqual(sortedResult); + + // 5. Matches expected (for sanity) + expect(result).toEqual(expected); + }, + ); + }); + + // Edge cases + describe('edge cases', () => { + test('should handle a single part equal to the value', () => { + expect(splitInteger(42, 1)).toEqual([42]); + }); + + test('should handle value smaller than the number of parts', () => { + expect(splitInteger(3, 5)).toEqual([0, 0, 1, 1, 1]); + }); + + test('should handle large numbers', () => { + const value = 1000000; + const parts = 7; + const result = splitInteger(value, parts); + + expect(result).toHaveLength(parts); + expect(result.reduce((acc, num) => acc + num, 0)).toBe(value); + expect(Math.max(...result) - Math.min(...result)).toBeLessThanOrEqual(1); + }); + }); +});