xpath-parser
Version:
simple xpath parser
522 lines (500 loc) • 14.5 kB
JavaScript
(function() {
var debug, inspect, parse;
debug = require('debug')('test:xpath');
inspect = require('eyes').inspector({
stream: null
});
parse = require('../lib/xpath').parse;
module.exports = {
foo: function(æ) {
var exp;
exp = parse("/f:iq/o:query/namespace::o:foobar");
debug(inspect(exp));
æ.deepEqual(exp.map(function(e) {
return e.prefix;
}), ['f', 'o', 'o']);
æ.deepEqual(exp.map(function(e) {
return e.axis;
}), ['child', 'child', 'namespace']);
æ.deepEqual(exp.map(function(e) {
return e.nc;
}), ['iq', 'query', 'foobar']);
return æ.done();
},
bar: function(æ) {
var exp, _ref, _ref1, _ref2;
exp = parse('//form[@action = "submi t.html"]//table');
debug(inspect(exp));
æ.deepEqual(exp.map(function(e) {
return e.nc;
}), ['node', 'form', 'node', 'table']);
æ.deepEqual(exp.map(function(e) {
return e.axis;
}), ['descendant-or-self', 'child', 'descendant-or-self', 'child']);
æ.deepEqual((_ref = exp[0]) != null ? _ref.args : void 0, [{}]);
æ.deepEqual((_ref1 = exp[2]) != null ? _ref1.args : void 0, [{}]);
æ.deepEqual((_ref2 = exp[1]) != null ? _ref2.predicate : void 0, [
[
{
operator: '=',
args: [
[
{
axis: 'attribute',
nc: 'action',
q: 'action'
}
], [
{
value: 'submi t.html'
}
]
]
}
]
]);
return æ.done();
},
baz: function(æ) {
var exp, _ref;
exp = parse("/iq/query../namespace::foobar");
debug(inspect(exp));
æ.deepEqual(exp.map(function(e) {
return e.axis;
}), ['child', 'child', 'parent', 'namespace']);
æ.deepEqual(exp.map(function(e) {
return e.nc;
}), ['iq', 'query', 'node', 'foobar']);
æ.deepEqual((_ref = exp[2]) != null ? _ref.args : void 0, [{}]);
return æ.done();
},
'self::ns': function(æ) {
var exp, _ref;
exp = parse("/self::node()/gs:enquiry/@ping:pong");
debug(inspect(exp));
æ.deepEqual(exp.map(function(e) {
return e.prefix;
}), [void 0, 'gs', 'ping']);
æ.deepEqual(exp.map(function(e) {
return e.axis;
}), ['self', 'child', 'attribute']);
æ.deepEqual(exp.map(function(e) {
return e.nc;
}), ['node', 'enquiry', 'pong']);
æ.deepEqual((_ref = exp[0]) != null ? _ref.args : void 0, [[{}]]);
return æ.done();
},
'./ns': function(æ) {
var exp, _ref;
exp = parse("./gs:enquiry/attribute::ping:pong");
debug(inspect(exp));
æ.deepEqual(exp.map(function(e) {
return e.prefix;
}), [void 0, 'gs', 'ping']);
æ.deepEqual(exp.map(function(e) {
return e.axis;
}), ['self', 'child', 'attribute']);
æ.deepEqual(exp.map(function(e) {
return e.nc;
}), ['node', 'enquiry', 'pong']);
æ.deepEqual((_ref = exp[0]) != null ? _ref.args : void 0, [{}]);
return æ.done();
},
iq: function(æ) {
var exp, _ref;
exp = parse('/iq[@id="rofl"]/lol:w00t');
debug(inspect(exp));
æ.deepEqual(exp.map(function(e) {
return e.prefix;
}), [void 0, 'lol']);
æ.deepEqual(exp.map(function(e) {
return e.axis;
}), ['child', 'child']);
æ.deepEqual(exp.map(function(e) {
return e.nc;
}), ['iq', 'w00t']);
æ.deepEqual((_ref = exp[0]) != null ? _ref.predicate : void 0, [
[
{
operator: '=',
args: [
[
{
axis: 'attribute',
nc: 'id',
q: 'id'
}
], [
{
value: 'rofl'
}
]
]
}
]
]);
return æ.done();
},
exp: function(æ) {
var exp, _ref, _ref1;
exp = parse('/überbook/(chapter)[fn:last()]');
debug(inspect(exp));
æ.deepEqual(exp.map(function(e) {
return e.axis;
}), ['child', 'child']);
æ.deepEqual(exp.map(function(e) {
return e.nc;
}), ['überbook', void 0]);
æ.deepEqual((_ref = exp[1]) != null ? _ref.predicate : void 0, [
[
{
axis: 'self',
prefix: 'fn',
nc: 'last',
q: 'fn:last',
args: [[{}]]
}
]
]);
æ.deepEqual((_ref1 = exp[1]) != null ? _ref1.expression : void 0, [
{
nc: 'chapter',
q: 'chapter',
axis: 'child'
}
]);
return æ.done();
},
or: function(æ) {
var exp, _ref, _ref1;
exp = parse('/book/(chapter | appendix | section)[fn:last()]');
debug(inspect(exp));
æ.deepEqual(exp.map(function(e) {
return e.axis;
}), ['child', 'child']);
æ.deepEqual(exp.map(function(e) {
return e.nc;
}), ['book', void 0]);
æ.deepEqual((_ref = exp[1]) != null ? _ref.predicate : void 0, [
[
{
axis: 'self',
prefix: 'fn',
nc: 'last',
q: 'fn:last',
args: [[{}]]
}
]
]);
æ.deepEqual((_ref1 = exp[1]) != null ? _ref1.expression : void 0, [
{
operator: 'union',
args: [
[
{
expression: [
{
operator: 'union',
args: [
[
{
nc: 'chapter',
q: 'chapter',
axis: 'child'
}
], [
{
nc: 'appendix',
q: 'appendix',
axis: 'child'
}
]
]
}
]
}
], [
{
nc: 'section',
q: 'section',
axis: 'child'
}
]
]
}
]);
return æ.done();
},
id: function(æ) {
var exp, _ref;
exp = parse('id("rofl")/lol:w00t');
debug(inspect(exp));
æ.deepEqual(exp.map(function(e) {
return e.prefix;
}), [void 0, 'lol']);
æ.deepEqual(exp.map(function(e) {
return e.axis;
}), ['child', 'child']);
æ.deepEqual(exp.map(function(e) {
return e.nc;
}), ['id', 'w00t']);
æ.deepEqual((_ref = exp[0]) != null ? _ref.args : void 0, [
[
{
value: 'rofl'
}
]
]);
return æ.done();
},
short: function(æ) {
var exp, _ref;
exp = parse("c | o | l");
debug(inspect(exp));
æ.equals(1, exp != null ? exp.length : void 0);
æ.deepEqual((_ref = exp[0]) != null ? _ref.expression : void 0, [
{
operator: 'union',
args: [
[
{
expression: [
{
operator: 'union',
args: [
[
{
nc: 'c',
q: 'c',
axis: 'child'
}
], [
{
nc: 'o',
q: 'o',
axis: 'child'
}
]
]
}
]
}
], [
{
nc: 'l',
q: 'l',
axis: 'child'
}
]
]
}
]);
return æ.done();
},
xmpp: function(æ) {
var exp, _ref, _ref1, _ref2, _ref3, _ref4;
exp = parse("/iq[@get] or /iq[@set] and /iq[@error]");
debug(inspect(exp));
æ.equals(1, exp != null ? exp.length : void 0);
æ.equals(1, (_ref = exp[0]) != null ? (_ref1 = _ref.expression) != null ? _ref1.length : void 0 : void 0);
æ.deepEqual((_ref2 = exp[0]) != null ? (_ref3 = _ref2.expression) != null ? (_ref4 = _ref3[0]) != null ? _ref4.expression : void 0 : void 0 : void 0, [
{
operator: 'or',
args: [
[
{
seperator: '/',
axis: 'child',
nc: 'iq',
q: 'iq',
predicate: [
[
{
nc: 'get',
q: 'get',
axis: 'attribute'
}
]
]
}
], [
{
operator: 'and',
args: [
[
{
seperator: '/',
axis: 'child',
nc: 'iq',
q: 'iq',
predicate: [
[
{
nc: 'set',
q: 'set',
axis: 'attribute'
}
]
]
}
], [
{
seperator: '/',
axis: 'child',
nc: 'iq',
q: 'iq',
predicate: [
[
{
nc: 'error',
q: 'error',
axis: 'attribute'
}
]
]
}
]
]
}
]
]
}
]);
return æ.done();
},
blubb: function(æ) {
var exp, _ref, _ref1;
exp = parse("id('foo')/child::para[position(5)]");
debug(inspect(exp));
æ.deepEqual(exp.map(function(e) {
return e.axis;
}), ['child', 'child']);
æ.deepEqual(exp.map(function(e) {
return e.nc;
}), ['id', 'para']);
æ.deepEqual((_ref = exp[0]) != null ? _ref.args : void 0, [
[
{
value: 'foo'
}
]
]);
æ.deepEqual((_ref1 = exp[1]) != null ? _ref1.predicate : void 0, [
[
{
axis: 'self',
nc: 'position',
q: 'position',
args: [
[
{
axis: 'child',
nc: '5',
q: '5'
}
]
]
}
]
]);
return æ.done();
},
presence: function(æ) {
var exp, _ref, _ref1, _ref2, _ref3, _ref4, _ref5, _ref6, _ref7, _ref8;
exp = parse("self::presence[@type='überchat' and @id='id']");
debug(inspect(exp));
æ.equals(1, exp != null ? exp.length : void 0);
æ.equals(1, (_ref = exp[0]) != null ? (_ref1 = _ref.predicate) != null ? _ref1.length : void 0 : void 0);
æ.equals(1, (_ref2 = exp[0]) != null ? (_ref3 = _ref2.predicate) != null ? (_ref4 = _ref3[0]) != null ? _ref4.length : void 0 : void 0 : void 0);
æ.deepEqual((_ref5 = exp[0]) != null ? (_ref6 = _ref5.predicate) != null ? (_ref7 = _ref6[0]) != null ? (_ref8 = _ref7[0]) != null ? _ref8.expression : void 0 : void 0 : void 0 : void 0, [
{
operator: 'and',
args: [
[
{
expression: [
{
operator: '=',
args: [
[
{
axis: 'attribute',
nc: 'type',
q: 'type'
}
], [
{
value: 'überchat'
}
]
]
}
]
}
], [
{
operator: '=',
args: [
[
{
axis: 'attribute',
nc: 'id',
q: 'id'
}
], [
{
value: 'id'
}
]
]
}
]
]
}
]);
return æ.done();
},
info: function(æ) {
var exp;
exp = parse("self::iq[@type=result and @id='id']/info:query");
debug(inspect(exp));
æ.deepEqual(exp.map(function(e) {
return e.prefix;
}), [void 0, 'info']);
æ.deepEqual(exp.map(function(e) {
return e.axis;
}), ['self', 'child']);
æ.deepEqual(exp.map(function(e) {
return e.nc;
}), ['iq', 'query']);
return æ.done();
},
or2: function(æ) {
var exp;
exp = parse("self::iq[@type=result and @id='id']/roster:query/descendant-or-self::(self::query|self::item)");
debug(inspect(exp));
æ.deepEqual(exp.map(function(e) {
return e.prefix;
}), [void 0, 'roster', void 0]);
æ.deepEqual(exp.map(function(e) {
return e.axis;
}), ['self', 'child', 'descendant-or-self']);
æ.deepEqual(exp.map(function(e) {
return e.nc;
}), ['iq', 'query', null]);
return æ.done();
},
or3: function(æ) {
var exp;
exp = parse("self::presence[@type=unavailable or @type=subscribed or @type=unsubscribed or @type=subscribe or @type=unsubscribe or not(@type)]");
debug(inspect(exp));
æ.deepEqual(exp.map(function(e) {
return e.axis;
}), ['self']);
æ.deepEqual(exp.map(function(e) {
return e.nc;
}), ['presence']);
return æ.done();
}
};
}).call(this);