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",