diff --git a/src/core/config/Categories.json b/src/core/config/Categories.json index bebdd6a5..62056c3d 100644 --- a/src/core/config/Categories.json +++ b/src/core/config/Categories.json @@ -208,6 +208,7 @@ "AND", "ADD", "SUB", + "Basic Arithmetic", "Sum", "Subtract", "Multiply", diff --git a/src/core/operations/BasicArithmetic.mjs b/src/core/operations/BasicArithmetic.mjs new file mode 100644 index 00000000..0891cda6 --- /dev/null +++ b/src/core/operations/BasicArithmetic.mjs @@ -0,0 +1,48 @@ +/** + * @author scottdermott [scottdermott@outlook.com] + * @copyright Crown Copyright 2021 + * @license Apache-2.0 + */ + +import Operation from "../Operation.mjs"; + +/** + * Basic Arithmetic operation + */ +class BasicArithmetic extends Operation { + + /** + * BasicArithmetic constructor + */ + constructor() { + super(); + + this.name = "Basic Arithmetic"; + this.module = "Default"; + this.description = "Evalutes Basic Arithmetic.

e.g. 1+2-1 becomes 2"; + this.infoURL = ""; + this.inputType = "string"; + this.outputType = "number"; + this.args = []; + } + /** + * @param {string} input + * @param {Object[]} args + * @returns {number} + */ + run(input, args) { + if (parseInt(input, 10).toString().length === input.length) { + return parseInt(input, 10); + } else if (input.match(/[+-]?([0-9.]+)/g)) { + return (input.replace(/\s/g, "").match(/[+-]?([0-9.]+)/g) || []) + .reduce(function (sum, value) { + return parseFloat(sum) + parseFloat(value); + }); + } else { + return NaN; + } + } + +} + +export default BasicArithmetic; diff --git a/tests/operations/tests/BasicArithmetic.mjs b/tests/operations/tests/BasicArithmetic.mjs new file mode 100644 index 00000000..d8a42be5 --- /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: "Basic Arithmetic: nothing", + input: "", + expectedOutput: "", + recipeConfig: [ + { + op: "Basic Arithmetic", + args: [], + }, + ], + }, + { + name: "Basic Arithmetic: Addition", + input: "1+2+3+4+5+6+7+8+9+0", + expectedOutput: 45, + recipeConfig: [ + { + op: "Basic Arithmetic", + args: [], + }, + ], + }, + { + name: "Basic Arithmetic: Subtraction", + input: "100-9-8-7-6-5-4-3-2-1-0", + expectedOutput: 55, + recipeConfig: [ + { + op: "Basic Arithmetic", + args: [], + }, + ], + }, + { + name: "Basic Arithmetic: 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: "Basic Arithmetic", + args: [], + }, + ], + }, + { + name: "Basic Arithmetic: 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: "Basic Arithmetic", + args: [], + }, + ], + }, +]);