diff --git a/Base/res/js/Spreadsheet/runtime.js b/Base/res/js/Spreadsheet/runtime.js index 92b003729c..d34b3e3ffe 100644 --- a/Base/res/js/Spreadsheet/runtime.js +++ b/Base/res/js/Spreadsheet/runtime.js @@ -365,6 +365,9 @@ function randRange(min, max) { } function integer(value) { + const typeVal = typeof value; + if ((typeVal !== "number" && typeVal !== "string") || Number.isNaN(Number(value))) + throw new Error(`integer() called with unexpected type "${typeVal}"`); return value | 0; } @@ -381,7 +384,7 @@ function numericReduce(op, accumulator, cells) { } function numericResolve(cells) { - return resolve(cells).map(str => (str === "" || str == null ? NaN : integer(str))); + return resolve(cells).map(val => parseInt(val)); } function resolve(cells) { diff --git a/Userland/Applications/Spreadsheet/Tests/free-functions.js b/Userland/Applications/Spreadsheet/Tests/free-functions.js index dc142d0bd3..9a55046075 100644 --- a/Userland/Applications/Spreadsheet/Tests/free-functions.js +++ b/Userland/Applications/Spreadsheet/Tests/free-functions.js @@ -203,3 +203,36 @@ describe("Lookup", () => { expect(reflookup("80", R`A0:A9`, R`B0:B9`, undefined, "nextlargest").name).toEqual("B9"); }); }); + +describe("integer() function", () => { + test("undefined", () => { + expect(() => integer(undefined)).toThrow(Error); + }); + test("null", () => { + expect(() => integer(null)).toThrow(Error); + }); + test("NaN", () => { + expect(() => integer(NaN)).toThrow(Error); + }); + test("object", () => { + expect(() => integer({})).toThrow(Error); + }); + test("function", () => { + expect(() => integer(() => {})).toThrow(Error); + }); + test("try 1 as string", () => { + expect(integer("1")).toBe(1); + }); + test("try 1 as number", () => { + expect(integer(1)).toBe(1); + }); + test("try 1000000 as string", () => { + expect(integer("1000000")).toBe(1000000); + }); + test("try 1000000 as number", () => { + expect(integer(1000000)).toBe(1000000); + }); + test("don't just allow any strings", () => { + expect(() => integer("is this NaN yet?")).toThrow(); + }); +});