/*
 * Copyright (c) 2008, Aaron Digulla
 * All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met:
 * 
 *     * Redistributions of source code must retain the above copyright
 *       notice, this list of conditions and the following disclaimer.
 *     * Redistributions in binary form must reproduce the above copyright
 *       notice, this list of conditions and the following disclaimer in
 *       the documentation and/or other materials provided with the
 *       distribution.
 *     * Neither the name of Aaron Digulla nor the names of its
 *       contributors may be used to endorse or promote products derived
 *       from this software without specific prior written permission.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
package de.pdark.decentxml;

import static org.junit.Assert.*;

import org.junit.Test;

public class TreeIteratorTest
{
    @Test
    public void testEmptyDocument () throws Exception
    {
        Document doc = new Document ();
        TreeIterator iter = new TreeIterator (doc);
        assertFalse (iter.hasNext ());
    }

    @Test
    public void testEmptyElement () throws Exception
    {
        Element e = new Element ("e");
        TreeIterator iter = new TreeIterator (e);
        assertFalse (iter.hasNext ());
    }
    
    @Test
    public void testSimpleDocument () throws Exception
    {
        Element root = new Element ("root");
        Document doc = new Document (root);
        
        TreeIterator iter = new TreeIterator (doc);
        assertTrue (iter.hasNext ());
        
        Node n = iter.next ();
        assertEquals (root, n);
        assertFalse (iter.hasNext ());
    }
    
    @Test
    public void testComplexDocument () throws Exception
    {
        Document doc = new Document (
            new Text ("\n"),
            new Element ("root").addNodes (
                new Text ("\n    "),
                new Comment (" comment "),
                new Text ("\n    "),
                new Element ("e").addNodes (
                    new Element ("e2")
                ),
                new Text ("\n")
            ),
            new Text ("\n")
        );
        doc.setEncoding (XMLInputStreamReader.ENCODING_UTF_8);
        
        StringBuilder result = toString (new TreeIterator (doc));
        
        assertEquals (
            "/ XMLDeclaration \"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\"\n" + 
            "/ Text \"\\n\"\n" + 
            "/ Text \"\\n\"\n" + 
            "/root Element \"<root>\\n    <!-- comment -->\\n    <e><e2/></e>\\n</root>\"\n" + 
            "/root Text \"\\n    \"\n" + 
            "/root Comment \"<!-- comment -->\"\n" + 
            "/root Text \"\\n    \"\n" + 
            "/root/e Element \"<e><e2/></e>\"\n" + 
            "/root/e Element \"<e2/>\"\n" + 
            "/root Text \"\\n\"\n" + 
            "/ Text \"\\n\"",
            result.toString ());
    }

    public StringBuilder toString (TreeIterator iter)
    {
        StringBuilder result = new StringBuilder ();
        String delim = "";
        while (iter.hasNext ())
        {
            Node n = iter.next ();
            result.append (delim);
            delim = "\n";
            result.append (iter.getPath ());
            result.append (" ");
            result.append (n.getClass ().getSimpleName ());
            result.append (" \"");
            result.append (n.toXML ().replaceAll ("\n", "\\\\n"));
            result.append ("\"");
        }
        return result;
    }
}
