Parser.test.js
2.37 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/*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();
});
});