xref: /aosp_15_r20/external/libxml2/python/tests/xpathret.py (revision 7c5688314b92172186c154356a6374bf7684c3ca)
1*7c568831SAndroid Build Coastguard Worker#!/usr/bin/env python3
2*7c568831SAndroid Build Coastguard Workerimport sys
3*7c568831SAndroid Build Coastguard Workerimport setup_test
4*7c568831SAndroid Build Coastguard Workerimport libxml2
5*7c568831SAndroid Build Coastguard Worker
6*7c568831SAndroid Build Coastguard Worker#memory debug specific
7*7c568831SAndroid Build Coastguard Workerlibxml2.debugMemory(1)
8*7c568831SAndroid Build Coastguard Worker
9*7c568831SAndroid Build Coastguard Worker#
10*7c568831SAndroid Build Coastguard Worker# A document hosting the nodes returned from the extension function
11*7c568831SAndroid Build Coastguard Worker#
12*7c568831SAndroid Build Coastguard Workermydoc = libxml2.newDoc("1.0")
13*7c568831SAndroid Build Coastguard Worker
14*7c568831SAndroid Build Coastguard Workerdef foo(ctx, str):
15*7c568831SAndroid Build Coastguard Worker    global mydoc
16*7c568831SAndroid Build Coastguard Worker
17*7c568831SAndroid Build Coastguard Worker    #
18*7c568831SAndroid Build Coastguard Worker    # test returning a node set works as expected
19*7c568831SAndroid Build Coastguard Worker    #
20*7c568831SAndroid Build Coastguard Worker    parent = mydoc.newDocNode(None, 'p', None)
21*7c568831SAndroid Build Coastguard Worker    mydoc.addChild(parent)
22*7c568831SAndroid Build Coastguard Worker    node = mydoc.newDocText(str)
23*7c568831SAndroid Build Coastguard Worker    parent.addChild(node)
24*7c568831SAndroid Build Coastguard Worker    return [parent]
25*7c568831SAndroid Build Coastguard Worker
26*7c568831SAndroid Build Coastguard Workerdoc = libxml2.parseFile("tst.xml")
27*7c568831SAndroid Build Coastguard Workerctxt = doc.xpathNewContext()
28*7c568831SAndroid Build Coastguard Workerlibxml2.registerXPathFunction(ctxt._o, "foo", None, foo)
29*7c568831SAndroid Build Coastguard Workerres = ctxt.xpathEval("foo('hello')")
30*7c568831SAndroid Build Coastguard Workerif type(res) != type([]):
31*7c568831SAndroid Build Coastguard Worker    print("Failed to return a nodeset")
32*7c568831SAndroid Build Coastguard Worker    sys.exit(1)
33*7c568831SAndroid Build Coastguard Workerif len(res) != 1:
34*7c568831SAndroid Build Coastguard Worker    print("Unexpected nodeset size")
35*7c568831SAndroid Build Coastguard Worker    sys.exit(1)
36*7c568831SAndroid Build Coastguard Workernode = res[0]
37*7c568831SAndroid Build Coastguard Workerif node.name != 'p':
38*7c568831SAndroid Build Coastguard Worker    print("Unexpected nodeset element result")
39*7c568831SAndroid Build Coastguard Worker    sys.exit(1)
40*7c568831SAndroid Build Coastguard Workernode = node.children
41*7c568831SAndroid Build Coastguard Workerif node.type != 'text':
42*7c568831SAndroid Build Coastguard Worker    print("Unexpected nodeset element children type")
43*7c568831SAndroid Build Coastguard Worker    sys.exit(1)
44*7c568831SAndroid Build Coastguard Workerif node.content != 'hello':
45*7c568831SAndroid Build Coastguard Worker    print("Unexpected nodeset element children content")
46*7c568831SAndroid Build Coastguard Worker    sys.exit(1)
47*7c568831SAndroid Build Coastguard Worker
48*7c568831SAndroid Build Coastguard Workerdoc.freeDoc()
49*7c568831SAndroid Build Coastguard Workermydoc.freeDoc()
50*7c568831SAndroid Build Coastguard Workerctxt.xpathFreeContext()
51*7c568831SAndroid Build Coastguard Worker
52*7c568831SAndroid Build Coastguard Worker#memory debug specific
53*7c568831SAndroid Build Coastguard Workerlibxml2.cleanupParser()
54*7c568831SAndroid Build Coastguard Workerif libxml2.debugMemory(1) == 0:
55*7c568831SAndroid Build Coastguard Worker    print("OK")
56*7c568831SAndroid Build Coastguard Workerelse:
57*7c568831SAndroid Build Coastguard Worker    print("Memory leak %d bytes" % (libxml2.debugMemory(1)))
58