UNPKG

fontoxpath

Version:

A minimalistic XPath 3.1 engine in JavaScript

88 lines (72 loc) 4.58 kB
import * as slimdom from 'slimdom'; import jsonMlMapper from 'test-helpers/jsonMlMapper'; import { evaluateXPathToBoolean, evaluateXPathToNumber, evaluateXPathToStrings } from 'fontoxpath'; let documentNode; beforeEach(() => { documentNode = new slimdom.Document(); }); describe('mathematical operators', () => { it('can evaluate 1 + 1 to 2', () => chai.assert.equal(evaluateXPathToNumber('1 + 1', documentNode), 2)); it('can evaluate 1 - 1 to 0', () => chai.assert.equal(evaluateXPathToNumber('1 - 1', documentNode), 0)); it('can evaluate 1 * 2 to 2', () => chai.assert.equal(evaluateXPathToNumber('1 * 2', documentNode), 2)); it('can evaluate 1 div 2 to 0.5', () => chai.assert.equal(evaluateXPathToNumber('1 div 2', documentNode), 0.5)); it('can evaluate 1 idiv 2 to 1', () => chai.assert.equal(evaluateXPathToNumber('1 idiv 2', documentNode), 0)); it('uses the correct ordering', () => chai.assert.equal(evaluateXPathToNumber('2 idiv 2 * 2', documentNode), 2, 'This should be parsed as (2 idiv 2) * 2')); it('returns the empty sequence if one of the operands is the empty sequence', () => chai.assert.deepEqual(evaluateXPathToStrings('() + 1', documentNode), [])); it('can evaluate 5 mod 3 to 2', () => chai.assert.equal(evaluateXPathToNumber('5 mod 3', documentNode), 2)); it('throws when passed strings', () => chai.assert.throws(() => evaluateXPathToNumber('"something" + 1', documentNode), 'XPTY0004')); it('can parse untyped attributes', () => { jsonMlMapper.parse(['someElement', { a: '1' }], documentNode); chai.assert.equal(evaluateXPathToNumber('@a + 1', documentNode.documentElement), 2); }); }); describe('Durations', () => { describe('xs:yearMonthDuration', () => { it('can evaluate "P10Y10M" + "P10Y10M"', () => chai.assert.isTrue(evaluateXPathToBoolean('xs:yearMonthDuration("P10Y10M") + xs:yearMonthDuration("P10Y10M") eq xs:yearMonthDuration("P21Y8M")', documentNode))); it('can evaluate "P11Y10M" - "P10Y10M"', () => chai.assert.isTrue(evaluateXPathToBoolean('xs:yearMonthDuration("P11Y10M") - xs:yearMonthDuration("P10Y10M") eq xs:yearMonthDuration("P1Y")', documentNode))); it('can evaluate "P11Y10M" * 2', () => chai.assert.isTrue(evaluateXPathToBoolean('xs:yearMonthDuration("P1Y10M") * xs:double("2") eq xs:yearMonthDuration("P44M")', documentNode))); it('can evaluate "P11Y10M" div 2', () => chai.assert.isTrue(evaluateXPathToBoolean('xs:yearMonthDuration("P1Y10M") div xs:double("2") eq xs:yearMonthDuration("P11M")', documentNode))); it('can evaluate "P3Y4M" div "-P1Y4M"', () => chai.assert.isTrue(evaluateXPathToBoolean('xs:yearMonthDuration("P3Y4M") div xs:yearMonthDuration("-P1Y4M") eq xs:decimal("-2.5")', documentNode))); it('can evaluate "P3Y4M" div "P1M"', () => chai.assert.isTrue(evaluateXPathToBoolean('xs:yearMonthDuration("P3Y4M") div xs:yearMonthDuration("P1M") eq xs:decimal("40")', documentNode))); }); describe('xs:dayTimeDuration', () => { it('can evaluate "P4DT26H" + "P4DT26H"', () => chai.assert.isTrue(evaluateXPathToBoolean('xs:dayTimeDuration("P4DT26H") + xs:dayTimeDuration("P4DT26H") eq xs:dayTimeDuration("P10DT4H")', documentNode))); it('can evaluate "P4DT28H" - "P4DT26H"', () => chai.assert.isTrue(evaluateXPathToBoolean('xs:dayTimeDuration("P4DT28H") - xs:dayTimeDuration("P4DT26H") eq xs:dayTimeDuration("PT2H")', documentNode))); it('can evaluate "PT20H" * 2', () => chai.assert.isTrue(evaluateXPathToBoolean('xs:dayTimeDuration("PT20H") * xs:double("2") eq xs:dayTimeDuration("P1DT16H")', documentNode))); it('can evaluate "PT11H" div 2', () => chai.assert.isTrue(evaluateXPathToBoolean('xs:dayTimeDuration("PT11H") div xs:double("2") eq xs:dayTimeDuration("PT5H30M")', documentNode))); it('can evaluate "PT10S" div "PT5S"', () => chai.assert.isTrue(evaluateXPathToBoolean('xs:dayTimeDuration("PT10S") div xs:dayTimeDuration("PT5S") eq xs:decimal("2")', documentNode))); it('can evaluate "P2DT53M11S" div "PT1S"', () => chai.assert.isTrue(evaluateXPathToBoolean('xs:dayTimeDuration("P2DT53M11S") div xs:dayTimeDuration("PT1S") eq xs:decimal("175991")', documentNode))); it('can evaluate implicit timezone div 0', () => chai.assert.throws(() => evaluateXPathToBoolean('fn:string(fn:implicit-timezone() div 0 )', documentNode), 'FODT0002')); }); describe('xs:dateTime', () => { it('can subtract dateTimes', () => { chai.assert.isTrue(evaluateXPathToBoolean('xs:dateTime("2000-10-30T06:12:00-05:00") - xs:dateTime("1999-11-28T09:00:00Z") eq xs:dayTimeDuration("P337DT2H12M")')); }); }); });