Browse Source

MPIDE-28: generator: ✅: some integration tests

Kyle P Davis 10 years ago
parent
commit
59f82c228e
1 changed files with 512 additions and 0 deletions
  1. 512 0
      src/lib/generator/test/generatorIntegration.js

+ 512 - 0
src/lib/generator/test/generatorIntegration.js

@@ -0,0 +1,512 @@
+"use strict";
+/*jshint camelcase:false*/
+/*eslint camelcase:0*/
+
+let assert = require("assert"),
+	Generator = require("../modellang");
+
+let fs = require("fs"),
+	path = require("path"),
+	PEG = require("pegjs");
+let parser = PEG.buildParser(fs.readFileSync(path.join(__dirname, "/../../parser/modellang.pegjs"), "utf8")),
+	parse = parser.parse;
+
+let tests = {
+
+	// ATOM TEST
+	oneA: {
+		model: "SYSTEM: oneA = a;",
+		expected: {
+			1: [
+				["oneA", "a"],
+			],
+			2: [
+				["oneA", "a"],
+			],
+		},
+	},
+
+	// QUANTIFIED ATOM TEST
+	maybeA: {
+		model: "SYSTEM: maybeA = a?;",
+		expected: {
+			1: [
+				["maybeA"],
+				["maybeA", "a"],
+			],
+			2: [
+				["maybeA"],
+				["maybeA", "a"],
+			],
+		},
+	},
+	someA: {
+		model: "SYSTEM: someA = a+;",
+		expected: {
+			1: [
+				["someA", "a"],
+			],
+			2: [
+				["someA", "a"],
+				["someA", "a", "a"],
+			],
+			3: [
+				["someA", "a"],
+				["someA", "a", "a"],
+				["someA", "a", "a", "a"],
+			],
+		},
+	},
+	maybeSomeA: {
+		model: "SYSTEM: maybeSomeA = a*;",
+		expected: {
+			1: [
+				["maybeSomeA"],
+				["maybeSomeA", "a"],
+			],
+			2: [
+				["maybeSomeA"],
+				["maybeSomeA", "a"],
+				["maybeSomeA", "a", "a"],
+			],
+			3: [
+				["maybeSomeA"],
+				["maybeSomeA", "a"],
+				["maybeSomeA", "a", "a"],
+				["maybeSomeA", "a", "a", "a"],
+			],
+		},
+	},
+	threeA: {
+		model: "SYSTEM: threeA = a{3};",
+		expected: {
+			1: [
+				["threeA", "a", "a", "a"],
+			],
+			2: [
+				["threeA", "a", "a", "a"],
+			],
+		},
+	},
+	twoToThreeA: {
+		model: "SYSTEM: twoToThreeA = a{2,3};",
+		expected: {
+			1: [
+				["twoToThreeA", "a", "a"],
+				["twoToThreeA", "a", "a", "a"],
+			],
+			2: [
+				["twoToThreeA", "a", "a"],
+				["twoToThreeA", "a", "a", "a"],
+			],
+		},
+	},
+
+	// SEQUENCE WITH QUANTIFIED ATOMS TEST
+	oneA_oneB: {
+		model: "SYSTEM: oneA_oneB = a b;",
+		expected: {
+			1: [
+				["oneA_oneB", "a", "b"],
+			],
+			2: [
+				["oneA_oneB", "a", "b"],
+			],
+		},
+	},
+	oneA_maybeB: {
+		model: "SYSTEM: oneA_maybeB = a b?;",
+		expected: {
+			1: [
+				["oneA_maybeB", "a"],
+				["oneA_maybeB", "a", "b"],
+			],
+			2: [
+				["oneA_maybeB", "a"],
+				["oneA_maybeB", "a", "b"],
+			],
+		},
+	},
+	oneA_someB: {
+		model: "SYSTEM: oneA_someB = a b+;",
+		expected: {
+			1: [
+				["oneA_someB", "a", "b"],
+			],
+			2: [
+				["oneA_someB", "a", "b"],
+				["oneA_someB", "a", "b", "b"],
+			],
+			3: [
+				["oneA_someB", "a", "b"],
+				["oneA_someB", "a", "b", "b"],
+				["oneA_someB", "a", "b", "b", "b"],
+			],
+		},
+	},
+	oneA_maybeSomeB: {
+		model: "SYSTEM: oneA_maybeSomeB = a b*;",
+		expected: {
+			1: [
+				["oneA_maybeSomeB", "a"],
+				["oneA_maybeSomeB", "a", "b"],
+			],
+			2: [
+				["oneA_maybeSomeB", "a"],
+				["oneA_maybeSomeB", "a", "b"],
+				["oneA_maybeSomeB", "a", "b", "b"],
+			],
+			3: [
+				["oneA_maybeSomeB", "a"],
+				["oneA_maybeSomeB", "a", "b"],
+				["oneA_maybeSomeB", "a", "b", "b"],
+				["oneA_maybeSomeB", "a", "b", "b", "b"],
+			],
+		},
+	},
+	maybeA_oneB: {
+		model: "SYSTEM: maybeA_oneB = a? b;",
+		expected: {
+			1: [
+				["maybeA_oneB", "b"],
+				["maybeA_oneB", "a", "b"],
+			],
+			2: [
+				["maybeA_oneB", "b"],
+				["maybeA_oneB", "a", "b"],
+			],
+		},
+	},
+	maybeA_maybeB: {
+		model: "SYSTEM: maybeA_maybeB = a? b?;",
+		expected: {
+			1: [
+				["maybeA_maybeB"],
+				["maybeA_maybeB", "b"],
+				["maybeA_maybeB", "a"],
+				["maybeA_maybeB", "a", "b"],
+			],
+			2: [
+				["maybeA_maybeB"],
+				["maybeA_maybeB", "b"],
+				["maybeA_maybeB", "a"],
+				["maybeA_maybeB", "a", "b"],
+			],
+		},
+	},
+	maybeA_someB: {
+		model: "SYSTEM: maybeA_someB = a? b+;",
+		expected: {
+			1: [
+				["maybeA_someB", "b"],
+				["maybeA_someB", "a", "b"],
+			],
+			2: [
+				["maybeA_someB", "b"],
+				["maybeA_someB", "b", "b"],
+				["maybeA_someB", "a", "b"],
+				["maybeA_someB", "a", "b", "b"],
+			],
+			3: [
+				["maybeA_someB", "b"],
+				["maybeA_someB", "b", "b"],
+				["maybeA_someB", "b", "b", "b"],
+				["maybeA_someB", "a", "b"],
+				["maybeA_someB", "a", "b", "b"],
+				["maybeA_someB", "a", "b", "b", "b"],
+			],
+		},
+	},
+	maybeA_maybeSomeB: {
+		model: "SYSTEM: maybeA_maybeSomeB = a? b*;",
+		expected: {
+			1: [
+				["maybeA_maybeSomeB"],
+				["maybeA_maybeSomeB", "b"],
+				["maybeA_maybeSomeB", "a"],
+				["maybeA_maybeSomeB", "a", "b"],
+			],
+			2: [
+				["maybeA_maybeSomeB"],
+				["maybeA_maybeSomeB", "b"],
+				["maybeA_maybeSomeB", "b", "b"],
+				["maybeA_maybeSomeB", "a"],
+				["maybeA_maybeSomeB", "a", "b"],
+				["maybeA_maybeSomeB", "a", "b", "b"],
+			],
+			3: [
+				["maybeA_maybeSomeB"],
+				["maybeA_maybeSomeB", "b"],
+				["maybeA_maybeSomeB", "b", "b"],
+				["maybeA_maybeSomeB", "b", "b", "b"],
+				["maybeA_maybeSomeB", "a"],
+				["maybeA_maybeSomeB", "a", "b"],
+				["maybeA_maybeSomeB", "a", "b", "b"],
+				["maybeA_maybeSomeB", "a", "b", "b", "b"],
+			],
+		},
+	},
+	someA_oneB: {
+		model: "SYSTEM: someA_oneB = a+ b;",
+		expected: {
+			1: [
+				["someA_oneB", "a", "b"],
+			],
+			2: [
+				["someA_oneB", "a", "b"],
+				["someA_oneB", "a", "a", "b"],
+			],
+			3: [
+				["someA_oneB", "a", "b"],
+				["someA_oneB", "a", "a", "b"],
+				["someA_oneB", "a", "a", "a", "b"],
+			],
+		},
+	},
+	someA_maybeB: {
+		model: "SYSTEM: someA_maybeB = a+ b?;",
+		expected: {
+			1: [
+				["someA_maybeB", "a"],
+				["someA_maybeB", "a", "b"],
+			],
+			2: [
+				["someA_maybeB", "a"],
+				["someA_maybeB", "a", "b"],
+				["someA_maybeB", "a", "a"],
+				["someA_maybeB", "a", "a", "b"],
+			],
+			3: [
+				["someA_maybeB", "a"],
+				["someA_maybeB", "a", "b"],
+				["someA_maybeB", "a", "a"],
+				["someA_maybeB", "a", "a", "b"],
+				["someA_maybeB", "a", "a", "a"],
+				["someA_maybeB", "a", "a", "a", "b"],
+			],
+		},
+	},
+	someA_someB: {
+		model: "SYSTEM: someA_someB = a+ b+;",
+		expected: {
+			1: [
+				["someA_someB", "a", "b"],
+			],
+			2: [
+				["someA_someB", "a", "b"],
+				["someA_someB", "a", "b", "b"],
+				["someA_someB", "a", "a", "b"],
+				["someA_someB", "a", "a", "b", "b"],
+			],
+			3: [
+				["someA_someB", "a", "b"],
+				["someA_someB", "a", "b", "b"],
+				["someA_someB", "a", "b", "b", "b"],
+				["someA_someB", "a", "a", "b"],
+				["someA_someB", "a", "a", "b", "b"],
+				["someA_someB", "a", "a", "b", "b", "b"],
+				["someA_someB", "a", "a", "a", "b"],
+				["someA_someB", "a", "a", "a", "b", "b"],
+				["someA_someB", "a", "a", "a", "b", "b", "b"],
+			],
+		},
+	},
+	someA_maybeSomeB: {
+		model: "SYSTEM: someA_maybeSomeB = a+ b*;",
+		expected: {
+			1: [
+				["someA_maybeSomeB", "a"],
+				["someA_maybeSomeB", "a", "b"],
+			],
+			2: [
+				["someA_maybeSomeB", "a"],
+				["someA_maybeSomeB", "a", "b"],
+				["someA_maybeSomeB", "a", "b", "b"],
+				["someA_maybeSomeB", "a", "a"],
+				["someA_maybeSomeB", "a", "a", "b"],
+				["someA_maybeSomeB", "a", "a", "b", "b"],
+			],
+			3: [
+				["someA_maybeSomeB", "a"],
+				["someA_maybeSomeB", "a", "b"],
+				["someA_maybeSomeB", "a", "b", "b"],
+				["someA_maybeSomeB", "a", "b", "b", "b"],
+				["someA_maybeSomeB", "a", "a"],
+				["someA_maybeSomeB", "a", "a", "b"],
+				["someA_maybeSomeB", "a", "a", "b", "b"],
+				["someA_maybeSomeB", "a", "a", "b", "b", "b"],
+				["someA_maybeSomeB", "a", "a", "a"],
+				["someA_maybeSomeB", "a", "a", "a", "b"],
+				["someA_maybeSomeB", "a", "a", "a", "b", "b"],
+				["someA_maybeSomeB", "a", "a", "a", "b", "b", "b"],
+			],
+		},
+	},
+	maybeSomeA_oneB: {
+		model: "SYSTEM: maybeSomeA_oneB = a* b;",
+		expected: {
+			1: [
+				["maybeSomeA_oneB", "b"],
+				["maybeSomeA_oneB", "a", "b"],
+			],
+			2: [
+				["maybeSomeA_oneB", "b"],
+				["maybeSomeA_oneB", "a", "b"],
+				["maybeSomeA_oneB", "a", "a", "b"],
+			],
+			3: [
+				["maybeSomeA_oneB", "b"],
+				["maybeSomeA_oneB", "a", "b"],
+				["maybeSomeA_oneB", "a", "a", "b"],
+				["maybeSomeA_oneB", "a", "a", "a", "b"],
+			],
+		},
+	},
+	maybeSomeA_maybeB: {
+		model: "SYSTEM: maybeSomeA_maybeB = a* b?;",
+		expected: {
+			1: [
+				["maybeSomeA_maybeB"],
+				["maybeSomeA_maybeB", "b"],
+				["maybeSomeA_maybeB", "a"],
+				["maybeSomeA_maybeB", "a", "b"],
+			],
+			2: [
+				["maybeSomeA_maybeB"],
+				["maybeSomeA_maybeB", "b"],
+				["maybeSomeA_maybeB", "a"],
+				["maybeSomeA_maybeB", "a", "b"],
+				["maybeSomeA_maybeB", "a", "a"],
+				["maybeSomeA_maybeB", "a", "a", "b"],
+			],
+			3: [
+				["maybeSomeA_maybeB"],
+				["maybeSomeA_maybeB", "b"],
+				["maybeSomeA_maybeB", "a"],
+				["maybeSomeA_maybeB", "a", "b"],
+				["maybeSomeA_maybeB", "a", "a"],
+				["maybeSomeA_maybeB", "a", "a", "b"],
+				["maybeSomeA_maybeB", "a", "a", "a"],
+				["maybeSomeA_maybeB", "a", "a", "a", "b"],
+			],
+		},
+	},
+	maybeSomeA_someB: {
+		model: "SYSTEM: maybeSomeA_someB = a* b+;",
+		expected: {
+			1: [
+				["maybeSomeA_someB", "b"],
+				["maybeSomeA_someB", "a", "b"],
+			],
+			2: [
+				["maybeSomeA_someB", "b"],
+				["maybeSomeA_someB", "b", "b"],
+				["maybeSomeA_someB", "a", "b"],
+				["maybeSomeA_someB", "a", "b", "b"],
+				["maybeSomeA_someB", "a", "a", "b"],
+				["maybeSomeA_someB", "a", "a", "b", "b"],
+			],
+			3: [
+				["maybeSomeA_someB", "b"],
+				["maybeSomeA_someB", "b", "b"],
+				["maybeSomeA_someB", "b", "b", "b"],
+				["maybeSomeA_someB", "a", "b"],
+				["maybeSomeA_someB", "a", "b", "b"],
+				["maybeSomeA_someB", "a", "b", "b", "b"],
+				["maybeSomeA_someB", "a", "a", "b"],
+				["maybeSomeA_someB", "a", "a", "b", "b"],
+				["maybeSomeA_someB", "a", "a", "b", "b", "b"],
+				["maybeSomeA_someB", "a", "a", "a", "b"],
+				["maybeSomeA_someB", "a", "a", "a", "b", "b"],
+				["maybeSomeA_someB", "a", "a", "a", "b", "b", "b"],
+			],
+		},
+	},
+	maybeSomeA_maybeSomeB: {
+		model: "SYSTEM: maybeSomeA_maybeSomeB = a* b*;",
+		expected: {
+			1: [
+				["maybeSomeA_maybeSomeB"],
+				["maybeSomeA_maybeSomeB", "b"],
+				["maybeSomeA_maybeSomeB", "a"],
+				["maybeSomeA_maybeSomeB", "a", "b"],
+			],
+			2: [
+				["maybeSomeA_maybeSomeB"],
+				["maybeSomeA_maybeSomeB", "b"],
+				["maybeSomeA_maybeSomeB", "b", "b"],
+				["maybeSomeA_maybeSomeB", "a"],
+				["maybeSomeA_maybeSomeB", "a", "b"],
+				["maybeSomeA_maybeSomeB", "a", "b", "b"],
+				["maybeSomeA_maybeSomeB", "a", "a"],
+				["maybeSomeA_maybeSomeB", "a", "a", "b"],
+				["maybeSomeA_maybeSomeB", "a", "a", "b", "b"],
+			],
+			3: [
+				["maybeSomeA_maybeSomeB"],
+				["maybeSomeA_maybeSomeB", "b"],
+				["maybeSomeA_maybeSomeB", "b", "b"],
+				["maybeSomeA_maybeSomeB", "b", "b", "b"],
+				["maybeSomeA_maybeSomeB", "a"],
+				["maybeSomeA_maybeSomeB", "a", "b"],
+				["maybeSomeA_maybeSomeB", "a", "b", "b"],
+				["maybeSomeA_maybeSomeB", "a", "b", "b", "b"],
+				["maybeSomeA_maybeSomeB", "a", "a"],
+				["maybeSomeA_maybeSomeB", "a", "a", "b"],
+				["maybeSomeA_maybeSomeB", "a", "a", "b", "b"],
+				["maybeSomeA_maybeSomeB", "a", "a", "b", "b", "b"],
+				["maybeSomeA_maybeSomeB", "a", "a", "a"],
+				["maybeSomeA_maybeSomeB", "a", "a", "a", "b"],
+				["maybeSomeA_maybeSomeB", "a", "a", "a", "b", "b"],
+				["maybeSomeA_maybeSomeB", "a", "a", "a", "b", "b", "b"],
+			],
+		},
+	},
+
+	////TODO: SEQUENCE TEST
+	//	SYSTEM: seq_oneA           = a;   //NOTE: like ATOM TEST but should test the event only rather than the system
+	//	SYSTEM: seq_oneA_oneB      = a b;
+	//	SYSTEM: seq_oneA_oneB_oneC = a b c;
+
+	////TODO: QUANTIFIED SEQUENCE TEST
+	//	SYSTEM: seq__oneA_oneB__maybe     = (a b)?;
+	//	SYSTEM: seq__oneA_oneB__some      = (a b)+;
+	//	SYSTEM: seq__oneA_oneB__maybeSome = (a b)*;
+
+	//TODO: ALTERNATIONS
+
+};
+
+
+describe("Generator (INTEGRATION)", () => {
+
+	describe("#generate()", () => {
+
+		Object.keys(tests).forEach((testName) => {
+			let test = tests[testName],
+				modelObj = parse(test.model),
+				gen = new Generator(modelObj);
+
+			describe(`for model=${JSON.stringify(test.model)}`, () => {
+
+				Object.keys(test.expected).forEach((scopeStr) => {
+					let scope = Number(scopeStr),
+						expected = test.expected[scopeStr];
+
+					it(`should return ${expected.length} traces if scope=${scope}`, () => {
+						let actual = [
+							for (evt of gen.generate(modelObj.systems[testName], scope))
+								evt.map(s => s.replace(/_\d+of\d+$/, ""))
+						];
+						assert.deepEqual(actual, expected);
+					});
+
+				});
+
+			});
+
+		});
+
+	});
+
+});