openrosa-xpath-evaluator
Version:
Wrapper for browsers' XPath evaluator with added support for OpenRosa extensions.
152 lines (131 loc) • 5.23 kB
JavaScript
const { initDoc, assertThrow, assertNumber } = require('../helpers');
describe('native number functions', () => {
it('number() conversion of convertible numbers, strings, booleans', () => {
// of numbers
assertNumber('number(-1.0)', -1);
assertNumber('number(1)', 1);
assertNumber('number(0.199999)', 0.199999);
assertNumber('number(-0.199999)', -0.199999);
assertNumber('number(- 0.199999)', -0.199999);
assertNumber('number(0.0)', 0);
assertNumber('number(.0)', 0);
assertNumber('number(0.)', 0);
// of booleans
assertNumber('number(true())', 1);
assertNumber('number(false())', 0);
// of strings
assertNumber('number("-1.0")', -1);
assertNumber('number("1")', 1);
assertNumber('number("0.199999")', 0.199999);
assertNumber('number("-0.9991")', -0.9991);
assertNumber('number("0.0")', 0);
assertNumber('number(".0")', 0);
assertNumber('number(".112")', 0.112);
assertNumber('number("0.")', 0);
assertNumber('number(" 1.1")', 1.1);
assertNumber('number("1.1 ")', 1.1);
assertNumber('number("1.1 \n ")', 1.1);
assertNumber('number(" 1.1 \n\r\n ")', 1.1);
});
it('number() conversions returns NaN if not convertible', () => {
assertNumber('number("asdf")', NaN);
assertNumber('number("1asdf")', NaN);
assertNumber('number("1.1sd")', NaN);
assertNumber('number(".1sd")', NaN);
assertNumber('number(" . ")', NaN);
});
describe('Infinities', () => {
[
['number( 1 div 0)', Infinity],
['number(-1 div 0)', -Infinity],
].forEach(([expr, expected]) => {
it(`should evaluate "${expr}" as "${expected}"`, () => {
assertNumber(expr, expected);
});
});
});
describe('conversion of nodesets', () => {
let doc;
beforeEach(() => {
doc = initDoc(`
<div id="FunctionNumberCase">
<div id="FunctionNumberCaseNumber">123</div>
<div id="FunctionNumberCaseNotNumber"> a a </div>
<div id="FunctionNumberCaseNumberMultiple">
<div>-10</div>
<div>11</div>
<div>99</div>
</div>
<div id="FunctionNumberCaseNotNumberMultiple">
<div>-10</div>
<div>11</div>
<div>a</div>
</div>
<div id="FunctionSumCaseJavarosa">
<div>-10</div>
<div>15</div>
<div></div>
</div>
</div>`);
});
it('number() ', () => {
let node = doc.getElementById('FunctionNumberCaseNumber');
assertNumber(node, null, 'number(self::node())', 123);
assertNumber(node, null, 'number()', 123);
node = doc.getElementById('FunctionNumberCaseNumberMultiple');
assertNumber(node, null, 'number(*)', -10);
node = doc.getElementById('FunctionNumberCaseNotNumber');
assertNumber(node, null, 'number()', NaN);
});
it('number() conversion fails when too many arguments are provided', () => {
assertThrow('number(1, 2)');
});
it('sum()', () => {
let node = doc.getElementById('FunctionNumberCaseNumber');
assertNumber(node, null, 'sum(self::*)', 123);
node = doc.getElementById('FunctionNumberCaseNumberMultiple');
assertNumber(node, null, 'sum(*)', 100);
node = doc.getElementById('FunctionNumberCaseNotNumberMultiple');
assertNumber(node, null, 'sum(node())', NaN);
node = doc.getElementById('FunctionSumCaseJavarosa');
assertNumber(node, null, 'sum(*)', NaN);
});
});
it('sum() fails when too many arguments are provided', () => {
assertThrow('sum(1, 2)');
});
it('sum() fails when too few arguments are provided', () => {
assertThrow('sum()');
});
it('ceiling()', () => {
assertNumber('ceiling(-1.55)', -1);
assertNumber('ceiling(2.44)', 3);
assertNumber('ceiling(0.001)', 1);
assertNumber('ceiling(1.5)', 2);
assertNumber('ceiling(5)', 5);
assertNumber('ceiling(1.00)', 1);
assertNumber('ceiling(-1.05)', -1);
});
it('ceiling() fails when too many arguments are provided', () => {
assertThrow('ceiling(1, 2)');
});
it('ceiling() fails when not enough arguments are provided', () => {
assertThrow('ceiling()');
});
it('round()', () => {
assertNumber('round(-1.55)', -2);
assertNumber('round(2.44)', 2);
assertNumber('round(0.001)', 0);
assertNumber('round(1.5)', 2);
assertNumber('round(5)', 5);
assertNumber('round(1.00)', 1);
assertNumber('round(-1.05)', -1);
assertNumber('round(33.33, -1)', 30);
});
it('round() fails when too many arguments are provided', () => {
assertThrow('round(1, 2, 3)');
});
it('round() fails when too few arguments are provided', () => {
assertThrow('round()');
});
});