diff --git a/spec/compiler/passes/report-missing-rules.spec.js b/spec/compiler/passes/report-missing-rules.spec.js
new file mode 100644
index 0000000..2852d32
--- /dev/null
+++ b/spec/compiler/passes/report-missing-rules.spec.js
@@ -0,0 +1,82 @@
+describe("compiler pass |reportMissingRules|", function() {
+ var pass = PEG.compiler.passes.reportMissingRules;
+
+ beforeEach(function() {
+ this.addMatchers({
+ toReportMissingRuleIn: function(grammar) {
+ var ast = PEG.parser.parse(grammar);
+
+ try {
+ this.actual(ast);
+
+ this.message = function() {
+ return "Expected the pass to report a missing rule for grammar "
+ + jasmine.pp(grammar) + ", "
+ + "but it didn't.";
+ };
+
+ return false;
+ } catch (e) {
+ if (this.isNot) {
+ this.message = function() {
+ return "Expected the pass not to report a missing rule for grammar "
+ + jasmine.pp(grammar) + ", "
+ + "but it did.";
+ };
+ } else {
+ this.message = function() {
+ return "Expected the pass to report a missing rule for grammar "
+ + jasmine.pp(grammar) + ", "
+ + "but it reported an error with message "
+ + jasmine.pp(e.message) + ".";
+ };
+ }
+
+ return e.message === 'Referenced rule "missing" does not exist.';
+ }
+ }
+ });
+ });
+
+ it("reports missing rule referenced from a rule", function() {
+ expect(pass).toReportMissingRuleIn('start = missing');
+ });
+
+ it("reports missing rule referenced from a choice", function() {
+ expect(pass).toReportMissingRuleIn('start = missing / "a" / "b"');
+ expect(pass).toReportMissingRuleIn('start = "a" / "b" / missing');
+ });
+
+ it("reports missing rule referenced from a sequence", function() {
+ expect(pass).toReportMissingRuleIn('start = missing "a" "b"');
+ expect(pass).toReportMissingRuleIn('start = "a" "b" missing');
+ });
+
+ it("reports missing rule referenced from a labeled", function() {
+ expect(pass).toReportMissingRuleIn('start = label:missing');
+ });
+
+ it("reports missing rule referenced from a simple and", function() {
+ expect(pass).toReportMissingRuleIn('start = &missing');
+ });
+
+ it("reports missing rule referenced from a simple not", function() {
+ expect(pass).toReportMissingRuleIn('start = &missing');
+ });
+
+ it("reports missing rule referenced from an optional", function() {
+ expect(pass).toReportMissingRuleIn('start = missing?');
+ });
+
+ it("reports missing rule referenced from a zero or more", function() {
+ expect(pass).toReportMissingRuleIn('start = missing*');
+ });
+
+ it("reports missing rule referenced from a one or more", function() {
+ expect(pass).toReportMissingRuleIn('start = missing+');
+ });
+
+ it("reports missing rule referenced from an action", function() {
+ expect(pass).toReportMissingRuleIn('start = missing { }');
+ });
+});
diff --git a/spec/index.html b/spec/index.html
index 068dc1f..7b0679f 100644
--- a/spec/index.html
+++ b/spec/index.html
@@ -8,6 +8,7 @@
+
-
diff --git a/test/run b/test/run
index bed692e..9121eae 100755
--- a/test/run
+++ b/test/run
@@ -75,7 +75,6 @@ QUnit.done(function(details) {
[
"helpers.js",
- "compiler/passes/report-missing-rules-test.js",
"compiler/passes/report-left-recursion-test.js",
"compiler/passes/remove-proxy-rules-test.js",
"compiler/passes/compute-var-names-test.js",