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

import lib.MultiMethodTest;
import lib.Status;
import lib.StatusException;

import com.sun.star.bridge.XBridge;
import com.sun.star.connection.XConnection;
import com.sun.star.lang.XInitialization;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.uno.XInterface;


/**
* Testing <code>com.sun.star.bridge.XBridge</code>
* interface methods :
* <ul>
*  <li><code> getInstance()</code></li>
*  <li><code> getName()</code></li>
*  <li><code> getDescription()</code></li>
* </ul> <p>
* This test needs the following object relations :
* <ul>
*  <li> <code>'XInitialization.args'</code> (of type <code>Object[]</code>):
*   relation which contains arguments for Bridge initialization.
*   It used here to check description of the bridge. This array
*   must contain : [0] - the name of the bridge, [1] - the name of
*   protocol, [2] - <code>XConnection</code> reference to bridge
*   connection. </li>
* <ul> <p>
* Test is <b> NOT </b> multithread compilant. <p>
* After test completion object environment has to be recreated.
* @see com.sun.star.bridge.XBridge
*/
public class _XBridge extends MultiMethodTest {

    public XBridge oObj;

    protected Object[] args;//for object relation 'XInitialization.args'

    /**
    * Retrieves object relations.
    * @throws StatusException If one of relations not found.
    */
    public void before() {
        args = (Object[])tEnv.getObjRelation("XInitialization.args");

        if (args == null) throw new StatusException(Status.failed
            ("Relation 'XInitialization.args' not found")) ;
        XInitialization xInit = (XInitialization)UnoRuntime.queryInterface(
                                       XInitialization.class, oObj);
        try {
            xInit.initialize(args);
        }
        catch (com.sun.star.uno.Exception e) {
            e.printStackTrace(log);
            throw new StatusException("Can't initialize the bridge", e);
        }
    }

    /**
    * Tries to retrieve <code>ServiceManager</code> service
    * using the bridge. <p>
    * Has <b>OK</b> status if non null object returned.
    */
    public void _getInstance() {
        XInterface xInt = (XInterface)oObj.getInstance(
                "com.sun.star.lang.ServiceManager");

        tRes.tested("getInstance()", xInt != null);
    }

    /**
    * Retrieves the name of the bridge from relation and compares
    * it to name returned by the method. <p>
    * Has <b>OK</b> status if names are equal.
    */
    public void _getName() {
        String expectedName = (String)args[0]; // args[0] - bridge name

        String name = oObj.getName();

        if (!tRes.tested("getName()", name.equals(expectedName))) {
            log.println("getName() returns wrong result : \"" + name + "\"");
            log.println("expected = \"" + expectedName + "\"");
        }
    }

    /**
    * Retrieves the description of the bridge and compares it with
    * expected description composed using relation
    * <code> ([protocol] + ":" + [connection description]) </code>. <p>
    * Has <b>OK</b> status if description returned by the method
    * is equal to expected one.
    */
    public void _getDescription() {
        String protocol = (String)args[1]; // args[1] - protocol
        XConnection xConnection = (XConnection)args[2]; // args[2] - connection
        // expected description is protocol + ":" + xConnection.getDescription()
        String expectedDescription =
                protocol + ":" + xConnection.getDescription();

        String description = oObj.getDescription();

        if (!tRes.tested("getDescription()",
                description.equals(expectedDescription))) {
            log.println("getDescription() returns wrong result : \""
                    + description + "\"");
            log.println("expected = \"" + expectedDescription + "\"");
        }
    }

    /**
    * Disposes object environment.
    */
    public void after() {
        disposeEnvironment() ;
    }

}

