/*   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.detailed;

import junit.framework.TestCase;
import junit.framework.Assert;

import org.openuri.test.selectChildren.*;
import org.openuri.test.selectAttribute.*;

import org.apache.xmlbeans.*;

import javax.xml.namespace.QName;
import java.util.*;

import xmlobject.common.SelectChildrenAttribCommon;

/**
 *
 *
 */
public class SelectAttributeTests
            extends SelectChildrenAttribCommon
{
    public SelectAttributeTests(String name)
    {
        super(name);
    }

    static String saUri = "http://openuri.org/test/selectAttribute";
    static String saStartFrag = "<xm xmlns:sa=\"" + saUri + "\">";

    static String abcUri = "http://abc";
    static String defUri = "http://def";
    static String xyzUri = "http://xyz";

    static String anyStartFrag = "<xm xmlns:sa=\"" + saUri + "\"" +
                                 " xmlns:abc=\"" + abcUri + "\"" +
                                 " xmlns:def=\"" + defUri + "\"" + ">";

    static String endFrag = "</xm>";
    // To speed up tests when running multiple test methods in the same run
    DocDocument.Doc doc = null;

    ///////////////////////////////////////////////////////////////////
    // Tests for non-wildcard attributes
    public void testSelectWithQName()
        throws Exception
    {
        if (doc == null)
            doc = (DocDocument.Doc) getTestObject();
        QName qn = new QName("", "att1");
        XmlObject x = doc.getNormal().selectAttribute(qn);
        String exp = saStartFrag + "Attribute 1" + endFrag;

        validateTest("testSelectWithQName", exp, x);
        // Check Select with QName that is not present.. should get null back.
        x = doc.getWithOther().selectAttribute(qn);
        assertTrue(x == null);
    }


    public void testSelectWithURI()
        throws Exception
    {
        if (doc == null)
            doc = (DocDocument.Doc) getTestObject();

        XmlObject x = doc.getNormal().selectAttribute("", "att2");
        String exp = saStartFrag + "Attribute 2" + endFrag;

        validateTest("testSelectWithURI", exp, x);
        // Check Select with QName that is not present.. should get null back.
        x = doc.getWithAny().selectAttribute("", "att2");
        assertTrue(x == null);

    }

    ////////////////////////////////////////////////////////////////////
    // Test for wild-card attributes
    public void testSelectWithQNameForAny()
        throws Exception
    {
        if (doc == null)
            doc = (DocDocument.Doc) getTestObject();

        QName qn = new QName(abcUri, "att3");
        String exp = saStartFrag + "Attribute 3" + endFrag;
        XmlObject x = doc.getWithAny().selectAttribute(qn);

        validateTest("testSelectWithQNameForAny", exp, x);


        x = doc.getWithAny();
        System.out.println(x.xmlText());

    }

    ////////////////////////////////////////////////////////////////////
    // Helper
    public XmlObject getTestObject()
        throws Exception
    {
        String xml = getXml("xbean/xmlobject/SelectAttribute-Doc.xml");
        DocDocument xmlObj = DocDocument.Factory.parse(xml);
        DocDocument.Doc doc = xmlObj.getDoc();

        Collection errors = new ArrayList();
        opts.setErrorListener(errors);
        boolean valid = doc.validate(opts);
        tools.xml.Utils.printXMLErrors(errors);

        assertTrue("Test Xml is not valid!!", valid);
        return doc;
    }

    public void printXmlObj(XmlObject[] xobj)
        throws Exception
    {
        for (int i = 0; i < xobj.length; i++)
            System.out.println(convertFragToDoc(xobj[i].xmlText()));
    }


}
