/*   Copyright 2004 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.
 */

package xmlobject.checkin;

import dumbNS.RootDocument;
import dumbNS.RootDocument.Root;
import org.apache.xmlbeans.XmlObject;
import org.junit.Before;
import org.junit.Test;
import tools.util.JarUtil;

import java.io.IOException;

import static org.junit.Assert.assertEquals;


public class DumbTest {
    private String instance;

    @Before
    public void setUp() throws IOException {
        instance = JarUtil.getResourceFromJar("xbean/simple/dumb/dumb.xml");
    }

    @Test
    public void testGetB2()
        throws Exception {
        RootDocument rootDoc = (RootDocument) XmlObject.Factory
            .parse(instance);
        Root root = rootDoc.getRoot();

        System.out.println("root.xmlText() = " + root.xmlText());

        assertEquals("bar:b attribute != 4", 4, root.getB2().intValue());
    }
}
