#!/usr/bin/env python3
import sys
import setup_test
import libxml2

#memory debug specific
libxml2.debugMemory(1)

#
# A document hosting the nodes returned from the extension function
#
mydoc = libxml2.newDoc("1.0")

def foo(ctx, str):
    global mydoc

    #
    # test returning a node set works as expected
    #
    parent = mydoc.newDocNode(None, 'p', None)
    mydoc.addChild(parent)
    node = mydoc.newDocText(str)
    parent.addChild(node)
    return [parent]

doc = libxml2.parseFile("tst.xml")
ctxt = doc.xpathNewContext()
libxml2.registerXPathFunction(ctxt._o, "foo", None, foo)
res = ctxt.xpathEval("foo('hello')")
if type(res) != type([]):
    print("Failed to return a nodeset")
    sys.exit(1)
if len(res) != 1:
    print("Unexpected nodeset size")
    sys.exit(1)
node = res[0]
if node.name != 'p':
    print("Unexpected nodeset element result")
    sys.exit(1)
node = node.children
if node.type != 'text':
    print("Unexpected nodeset element children type")
    sys.exit(1)
if node.content != 'hello':
    print("Unexpected nodeset element children content")
    sys.exit(1)

doc.freeDoc()
mydoc.freeDoc()
ctxt.xpathFreeContext()

#memory debug specific
libxml2.cleanupParser()
if libxml2.debugMemory(1) == 0:
    print("OK")
else:
    print("Memory leak %d bytes" % (libxml2.debugMemory(1)))
