/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements. See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership. The ASF licenses this file
 * to you 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 org.apache.axis2.util;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

import junit.framework.TestCase;

public class XMLPrettyPrinterTest extends TestCase {
    /**
     * This method checks whether the file can be deleted after using PrettyPrinter. 
     * It normally works fine in linux, but if the pretty printer doesn't close the streams properly
     * it will fail in windows. 
     * @throws IOException
     */
    public void testPrettifyStreamClose() throws IOException{
        String filePath = new File(".").getAbsolutePath() + File.separator + 
            "target" + File.separator + "test.xml";

        //Create new file
        File outputFile = new File(filePath);
        outputFile.createNewFile();
        OutputStream outStream = new FileOutputStream(outputFile);
        outStream.write("<a><b>test</b></a>".getBytes());
        outStream.close();
        
        //Prettyfy the output
        XMLPrettyPrinter.prettify(outputFile);
        
        //Delete file
        assertTrue(outputFile.delete());
    }

}
