blob: 6ab762d4fcaf44ab085a02a373e575996a49dc2d [file] [log] [blame]
/**************************************************************
*
* 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.frame;
import com.sun.star.beans.PropertyValue;
import com.sun.star.frame.XDesktop;
import com.sun.star.frame.XDispatch;
import com.sun.star.frame.XDispatchProvider;
import com.sun.star.frame.XDispatchRecorder;
import com.sun.star.frame.XModel;
import com.sun.star.lang.XMultiServiceFactory;
import com.sun.star.frame.XDispatchRecorderSupplier;
import com.sun.star.frame.XFrame;
import com.sun.star.lang.XComponent;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.uno.XInterface;
import com.sun.star.util.URL;
import lib.MultiMethodTest;
import lib.StatusException;
import util.SOfficeFactory;
import util.utils;
/**
* Testing <code>com.sun.star.frame.XDispatchRecorderSupplier</code>
* interface methods:
* <ul>
* <li><code> setDispatchRecorder() </code></li>
* <li><code> getDispatchRecorder() </code></li>
* <li><code> dispatchAndRecord() </code></li>
* </ul><p>
* Test is <b> NOT </b> multithread compilant. <p>
* @see com.sun.star.frame.XDispatchRecorderSupplier
*/
public class _XDispatchRecorderSupplier extends MultiMethodTest {
public static XDispatchRecorderSupplier oObj = null;
XComponent xTextDoc = null;
XDispatchRecorder recorder = null;
XDesktop desktop = null;
/**
* Simple <code>XDispatchRecorder</code> implementation
* which method <code>getRecordedMacro</code> returns a fixed
* string.
*/
private static class MyRecorder implements XDispatchRecorder {
public void startRecording(XFrame p0) {}
public void recordDispatch(URL p0, PropertyValue[] p1) {}
public void recordDispatchAsComment(URL p0, PropertyValue[] p1) {}
public void endRecording(){}
public String getRecordedMacro() {
return "MyRecorder implementation";
}
}
/**
* Creates a new document which supplies a frame.
* Also a <code>com.sun.star.frame.Desktop</code>
* service created for obtaining document's frame.
*/
protected void before() {
SOfficeFactory SOF = SOfficeFactory.getFactory((XMultiServiceFactory) tParam.getMSF());
try {
log.println( "creating a text document" );
xTextDoc = SOF.createTextDoc(null);
Object inst = (XInterface)((XMultiServiceFactory)tParam.getMSF()).createInstance
("com.sun.star.frame.Desktop");
desktop = (XDesktop) UnoRuntime.queryInterface
(XDesktop.class, inst);
} catch ( com.sun.star.uno.Exception e ) {
// Some exception occures.FAILED
e.printStackTrace( log );
throw new StatusException( "Couldn't create document", e );
}
}
/**
* Creates an instance of <code>MyRecorder</code> and set if,
* then get the current recorder. Second case is setting
* recorder to null. Finally restores the old macro recorder. <p>
*
* Has <b>OK</b> status if in the first case custom recorder
* was successfully returned, and in second case current
* recorder is null.
*/
public void _setDispatchRecorder() {
requiredMethod("getDispatchRecorder()");
boolean res = true,
locRes = true;
log.print("Setting custom macro recorder ...");
oObj.setDispatchRecorder(new MyRecorder());
XDispatchRecorder rec = oObj.getDispatchRecorder();
locRes = rec != null &&
"MyRecorder implementation".equals(rec.getRecordedMacro());
if (locRes) log.println("OK");
else log.println("FAILED");
res &= locRes;
log.print("Setting null dispatch recorder ...");
oObj.setDispatchRecorder(null);
locRes = oObj.getDispatchRecorder() == null;
if (locRes) log.println("OK");
else log.println("FAILED");
res &= locRes;
log.println("Setting old macro recorder ...");
oObj.setDispatchRecorder(recorder);
tRes.tested("setDispatchRecorder()", res);
}
/**
* Just gets the current recorder and stores it.
*
* Has <b>OK</b> status.
*/
public void _getDispatchRecorder() {
recorder = oObj.getDispatchRecorder();
tRes.tested("getDispatchRecorder()", true);
}
/**
* First sets the current dispatch recorder to new
* <code>DispatchRecorder</code> instance if the current one
* is null. The a <code>Dispatch</code> instance is created
* which inserts some text into text document.
* A number of cases is checked :
* <ul>
* <li> A valid call : here the recorded macro must contain
* inserted string and URL </li>
* <li> Call with invalid URL : the macro recorded must not
* contain this URL </li>
* <li> Call with null dispatcher : checking for GPF </li>
* <li> Call with the current recorder set to null :
* checking for GPF </li>
* </ul>
*
* Has <b>OK</b> status if all cases are OK.
*/
public void _dispatchAndRecord() {
requiredMethod("getDispatchRecorder()");
boolean res = true;
if (recorder == null) {
try {
Object inst = ((XMultiServiceFactory) tParam.getMSF()).createInstance
("com.sun.star.comp.framework.DispatchRecorder");
recorder = (XDispatchRecorder) UnoRuntime.queryInterface
(XDispatchRecorder.class, inst);
oObj.setDispatchRecorder(recorder);
} catch (com.sun.star.uno.Exception e) {
throw new StatusException("Couldn't create recorder", e);
}
}
try {
Thread.sleep(500);
} catch (InterruptedException ex) {}
XModel model = (XModel) UnoRuntime.queryInterface(XModel.class, xTextDoc);
XFrame fr = model.getCurrentController().getFrame();
XDispatchProvider xDispProv = (XDispatchProvider)
UnoRuntime.queryInterface(XDispatchProvider.class, fr);
URL dispURL = utils.parseURL((XMultiServiceFactory) tParam.getMSF(), ".uno:InsertText");
XDispatch xDisp = xDispProv.queryDispatch(dispURL,"",0);
PropertyValue[] args = new PropertyValue[1];
args[0] = new PropertyValue();
args[0].Name = "Text";
args[0].Value = "XDispatchRecorderSupplier";
log.print("Dispatching and recording ...");
oObj.dispatchAndRecord(dispURL, args, xDisp);
String macro = recorder.getRecordedMacro();
boolean locRes = macro != null &&
macro.indexOf("XDispatchRecorderSupplier")>-1 &&
macro.indexOf(".uno:InsertText")>-1;
if (locRes) log.println("OK");
else log.println("FAILED");
res &= locRes;
log.println("Recorder macro :\n" + macro);
log.print("Trying to set dispatch with null Dispatcher ...");
try {
oObj.dispatchAndRecord(dispURL, args, null);
log.println("OK");
} catch (java.lang.Exception e){
log.println("Exception is OK: " + e);
}
log.print("Trying to set dispatch recorder to null and record ...");
oObj.setDispatchRecorder(null);
try {
oObj.dispatchAndRecord(dispURL, args, xDisp);
log.println("OK");
} catch (java.lang.Exception e){
log.println("Exception is OK: " + e);
}
oObj.setDispatchRecorder(recorder);
tRes.tested("dispatchAndRecord()", res);
}
/**
* Disposes the document created in <code>before()</code>
*/
protected void after() {
xTextDoc.dispose();
}
}