/*
 * Copyright (C) 2010 The Android Open Source Project
 *
 * 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 tests.xml;

import dalvik.annotation.KnownFailure;
import junit.framework.TestCase;
import org.w3c.dom.Document;
import org.xml.sax.InputSource;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

/**
 * Test the parsing of the XML declaration, plus the additional document fields
 * captured during parsing.
 */
public class DeclarationTest extends TestCase {

    private String systemIdA;
    private Document documentA;

    private String systemIdB;
    private Document documentB;

    @Override protected void setUp() throws Exception {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        factory.setNamespaceAware(true);
        DocumentBuilder builder = factory.newDocumentBuilder();

        systemIdA = stringToSystemId(
                "<?xml version=\"1.0\" encoding=\"ISO-8859-1\" standalone=\"no\" ?><foo />");
        InputSource inputSourceA = new InputSource(systemIdA);
        inputSourceA.setEncoding("US-ASCII");
        documentA = builder.parse(inputSourceA);

        systemIdB = stringToSystemId(
                "<?xml version=\"1.1\" encoding=\"US-ASCII\" standalone=\"yes\" ?><foo />");
        InputSource inputSourceB = new InputSource(systemIdB);
        inputSourceB.setEncoding("ISO-8859-1");
        documentB = builder.parse(inputSourceB);
    }

    private String stringToSystemId(String contents) throws IOException {
        File file = File.createTempFile("temp", "xml");
        file.deleteOnExit();
        OutputStream out = new FileOutputStream(file);
        out.write(contents.getBytes("UTF-8"));
        out.close();
        return "file:" + file;
    }

    /**
     * XML parsers are advised of the document's character set via two channels:
     * via the declaration and also the document's input source. To test that
     * each of these winds up in the correct location in the document model, we
     * supply different names for each. This is only safe because for the subset
     * of characters in the document, the character sets are equivalent.
     */
    public void testGetInputEncoding() throws Exception {
        assertEquals("US-ASCII", documentA.getInputEncoding());
        assertEquals("ISO-8859-1", documentB.getInputEncoding());
    }

    @KnownFailure("Dalvik doesn't parse the XML declaration")
    public void testGetXmlEncoding() throws Exception {
        String message = "This implementation doesn't parse the encoding from the XML declaration";
        assertEquals(message, "ISO-8859-1", documentA.getXmlEncoding());
        assertEquals(message, "US-ASCII", documentB.getXmlEncoding());
    }

    @KnownFailure("Dalvik doesn't parse the XML declaration")
    public void testGetXmlVersion() throws Exception {
        String message = "This implementation doesn't parse the version from the XML declaration";
        assertEquals(message, "1.0", documentA.getXmlVersion());
        assertEquals(message, "1.1", documentB.getXmlVersion());
    }

    @KnownFailure("Dalvik doesn't parse the XML declaration")
    public void testGetXmlStandalone() throws Exception {
        String message = "This implementation doesn't parse standalone from the XML declaration";
        assertEquals(message, false, documentA.getXmlStandalone());
        assertEquals(message, true, documentB.getXmlStandalone());
    }

    public void testGetDocumentUri() throws Exception {
        assertEquals(systemIdA, documentA.getDocumentURI());
        assertEquals(systemIdB, documentB.getDocumentURI());
    }
}
