123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- /*globals describe it */
- require("should");
- var Parser = require("../");
- var testdata = [
- {
- name: "simple string",
- states: {
- "start": {
- "[d-gm-rv]+": function(match, index) {
- if(!this.data) this.data = [];
- this.data.push({
- match: match,
- index: index
- });
- }
- }
- },
- string: "abcdefghijklmnopqrstuvwxyz",
- expected: {
- data: [
- { match: "defg", index: 3 },
- { match: "mnopqr", index: 12 },
- { match: "v", index: 21 }
- ]
- }
- },
- {
- name: "state switing",
- states: {
- "number": {
- "([0-9]+)": function(match, number) {
- if(!this.data) this.data = {};
- this.data[this.ident] = +number;
- delete this.ident;
- return "start";
- },
- "-\\?": true,
- "\\?": "start"
- },
- "start": {
- "([a-z]+)": function(match, name) {
- this.ident = name;
- return "number";
- }
- }
- },
- string: "a 1 b 2 c f 3 d ? e -? 4",
- expected: {
- data: {
- a: 1, b: 2, c: 3, e: 4
- }
- }
- },
- {
- name: "state array",
- states: {
- "start": [
- { "a": function() { this.a = true; } },
- {
- "b": function() { this.b = true; },
- "c": function() { this.c = true; }
- }
- ]
- },
- string: "hello abc",
- expected: {
- a: true, b: true, c: true
- }
- },
- {
- name: "reference other states",
- states: {
- "start": [
- { "a": function() { this.a = true; } },
- "bc"
- ],
- "bc": {
- "b": function() { this.b = true; },
- "c": function() { this.c = true; }
- }
- },
- string: "hello abc",
- expected: {
- a: true, b: true, c: true
- }
- }
- ];
- describe("Parser", function() {
- testdata.forEach(function(testcase) {
- it("should parse " + testcase.name, function() {
- var parser = new Parser(testcase.states);
- var actual = parser.parse("start", testcase.string, {});
- actual.should.be.eql(testcase.expected);
- });
- });
- it("should default context to empty object", function() {
- var parser = new Parser({
- "a": {
- "a": function() {
- this.should.be.eql({});
- }
- }
- });
- var result = parser.parse("a", "a");
- result.should.be.eql({});
- });
- it("should error for unexpected format", function() {
- (function() {
- var parser = new Parser({
- "a": 123
- });
- return parser;
- }).should.throw();
- });
- it("should error for not existing state", function() {
- var parser = new Parser({
- "a": {
- "a": "b"
- }
- });
- (function() {
- return parser.parse("a", "a");
- }).should.throw();
- });
- });
|