/* $Id: XMLPullParserTest.java,v 1.2 2003/04/04 19:26:06 tsm Exp $
 * Created on Apr 2, 2003
 *
 */
package org.tienshiao.XMLLite;

import java.io.*;
import junit.framework.*;

/**
 * @author tsm
 *
 * To change the template for this generated type comment go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */
public class XMLPullParserTest extends TestCase {

	/**
	 * Constructor for XMLPullParserTest.
	 * @param arg0
	 */
	public XMLPullParserTest(String arg0) {
		super(arg0);
	}
	
	public static Test suite() {
		TestSuite suite = new TestSuite(XMLPullParserTest.class);
		return suite;
	}

	public static void main(String[] args) {
		junit.textui.TestRunner.run(XMLPullParserTest.class);
	}

    private XMLPullParser startParser(String s) {
		ByteArrayInputStream bin = 
			new ByteArrayInputStream(s.getBytes());
		return new XMLPullParser(new InputStreamReader(bin));
    }
    
    private XMLPullParser getXMLToken(int o, String s) throws IOException, XMLParserException {
    	XMLPullParser xpp = startParser(s);
    	for (int i = 0; i <= o; i++) {
    		xpp.getNextToken();
    	}
    	return xpp;
    }
    
    private boolean testXMLException(int o, String s) throws IOException, XMLParserException {
        XMLPullParser xpp = startParser(s);
        for (int i = 0; i < o; i++) {
            xpp.getNextToken();
        }

        boolean flag = false;
        try {
            xpp.getNextToken();
        } catch (XMLParserException e) {
            flag = true;
        }
        return flag;
    }
        
    public void testParseCommentGood() throws IOException, XMLParserException {
    	XMLPullParser xpp = getXMLToken(0, "<!-- Good Comment -->");
        assertTrue("Type != COMMENT", xpp.getType() == XMLPullParser.COMMENT);
        assertTrue("Name != null", xpp.getName() == null);
        assertTrue("Text = " + xpp.getText(), xpp.getText().compareTo(" Good Comment ") == 0);
    	
        xpp = getXMLToken(0, "<!-- Good -- Comment -->");
        assertTrue("Type != COMMENT", xpp.getType() == XMLPullParser.COMMENT);
        assertTrue("Name != null", xpp.getName() == null);
        assertTrue("Text = " + xpp.getText(), xpp.getText().compareTo(" Good -- Comment ") == 0);
		
        xpp = getXMLToken(0, "<!-- -- -->");
        assertTrue("Type != COMMENT", xpp.getType() == XMLPullParser.COMMENT);
        assertTrue("Name != null", xpp.getName() == null);
        assertTrue("Text = " + xpp.getText(), xpp.getText().compareTo(" -- ") == 0);
        
        xpp = getXMLToken(0, "<!-- ->>->-- -->");
        assertTrue("Type != COMMENT", xpp.getType() == XMLPullParser.COMMENT);
        assertTrue("Name != null", xpp.getName() == null);
        assertTrue("Text = " + xpp.getText(), xpp.getText().compareTo(" ->>->-- ") == 0);            	    	
    }

    public void testParseCommentBad() throws IOException, XMLParserException {
        assertTrue(testXMLException(0, "<!! Doesn't Start"));
        assertTrue(testXMLException(0, "<!- Doesnt Start"));
        assertTrue(testXMLException(0, "<!-- Doesn't End "));
        assertTrue(testXMLException(0, "<!-- Doesn't End -"));
        assertTrue(testXMLException(0, "<!-- Doesn't End --"));
    }
    
