You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
pegjs/spec/compiler/passes/report-missing-rules.spec.js

87 lines
2.8 KiB
JavaScript

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+');
});
});