瀏覽代碼

move Set Intersection into its own operation class

d98762625 7 年之前
父節點
當前提交
03ecaa81f7

+ 2 - 2
src/core/config/OperationConfig.json

@@ -220,7 +220,7 @@
             {
                 "name": "Sample delimiter",
                 "type": "binaryString",
-                "value": "\n\n"
+                "value": "\\n\\n"
             },
             {
                 "name": "Item delimiter",
@@ -256,7 +256,7 @@
         "flowControl": false,
         "args": [
             {
-                "name": "Samples delimiter",
+                "name": "Sample delimiter",
                 "type": "binaryString",
                 "value": "\\n\\n"
             },

+ 56 - 9
src/core/operations/SetIntersection.mjs

@@ -1,19 +1,63 @@
-import SetOp from "./SetOps";
+import Utils from "../Utils";
+import Operation from "../Operation";
 
 /**
- * 
+ * Set Intersection operation
  */
-class SetIntersection extends SetOp {
+class SetIntersection extends Operation {
 
     /**
-     * 
+     * Set Intersection constructor
      */
     constructor() {
         super();
-        this.setOp = this.runIntersection;
 
         this.name = "Set Intersection";
+        this.module = "Default";
         this.description = "Get the intersection of two sets";
+        this.inputType = "string";
+        this.outputType = "string";
+        this.args = [
+            {
+                name: "Sample delimiter",
+                type: "binaryString",
+                value: Utils.escapeHtml("\\n\\n")
+            },
+            {
+                name: "Item delimiter",
+                type: "binaryString",
+                value: ","
+            },
+        ];
+    }
+
+    /**
+     * Validate input length
+     * @param {Object[]} sets
+     * @throws {Error} if not two sets
+     */
+    validateSampleNumbers(sets) {
+        if (!sets || (sets.length !== 2)) {
+            throw "Incorrect number of sets, perhaps you need to modify the sample delimiter or add more samples?";
+        }
+    }
+
+    /**
+     * Run the intersection operation
+     * @param input
+     * @param args
+     */
+    run(input, args) {
+        [this.sampleDelim, this.itemDelimiter] = args;
+        const sets = input.split(this.sampleDelim);
+
+        try {
+            this.validateSampleNumbers(sets);
+        } catch (e) {
+            return e;
+        }
+
+        return Utils.escapeHtml(this.runIntersect(...sets.map(s => s.split(this.itemDelimiter))));
     }
 
     /**
@@ -23,11 +67,14 @@ class SetIntersection extends SetOp {
      * @param {Object[]} b
      * @returns {Object[]}
      */
-    runIntersection(a, b) {
-        return a.filter((item) => {
-            return b.indexOf(item) > -1;
-        }).join(this.itemDelimiter);
+    runIntersect(a, b) {
+        return a
+            .filter((item) => {
+                return b.indexOf(item) > -1;
+            })
+            .join(this.itemDelimiter);
     }
+
 }
 
 export default SetIntersection;

+ 2 - 0
test/index.mjs

@@ -48,6 +48,8 @@ import "./tests/operations/Base64";
 // import "./tests/operations/StrUtils.js";
 // import "./tests/operations/SeqUtils.js";
 import "./tests/operations/SetUnion";
+import "./tests/operations/SetIntersection";
+
 
 
 let allTestsPassing = true;

+ 56 - 0
test/tests/operations/SetIntersection.mjs

@@ -0,0 +1,56 @@
+/**
+ * Set Operations tests.
+ *
+ * @author d98762625
+ *
+ * @copyright Crown Copyright 2017
+ * @license Apache-2.0
+ */
+import TestRegister from "../../TestRegister";
+
+TestRegister.addTests([
+    {
+        name: "Set  Intersection",
+        input: "1 2 3 4 5\n\n3 4 5 6 7",
+        expectedOutput: "3 4 5",
+        recipeConfig: [
+            {
+                op: "Set Intersection",
+                args: ["\n\n", " "],
+            },
+        ],
+    },
+    {
+        name: "Set Intersection: only one set",
+        input: "1 2 3 4 5 6 7 8",
+        expectedOutput: "Incorrect number of sets, perhaps you need to modify the sample delimiter or add more samples?",
+        recipeConfig: [
+            {
+                op: "Set Intersection",
+                args: ["\n\n", " "],
+            },
+        ],
+    },
+    {
+        name: "Set Intersection: item delimiter",
+        input: "1-2-3-4-5\n\n3-4-5-6-7",
+        expectedOutput: "3-4-5",
+        recipeConfig: [
+            {
+                op: "Set Intersection",
+                args: ["\n\n", "-"],
+            },
+        ],
+    },
+    {
+        name: "Set Intersection: sample delimiter",
+        input: "1-2-3-4-5z3-4-5-6-7",
+        expectedOutput: "3-4-5",
+        recipeConfig: [
+            {
+                op: "Set Intersection",
+                args: ["z", "-"],
+            },
+        ],
+    }
+]);