diff --git a/src/core/operations/BasicArithmetic.mjs b/src/core/operations/BasicArithmetic.mjs index 6af45dd1..afaafb3c 100644 --- a/src/core/operations/BasicArithmetic.mjs +++ b/src/core/operations/BasicArithmetic.mjs @@ -4,6 +4,7 @@ * @license Apache-2.0 */ +import BigNumber from "bignumber.js"; import Operation from "../Operation.mjs"; /** @@ -31,13 +32,19 @@ class BasicArithmetic extends Operation { * @returns {number} */ run(input, args) { - if (parseInt(input, 10).toString().length === input.length) { - return parseInt(input, 10); + if (input.length >= 1) { + if (parseInt(input, 10).toString().length === input.length) { + const val = parseInt(input, 10); + return BigNumber.isBigNumber(val) ? val : new BigNumber(NaN); + } else { + return (input.replace(/\s/g, "").match(/[+-]?([0-9.]+)/g) || []) + .reduce(function (sum, value) { + const val = parseFloat(sum) + parseFloat(value); + return BigNumber.isBigNumber(val) ? val : new BigNumber(NaN); + }); + } } else { - return (input.replace(/\s/g, "").match(/[+-]?([0-9.]+)/g) || []) - .reduce(function (sum, value) { - return parseFloat(sum) + parseFloat(value); - }); + return new BigNumber(NaN); } } diff --git a/tests/operations/tests/BasicArithmetic.mjs b/tests/operations/tests/BasicArithmetic.mjs new file mode 100644 index 00000000..964a5d30 --- /dev/null +++ b/tests/operations/tests/BasicArithmetic.mjs @@ -0,0 +1,68 @@ +/** + * @author scottdermott [scottdermott@outlook.com] + * @copyright Crown Copyright 2021 + * @license Apache-2.0 + */ + +/** + * Basic Arithmetic Tests + */ +import TestRegister from "../../lib/TestRegister.mjs"; + +TestRegister.addTests([ + { + name: "BasicArithmetic: nothing", + input: "", + expectedOutput: "", + recipeConfig: [ + { + op: "BasicArithmetic", + args: [], + }, + ], + }, + { + name: "BasicArithmetic: Addition", + input: "1+2+3+4+5+6+7+8+9+0", + expectedOutput: 45, + recipeConfig: [ + { + op: "BasicArithmetic", + args: [], + }, + ], + }, + { + name: "BasicArithmetic: Subtraction", + input: "100-9-8-7-6-5-4-3-2-1-0", + expectedOutput: 55, + recipeConfig: [ + { + op: "BasicArithmetic", + args: [], + }, + ], + }, + { + name: "BasicArithmetic: Add + Sub", + input: "1+2+3+4+5+6+7+8+9-9-8-7-6-5-4-3-2-1", + expectedOutput: 0, + recipeConfig: [ + { + op: "BasicArithmetic", + args: [], + }, + ], + }, + { + name: "BasicArithmetic: Large number", + input: "999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999", + expectedOutput: 22977, + recipeConfig: [ + { + op: "BasicArithmetic", + args: [], + }, + ], + }, +]);