Loading package-lock.json +77 −1 Original line number Diff line number Diff line Loading @@ -8,7 +8,8 @@ "jsdom": "^26.1.0", "jsdom-global": "^3.0.2", "jshint": "^2.13.6", "mocha": "^11.7.2" "mocha": "^11.7.2", "sinon": "^21.0.0" } }, "node_modules/@asamuzakjp/css-color": { Loading Loading @@ -240,6 +241,43 @@ "node": ">=14" } }, "node_modules/@sinonjs/commons": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "license": "BSD-3-Clause", "dependencies": { "type-detect": "4.0.8" } }, "node_modules/@sinonjs/fake-timers": { "version": "13.0.5", "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-13.0.5.tgz", "integrity": "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==", "license": "BSD-3-Clause", "dependencies": { "@sinonjs/commons": "^3.0.1" } }, "node_modules/@sinonjs/samsam": { "version": "8.0.3", "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.3.tgz", "integrity": "sha512-hw6HbX+GyVZzmaYNh82Ecj1vdGZrqVIn/keDTg63IgAwiQPO+xCz99uG6Woqgb4tM0mUiFENKZ4cqd7IX94AXQ==", "license": "BSD-3-Clause", "dependencies": { "@sinonjs/commons": "^3.0.1", "type-detect": "^4.1.0" } }, "node_modules/@sinonjs/samsam/node_modules/type-detect": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/agent-base": { "version": "7.1.4", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", Loading Loading @@ -1360,6 +1398,35 @@ "url": "https://github.com/sponsors/isaacs" } }, "node_modules/sinon": { "version": "21.0.0", "resolved": "https://registry.npmjs.org/sinon/-/sinon-21.0.0.tgz", "integrity": "sha512-TOgRcwFPbfGtpqvZw+hyqJDvqfapr1qUlOizROIk4bBLjlsjlB00Pg6wMFXNtJRpu+eCZuVOaLatG7M8105kAw==", "license": "BSD-3-Clause", "dependencies": { "@sinonjs/commons": "^3.0.1", "@sinonjs/fake-timers": "^13.0.5", "@sinonjs/samsam": "^8.0.1", "diff": "^7.0.0", "supports-color": "^7.2.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/sinon" } }, "node_modules/sinon/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/string_decoder": { "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", Loading Loading @@ -1494,6 +1561,15 @@ "node": ">=18" } }, "node_modules/type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/w3c-xmlserializer": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", Loading package.json +3 −2 Original line number Diff line number Diff line Loading @@ -12,6 +12,7 @@ "jsdom": "^26.1.0", "jsdom-global": "^3.0.2", "jshint": "^2.13.6", "mocha": "^11.7.2" "mocha": "^11.7.2", "sinon": "^21.0.0" } } test/assignment-5/test_35.jsdeleted 100644 → 0 +0 −18 Original line number Diff line number Diff line import sum from "../solution_35.js"; import assert from "assert"; describe("\n\nSolution_35", () => { [ { cb: () => sum(1), res: 1 }, { cb: () => sum(1)(2), res: 3 }, { cb: () => sum(1)(2)(3), res: 6 }, { cb: () => sum(5)(-1)(2), res: 6 }, { cb: () => sum(6)(-1)(-2)(-3), res: 0 }, { cb: () => sum(0)(1)(2)(3)(4)(5), res: 15 }, ].map(({ cb, res }) => { it(`should return ${res} for ${cb}`, () => { assert.deepEqual(cb(), res); }); }); }); test/assignment-5/test_36.js +15 −14 Original line number Diff line number Diff line import FormatError from "../solution_36.js"; import assert from "assert"; import sum from '../solution_36.js'; import assert from 'assert'; describe("\n\nSolution_36", () => { let err = new FormatError("formatting error"); describe('solution_36', () => { describe('sum()', () => { [ { cb: () => err.message, res: "formatting error" }, { cb: () => err.name, res: "FormatError" }, { cb: () => err instanceof FormatError, res: true }, { cb: () => err instanceof SyntaxError, res: true }, { cb: () => sum(1), res: 1 }, { cb: () => sum(1)(2), res: 3 }, { cb: () => sum(1)(2)(3), res: 6 }, { cb: () => sum(5)(-1)(2), res: 6 }, { cb: () => sum(6)(-1)(-2)(-3), res: 0 }, { cb: () => sum(0)(1)(2)(3)(4)(5), res: 15 }, ].map(({ cb, res }) => { it(`should return ${res} for ${cb}`, () => { assert.deepEqual(cb(), res); }); }); }); }); test/assignment-5/test_37.js +40 −5 Original line number Diff line number Diff line import delay from "../solution_37.js"; import assert from "assert"; import delay from '../solution_37.js'; import assert from 'assert'; describe("\n\nSolution_37", () => { it(`should be able to accept then`, () => { delay(3000).then(() => done()); describe('solution_37', () => { describe('delay(ms)', () => { it('should return a Promise', () => { const result = delay(100); assert.strictEqual(typeof result.then, 'function'); }); it('should resolve after the specified delay', async () => { const start = Date.now(); await delay(200); const elapsed = Date.now() - start; assert(elapsed >= 200, `Elapsed: ${elapsed}`); }); it('should resolve with undefined', async () => { const value = await delay(50); assert.strictEqual(value, undefined); }); it('should work with zero delay', async () => { const start = Date.now(); await delay(0); const elapsed = Date.now() - start; assert(elapsed < 50, `Elapsed: ${elapsed}`); }); it('should accept then', (done) => { delay(10).then(() => done()); }); it('should allow chaining with then', (done) => { delay(10) .then(() => 'next') .then((val) => { assert.strictEqual(val, 'next'); done(); }); }); }); }); Loading
package-lock.json +77 −1 Original line number Diff line number Diff line Loading @@ -8,7 +8,8 @@ "jsdom": "^26.1.0", "jsdom-global": "^3.0.2", "jshint": "^2.13.6", "mocha": "^11.7.2" "mocha": "^11.7.2", "sinon": "^21.0.0" } }, "node_modules/@asamuzakjp/css-color": { Loading Loading @@ -240,6 +241,43 @@ "node": ">=14" } }, "node_modules/@sinonjs/commons": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "license": "BSD-3-Clause", "dependencies": { "type-detect": "4.0.8" } }, "node_modules/@sinonjs/fake-timers": { "version": "13.0.5", "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-13.0.5.tgz", "integrity": "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==", "license": "BSD-3-Clause", "dependencies": { "@sinonjs/commons": "^3.0.1" } }, "node_modules/@sinonjs/samsam": { "version": "8.0.3", "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.3.tgz", "integrity": "sha512-hw6HbX+GyVZzmaYNh82Ecj1vdGZrqVIn/keDTg63IgAwiQPO+xCz99uG6Woqgb4tM0mUiFENKZ4cqd7IX94AXQ==", "license": "BSD-3-Clause", "dependencies": { "@sinonjs/commons": "^3.0.1", "type-detect": "^4.1.0" } }, "node_modules/@sinonjs/samsam/node_modules/type-detect": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/agent-base": { "version": "7.1.4", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", Loading Loading @@ -1360,6 +1398,35 @@ "url": "https://github.com/sponsors/isaacs" } }, "node_modules/sinon": { "version": "21.0.0", "resolved": "https://registry.npmjs.org/sinon/-/sinon-21.0.0.tgz", "integrity": "sha512-TOgRcwFPbfGtpqvZw+hyqJDvqfapr1qUlOizROIk4bBLjlsjlB00Pg6wMFXNtJRpu+eCZuVOaLatG7M8105kAw==", "license": "BSD-3-Clause", "dependencies": { "@sinonjs/commons": "^3.0.1", "@sinonjs/fake-timers": "^13.0.5", "@sinonjs/samsam": "^8.0.1", "diff": "^7.0.0", "supports-color": "^7.2.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/sinon" } }, "node_modules/sinon/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/string_decoder": { "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", Loading Loading @@ -1494,6 +1561,15 @@ "node": ">=18" } }, "node_modules/type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/w3c-xmlserializer": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", Loading
package.json +3 −2 Original line number Diff line number Diff line Loading @@ -12,6 +12,7 @@ "jsdom": "^26.1.0", "jsdom-global": "^3.0.2", "jshint": "^2.13.6", "mocha": "^11.7.2" "mocha": "^11.7.2", "sinon": "^21.0.0" } }
test/assignment-5/test_35.jsdeleted 100644 → 0 +0 −18 Original line number Diff line number Diff line import sum from "../solution_35.js"; import assert from "assert"; describe("\n\nSolution_35", () => { [ { cb: () => sum(1), res: 1 }, { cb: () => sum(1)(2), res: 3 }, { cb: () => sum(1)(2)(3), res: 6 }, { cb: () => sum(5)(-1)(2), res: 6 }, { cb: () => sum(6)(-1)(-2)(-3), res: 0 }, { cb: () => sum(0)(1)(2)(3)(4)(5), res: 15 }, ].map(({ cb, res }) => { it(`should return ${res} for ${cb}`, () => { assert.deepEqual(cb(), res); }); }); });
test/assignment-5/test_36.js +15 −14 Original line number Diff line number Diff line import FormatError from "../solution_36.js"; import assert from "assert"; import sum from '../solution_36.js'; import assert from 'assert'; describe("\n\nSolution_36", () => { let err = new FormatError("formatting error"); describe('solution_36', () => { describe('sum()', () => { [ { cb: () => err.message, res: "formatting error" }, { cb: () => err.name, res: "FormatError" }, { cb: () => err instanceof FormatError, res: true }, { cb: () => err instanceof SyntaxError, res: true }, { cb: () => sum(1), res: 1 }, { cb: () => sum(1)(2), res: 3 }, { cb: () => sum(1)(2)(3), res: 6 }, { cb: () => sum(5)(-1)(2), res: 6 }, { cb: () => sum(6)(-1)(-2)(-3), res: 0 }, { cb: () => sum(0)(1)(2)(3)(4)(5), res: 15 }, ].map(({ cb, res }) => { it(`should return ${res} for ${cb}`, () => { assert.deepEqual(cb(), res); }); }); }); });
test/assignment-5/test_37.js +40 −5 Original line number Diff line number Diff line import delay from "../solution_37.js"; import assert from "assert"; import delay from '../solution_37.js'; import assert from 'assert'; describe("\n\nSolution_37", () => { it(`should be able to accept then`, () => { delay(3000).then(() => done()); describe('solution_37', () => { describe('delay(ms)', () => { it('should return a Promise', () => { const result = delay(100); assert.strictEqual(typeof result.then, 'function'); }); it('should resolve after the specified delay', async () => { const start = Date.now(); await delay(200); const elapsed = Date.now() - start; assert(elapsed >= 200, `Elapsed: ${elapsed}`); }); it('should resolve with undefined', async () => { const value = await delay(50); assert.strictEqual(value, undefined); }); it('should work with zero delay', async () => { const start = Date.now(); await delay(0); const elapsed = Date.now() - start; assert(elapsed < 50, `Elapsed: ${elapsed}`); }); it('should accept then', (done) => { delay(10).then(() => done()); }); it('should allow chaining with then', (done) => { delay(10) .then(() => 'next') .then((val) => { assert.strictEqual(val, 'next'); done(); }); }); }); });