describe("PEG.js grammar parser", function() { var trivialGrammar; beforeEach(function() { trivialGrammar = { type: "grammar", initializer: null, rules: [ { type: "rule", name: "start", displayName: null, expression: { type: "literal", value: "abcd", ignoreCase: false } } ], startRule: "start" }; this.addMatchers({ toParseAs: function(expected) { var result; try { result = PEG.parser.parse(this.actual); this.message = function() { return "Expected " + jasmine.pp(this.actual) + " " + (this.isNot ? "not " : "") + "to parse as " + jasmine.pp(expected) + ", " + "but it parsed as " + jasmine.pp(result) + "."; }; return this.env.equals_(result, expected); } catch (e) { this.message = function() { return "Expected " + jasmine.pp(this.actual) + " " + "to parse as " + jasmine.pp(expected) + ", " + "but it failed to parse with message " + jasmine.pp(e.message) + "."; }; return false; } }, toFailToParse: function() { var result; try { result = PEG.parser.parse(this.actual); this.message = function() { return "Expected " + jasmine.pp(this.actual) + " to fail to parse, " + "but it parsed as " + jasmine.pp(result) + "."; }; return false; } catch (e) { this.message = function() { return "Expected " + jasmine.pp(this.actual) + " to parse, " + "but it failed with message " + jasmine.pp(e.message) + "."; }; return true; } } }); }); // Canonical comment is "/* comment */". it("parses comment", function() { expect('start =// comment\n"abcd"' ).toParseAs(trivialGrammar); expect('start =/* comment */"abcd"').toParseAs(trivialGrammar); }); /* Canonical singleLineComment is "// comment". */ it("parses singleLineComment", function() { expect('start =//\n"abcd"' ).toParseAs(trivialGrammar); expect('start =//a\n"abcd"' ).toParseAs(trivialGrammar); expect('start =//aaa\n"abcd"').toParseAs(trivialGrammar); }); // Canonical multiLineComment is "/* comment */". it("parses multiLineComment", function() { expect('start =/**/"abcd"' ).toParseAs(trivialGrammar); expect('start =/*a*/"abcd"' ).toParseAs(trivialGrammar); expect('start =/*aaa*/"abcd"').toParseAs(trivialGrammar); expect('start =/***/"abcd"' ).toParseAs(trivialGrammar); expect('start =/**/*/"abcd"').toFailToParse(); }); /* Canonical eol is "\n". */ it("parses eol", function() { expect('start =\n"abcd"' ).toParseAs(trivialGrammar); expect('start =\r\n"abcd"' ).toParseAs(trivialGrammar); expect('start =\r"abcd"' ).toParseAs(trivialGrammar); expect('start =\u2028"abcd"').toParseAs(trivialGrammar); expect('start =\u2029"abcd"').toParseAs(trivialGrammar); }); /* Canonical eolChar is "\n". */ it("parses eolChar", function() { expect('start =\n"abcd"' ).toParseAs(trivialGrammar); expect('start =\r"abcd"' ).toParseAs(trivialGrammar); expect('start =\u2028"abcd"').toParseAs(trivialGrammar); expect('start =\u2029"abcd"').toParseAs(trivialGrammar); }); /* Canonical whitespace is " ". */ it("parses whitespace", function() { expect('start =\t"abcd"' ).toParseAs(trivialGrammar); expect('start =\x0B"abcd"' ).toParseAs(trivialGrammar); // no "\v" in IE expect('start =\f"abcd"' ).toParseAs(trivialGrammar); expect('start = "abcd"' ).toParseAs(trivialGrammar); expect('start =\u00A0"abcd"').toParseAs(trivialGrammar); expect('start =\uFEFF"abcd"').toParseAs(trivialGrammar); expect('start =\u1680"abcd"').toParseAs(trivialGrammar); expect('start =\u180E"abcd"').toParseAs(trivialGrammar); expect('start =\u2000"abcd"').toParseAs(trivialGrammar); expect('start =\u2001"abcd"').toParseAs(trivialGrammar); expect('start =\u2002"abcd"').toParseAs(trivialGrammar); expect('start =\u2003"abcd"').toParseAs(trivialGrammar); expect('start =\u2004"abcd"').toParseAs(trivialGrammar); expect('start =\u2005"abcd"').toParseAs(trivialGrammar); expect('start =\u2006"abcd"').toParseAs(trivialGrammar); expect('start =\u2007"abcd"').toParseAs(trivialGrammar); expect('start =\u2008"abcd"').toParseAs(trivialGrammar); expect('start =\u2009"abcd"').toParseAs(trivialGrammar); expect('start =\u200A"abcd"').toParseAs(trivialGrammar); expect('start =\u202F"abcd"').toParseAs(trivialGrammar); expect('start =\u205F"abcd"').toParseAs(trivialGrammar); expect('start =\u3000"abcd"').toParseAs(trivialGrammar); }); });