Browse Source

MPIDE-27: add parser integration tests

Parser test suite now includes integration tests, performing deep
comparisons on the output of the parser. They are much more fragile than
the unit tests and are much more likely to catch subtle errors.
Austin Meagher 10 years ago
parent
commit
a4fdb67407
2 changed files with 621 additions and 0 deletions
  1. 47 0
      src/lib/parser/test/parserIntegration.js
  2. 574 0
      src/lib/parser/test/testdata.json

+ 47 - 0
src/lib/parser/test/parserIntegration.js

@@ -0,0 +1,47 @@
+"use strict";
+
+let assert = require("assert");
+let tests = require("./testdata.json");
+
+require("../../../../build/lib/parser/modellang");
+let Parser = modellangParser;
+
+let parseOpts = {locations: false, showAst: true};
+
+describe("Parser", function() {
+
+	describe("#parse()", function() {
+		Object.keys(tests).forEach(function(testName) {
+
+			describe(`for model ${testName}`, function() {
+				let test = tests[testName];
+				let actual = Parser.parse(test.input, {}, parseOpts);
+				let expected = test.expected;
+
+				it("should parse systems correctly", function() {
+					assert.deepEqual(actual.systems, expected.systems);
+				});
+
+				it("should parse behaviors correctly", function() {
+					assert.deepEqual(actual.behaviors, expected.behaviors);
+				});
+
+				it("should parse interactions correctly", function() {
+					assert.deepEqual(actual.interactions, expected.interactions);
+				});
+
+				it("should parse triggers correctly", function() {
+					assert.deepEqual(actual.triggers, expected.triggers);
+				});
+
+				it("should parse inits correctly", function() {
+					assert.deepEqual(actual.init, expected.init);
+				});
+
+				it("should parse ASTs correctly", function() {
+					assert.deepEqual(actual.ast, expected.ast);
+				});
+			});
+		});
+	});
+});

+ 574 - 0
src/lib/parser/test/testdata.json

