/*******************************************************************************
 * Copyright (c) 2013 Oracle and/or its affiliates. All rights reserved.
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
 * which accompanies this distribution.
 * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
 * and the Eclipse Distribution License is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * Contributors:
 *     Blaise Doughan - 2.5.1 - initial implementation
 ******************************************************************************/
package org.eclipse.persistence.testing.jaxb.stax;

import java.io.StringReader;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamReader;
import javax.xml.transform.stax.StAXSource;

import org.eclipse.persistence.jaxb.JAXBContextFactory;

import junit.framework.TestCase;

public class XMLStreamReaderEndEventTestCases extends TestCase {

    private static final String XML = "<root><foo><bar>Hello World</bar></foo></root>";
    
    private Unmarshaller unmarshaller;
    private XMLStreamReader xsr;

    @Override
    protected void setUp() throws Exception {
        JAXBContext jc = JAXBContextFactory.createContext(new Class[] {EndEventRoot.class}, null);
        unmarshaller = jc.createUnmarshaller();
        
        XMLInputFactory xif = XMLInputFactory.newFactory();
        xsr = xif.createXMLStreamReader(new StringReader(XML));
    }

    public void testUnmarshalFromXMLStreamReaderStartDocumentEvent() throws Exception {
        assertEquals(XMLStreamReader.START_DOCUMENT, xsr.getEventType());
        unmarshaller.unmarshal(xsr);
        assertEquals(XMLStreamReader.END_DOCUMENT, xsr.getEventType());
    }
    
    public void testUnmarshalFromXMLStreamReaderStartElementEvent() throws Exception {
        xsr.next();
        assertEquals(XMLStreamReader.START_ELEMENT, xsr.getEventType());
        unmarshaller.unmarshal(xsr);
        assertEquals(XMLStreamReader.END_DOCUMENT, xsr.getEventType());
    }

    public void testUnmarshalFromXMLStreamReaderNestedStartElementEvent() throws Exception {
        xsr.next();
        xsr.next();
        assertEquals(XMLStreamReader.START_ELEMENT, xsr.getEventType());
        unmarshaller.unmarshal(xsr);
        assertEquals(XMLStreamReader.END_ELEMENT, xsr.getEventType());
        assertEquals("root", xsr.getLocalName());
    }

    public void testUnmarshalWithClassFromXMLStreamReaderStartDocumentEvent() throws Exception {
        assertEquals(XMLStreamReader.START_DOCUMENT, xsr.getEventType());
        unmarshaller.unmarshal(xsr, EndEventRoot.class);
        assertEquals(XMLStreamReader.END_DOCUMENT, xsr.getEventType());
    }

    public void testUnmarshalWithClassFromXMLStreamReaderStartElementEvent() throws Exception {
        xsr.next();
        assertEquals(XMLStreamReader.START_ELEMENT, xsr.getEventType());
        unmarshaller.unmarshal(xsr, EndEventRoot.class);
        assertEquals(XMLStreamReader.END_DOCUMENT, xsr.getEventType());
    }

    public void testUnmarshalWithClassFromXMLStreamReaderNestedStartElementEvent() throws Exception {
        xsr.next();
        xsr.next();
        assertEquals(XMLStreamReader.START_ELEMENT, xsr.getEventType());
        unmarshaller.unmarshal(xsr, EndEventRoot.class);
        assertEquals(XMLStreamReader.END_ELEMENT, xsr.getEventType());
        assertEquals("root", xsr.getLocalName());
    }

    public void testUnmarshalFromStAXSourceStartDocumentEvent() throws Exception {
        assertEquals(XMLStreamReader.START_DOCUMENT, xsr.getEventType());
        StAXSource staxSource = new StAXSource(xsr);
        unmarshaller.unmarshal(staxSource);
        assertEquals(XMLStreamReader.END_DOCUMENT, xsr.getEventType());
    }
    
    public void testUnmarshalFromStAXSourceStartElementEvent() throws Exception {
        xsr.next();
        assertEquals(XMLStreamReader.START_ELEMENT, xsr.getEventType());
        StAXSource staxSource = new StAXSource(xsr);
        unmarshaller.unmarshal(staxSource);
        assertEquals(XMLStreamReader.END_DOCUMENT, xsr.getEventType());
    }

    public void testUnmarshalFromStAXSourceNestedStartElementEvent() throws Exception {
        xsr.next();
        xsr.next();
        assertEquals(XMLStreamReader.START_ELEMENT, xsr.getEventType());
        StAXSource staxSource = new StAXSource(xsr);
        unmarshaller.unmarshal(staxSource);
        assertEquals(XMLStreamReader.END_ELEMENT, xsr.getEventType());
        assertEquals("root", xsr.getLocalName());
    }

    public void testUnmarshalWithClassFromStAXSourceStartDocumentEvent() throws Exception {
        assertEquals(XMLStreamReader.START_DOCUMENT, xsr.getEventType());
        StAXSource staxSource = new StAXSource(xsr);
        unmarshaller.unmarshal(staxSource, EndEventRoot.class);
        assertEquals(XMLStreamReader.END_DOCUMENT, xsr.getEventType());
    }

    public void testUnmarshalWithClassFromStAXSourceStartElementEvent() throws Exception {
        xsr.next();
        assertEquals(XMLStreamReader.START_ELEMENT, xsr.getEventType());
        StAXSource staxSource = new StAXSource(xsr);
        unmarshaller.unmarshal(staxSource, EndEventRoot.class);
        assertEquals(XMLStreamReader.END_DOCUMENT, xsr.getEventType());
    }

    public void testUnmarshalWithClassFromStAXSourceNestedStartElementEvent() throws Exception {
        xsr.next();
        xsr.next();
        assertEquals(XMLStreamReader.START_ELEMENT, xsr.getEventType());
        StAXSource staxSource = new StAXSource(xsr);
        unmarshaller.unmarshal(staxSource, EndEventRoot.class);
        assertEquals(XMLStreamReader.END_ELEMENT, xsr.getEventType());
        assertEquals("root", xsr.getLocalName());
    }

}
