diff --git a/src/core/config/Categories.json b/src/core/config/Categories.json
index 09ee8d15b7..95f14f853a 100644
--- a/src/core/config/Categories.json
+++ b/src/core/config/Categories.json
@@ -160,6 +160,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 0000000000..0891cda6a9
--- /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 0000000000..d8a42be517
--- /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: [],
+ },
+ ],
+ },
+]);