@@ -0,0 +1,574 @@
+{
+	"send-receive": {
+		"input": "SYSTEM: task_a = send*;\nSYSTEM: task_b = receive*;\nINTERACTION: task_a:send -> task_b:receive;",
+		"expected": {
+			"systems": {
+				"task_a": {
+					"type": "System",
+					"id": "task_a",
+					"body": [{
+						"type": "Sequence",
+						"body": [{
+							"type": "Behavior",
+							"id": "send",
+							"scope": {
+								"min": 0,
+								"max": null
+							}
+						}],
+						"scope": {
+							"min": 1,
+							"max": 1
+						}
+					}],
+					"refs": [
+						"send"
+					],
+					"properties": {},
+					"scope": {
+						"min": 1,
+						"max": 1
+					}
+				},
+				"task_b": {
+					"type": "System",
+					"id": "task_b",
+					"body": [{
+						"type": "Sequence",
+						"body": [{
+							"type": "Behavior",
+							"id": "receive",
+							"scope": {
+								"min": 0,
+								"max": null
+							}
+						}],
+						"scope": {
+							"min": 1,
+							"max": 1
+						}
+					}],
+					"refs": [
+						"receive"
+					],
+					"properties": {},
+					"scope": {
+						"min": 1,
+						"max": 1
+					}
+				}
+			},
+			"behaviors": {
+				"send": {
+					"type": "Behavior",
+					"id": "send",
+					"body": [],
+					"refs": [],
+					"properties": {}
+				},
+				"receive": {
+					"type": "Behavior",
+					"id": "receive",
+					"body": [],
+					"refs": [],
+					"properties": {}
+				}
+			},
+			"interactions": [{
+				"type": "Then",
+				"body": [{
+					"type": "Selector",
+					"system": "task_a",
+					"pattern": [{
+						"type": "Sequence",
+						"body": [{
+							"type": "Behavior",
+							"id": "send",
+							"scope": {
+								"min": 1,
+								"max": 1
+							}
+						}],
+						"scope": {
+							"min": 1,
+							"max": 1
+						}
+					}],
+					"pre": null,
+					"post": null
+				}, {
+					"type": "Selector",
+					"system": "task_b",
+					"pattern": [{
+						"type": "Sequence",
+						"body": [{
+							"type": "Behavior",
+							"id": "receive",
+							"scope": {
+								"min": 1,
+								"max": 1
+							}
+						}],
+						"scope": {
+							"min": 1,
+							"max": 1
+						}
+					}],
+					"pre": null,
+					"post": null
+				}]
+			}],
+			"triggers": [],
+			"init": [],
+			"ast": [{
+				"type": "System",
+				"id": "task_a",
+				"body": [{
+					"type": "Sequence",
+					"body": [{
+						"type": "Behavior",
+						"id": "send",
+						"scope": {
+							"min": 0,
+							"max": null
+						}
+					}],
+					"scope": {
+						"min": 1,
+						"max": 1
+					}
+				}],
+				"refs": [
+					"send"
+				],
+				"properties": {},
+				"scope": {
+					"min": 1,
+					"max": 1
+				}
+			}, {
+				"type": "System",
+				"id": "task_b",
+				"body": [{
+					"type": "Sequence",
+					"body": [{
+						"type": "Behavior",
+						"id": "receive",
+						"scope": {
+							"min": 0,
+							"max": null
+						}
+					}],
+					"scope": {
+						"min": 1,
+						"max": 1
+					}
+				}],
+				"refs": [
+					"receive"
+				],
+				"properties": {},
+				"scope": {
+					"min": 1,
+					"max": 1
+				}
+			}, {
+				"type": "Then",
+				"body": [{
+					"type": "Selector",
+					"system": "task_a",
+					"pattern": [{
+						"type": "Sequence",
+						"body": [{
+							"type": "Behavior",
+							"id": "send",
+							"scope": {
+								"min": 1,
+								"max": 1
+							}
+						}],
+						"scope": {
+							"min": 1,
+							"max": 1
+						}
+					}],
+					"pre": null,
+					"post": null
+				}, {
+					"type": "Selector",
+					"system": "task_b",
+					"pattern": [{
+						"type": "Sequence",
+						"body": [{
+							"type": "Behavior",
+							"id": "receive",
+							"scope": {
+								"min": 1,
+								"max": 1
+							}
+						}],
+						"scope": {
+							"min": 1,
+							"max": 1
+						}
+					}],
+					"pre": null,
+					"post": null
+				}]
+			}],
+			"errors": []
+		}
+	},
+	"kruskal": {
+		"input": "SYSTEM: kruskal = make_set* find_edges* return;\nBEHAVIOR: find_edges = found_edge | found_no_edge;\nBEHAVIOR: found_edge = union_vertices add_edge_to_forest;\nWHEN: kruskal:make_set { count++ };\nWHEN: kruskal:find_edges { count--; if (count == 0) return false; };",
+		"expected": {
+			"systems": {
+				"kruskal": {
+					"type": "System",
+					"id": "kruskal",
+					"body": [{
+						"type": "Sequence",
+						"body": [{
+							"type": "Behavior",
+							"id": "make_set",
+							"scope": {
+								"min": 0,
+								"max": null
+							}
+						}, {
+							"type": "Behavior",
+							"id": "find_edges",
+							"scope": {
+								"min": 0,
+								"max": null
+							}
+						}, {
+							"type": "Behavior",
+							"id": "return",
+							"scope": {
+								"min": 1,
+								"max": 1
+							}
+						}],
+						"scope": {
+							"min": 1,
+							"max": 1
+						}
+					}],
+					"refs": [
+						"make_set",
+						"find_edges",
+						"return"
+					],
+					"properties": {},
+					"scope": {
+						"min": 1,
+						"max": 1
+					}
+				}
+			},
+			"behaviors": {
+				"find_edges": {
+					"type": "Behavior",
+					"id": "find_edges",
+					"body": [{
+						"type": "Alternation",
+						"body": [{
+							"type": "Behavior",
+							"id": "found_edge",
+							"scope": {
+								"min": 1,
+								"max": 1
+							}
+						}, {
+							"type": "Behavior",
+							"id": "found_no_edge",
+							"scope": {
+								"min": 1,
+								"max": 1
+							}
+						}],
+						"scope": {
+							"min": 1,
+							"max": 1
+						}
+					}],
+					"refs": [
+						"found_edge",
+						"found_no_edge"
+					],
+					"properties": {}
+				},
+				"found_edge": {
+					"type": "Behavior",
+					"id": "found_edge",
+					"body": [{
+						"type": "Sequence",
+						"body": [{
+							"type": "Behavior",
+							"id": "union_vertices",
+							"scope": {
+								"min": 1,
+								"max": 1
+							}
+						}, {
+							"type": "Behavior",
+							"id": "add_edge_to_forest",
+							"scope": {
+								"min": 1,
+								"max": 1
+							}
+						}],
+						"scope": {
+							"min": 1,
+							"max": 1
+						}
+					}],
+					"refs": [
+						"union_vertices",
+						"add_edge_to_forest"
+					],
+					"properties": {}
+				},
+				"make_set": {
+					"type": "Behavior",
+					"id": "make_set",
+					"body": [],
+					"refs": [],
+					"properties": {}
+				},
+				"return": {
+					"type": "Behavior",
+					"id": "return",
+					"body": [],
+					"refs": [],
+					"properties": {}
+				},
+				"found_no_edge": {
+					"type": "Behavior",
+					"id": "found_no_edge",
+					"body": [],
+					"refs": [],
+					"properties": {}
+				},
+				"union_vertices": {
+					"type": "Behavior",
+					"id": "union_vertices",
+					"body": [],
+					"refs": [],
+					"properties": {}
+				},
+				"add_edge_to_forest": {
+					"type": "Behavior",
+					"id": "add_edge_to_forest",
+					"body": [],
+					"refs": [],
+					"properties": {}
+				}
+			},
+			"interactions": [],
+			"triggers": [{
+				"type": "Trigger",
+				"on": {
+					"type": "Selector",
+					"system": "kruskal",
+					"pattern": [{
+						"type": "Sequence",
+						"body": [{
+							"type": "Behavior",
+							"id": "make_set",
+							"scope": {
+								"min": 1,
+								"max": 1
+							}
+						}],
+						"scope": {
+							"min": 1,
+							"max": 1
+						}
+					}],
+					"pre": null,
+					"post": null
+				},
+				"do": "count++"
+			}, {
+				"type": "Trigger",
+				"on": {
+					"type": "Selector",
+					"system": "kruskal",
+					"pattern": [{
+						"type": "Sequence",
+						"body": [{
+							"type": "Behavior",
+							"id": "find_edges",
+							"scope": {
+								"min": 1,
+								"max": 1
+							}
+						}],
+						"scope": {
+							"min": 1,
+							"max": 1
+						}
+					}],
+					"pre": null,
+					"post": null
+				},
+				"do": "count--; if (count == 0) return false;"
+			}],
+			"init": [],
+			"ast": [{
+				"type": "System",
+				"id": "kruskal",
+				"body": [{
+					"type": "Sequence",
+					"body": [{
+						"type": "Behavior",
+						"id": "make_set",
+						"scope": {
+							"min": 0,
+							"max": null
+						}
+					}, {
+						"type": "Behavior",
+						"id": "find_edges",
+						"scope": {
+							"min": 0,
+							"max": null
+						}
+					}, {
+						"type": "Behavior",
+						"id": "return",
+						"scope": {
+							"min": 1,
+							"max": 1
+						}
+					}],
+					"scope": {
+						"min": 1,
+						"max": 1
+					}
+				}],
+				"refs": [
+					"make_set",
+					"find_edges",
+					"return"
+				],
+				"properties": {},
+				"scope": {
+					"min": 1,
+					"max": 1
+				}
+			}, {
+				"type": "Behavior",
+				"id": "find_edges",
+				"body": [{
+					"type": "Alternation",
+					"body": [{
+						"type": "Behavior",
+						"id": "found_edge",
+						"scope": {
+							"min": 1,
+							"max": 1
+						}
+					}, {
+						"type": "Behavior",
+						"id": "found_no_edge",
+						"scope": {
+							"min": 1,
+							"max": 1
+						}
+					}],
+					"scope": {
+						"min": 1,
+						"max": 1
+					}
+				}],
+				"refs": [
+					"found_edge",
+					"found_no_edge"
+				],
+				"properties": {}
+			}, {
+				"type": "Behavior",
+				"id": "found_edge",
+				"body": [{
+					"type": "Sequence",
+					"body": [{
+						"type": "Behavior",
+						"id": "union_vertices",
+						"scope": {
+							"min": 1,
+							"max": 1
+						}
+					}, {
+						"type": "Behavior",
+						"id": "add_edge_to_forest",
+						"scope": {
+							"min": 1,
+							"max": 1
+						}
+					}],
+					"scope": {
+						"min": 1,
+						"max": 1
+					}
+				}],
+				"refs": [
+					"union_vertices",
+					"add_edge_to_forest"
+				],
+				"properties": {}
+			}, {
+				"type": "Trigger",
+				"on": {
+					"type": "Selector",
+					"system": "kruskal",
+					"pattern": [{
+						"type": "Sequence",
+						"body": [{
+							"type": "Behavior",
+							"id": "make_set",
+							"scope": {
+								"min": 1,
+								"max": 1
+							}
+						}],
+						"scope": {
+							"min": 1,
+							"max": 1
+						}
+					}],
+					"pre": null,
+					"post": null
+				},
+				"do": "count++"
+			}, {
+				"type": "Trigger",
+				"on": {
+					"type": "Selector",
+					"system": "kruskal",
+					"pattern": [{
+						"type": "Sequence",
+						"body": [{
+							"type": "Behavior",
+							"id": "find_edges",
+							"scope": {
+								"min": 1,
+								"max": 1
+							}
+						}],
+						"scope": {
+							"min": 1,
+							"max": 1
+						}
+					}],
+					"pre": null,
+					"post": null
+				},
+				"do": "count--; if (count == 0) return false;"
+			}],
+			"errors": []
+		}
+	}
+}