132 lines
2.4 KiB
JavaScript
Vendored
132 lines
2.4 KiB
JavaScript
Vendored
/*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();
|
|
});
|
|
});
|