    public void testParseCommentUgly() throws IOException, XMLParserException {
        XMLPullParser xpp = getXMLToken(0, "<!--- Ugly Comment --->");
        assertTrue("Type != COMMENT", xpp.getType() == XMLPullParser.COMMENT);
        assertTrue("Name != null", xpp.getName() == null);
        assertTrue("Text = " + xpp.getText(), xpp.getText().compareTo("- Ugly Comment -") == 0);

        xpp = getXMLToken(0, "<!------>");
        assertTrue("Type != COMMENT", xpp.getType() == XMLPullParser.COMMENT);
        assertTrue("Name != null", xpp.getName() == null);
        assertTrue("Text = " + xpp.getText(), xpp.getText().compareTo("--") == 0);                
    }
    
    public void testParseCDATAGood() throws IOException, XMLParserException {
        XMLPullParser xpp = getXMLToken(0, "<![CDATA[Good CDATA]]>");
        assertTrue("Type != TEXT", xpp.getType() == XMLPullParser.TEXT);
        assertTrue("Name != null", xpp.getName() == null);
        assertTrue("Text = " + xpp.getText(), xpp.getText().compareTo("Good CDATA") == 0);
        
        xpp = getXMLToken(0, "<![CDATA[Good ]] CDATA]]>");
        assertTrue("Type != TEXT", xpp.getType() == XMLPullParser.TEXT);
        assertTrue("Name != null", xpp.getName() == null);
        assertTrue("Text = " + xpp.getText(), xpp.getText().compareTo("Good ]] CDATA") == 0);
        
        xpp = getXMLToken(0, "<![CDATA[ ]] ]]>");
        assertTrue("Type != COMMENT", xpp.getType() == XMLPullParser.TEXT);
        assertTrue("Name != null", xpp.getName() == null);
        assertTrue("Text = " + xpp.getText(), xpp.getText().compareTo(" ]] ") == 0);
        
        xpp = getXMLToken(0, "<![CDATA[ ]>>]>]] ]]>");
        assertTrue("Type != COMMENT", xpp.getType() == XMLPullParser.TEXT);
        assertTrue("Name != null", xpp.getName() == null);
        assertTrue("Text = " + xpp.getText(), xpp.getText().compareTo(" ]>>]>]] ") == 0);                       
    }
    
    public void testParseCDATABad() throws IOException, XMLParserException {
        assertTrue(testXMLException(0, "<![ Doesn't Start]]>"));
        assertTrue(testXMLException(0, "<![CDATA Doesnt Start]]>"));
        assertTrue(testXMLException(0, "<![CDATA[ Doesn't End "));
        assertTrue(testXMLException(0, "<![CDATA[ Doesn't End ]"));
        assertTrue(testXMLException(0, "<![CDATA[ Doesn't End ]]"));
    }

    public void testParseCDATAUgly() throws IOException, XMLParserException {
        XMLPullParser xpp = getXMLToken(0, "<![CDATA[[ Ugly Comment ]]]>");
        assertTrue("Type != TEXT", xpp.getType() == XMLPullParser.TEXT);
        assertTrue("Name != null", xpp.getName() == null);
        assertTrue("Text = " + xpp.getText(), xpp.getText().compareTo("[ Ugly Comment ]") == 0);

        xpp = getXMLToken(0, "<![CDATA[[]]]>");
        assertTrue("Type != TEXT", xpp.getType() == XMLPullParser.TEXT);
        assertTrue("Name != null", xpp.getName() == null);
        assertTrue("Text = " + xpp.getText(), xpp.getText().compareTo("[]") == 0);                
    }
    
