openrosa-xpath-evaluator
Version:
Wrapper for browsers' XPath evaluator with added support for OpenRosa extensions.
202 lines (188 loc) • 9.31 kB
JavaScript
const { initDoc, assertBoolean } = require('../helpers');
const assertOps1 = (...args) => {
const expected = args[args.length - 1];
const val2 = args[args.length - 2];
const val1 = args[args.length - 3];
const node = args.length > 3 ? args[args.length - 4] : null;
['=', '!='].forEach((op, idx) => {
const expr = `${val1} ${op} ${val2}`;
if (node) {
assertBoolean(node, null, expr, expected[idx]);
} else {
assertBoolean(expr, expected[idx]);
}
});
};
const assertOps2 = (...args) => {
const expected = args[args.length - 1];
const val2 = args[args.length - 2];
const val1 = args[args.length - 3];
const node = args.length > 3 ? args[args.length - 4] : null;
['<', '<=', '>', '>='].forEach((op, idx) => {
const expr = `${val1} ${op} ${val2}`;
if (node) {
assertBoolean(node, null, expr, expected[idx]);
} else {
assertBoolean(expr, expected[idx]);
}
});
};
describe('Comparison operator', () => {
it('correctly evaluates = and !=', () => {
assertOps1(1, 1, [true, false]);
assertOps1(1, 0, [false, true]);
assertOps1(1, '1', [true, false]);
assertOps1(1, '0', [false, true]);
assertOps1(1, 'true()', [true, false]);
assertOps1(1, 'false()', [false, true]);
assertOps1(0, 'false()', [true, false]);
assertOps1('true()', 'true()', [true, false]);
assertOps1('false()', 'false()', [true, false]);
assertOps1('true()', 1, [true, false]);
assertOps1('true()', '""', [false, true]);
// assertOps1('false()', 0, [false, true]);
assertOps1('false()', '""', [true, false]);
assertOps1('"1a"', '"1a"', [true, false]);
assertOps1('"1"', '"0"', [false, true]);
assertOps1('""', '""', [true, false]);
assertOps1('""', '"0"', [false, true]);
});
it('correctly evaluates <, <=, > and >=', () => {
assertOps2('1', '2', [true, true, false, false]);
assertOps2('1', '1', [false, true, false, true]);
assertOps2('1', '0', [false, false, true, true]);
assertOps2('1', "'2'", [true, true, false, false]);
assertOps2('1', "'1'", [false, true, false, true]);
assertOps2('1', "'0'", [false, false, true, true]);
assertOps2('2', 'true()', [false, false, true, true]);
assertOps2('1', 'true()', [false, true, false, true]);
assertOps2('1', 'false()', [false, false, true, true]);
assertOps2('0', 'false()', [false, true, false, true]);
assertOps2('0', 'true()', [true, true, false, false]);
assertOps2('true()', '2', [true, true, false, false]);
assertOps2('true()', '1', [false, true, false, true]);
assertOps2('false()', '1', [true, true, false, false]);
assertOps2('false()', '0', [false, true, false, true]);
assertOps2('true()', '0', [false, false, true, true]);
assertOps2('true()', 'true()', [false, true, false, true]);
assertOps2('true()', 'false()', [false, false, true, true]);
assertOps2('false()', 'false()', [false, true, false, true]);
assertOps2('false()', 'true()', [true, true, false, false]);
assertOps2('true()', "'1'", [false, true, false, true]);
assertOps2('true()', "''", [false, false, false, false]);
assertOps2('false()', "'0'", [false, true, false, true]);
assertOps2('false()', "''", [false, false, false, false]);
assertOps2("'2'", '1', [false, false, true, true]);
assertOps2("'1'", '1', [false, true, false, true]);
assertOps2("'0'", '1', [true, true, false, false]);
assertOps2("'1'", 'true()', [false, true, false, true]);
assertOps2("''", 'true()', [false, false, false, false]);
assertOps2("'0'", 'false()', [false, true, false, true]);
assertOps2("''", 'false()', [false, false, false, false]);
// assertOps2("'1a'", "'1a'", [false, false, false, false]);
assertOps2("'1'", "'0'", [false, false, true, true]);
// assertOps2("''", "''", [false, false, false, false]);
// assertOps2("''", "'0'", [false, false, false, false]);
});
describe('with nodes', () => {
let doc;
beforeEach(() => {
doc = initDoc(`
<div id="ComparisonOperatorCase">
<div id="ComparisonOperatorCaseNodesetNegative5to5">
<div>-5</div>
<div>-4</div>
<div>-3</div>
<div>-2</div>
<div>-1</div>
<div>0</div>
<div>1</div>
<div>2</div>
<div>3</div>
<div>4</div>
<div>5</div>
</div>
<div id="ComparisonOperatorCaseNodesetEmpty">
</div>
<div id="ComparisonOperatorCaseNodesetStrings">
<div>aaa</div>
<div>bbb</div>
<div>cccccc</div>
<div>ddd</div>
<div>eee</div>
</div>
</div>`);
});
it('compare =, != with nodes', () => {
// assertOps1(doc,
// "id('ComparisonOperatorCaseNodesetNegative5to5')/*",
// "id('ComparisonOperatorCaseNodesetEmpty')/*", [false, false]);
// assertOps1(doc,
// "id('ComparisonOperatorCaseNodesetNegative5to5')/*",
// "id('ComparisonOperatorCaseNodeset4to8')/*", [true, true]);
// assertOps1(doc,
// "id('ComparisonOperatorCaseNodesetNegative5to5')/*",
// "id('ComparisonOperatorCaseNodeset6to10')/*", [false, true ]);
let node = doc.getElementById(
'ComparisonOperatorCaseNodesetNegative5to5'
);
assertOps1(node, '-10', '*', [false, true]);
assertOps1(node, '4', '*', [true, true]);
assertOps1(node, '4.3', '*', [false, true]);
assertOps1('true()', '*', [true, false]);
assertOps1('false()', '*', [false, true]);
node = doc.getElementById('ComparisonOperatorCaseNodesetEmpty');
assertOps1(node, '0', '*', [false, false]);
// assertOps1(node, "true()", "*"], [false, true]);
// assertOps1(node, "false()", "*"], [true, false]);
// assertOps1(node, "''", "*", [false, false]);
node = doc.getElementById('ComparisonOperatorCaseNodesetStrings');
assertOps1(node, "'aaa'", '*', [true, true]);
assertOps1(node, "'bb'", '*', [false, true]);
assertOps1(node, "''", '*', [false, true]);
});
it('compare > < >= <= with nodes', () => {
// assertOps2(doc,
// "id('ComparisonOperatorCaseNodesetNegative5to5')/*",
// "id('ComparisonOperatorCaseNodesetEmpty')/*",
// [false, false, false, false]);
// assertOps2(doc,
// "id('ComparisonOperatorCaseNodesetNegative5to5')/*",
// "id('ComparisonOperatorCaseNodeset4to8')/*",
// [true, true, true, true]);
// assertOps2(doc,
// "id('ComparisonOperatorCaseNodesetNegative5to5')/*",
// "id('ComparisonOperatorCaseNodeset6to10')/*",
// [true, true, false, false]);
let node = doc.getElementById(
'ComparisonOperatorCaseNodesetNegative5to5'
);
assertOps2(node, '-10', '*', [true, true, false, false]);
assertOps2(node, '10', '*', [false, false, true, true]);
assertOps2(node, '5', '*', [false, true, true, true]);
assertOps2(node, '2', '*', [true, true, true, true]);
assertOps2(node, 'true()', '*', [true, true, true, true]);
assertOps2(node, 'false()', '*', [true, true, true, true]);
assertOps2(node, "'4'", '*', [true, true, true, true]);
assertOps2(node, '*', '-10', [false, false, true, true]);
assertOps2(node, '*', '10', [true, true, false, false]);
assertOps2(node, '*', '5', [true, true, false, true]);
assertOps2(node, '*', '2', [true, true, true, true]);
assertOps2(node, '*', 'true()', [true, true, true, true]);
assertOps2(node, '*', 'false()', [true, true, true, true]);
assertOps2(node, '*', "'4'", [true, true, true, true]);
node = doc.getElementById('ComparisonOperatorCaseNodesetStrings');
assertOps2(node, '*', "'aaa'", [false, false, false, false]);
assertOps2(node, "'aaa'", '*', [false, false, false, false]);
node = doc.getElementById('ComparisonOperatorCaseNodesetEmpty');
assertOps2(node, '0', '*', [false, false, false, false]);
assertOps2(node, 'true()', '*', [false, false, false, false]);
assertOps2(node, 'false()', '*', [false, false, false, false]);
assertOps2(node, "''", '*', [false, false, false, false]);
assertOps2(node, '*', '0', [false, false, false, false]);
assertOps2(node, '*', 'true()', [false, false, false, false]);
assertOps2(node, '*', 'false()', [false, false, false, false]);
assertOps2(node, '*', "''", [false, false, false, false]);
});
});
});