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

import com.sun.star.io.IOException;
import com.sun.star.lang.IllegalArgumentException;
import com.sun.star.lang.XComponent;
import com.sun.star.lang.XMultiServiceFactory;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.util.XCloseable;
import java.io.File;
import java.io.RandomAccessFile;

import lib.TestParameters;

import util.SOfficeFactory;

// ---------- junit imports -----------------
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.openoffice.test.OfficeConnection;
import static org.junit.Assert.*;
// ------------------------------------------

public class Skeleton
{
    /**
     * The test parameters
     */
    private static TestParameters param = null;

    @Test public void check() {
        assertTrue("Couldn't open document", open());
        System.out.println("check");
        assertTrue("Couldn't close document", close());
        String tempDirURL = util.utils.getOfficeTemp/*Dir*/(getMSF());
        System.out.println("temp dir URL is: " + tempDirURL);
        String tempDir = graphical.FileHelper.getSystemPathFromFileURL(tempDirURL);
        assertTrue("Temp directory doesn't exist.", new File(tempDir).exists());
    }

    private boolean open()
        {
            System.out.println("open()");
            // get multiservicefactory -----------------------------------------
            final XMultiServiceFactory xMsf = getMSF();

            SOfficeFactory SOF = SOfficeFactory.getFactory(xMsf);

            // some Tests need the qadevOOo TestParameters, it is like a Hashmap for Properties.
            param = new TestParameters();
            param.put("ServiceFactory", xMsf); // some qadevOOo functions need the ServiceFactory

            return true;
        }

    private boolean close()
        {
            System.out.println("close()");
            return true;
        }

    // marked as test
    @Test public void checkDocument()
        {
            System.out.println("checkDocument()");
            final String sREADME = TestDocument.getUrl("README.txt");
            System.out.println("README is in:" + sREADME);
            File aFile = new File(sREADME);
            if (! aFile.exists())
            {
                // It is a little bit stupid that office urls not compatible to java file urls
                System.out.println("java.io.File can't access Office file urls.");
                String sREADMESystemPath = graphical.FileHelper.getSystemPathFromFileURL(sREADME);
                aFile = new File(sREADMESystemPath);
                assertTrue("File '" + sREADMESystemPath + "' doesn't exists.", aFile.exists());
            }

            try
            {
                RandomAccessFile aAccess = new RandomAccessFile(aFile, "r");
                long nLength = aAccess.length();
                System.out.println("File length: " + nLength);
                assertTrue("File length wrong", nLength > 0);
                String sLine = aAccess.readLine();
                assertTrue("Line must not be empty", sLine.length() > 0);
                System.out.println("       Line: '" + sLine + "'");
                System.out.println("     length: " + sLine.length());
                assertTrue("File length not near equal to string length", sLine.length() + 2 >= nLength);
                aAccess.close();
            }
            catch (java.io.FileNotFoundException e)
            {
                fail("Can't find file: " + sREADME + " - " + e.getMessage());
            }
            catch (java.io.IOException e)
            {
                fail("IO Exception: " + e.getMessage());
            }

        }
    
    @Test public void checkOpenDocumentWithOffice()
    {
        // SOfficeFactory aFactory = new SOfficeFactory(getMSF());
        SOfficeFactory SOF = SOfficeFactory.getFactory(getMSF());
        final String sREADME = TestDocument.getUrl("README.txt");
        try
        {
            XComponent aDocument = SOF.loadDocument(sREADME);
            complex.junitskeleton.justatest.shortWait();
            XCloseable xClose = UnoRuntime.queryInterface(XCloseable.class, aDocument);
            xClose.close(true);
        }
        catch (com.sun.star.lang.IllegalArgumentException ex)
        {
            fail("Illegal argument exception caught: " + ex.getMessage());
        }
        catch (com.sun.star.io.IOException ex)
        {
            fail("IOException caught: " + ex.getMessage());
        }
        catch (com.sun.star.uno.Exception ex)
        {
            fail("Exception caught: " + ex.getMessage());
        }
    }

    // marked as prepare for test, will call before every test
    @Before public void before()
        {
            System.out.println("before()");
            System.setProperty("THIS IS A TEST", "Hallo");
        }
    

    // marked as post for test, will call after every test
    @After public void after()
        {
            System.out.println("after()");
            String sValue = System.getProperty("THIS IS A TEST");
            assertEquals(sValue, "Hallo");
    }


    private XMultiServiceFactory getMSF()
    {
        final XMultiServiceFactory xMSF1 = UnoRuntime.queryInterface(XMultiServiceFactory.class, connection.getComponentContext().getServiceManager());
        return xMSF1;
    }

    // setup and close connections
    @BeforeClass public static void setUpConnection() throws Exception {
        System.out.println("setUpConnection()");
        connection.setUp();
    }

    @AfterClass public static void tearDownConnection()
        throws InterruptedException, com.sun.star.uno.Exception
    {
        System.out.println("tearDownConnection()");
        connection.tearDown();
    }

    private static final OfficeConnection connection = new OfficeConnection();

}
