From 4fc39bc02483d5ae7c1897667dcb832d64930333 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 13 Mar 2026 09:16:14 +0000 Subject: [PATCH 1/4] Initial plan From b16f9ec134948115bc40aae8f423510dcb4c8d1c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 13 Mar 2026 09:20:52 +0000 Subject: [PATCH 2/4] Fix median sorting regression Co-authored-by: williballenthin <156560+williballenthin@users.noreply.github.com> --- src/core/lib/Arithmetic.mjs | 13 ++++++++----- tests/node/index.mjs | 1 + tests/node/tests/Arithmetic.mjs | 17 +++++++++++++++++ 3 files changed, 26 insertions(+), 5 deletions(-) create mode 100644 tests/node/tests/Arithmetic.mjs diff --git a/src/core/lib/Arithmetic.mjs b/src/core/lib/Arithmetic.mjs index 7c10855fa..5fbc5771b 100644 --- a/src/core/lib/Arithmetic.mjs +++ b/src/core/lib/Arithmetic.mjs @@ -108,14 +108,17 @@ export function mean(data) { * @returns {BigNumber} */ export function median(data) { - if ((data.length % 2) === 0 && data.length > 0) { + if (data.length > 0) { data.sort(function(a, b) { return a.minus(b); }); - const first = data[Math.floor(data.length / 2)]; - const second = data[Math.floor(data.length / 2) - 1]; - return mean([first, second]); - } else { + + if ((data.length % 2) === 0) { + const first = data[Math.floor(data.length / 2)]; + const second = data[Math.floor(data.length / 2) - 1]; + return mean([first, second]); + } + return data[Math.floor(data.length / 2)]; } } diff --git a/tests/node/index.mjs b/tests/node/index.mjs index f872f8f48..c5baeedd7 100644 --- a/tests/node/index.mjs +++ b/tests/node/index.mjs @@ -22,6 +22,7 @@ import "./tests/File.mjs"; import "./tests/Dish.mjs"; import "./tests/NodeDish.mjs"; import "./tests/Utils.mjs"; +import "./tests/Arithmetic.mjs"; import "./tests/Categories.mjs"; import "./tests/lib/BigIntUtils.mjs"; diff --git a/tests/node/tests/Arithmetic.mjs b/tests/node/tests/Arithmetic.mjs new file mode 100644 index 000000000..eb72a8386 --- /dev/null +++ b/tests/node/tests/Arithmetic.mjs @@ -0,0 +1,17 @@ +import assert from "assert"; +import BigNumber from "bignumber.js"; +import it from "../assertionHandler.mjs"; +import TestRegister from "../../lib/TestRegister.mjs"; +import { median } from "../../../src/core/lib/Arithmetic.mjs"; + +TestRegister.addApiTests([ + it("Arithmetic: median sorts odd-length input", () => { + const result = median([new BigNumber(10), new BigNumber(1), new BigNumber(2)]); + assert.strictEqual(result.toString(), "2"); + }), + + it("Arithmetic: median keeps even-length behavior", () => { + const result = median([new BigNumber(10), new BigNumber(1), new BigNumber(2), new BigNumber(5)]); + assert.strictEqual(result.toString(), "3.5"); + }), +]); From 4865806baa159acdc5164ea30e30a6609c128d98 Mon Sep 17 00:00:00 2001 From: "openai-code-agent[bot]" <242516109+Codex@users.noreply.github.com> Date: Fri, 13 Mar 2026 09:56:02 +0000 Subject: [PATCH 3/4] Move median tests into operations suite --- tests/node/index.mjs | 1 - tests/node/tests/Arithmetic.mjs | 17 ---------------- tests/operations/index.mjs | 1 + tests/operations/tests/Median.mjs | 33 +++++++++++++++++++++++++++++++ 4 files changed, 34 insertions(+), 18 deletions(-) delete mode 100644 tests/node/tests/Arithmetic.mjs create mode 100644 tests/operations/tests/Median.mjs diff --git a/tests/node/index.mjs b/tests/node/index.mjs index c5baeedd7..f872f8f48 100644 --- a/tests/node/index.mjs +++ b/tests/node/index.mjs @@ -22,7 +22,6 @@ import "./tests/File.mjs"; import "./tests/Dish.mjs"; import "./tests/NodeDish.mjs"; import "./tests/Utils.mjs"; -import "./tests/Arithmetic.mjs"; import "./tests/Categories.mjs"; import "./tests/lib/BigIntUtils.mjs"; diff --git a/tests/node/tests/Arithmetic.mjs b/tests/node/tests/Arithmetic.mjs deleted file mode 100644 index eb72a8386..000000000 --- a/tests/node/tests/Arithmetic.mjs +++ /dev/null @@ -1,17 +0,0 @@ -import assert from "assert"; -import BigNumber from "bignumber.js"; -import it from "../assertionHandler.mjs"; -import TestRegister from "../../lib/TestRegister.mjs"; -import { median } from "../../../src/core/lib/Arithmetic.mjs"; - -TestRegister.addApiTests([ - it("Arithmetic: median sorts odd-length input", () => { - const result = median([new BigNumber(10), new BigNumber(1), new BigNumber(2)]); - assert.strictEqual(result.toString(), "2"); - }), - - it("Arithmetic: median keeps even-length behavior", () => { - const result = median([new BigNumber(10), new BigNumber(1), new BigNumber(2), new BigNumber(5)]); - assert.strictEqual(result.toString(), "3.5"); - }), -]); diff --git a/tests/operations/index.mjs b/tests/operations/index.mjs index fb03a5f71..702d552ef 100644 --- a/tests/operations/index.mjs +++ b/tests/operations/index.mjs @@ -109,6 +109,7 @@ import "./tests/LuhnChecksum.mjs"; import "./tests/LZNT1Decompress.mjs"; import "./tests/LZString.mjs"; import "./tests/Magic.mjs"; +import "./tests/Median.mjs"; import "./tests/Media.mjs"; import "./tests/MIMEDecoding.mjs"; import "./tests/Modhex.mjs"; diff --git a/tests/operations/tests/Median.mjs b/tests/operations/tests/Median.mjs new file mode 100644 index 000000000..74bbfe746 --- /dev/null +++ b/tests/operations/tests/Median.mjs @@ -0,0 +1,33 @@ +/** + * Median operation tests. + * + * @author copilot-swe-agent[bot] + * @copyright Crown Copyright 2018 + * @license Apache-2.0 + */ +import TestRegister from "../../lib/TestRegister.mjs"; + +TestRegister.addTests([ + { + name: "Median: sorts odd-length input", + input: "10 1 2", + expectedOutput: "2", + recipeConfig: [ + { + op: "Median", + args: ["Space"], + }, + ], + }, + { + name: "Median: keeps even-length behavior", + input: "10 1 2 5", + expectedOutput: "3.5", + recipeConfig: [ + { + op: "Median", + args: ["Space"], + }, + ], + }, +]); From 90660fb41b283c5616c3a0ebe096e6fb63b63287 Mon Sep 17 00:00:00 2001 From: Willi Ballenthin Date: Fri, 13 Mar 2026 10:58:11 +0100 Subject: [PATCH 4/4] Median: fix test names --- tests/operations/tests/Median.mjs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/operations/tests/Median.mjs b/tests/operations/tests/Median.mjs index 74bbfe746..555f2edd2 100644 --- a/tests/operations/tests/Median.mjs +++ b/tests/operations/tests/Median.mjs @@ -9,7 +9,7 @@ import TestRegister from "../../lib/TestRegister.mjs"; TestRegister.addTests([ { - name: "Median: sorts odd-length input", + name: "Median: odd-length input", input: "10 1 2", expectedOutput: "2", recipeConfig: [ @@ -20,7 +20,7 @@ TestRegister.addTests([ ], }, { - name: "Median: keeps even-length behavior", + name: "Median: even-length input", input: "10 1 2 5", expectedOutput: "3.5", recipeConfig: [