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


import lib.MultiMethodTest;

import com.sun.star.form.XLoadable;

/**
* Testing <code>com.sun.star.form.XLoadable</code>
* interface methods :
* <ul>
*  <li><code> load()</code></li>
*  <li><code> unload()</code></li>
*  <li><code> reload()</code></li>
*  <li><code> isLoaded()</code></li>
*  <li><code> addLoadListener()</code></li>
*  <li><code> removeLoadListener()</code></li>
* </ul> <p>
* Test is <b> NOT </b> multithread compilant. <p>
* @see com.sun.star.form.XLoadable
*/
public class _XLoadable extends MultiMethodTest {

    public XLoadable oObj = null;

    /**
    * Listener implementation which sets flags on appropriate method calls
    */
    protected class TestLoadListener implements com.sun.star.form.XLoadListener {
        public boolean disposingCalled = false ;
        public boolean loadedCalled = false ;
        public boolean reloadedCalled = false ;
        public boolean reloadingCalled = false ;
        public boolean unloadedCalled = false ;
        public boolean unloadingCalled = false ;
        private java.io.PrintWriter log = null ;

        public TestLoadListener(java.io.PrintWriter log) {
            this.log = log ;
        }

        public void disposing(com.sun.star.lang.EventObject e) {
            disposingCalled = true ;
            log.println(" disposing was called.") ;
        }

        public void loaded(com.sun.star.lang.EventObject e) {
            loadedCalled = true ;
            log.println(" loaded was called.") ;
        }

        public void reloaded(com.sun.star.lang.EventObject e) {
            reloadedCalled = true ;
            log.println(" reloaded was called.") ;
        }

        public void reloading(com.sun.star.lang.EventObject e) {
            reloadingCalled = true ;
            log.println(" reloading was called.") ;
        }

        public void unloaded(com.sun.star.lang.EventObject e) {
            unloadedCalled = true ;
            log.println(" unloaded was called.") ;
        }

        public void unloading(com.sun.star.lang.EventObject e) {
            unloadingCalled = true ;
            log.println(" unloading was called.") ;
        }
    }

    TestLoadListener loadListener = null ;

    /**
    * Creates new listener.
    */
    public void before() {
        loadListener = new TestLoadListener(log) ;
    }

    /**
     * Waits for 0.1 second. Used to get time for load completion.
     */
    private void shortWait() {
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {}
    }

    /**
    * Loads the form. <p>
    * Has <b> OK </b> status if <code>isLoaded()</code> returns
    * <code>true</code> and listener method <code>loaded()</code>
    * is called.
    * The following method tests are to be completed successfully before :
    * <ul>
    *  <li> <code> isLoaded() </code> : to be sure form is not loaded </li>
    *  <li> <code> addLoadListener() </code> : to check if this listener method
    *  is called. </li>
    * </ul>
    */
    public void _load() {
        requiredMethod("isLoaded()") ;
        requiredMethod("addLoadListener()") ;

        boolean result = true ;
        oObj.load() ;

        shortWait() ;
        result = oObj.isLoaded() && loadListener.loadedCalled ;

        tRes.tested("load()", result) ;
    }

    /**
    * Unloads the form. <p>
    * Has <b> OK </b> status if <code>isLoaded()</code> returns
    * <code>false</code> and listener method <code>unloaded()</code>
    * is called.
    * The following method tests are to be completed successfully before :
    * <ul>
    *  <li> <code> reload() </code> : to be sure the form is loaded </li>
    *  <li> <code> addLoadListener() </code> : to check if this listener method
    *  is called. </li>
    * </ul>
    */
    public void _unload() {
        requiredMethod("reload()") ;
        requiredMethod("addLoadListener()") ;

        boolean result = true ;
        oObj.unload() ;

        shortWait() ;
        result = !oObj.isLoaded() && loadListener.unloadedCalled ;

        tRes.tested("unload()", result) ;
    }

    /**
    * Reloads the form. <p>
    * Has <b> OK </b> status if <code>isLoaded()</code> returns
    * <code>true</code> and listener method <code>reloaded()</code>
    * is called.
    * The following method tests are to be completed successfully before :
    * <ul>
    *  <li> <code> load() </code> : to be sure form is loaded </li>
    *  <li> <code> addLoadListener() </code> : to check if this listener method
    *  is called. </li>
    * </ul>
    */
    public void _reload() {
        requiredMethod("load()") ;
        requiredMethod("addLoadListener()") ;

        boolean result = true ;
        oObj.reload() ;

        shortWait() ;
        result = oObj.isLoaded() && loadListener.reloadedCalled;

        tRes.tested("reload()", result) ;
    }

    /**
    * Checks if the component is already loaded. If yes it unloads
    * it <p>
    * Has <b> OK </b> status if finally <code>isLoaded()</code> method
    * returns <code>false</code>.
    */
    public void _isLoaded() {

        boolean isLoaded = oObj.isLoaded() ;
        if (isLoaded) oObj.unload();
        isLoaded = oObj.isLoaded() ;

        tRes.tested("isLoaded()", !isLoaded) ;
    }

    /**
    * Adds a listener. If its methods are called or not is checked
    * in other object methods. <p>
    * Has <b> OK </b> status if no runtime exceptions occured.
    */
    public void _addLoadListener() {

        boolean result = true ;
        oObj.addLoadListener(loadListener) ;

        tRes.tested("addLoadListener()", result) ;
    }

    /**
    * Removes the listener added before. <p>
    * Has <b> OK </b> status if after <code>load()</code> call no
    * listener methods were called. <p>
    * The following method tests are to be completed successfully before :
    * <ul>
    *  <li> <code> unload() </code> : to make this test run finally.</li>
    * </ul>
    */
    public void _removeLoadListener() {
        requiredMethod("unload()") ;

        boolean result = true ;
        oObj.removeLoadListener(loadListener) ;
        loadListener.loadedCalled = false ;
        oObj.load();

        result = ! loadListener.loadedCalled ;

        tRes.tested("removeLoadListener()", result) ;
    }
    
    protected void after() {
        disposeEnvironment();
    }
}

