spahql
Version:
A query language and data model for deep Javascript object structures.
61 lines (53 loc) • 2.08 kB
JavaScript
exports["SpahQL.QueryParser"] = {
"Throws a parse error on empty or nonsense queries": function(test) {
test.expect(2);
try { SpahQL.QueryParser.parseQuery(""); }
catch(e) { test.ok(e.message.indexOf("Failed") >= 0); }
try { SpahQL.QueryParser.parseQuery("gibberish"); }
catch(e) {
test.ok(e.message.indexOf("Failed") >= 0);
test.done();
}
},
"Returns the correct structure when parsing full queries": function(test) {
var q = SpahQL.QueryParser.parseQuery("/foo//bar/.property/baz[$//bar] == {1,'2', /foo, true}");
test.deepEqual(
q.primaryToken,
new SpahQL.Token.SelectionQuery([
new SpahQL.Token.PathComponent(new SpahQL.Token.KeyName("foo")),
new SpahQL.Token.PathComponent(new SpahQL.Token.KeyName("bar"), null, true),
new SpahQL.Token.PathComponent(null, new SpahQL.Token.KeyName("property")),
new SpahQL.Token.PathComponent(new SpahQL.Token.KeyName("baz"), null, false, [
new SpahQL.Token.FilterQuery(SpahQL.QueryParser.parseQuery("$//bar"))
])
])
);
test.deepEqual(
q.comparisonOperator,
new SpahQL.Token.ComparisonOperator("==")
);
test.deepEqual(
q.secondaryToken,
new SpahQL.Token.Set([
new SpahQL.Token.Numeric(1),
new SpahQL.Token.String("2"),
new SpahQL.Token.SelectionQuery([
new SpahQL.Token.PathComponent(new SpahQL.Token.KeyName("foo"))
]),
new SpahQL.Token.Boolean(true)
])
);
test.done();
},
"Cleans a query with spaces but doesn't clean spaces from string literals": function(test) {
var qp = SpahQL.QueryParser;
test.equal(qp.cleanQuery("//foo == 'bar'"), "//foo=='bar'");
test.equal(qp.cleanQuery("//foo == 'bar baz\" '"), "//foo=='bar baz\" '");
test.done();
},
"Parses a flat root query": function(test) {
var q = SpahQL.QueryParser.parseQuery("/");
test.deepEqual(q.primaryToken, new SpahQL.Token.SelectionQuery([new SpahQL.Token.PathComponent()]));
test.done();
}
};