package org.apache.axiom.om.impl.llom;

import junit.framework.TestCase;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMNamespace;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMComment;

import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
/*
 * Copyright 2004,2005 The Apache Software Foundation.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

public class OMElementGetElementTextTest extends TestCase {

    protected OMElement documentElement;
    public void setUp() {
        OMFactory factory = OMAbstractFactory.getOMFactory();

        OMNamespace namespace = factory.createOMNamespace("http://testuri.org","test");
        documentElement = factory.createOMElement("DocumentElement",namespace);
        factory.createOMText(documentElement,"this is a TEXT");
        factory.createOMComment(documentElement,"this is a comment");
        factory.createOMText(documentElement,"this is a TEXT block 2");

    }

    /**
     *
     */
     public void testGetElementTextProperly(){
        try {
            XMLStreamReader xmlStreamReader = documentElement.getXMLStreamReader();
            //move to the Start_Element
            while(xmlStreamReader.getEventType()!=XMLStreamReader.START_ELEMENT){
                xmlStreamReader.next();
            }

            String elementText = xmlStreamReader.getElementText();
            assertEquals("this is a TEXTthis is a TEXT block 2",elementText);
        } catch (XMLStreamException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }
    }

}