    public void testParseDeclarationGood() throws IOException, XMLParserException {
        XMLPullParser xpp = getXMLToken(0, "<!ELEMENT br EMPTY>");
        assertTrue("Type != DECLARATION", xpp.getType() == XMLPullParser.DECLARATION_TAG);
        assertTrue("Name != ELEMENT", xpp.getName().compareTo("ELEMENT") == 0);
        assertTrue("Text = " + xpp.getText(), xpp.getText().compareTo("br EMPTY") == 0);
        
        xpp = getXMLToken(0, "<!ELEMENT p (#PCDATA|emph)* >");
        assertTrue("Type != DECLARATION", xpp.getType() == XMLPullParser.DECLARATION_TAG);
        assertTrue("Name != ELEMENT", xpp.getName().compareTo("ELEMENT") == 0);
        assertTrue("Text = " + xpp.getText(), xpp.getText().compareTo("p (#PCDATA|emph)*") == 0);

        xpp = getXMLToken(0, "<!ELEMENT %name.para; %content.para; >");
        assertTrue("Type != DECLARATION", xpp.getType() == XMLPullParser.DECLARATION_TAG);
        assertTrue("Name != ELEMENT", xpp.getName().compareTo("ELEMENT") == 0);
        assertTrue("Text = " + xpp.getText(), xpp.getText().compareTo("%name.para; %content.para;") == 0);
                
        xpp = getXMLToken(0, "<!ELEMENT container ANY>");
        assertTrue("Type != DECLARATION", xpp.getType() == XMLPullParser.DECLARATION_TAG);
        assertTrue("Name != ELEMENT", xpp.getName().compareTo("ELEMENT") == 0);
        assertTrue("Text = " + xpp.getText(), xpp.getText().compareTo("container ANY") == 0);

        xpp = getXMLToken(0, "<!ELEMENT spec (front, body, back?)>");
        assertTrue("Type != DECLARATION", xpp.getType() == XMLPullParser.DECLARATION_TAG);
        assertTrue("Name != ELEMENT", xpp.getName().compareTo("ELEMENT") == 0);
        assertTrue("Text = " + xpp.getText(), xpp.getText().compareTo("spec (front, body, back?)") == 0);

        xpp = getXMLToken(0, "<!ELEMENT div1 (head, (p | list | note)*, div2*)>");
        assertTrue("Type != DECLARATION", xpp.getType() == XMLPullParser.DECLARATION_TAG);
        assertTrue("Name != ELEMENT", xpp.getName().compareTo("ELEMENT") == 0);
        assertTrue("Text = " + xpp.getText(), xpp.getText().compareTo("div1 (head, (p | list | note)*, div2*)") == 0);
        
        xpp = getXMLToken(0, "<!ELEMENT dictionary-body (%div.mix; | %dict.mix;)*>");
        assertTrue("Type != DECLARATION", xpp.getType() == XMLPullParser.DECLARATION_TAG);
        assertTrue("Name != ELEMENT", xpp.getName().compareTo("ELEMENT") == 0);
        assertTrue("Text = " + xpp.getText(), xpp.getText().compareTo("dictionary-body (%div.mix; | %dict.mix;)*") == 0);

        xpp = getXMLToken(0, "<!ELEMENT p (#PCDATA|a|ul|b|i|em)*>");
        assertTrue("Type != DECLARATION", xpp.getType() == XMLPullParser.DECLARATION_TAG);
        assertTrue("Name != ELEMENT", xpp.getName().compareTo("ELEMENT") == 0);
        assertTrue("Text = " + xpp.getText(), xpp.getText().compareTo("p (#PCDATA|a|ul|b|i|em)*") == 0);        

        xpp = getXMLToken(0, "<!ELEMENT p (#PCDATA | %font; | %phrase; | %special; | %form;)* >");
        assertTrue("Type != DECLARATION", xpp.getType() == XMLPullParser.DECLARATION_TAG);
        assertTrue("Name != ELEMENT", xpp.getName().compareTo("ELEMENT") == 0);
        assertTrue("Text = " + xpp.getText(), xpp.getText().compareTo("p (#PCDATA | %font; | %phrase; | %special; | %form;)*") == 0);                

        xpp = getXMLToken(0, "<!ELEMENT b (#PCDATA)>");
        assertTrue("Type != DECLARATION", xpp.getType() == XMLPullParser.DECLARATION_TAG);
        assertTrue("Name != ELEMENT", xpp.getName().compareTo("ELEMENT") == 0);
        assertTrue("Text = " + xpp.getText(), xpp.getText().compareTo("b (#PCDATA)") == 0);                
             
    }


}
