38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#!/usr/bin/python -u
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncimport sys
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncimport libxml2
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#memory debug specific
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsynclibxml2.debugMemory(1)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync# A document hosting the nodes returned from the extension function
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncmydoc = libxml2.newDoc("1.0")
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncdef foo(ctx, str):
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync global mydoc
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync #
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync # test returning a node set works as expected
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync #
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync parent = mydoc.newDocNode(None, 'p', None)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync mydoc.addChild(parent)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync node = mydoc.newDocText(str)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync parent.addChild(node)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return [parent]
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncdoc = libxml2.parseFile("tst.xml")
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncctxt = doc.xpathNewContext()
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsynclibxml2.registerXPathFunction(ctxt._o, "foo", None, foo)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncres = ctxt.xpathEval("foo('hello')")
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncif type(res) != type([]):
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync print "Failed to return a nodeset"
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync sys.exit(1)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncif len(res) != 1:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync print "Unexpected nodeset size"
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync sys.exit(1)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncnode = res[0]
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncif node.name != 'p':
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync print "Unexpected nodeset element result"
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync sys.exit(1)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncnode = node.children
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncif node.type != 'text':
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync print "Unexpected nodeset element children type"
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync sys.exit(1)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncif node.content != 'hello':
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync print "Unexpected nodeset element children content"
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync sys.exit(1)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncdoc.freeDoc()
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncmydoc.freeDoc()
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncctxt.xpathFreeContext()
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#memory debug specific
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsynclibxml2.cleanupParser()
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncif libxml2.debugMemory(1) == 0:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync print "OK"
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncelse:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync print "Memory leak %d bytes" % (libxml2.debugMemory(1))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync libxml2.dumpMemory()