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 named", function() { expect(pass).toReportMissingRuleIn('start "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 an action", function() { expect(pass).toReportMissingRuleIn('start = 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+'); }); });