mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-12 14:09:17 +02:00
+ XPath test suite, implemented possibility to use a specified context node instead of fixed root element.
* enabled expressions which start with a FilterNode. + added a test for ancestor:: axis of attribute. git-svn-id: trunk@15650 -
This commit is contained in:
parent
4b063ea245
commit
22038d7db6
@ -736,7 +736,7 @@ const
|
|||||||
'</section>'+
|
'</section>'+
|
||||||
'</chapter>';
|
'</chapter>';
|
||||||
|
|
||||||
AxesTests: array[0..16] of TTestRec = (
|
AxesTests: array[0..15] of TTestRec = (
|
||||||
(data: ax117; expr: 'count(//@*)'; rt: rtNumber; n: 16),
|
(data: ax117; expr: 'count(//@*)'; rt: rtNumber; n: 16),
|
||||||
(data: ax117; expr: 'count(//@title)'; rt: rtNumber; n: 12),
|
(data: ax117; expr: 'count(//@title)'; rt: rtNumber; n: 12),
|
||||||
(data: ax117; expr: 'count(//section//@*)'; rt: rtNumber; n: 14),
|
(data: ax117; expr: 'count(//section//@*)'; rt: rtNumber; n: 14),
|
||||||
@ -750,14 +750,17 @@ const
|
|||||||
(data: ax117; expr: 'count(/chapter/section[3]//@*)'; rt: rtNumber; n: 5),
|
(data: ax117; expr: 'count(/chapter/section[3]//@*)'; rt: rtNumber; n: 5),
|
||||||
(data: ax117; expr: 'count(/chapter/section[3]//@title)'; rt: rtNumber; n: 4),
|
(data: ax117; expr: 'count(/chapter/section[3]//@title)'; rt: rtNumber; n: 4),
|
||||||
|
|
||||||
(data: ax114; expr: '//baz/preceding::foo[1]/@att1'; rt: rtNodeStr; s: 'a'),
|
|
||||||
// (data: ax114; expr: '//baz/(preceding::foo)[1]/@att1'; rt: rtNodeStr; s: 'c'), // won't parse
|
|
||||||
(data: ax115; expr: '//baz/preceding-sibling::foo[1]/@att1'; rt: rtNodeStr; s: 'a'),
|
|
||||||
// (data: ax115; expr: '//baz/(preceding-sibling::foo)[1]/@att1'; rt: rtNodeStr; s: 'c') // won't parse
|
|
||||||
|
|
||||||
(data: simple; expr: 'local-name(namespace::*[1])'; rt: rtString; s: 'xml'), // namespace28a
|
(data: simple; expr: 'local-name(namespace::*[1])'; rt: rtString; s: 'xml'), // namespace28a
|
||||||
(data: simple; expr: 'name(namespace::*[1])'; rt: rtString; s: 'xml'), // namespace28b
|
(data: simple; expr: 'name(namespace::*[1])'; rt: rtString; s: 'xml'), // namespace28b
|
||||||
(data: ax117; expr: 'name(//subsection[@title="A3b"]/@title/parent::*)'; rt: rtString; s: 'subsection') // axes96 modified
|
(data: ax117; expr: 'name(//subsection[@title="A3b"]/@title/parent::*)'; rt: rtString; s: 'subsection'), // axes96 modified
|
||||||
|
(data: ax117; expr: 'name(//subsection[@title="A3b"]/@title/ancestor::*[1])'; rt: rtString; s: 'subsection') // axes97 modified
|
||||||
|
);
|
||||||
|
|
||||||
|
AxesTests2: array[0..3] of TTestRec3 = (
|
||||||
|
(data: ax114; re: '//baz'; expr: 'preceding::foo[1]/@att1'; rt: rtNodeStr; s: 'a'),
|
||||||
|
(data: ax114; re: '//baz'; expr: '(preceding::foo)[1]/@att1'; rt: rtNodeStr; s: 'c'), // won't parse
|
||||||
|
(data: ax115; re: '//baz'; expr: 'preceding-sibling::foo[1]/@att1'; rt: rtNodeStr; s: 'a'),
|
||||||
|
(data: ax115; re: '//baz'; expr: '(preceding-sibling::foo)[1]/@att1'; rt: rtNodeStr; s: 'c') // won't parse
|
||||||
);
|
);
|
||||||
|
|
||||||
pred44 = '<doc>'+
|
pred44 = '<doc>'+
|
||||||
@ -800,7 +803,7 @@ const
|
|||||||
var
|
var
|
||||||
FailCount: Integer = 0;
|
FailCount: Integer = 0;
|
||||||
|
|
||||||
procedure CheckResult(const t: TTestRec; r: TXPathVariable);
|
procedure CheckResult(const t: TTestRec; r: TXPathVariable); overload;
|
||||||
begin
|
begin
|
||||||
case t.rt of
|
case t.rt of
|
||||||
rtBool:
|
rtBool:
|
||||||
@ -856,6 +859,18 @@ begin
|
|||||||
Inc(FailCount);
|
Inc(FailCount);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure CheckResult(const t: TTestRec3; r: TXPathVariable); overload;
|
||||||
|
var
|
||||||
|
temp: TTestRec;
|
||||||
|
begin
|
||||||
|
temp.data := t.data;
|
||||||
|
temp.expr := t.expr;
|
||||||
|
temp.rt := t.rt;
|
||||||
|
temp.n := t.n;
|
||||||
|
CheckResult(temp, r);
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
function ParseString(const data: string): TXMLDocument;
|
function ParseString(const data: string): TXMLDocument;
|
||||||
var
|
var
|
||||||
parser: TDOMParser;
|
parser: TDOMParser;
|
||||||
@ -908,13 +923,12 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure DoSuite3(const tests: array of TTestRec3);
|
procedure DoSuite_WithResolver(const tests: array of TTestRec3);
|
||||||
var
|
var
|
||||||
i: Integer;
|
i: Integer;
|
||||||
doc: TXMLDocument;
|
doc: TXMLDocument;
|
||||||
rslt: TXPathVariable;
|
rslt: TXPathVariable;
|
||||||
nsdoc: TXMLDocument;
|
nsdoc: TXMLDocument;
|
||||||
temp: TTestRec;
|
|
||||||
begin
|
begin
|
||||||
for i := 0 to High(tests) do
|
for i := 0 to High(tests) do
|
||||||
begin
|
begin
|
||||||
@ -925,11 +939,7 @@ begin
|
|||||||
try
|
try
|
||||||
rslt := EvaluateXPathExpression(tests[i].expr, doc.DocumentElement, nsdoc.DocumentElement);
|
rslt := EvaluateXPathExpression(tests[i].expr, doc.DocumentElement, nsdoc.DocumentElement);
|
||||||
try
|
try
|
||||||
temp.data := tests[i].data;
|
CheckResult(tests[i], rslt);
|
||||||
temp.expr := tests[i].expr;
|
|
||||||
temp.rt := tests[i].rt;
|
|
||||||
temp.n := tests[i].n;
|
|
||||||
CheckResult(temp, rslt);
|
|
||||||
finally
|
finally
|
||||||
rslt.Free;
|
rslt.Free;
|
||||||
end;
|
end;
|
||||||
@ -948,6 +958,45 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure DoSuite_WithContext(const tests: array of TTestRec3);
|
||||||
|
var
|
||||||
|
i: Integer;
|
||||||
|
doc: TXMLDocument;
|
||||||
|
rslt: TXPathVariable;
|
||||||
|
context: TXPathVariable;
|
||||||
|
ctxNs: TNodeSet;
|
||||||
|
begin
|
||||||
|
for i := 0 to High(tests) do
|
||||||
|
begin
|
||||||
|
doc := ParseString(tests[i].data);
|
||||||
|
try
|
||||||
|
context := EvaluateXPathExpression(tests[i].re, doc.DocumentElement);
|
||||||
|
try
|
||||||
|
try
|
||||||
|
ctxNs := context.AsNodeSet;
|
||||||
|
if ctxNs.Count <> 1 then
|
||||||
|
raise Exception.CreateFmt('Context expression "%s" does not evaluate to a single node', [tests[i].re]);
|
||||||
|
rslt := EvaluateXPathExpression(tests[i].expr, TDOMNode(ctxNs[0]));
|
||||||
|
try
|
||||||
|
CheckResult(tests[i], rslt);
|
||||||
|
finally
|
||||||
|
rslt.Free;
|
||||||
|
end;
|
||||||
|
except
|
||||||
|
writeln;
|
||||||
|
writeln('Failed: ', tests[i].expr);
|
||||||
|
SysUtils.ShowException(ExceptObject, ExceptAddr);
|
||||||
|
Inc(FailCount);
|
||||||
|
end;
|
||||||
|
finally
|
||||||
|
context.Free;
|
||||||
|
end;
|
||||||
|
finally
|
||||||
|
doc.Free;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
DoSuite(BaseTests);
|
DoSuite(BaseTests);
|
||||||
DoSuite(CompareTests);
|
DoSuite(CompareTests);
|
||||||
@ -957,8 +1006,8 @@ begin
|
|||||||
DoSuite(FunctionTests);
|
DoSuite(FunctionTests);
|
||||||
DoSuite(StringTests);
|
DoSuite(StringTests);
|
||||||
DoSuite(AxesTests);
|
DoSuite(AxesTests);
|
||||||
|
DoSuite_WithContext(AxesTests2);
|
||||||
DoSuite3(nameTests);
|
DoSuite_WithResolver(nameTests);
|
||||||
DoSuite(PredicateTests);
|
DoSuite(PredicateTests);
|
||||||
|
|
||||||
writeln;
|
writeln;
|
||||||
|
Loading…
Reference in New Issue
Block a user