# xml.etree test for cElementTree



import doctest

import sys



from test import test_support



from xml.etree import cElementTree as ET



SAMPLE_XML = """

<body>

  <tag>text</tag>

  <tag />

  <section>

    <tag>subtext</tag>

  </section>

</body>

"""



SAMPLE_XML_NS = """

<body xmlns="http://effbot.org/ns">

  <tag>text</tag>

  <tag />

  <section>

    <tag>subtext</tag>

  </section>

</body>

"""



def sanity():

    """

    Import sanity.



    >>> from xml.etree import cElementTree

    """



def check_method(method):

    if not callable(method):

        print method, "not callable"



def serialize(ET, elem, encoding=None):

    import StringIO

    file = StringIO.StringIO()

    tree = ET.ElementTree(elem)

    if encoding:

        tree.write(file, encoding)

    else:

        tree.write(file)

    return file.getvalue()



def summarize(elem):

    return elem.tag



def summarize_list(seq):

    return map(summarize, seq)



def interface():

    """

    Test element tree interface.



    >>> element = ET.Element("tag", key="value")

    >>> tree = ET.ElementTree(element)



    Make sure all standard element methods exist.



    >>> check_method(element.append)

    >>> check_method(element.insert)

    >>> check_method(element.remove)

    >>> check_method(element.getchildren)

    >>> check_method(element.find)

    >>> check_method(element.findall)

    >>> check_method(element.findtext)

    >>> check_method(element.clear)

    >>> check_method(element.get)

    >>> check_method(element.set)

    >>> check_method(element.keys)

    >>> check_method(element.items)

    >>> check_method(element.getiterator)



    Basic method sanity checks.



    >>> serialize(ET, element) # 1

    '<tag key="value" />'

    >>> subelement = ET.Element("subtag")

    >>> element.append(subelement)

    >>> serialize(ET, element) #  2

    '<tag key="value"><subtag /></tag>'

    >>> element.insert(0, subelement)

    >>> serialize(ET, element) # 3

    '<tag key="value"><subtag /><subtag /></tag>'

    >>> element.remove(subelement)

    >>> serialize(ET, element) # 4

    '<tag key="value"><subtag /></tag>'

    >>> element.remove(subelement)

    >>> serialize(ET, element) # 5

    '<tag key="value" />'

    >>> element.remove(subelement)

    Traceback (most recent call last):

    ValueError: list.remove(x): x not in list

    >>> serialize(ET, element) # 6

    '<tag key="value" />'

    """



def find():

    """

    Test find methods (including xpath syntax).



    >>> elem = ET.XML(SAMPLE_XML)

    >>> elem.find("tag").tag

    'tag'

    >>> ET.ElementTree(elem).find("tag").tag

    'tag'

    >>> elem.find("section/tag").tag

    'tag'

    >>> ET.ElementTree(elem).find("section/tag").tag

    'tag'

    >>> elem.findtext("tag")

    'text'

    >>> elem.findtext("tog")

    >>> elem.findtext("tog", "default")

    'default'

    >>> ET.ElementTree(elem).findtext("tag")

    'text'

    >>> elem.findtext("section/tag")

    'subtext'

    >>> ET.ElementTree(elem).findtext("section/tag")

    'subtext'

    >>> summarize_list(elem.findall("tag"))

    ['tag', 'tag']

    >>> summarize_list(elem.findall("*"))

    ['tag', 'tag', 'section']

    >>> summarize_list(elem.findall(".//tag"))

    ['tag', 'tag', 'tag']

    >>> summarize_list(elem.findall("section/tag"))

    ['tag']

    >>> summarize_list(elem.findall("section//tag"))

    ['tag']

    >>> summarize_list(elem.findall("section/*"))

    ['tag']

    >>> summarize_list(elem.findall("section//*"))

    ['tag']

    >>> summarize_list(elem.findall("section/.//*"))

    ['tag']

    >>> summarize_list(elem.findall("*/*"))

    ['tag']

    >>> summarize_list(elem.findall("*//*"))

    ['tag']

    >>> summarize_list(elem.findall("*/tag"))

    ['tag']

    >>> summarize_list(elem.findall("*/./tag"))

    ['tag']

    >>> summarize_list(elem.findall("./tag"))

    ['tag', 'tag']

    >>> summarize_list(elem.findall(".//tag"))

    ['tag', 'tag', 'tag']

    >>> summarize_list(elem.findall("././tag"))

    ['tag', 'tag']

    >>> summarize_list(ET.ElementTree(elem).findall("/tag"))

    ['tag', 'tag']

    >>> summarize_list(ET.ElementTree(elem).findall("./tag"))

    ['tag', 'tag']

    >>> elem = ET.XML(SAMPLE_XML_NS)

    >>> summarize_list(elem.findall("tag"))

    []

    >>> summarize_list(elem.findall("{http://effbot.org/ns}tag"))

    ['{http://effbot.org/ns}tag', '{http://effbot.org/ns}tag']

    >>> summarize_list(elem.findall(".//{http://effbot.org/ns}tag"))

    ['{http://effbot.org/ns}tag', '{http://effbot.org/ns}tag', '{http://effbot.org/ns}tag']

    """



def parseliteral():

    r"""



    >>> element = ET.XML("<html><body>text</body></html>")

    >>> ET.ElementTree(element).write(sys.stdout)

    <html><body>text</body></html>

    >>> element = ET.fromstring("<html><body>text</body></html>")

    >>> ET.ElementTree(element).write(sys.stdout)

    <html><body>text</body></html>

    >>> print ET.tostring(element)

    <html><body>text</body></html>

    >>> print ET.tostring(element, "ascii")

    <?xml version='1.0' encoding='ascii'?>

    <html><body>text</body></html>

    >>> _, ids = ET.XMLID("<html><body>text</body></html>")

    >>> len(ids)

    0

    >>> _, ids = ET.XMLID("<html><body id='body'>text</body></html>")

    >>> len(ids)

    1

    >>> ids["body"].tag

    'body'

    """



def check_encoding(encoding):

    """

    >>> check_encoding("ascii")

    >>> check_encoding("us-ascii")

    >>> check_encoding("iso-8859-1")

    >>> check_encoding("iso-8859-15")

    >>> check_encoding("cp437")

    >>> check_encoding("mac-roman")

    """

    ET.XML(

        "<?xml version='1.0' encoding='%s'?><xml />" % encoding

        )



def bug_1534630():

    """

    >>> bob = ET.TreeBuilder()

    >>> e = bob.data("data")

    >>> e = bob.start("tag", {})

    >>> e = bob.end("tag")

    >>> e = bob.close()

    >>> serialize(ET, e)

    '<tag />'

    """



def test_main():

    from test import test_xml_etree_c

    test_support.run_doctest(test_xml_etree_c, verbosity=True)



if __name__ == '__main__':

    test_main()

