diff options
Diffstat (limited to 'sfx2/qa/complex')
31 files changed, 3739 insertions, 1365 deletions
diff --git a/sfx2/qa/complex/CheckGlobalEventBroadcaster_writer1.java b/sfx2/qa/complex/CheckGlobalEventBroadcaster_writer1.java deleted file mode 100644 index d5dc17e183eb..000000000000 --- a/sfx2/qa/complex/CheckGlobalEventBroadcaster_writer1.java +++ /dev/null @@ -1,243 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ -package complex.framework; - -import com.sun.star.awt.XWindow; -import com.sun.star.document.XEventBroadcaster; -import com.sun.star.document.XEventListener; -import com.sun.star.lang.XMultiServiceFactory; -import com.sun.star.sheet.XSpreadsheetDocument; -import com.sun.star.text.XTextDocument; -import com.sun.star.uno.UnoRuntime; -import complex.framework.DocHelper.WriterHelper; -import complexlib.ComplexTestCase; -import java.util.ArrayList; -import com.sun.star.task.XJobExecutor; -import com.sun.star.util.URL; -import util.UITools; - -/** - * This testcase checks the GlobalEventBroadcaster - * it will add an XEventListener and verify the Events - * raised when opening/changing and closing Office Documents - */ -public class CheckGlobalEventBroadcaster_writer1 extends ComplexTestCase { - XMultiServiceFactory m_xMSF = null; - XEventBroadcaster m_xEventBroadcaster = null; - ArrayList notifyEvents = new ArrayList(); - XTextDocument xTextDoc; - XSpreadsheetDocument xSheetDoc; - XEventListener m_xEventListener = new EventListenerImpl(); - - public String[] getTestMethodNames() { - return new String[] { - "initialize", "checkWriter", "cleanup" - }; - } - - public void initialize() { - m_xMSF = (XMultiServiceFactory) param.getMSF(); - log.println("check wether there is a valid MultiServiceFactory"); - - if (m_xMSF == null) { - assure("## Couldn't get MultiServiceFactory make sure your Office is started", - true); - } - - log.println("... done"); - - log.println( - "Create an instance of com.sun.star.frame.GlobalEventBroadcaster"); - - Object GlobalEventBroadcaster = null; - Object dispatcher = null; - - try { - GlobalEventBroadcaster = m_xMSF.createInstance( - "com.sun.star.frame.GlobalEventBroadcaster"); - } catch (com.sun.star.uno.Exception e) { - assure("## Exception while creating instance", false); - } - - log.println("... done"); - - log.println("check wether the created instance is valid"); - - if (GlobalEventBroadcaster == null) { - assure("couldn't create service", false); - } - - log.println("... done"); - - log.println( - "try to query the XEventBroadcaster from the gained Object"); - m_xEventBroadcaster = (XEventBroadcaster) UnoRuntime.queryInterface( - XEventBroadcaster.class, - GlobalEventBroadcaster); - - if (util.utils.isVoid(m_xEventBroadcaster)) { - assure("couldn't get XEventBroadcaster", false); - } - - log.println("... done"); - - log.println("adding Listener"); - m_xEventBroadcaster.addEventListener(m_xEventListener); - log.println("... done"); - } - - public void checkWriter() { - log.println("-- Checking Writer --"); - - WriterHelper wHelper = new WriterHelper(m_xMSF); - String[] expected; - boolean locRes = true; - log.println("opening an empty writer doc"); - notifyEvents.clear(); - xTextDoc = wHelper.openEmptyDoc(); - shortWait(); - expected = new String[] { "OnUnfocus", "OnCreate", "OnViewCreated", "OnFocus" }; - - assure("Wrong events fired when opening empty doc", - proveExpectation(expected)); - log.println("... done"); - - log.println("changing the writer doc"); - notifyEvents.clear(); - xTextDoc.getText().setString("GlobalEventBroadcaster"); - shortWait(); - expected = new String[] { "OnModifyChanged" }; - - assure("Wrong events fired when changing doc", - proveExpectation(expected)); - log.println("... done"); - - log.println("closing the empty writer doc"); - notifyEvents.clear(); - wHelper.closeDoc(xTextDoc); - shortWait(); - expected = new String[] { "OnUnfocus", "OnFocus", "OnViewClosed", "OnUnload" }; - - assure("Wrong events fired when closing empty doc", - proveExpectation(expected)); - log.println("... done"); - - log.println("opening an writer doc via Window-New Window"); - notifyEvents.clear(); - xTextDoc = wHelper.openFromDialog(".uno:NewWindow", "", false); - shortWait(); - expected = new String[] { "OnUnfocus", "OnCreate", "OnViewCreated", "OnFocus", "OnUnfocus", "OnViewCreated", "OnFocus", }; - - assure("Wrong events fired when opening an writer doc via Window-New Window", - proveExpectation(expected)); - log.println("... done"); - - log.println("closing the created writer doc"); - notifyEvents.clear(); - - wHelper.closeDoc(xTextDoc); - shortWait(); - expected = new String[] { "OnViewClosed", "OnUnfocus", "OnFocus", "OnViewClosed", "OnUnload" }; - - assure("Wrong events fired when closing Window-New Window", - proveExpectation(expected)); - - log.println("... done"); - - log.println("Opening document with label wizard"); - xTextDoc = wHelper.openFromDialog("private:factory/swriter?slot=21051", "", false); - shortWait(); - XWindow xWindow = (XWindow) UnoRuntime.queryInterface(XWindow.class, wHelper.getToolkit ().getActiveTopWindow ()); - UITools ut = new UITools(m_xMSF,xWindow); - notifyEvents.clear(); - log.println("pressing button 'New Document'"); - try{ - ut.clickButton ("New Document"); - } catch (Exception e) { - log.println("Couldn't press Button"); - } - log.println("... done"); - shortWait(); - shortWait(); - shortWait(); - expected = new String[] { "OnViewClosed", "OnCreate", "OnFocus", "OnModifyChanged" }; - - assure("Wrong events fired when starting labels wizard", - proveExpectation(expected)); - - log.println("-- Done Writer --"); - } - - public void cleanup() { - log.println("removing Listener"); - m_xEventBroadcaster.removeEventListener(m_xEventListener); - log.println("... done"); - } - - /** - * Sleeps for 0.5 sec. to allow StarOffice to react on <code> - * reset</code> call. - */ - private void shortWait() { - try { - Thread.sleep(2000); - } catch (InterruptedException e) { - log.println("While waiting :" + e); - } - } - - private boolean proveExpectation(String[] expected) { - boolean locRes = true; - boolean failure = false; - - log.println("Fired Events:"); - for (int k=0;k<notifyEvents.size();k++) { - System.out.println("\t- "+notifyEvents.get(k)); - } - - for (int i = 0; i < expected.length; i++) { - locRes = notifyEvents.contains(expected[i]); - - if (!locRes) { - log.println("The event " + expected[i] + " isn't fired"); - failure = true; - } - } - - return !failure; - } - - public class EventListenerImpl implements XEventListener { - public void disposing(com.sun.star.lang.EventObject eventObject) { - log.println("disposing: " + eventObject.Source.toString()); - } - - public void notifyEvent(com.sun.star.document.EventObject eventObject) { - notifyEvents.add(eventObject.EventName); - } - } -} diff --git a/sfx2/qa/complex/DocHelper/makefile.mk b/sfx2/qa/complex/DocHelper/makefile.mk deleted file mode 100644 index 6b6ac9191cdb..000000000000 --- a/sfx2/qa/complex/DocHelper/makefile.mk +++ /dev/null @@ -1,46 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -PRJ = ..$/..$/.. -TARGET = DocHelper -PRJNAME = $(TARGET) -PACKAGE = complex$/framework$/dochelper - -# --- Settings ----------------------------------------------------- -.INCLUDE: settings.mk - - -#----- compile .java files ----------------------------------------- - -JARFILES = ridl.jar unoil.jar jurt.jar juh.jar java_uno.jar OOoRunner.jar -JAVAFILES = DialogThread.java WriterHelper.java -JAVACLASSFILES = $(foreach,i,$(JAVAFILES) $(CLASSDIR)$/$(PACKAGE)$/$(i:b).class) - -# --- Targets ------------------------------------------------------ - -.INCLUDE : target.mk - diff --git a/sfx2/qa/complex/docinfo/DocumentProperties.java b/sfx2/qa/complex/docinfo/DocumentProperties.java deleted file mode 100644 index cff1dd341d48..000000000000 --- a/sfx2/qa/complex/docinfo/DocumentProperties.java +++ /dev/null @@ -1,269 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ -package complex.docinfo; - -import com.sun.star.beans.PropertyValue; -import com.sun.star.beans.XPropertyContainer; -import com.sun.star.beans.XPropertySet; -import com.sun.star.document.XDocumentInfo; -import com.sun.star.document.XDocumentInfoSupplier; -import com.sun.star.frame.XComponentLoader; -import com.sun.star.frame.XStorable; -import com.sun.star.lang.XComponent; -import com.sun.star.lang.XMultiServiceFactory; -import com.sun.star.text.XTextDocument; -import com.sun.star.uno.UnoRuntime; -import com.sun.star.uno.XInterface; -import com.sun.star.util.Date; - -import complexlib.ComplexTestCase; - -import util.DesktopTools; -import util.WriterTools; - - -public class DocumentProperties extends ComplexTestCase { - XMultiServiceFactory m_xMSF = null; - XTextDocument xTextDoc = null; - - public String[] getTestMethodNames() { - return new String[] {"checkDocInfo", "cleanup"}; - } - - public void checkDocInfo() { - m_xMSF = (XMultiServiceFactory) param.getMSF(); - - log.println( - "check wether there is a valid MultiServiceFactory"); - - if (m_xMSF == null) { - assure("## Couldn't get MultiServiceFactory make sure your Office is started", - true); - } - - log.println("... done"); - - log.println("Opening a Writer document"); - xTextDoc = WriterTools.createTextDoc(m_xMSF); - log.println("... done"); - - XDocumentInfoSupplier xDocInfoSup = - (XDocumentInfoSupplier) UnoRuntime.queryInterface(XDocumentInfoSupplier.class, - xTextDoc); - XDocumentInfo xDocInfo = xDocInfoSup.getDocumentInfo(); - XPropertyContainer xPropContainer = - (XPropertyContainer) UnoRuntime.queryInterface(XPropertyContainer.class, - xDocInfo); - - log.println("Trying to add a existing property"); - - boolean worked = - addProperty(xPropContainer, "Author", (short) 0, ""); - assure("Could set an existing property", !worked); - log.println("...done"); - - log.println("Trying to add a integer property"); - worked = - addProperty(xPropContainer, "intValue", com.sun.star.beans.PropertyAttribute.READONLY, - new Integer(17)); - assure("Couldn't set an integer property", worked); - log.println("...done"); - - log.println("Trying to add a double property"); - worked = - addProperty(xPropContainer, "doubleValue", com.sun.star.beans.PropertyAttribute.REMOVEABLE , - new Double(17.7)); - assure("Couldn't set an double property", worked); - log.println("...done"); - - log.println("Trying to add a boolean property"); - worked = - addProperty(xPropContainer, "booleanValue", com.sun.star.beans.PropertyAttribute.REMOVEABLE, - Boolean.TRUE); - assure("Couldn't set an boolean property", worked); - log.println("...done"); - - log.println("Trying to add a date property"); - worked = - addProperty(xPropContainer, "dateValue", com.sun.star.beans.PropertyAttribute.REMOVEABLE, - new Date()); - assure("Couldn't set an date property", worked); - log.println("...done"); - - log.println("trying to remove a read only Property"); - try { - xPropContainer.removeProperty ("intValue"); - assure("Could remove read only property", false); - } catch (Exception e) { - log.println("\tException was thrown "+e); - log.println("\t...OK"); - } - log.println("...done"); - - - String tempdir = System.getProperty("java.io.tmpdir"); - String fs = System.getProperty("file.separator"); - - if (!tempdir.endsWith(fs)) { - tempdir += fs; - } - - tempdir = util.utils.getFullURL(tempdir); - - log.println("Storing the document"); - - try { - XStorable store = - (XStorable) UnoRuntime.queryInterface(XStorable.class, - xTextDoc); - store.storeToURL(tempdir + "DocInfo.oot", - new PropertyValue[] {}); - DesktopTools.closeDoc(xTextDoc); - } catch (Exception e) { - assure("Couldn't store document", false); - } - - log.println("...done"); - - log.println("loading the document"); - - try { - XComponentLoader xCL = - (XComponentLoader) UnoRuntime.queryInterface(XComponentLoader.class, - m_xMSF.createInstance( - "com.sun.star.frame.Desktop")); - XComponent xComp = - xCL.loadComponentFromURL(tempdir + "DocInfo.oot", - "_blank", 0, new PropertyValue[] {}); - xTextDoc = - (XTextDocument) UnoRuntime.queryInterface(XTextDocument.class, - xComp); - } catch (Exception e) { - assure("Couldn't load document", false); - } - - log.println("...done"); - - xDocInfoSup = - (XDocumentInfoSupplier) UnoRuntime.queryInterface(XDocumentInfoSupplier.class, - xTextDoc); - xDocInfo = xDocInfoSup.getDocumentInfo(); - - XPropertySet xProps = - (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, - xDocInfo); - - assure("Integer doesn't work", - checkType(xProps, "intValue", "java.lang.Integer")); - assure("Double doesn't work", - checkType(xProps, "doubleValue", "java.lang.Double")); - assure("Boolean doesn't work", - checkType(xProps, "booleanValue", "java.lang.Boolean")); - assure("Date doesn't work", - checkType(xProps, "dateValue", - "com.sun.star.util.DateTime")); - - xPropContainer = - (XPropertyContainer) UnoRuntime.queryInterface(XPropertyContainer.class, - xDocInfo); - - log.println("trying to remove a not user defined Property"); - try { - xPropContainer.removeProperty ("Author"); - assure("Could remove non user defined property", false); - } catch (Exception e) { - log.println("\tException was thrown "+e); - log.println("\t...OK"); - } - log.println("...done"); - - log.println("Trying to remove a user defined property"); - try { - xPropContainer.removeProperty ("dateValue"); - log.println("\t...OK"); - } catch (Exception e) { - log.println("\tException was thrown "+e); - log.println("\t...FAILED"); - assure("Could not remove user defined property", false); - } - log.println("...done"); - - } - - public void cleanup() { - DesktopTools.closeDoc(xTextDoc); - } - - private boolean checkType(XPropertySet xProps, String aName, - String expected) { - boolean ret = true; - log.println("Checking " + expected); - - String getting = - getPropertyByName(xProps, aName).getClass().getName(); - - if (!getting.equals(expected)) { - log.println("\t Expected: " + expected); - log.println("\t Detting: " + getting); - ret = false; - } - - if (ret) { - log.println("...OK"); - } - - return ret; - } - - private Object getPropertyByName(XPropertySet xProps, String aName) { - Object ret = null; - - try { - ret = xProps.getPropertyValue(aName); - } catch (Exception e) { - log.println("\tCouldn't get Property " + aName); - log.println("\tMessage " + e); - } - - return ret; - } - - private boolean addProperty(XPropertyContainer xPropContainer, - String aName, short attr, Object defaults) { - boolean ret = true; - - try { - xPropContainer.addProperty(aName, attr, defaults); - } catch (Exception e) { - ret = false; - log.println("\tCouldn't get Property " + aName); - log.println("\tMessage " + e); - } - - return ret; - } -} diff --git a/sfx2/qa/complex/makefile.mk b/sfx2/qa/complex/makefile.mk deleted file mode 100644 index b8bc897fccf7..000000000000 --- a/sfx2/qa/complex/makefile.mk +++ /dev/null @@ -1,61 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -PRJ = ..$/.. -TARGET = CheckGlobalEventBroadcaster_writer1 -PRJNAME = $(TARGET) -PACKAGE = complex$/framework - -# --- Settings ----------------------------------------------------- -.INCLUDE: settings.mk - - -#----- compile .java files ----------------------------------------- - -JARFILES = ridl.jar unoil.jar jurt.jar juh.jar java_uno.jar OOoRunner.jar -JAVAFILES = CheckGlobalEventBroadcaster_writer1.java \ - DocumentMetaData.java \ - DocumentMetadataAccessTest.java - -JAVACLASSFILES = $(foreach,i,$(JAVAFILES) $(CLASSDIR)$/$(PACKAGE)$/$(i:b).class) - -SUBDIRS = DocHelper -#----- make a jar from compiled files ------------------------------ - -MAXLINELENGTH = 100000 - -JARCLASSDIRS = $(PACKAGE) -JARTARGET = $(TARGET).jar -JARCOMPRESS = TRUE - -# --- Targets ------------------------------------------------------ - -.INCLUDE : target.mk - - -run: - +java -cp $(CLASSPATH) org.openoffice.Runner -TestBase java_complex -sce tests.sce -tdoc $(PWD)$/testdocuments diff --git a/sfx2/qa/complex/sfx2/DocumentInfo.java b/sfx2/qa/complex/sfx2/DocumentInfo.java new file mode 100755 index 000000000000..ca7ae8b1dda0 --- /dev/null +++ b/sfx2/qa/complex/sfx2/DocumentInfo.java @@ -0,0 +1,362 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ +package complex.sfx2; + +import com.sun.star.beans.PropertyAttribute; +import com.sun.star.beans.Property; +import com.sun.star.beans.PropertyValue; +import com.sun.star.beans.XPropertyContainer; +import com.sun.star.beans.XPropertySet; +import com.sun.star.beans.XPropertySetInfo; +import com.sun.star.document.XDocumentInfo; +import com.sun.star.document.XDocumentInfoSupplier; +import com.sun.star.frame.XComponentLoader; +import com.sun.star.frame.XStorable; +import com.sun.star.lang.XComponent; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.text.XTextDocument; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.util.Date; + + + +import util.DesktopTools; +import util.WriterTools; + +import org.junit.After; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; +import org.openoffice.test.OfficeConnection; +import static org.junit.Assert.*; + +public class DocumentInfo +{ + XMultiServiceFactory m_xMSF = null; + XTextDocument xTextDoc = null; + XTextDocument xTextDocSecond = null; + + @Test public void checkDocInfo() + { + m_xMSF = getMSF(); + + System.out.println("check wether there is a valid MultiServiceFactory"); + + assertNotNull("## Couldn't get MultiServiceFactory make sure your Office is started", m_xMSF); + + // TODO: need other temp directory! + String tempdir = System.getProperty("java.io.tmpdir"); + String fs = System.getProperty("file.separator"); + + if (!tempdir.endsWith(fs)) + { + tempdir += fs; + } + tempdir = util.utils.getFullURL(tempdir); + final String sTempDocument = tempdir + "DocInfo.oot"; + + if (true) + { + System.out.println("... done"); + + + System.out.println("Opening a Writer document"); + xTextDoc = WriterTools.createTextDoc(m_xMSF); + System.out.println("... done"); + + XDocumentInfoSupplier xDocInfoSup = UnoRuntime.queryInterface(XDocumentInfoSupplier.class, xTextDoc); + XDocumentInfo xDocInfo = xDocInfoSup.getDocumentInfo(); + XPropertyContainer xPropContainer = UnoRuntime.queryInterface(XPropertyContainer.class, xDocInfo); + + System.out.println("Trying to add a existing property"); + + boolean worked = addProperty(xPropContainer, "Author", (short) 0, ""); + assertTrue("Could set an existing property", !worked); + System.out.println("...done"); + + System.out.println("Trying to add a integer property"); + worked = addProperty(xPropContainer, "intValue", com.sun.star.beans.PropertyAttribute.READONLY, new Integer(17)); + assertTrue("Couldn't set an integer property", worked); + System.out.println("...done"); + + System.out.println("Trying to add a double property"); + worked = addProperty(xPropContainer, "doubleValue", com.sun.star.beans.PropertyAttribute.REMOVEABLE, new Double(17.7)); + assertTrue("Couldn't set an double property", worked); + System.out.println("...done"); + + System.out.println("Trying to add a boolean property"); + worked = addProperty(xPropContainer, "booleanValue", com.sun.star.beans.PropertyAttribute.REMOVEABLE, Boolean.TRUE); + assertTrue("Couldn't set an boolean property", worked); + System.out.println("...done"); + + System.out.println("Trying to add a date property"); + worked = addProperty(xPropContainer, "dateValue", com.sun.star.beans.PropertyAttribute.REMOVEABLE, new Date()); + assertTrue("Couldn't set an date property", worked); + System.out.println("...done"); + + System.out.println("trying to remove a read only Property"); + try + { + xPropContainer.removeProperty("intValue"); + fail("Could remove read only property"); + } + catch (Exception e) + { + System.out.println("\tException was thrown " + e); + System.out.println("\t...OK"); + } + System.out.println("...done"); + + XPropertySet xProps2 = UnoRuntime.queryInterface(XPropertySet.class, xPropContainer); + showPropertySet(xProps2); + + + System.out.println("Storing the document"); + try + { + XStorable store = UnoRuntime.queryInterface(XStorable.class, xTextDoc); + store.storeToURL(sTempDocument, new PropertyValue[] {}); + DesktopTools.closeDoc(xTextDoc); + } + catch (Exception e) + { + fail("Couldn't store document"); + } + + System.out.println("...done"); + } + + + if (true) + { + System.out.println("loading the document"); + + try + { + XComponentLoader xCL = UnoRuntime.queryInterface(XComponentLoader.class, m_xMSF.createInstance("com.sun.star.frame.Desktop")); + XComponent xComp = xCL.loadComponentFromURL(sTempDocument, "_blank", 0, new PropertyValue[] {}); + xTextDocSecond = UnoRuntime.queryInterface(XTextDocument.class, xComp); + } + catch (Exception e) + { + fail("Couldn't load document"); + } + + System.out.println("...done"); + + XDocumentInfoSupplier xDocInfoSup = UnoRuntime.queryInterface(XDocumentInfoSupplier.class, xTextDocSecond); + XDocumentInfo xDocInfo = xDocInfoSup.getDocumentInfo(); + XPropertyContainer xPropContainer = UnoRuntime.queryInterface(XPropertyContainer.class, xDocInfo); + + XPropertySet xProps = UnoRuntime.queryInterface(XPropertySet.class, xDocInfo); + showPropertySet(xProps); + + assertTrue("Double doesn't work", checkType(xProps, "doubleValue", "java.lang.Double")); + assertTrue("Boolean doesn't work", checkType(xProps, "booleanValue", "java.lang.Boolean")); + + // TODO: dateValue does not exist. + // assertTrue("Date doesn't work", checkType(xProps, "dateValue", "com.sun.star.util.DateTime")); + + // TODO: is java.lang.Double + // assertTrue("Integer doesn't work", checkType(xProps, "intValue", "java.lang.Integer")); + + xPropContainer = UnoRuntime.queryInterface(XPropertyContainer.class, xDocInfo); + + System.out.println("trying to remove a not user defined Property"); + try + { + xPropContainer.removeProperty("Author"); + fail("Could remove non user defined property"); + } + catch (Exception e) + { + System.out.println("\tException was thrown " + e); + System.out.println("\t...OK"); + } + System.out.println("...done"); + + + System.out.println("Trying to remove a user defined property"); + try + { + xPropContainer.removeProperty("booleanValue"); + System.out.println("\t...OK"); + } + catch (Exception e) + { + System.out.println("\tException was thrown " + e); + System.out.println("\t...FAILED"); + fail("Could not remove user defined property"); + } + showPropertySet(xProps); + System.out.println("...done"); + } + } + + @After public void cleanup() + { + DesktopTools.closeDoc(xTextDocSecond); + DesktopTools.closeDoc(xTextDoc); + } + + private void showPropertySet(XPropertySet xProps) + { + try + { + // get an XPropertySet, here the one of a text cursor + // XPropertySet xCursorProps = (XPropertySet)UnoRuntime.queryInterface(XPropertySet.class, mxDocCursor); + + // get the property info interface of this XPropertySet + XPropertySetInfo xPropsInfo = xProps.getPropertySetInfo(); + + // get all properties (NOT the values) from XPropertySetInfo + Property[] aProps = xPropsInfo.getProperties(); + int i; + for (i = 0; i < aProps.length; ++i) { + // number of property within this info object + System.out.print("Property #" + i); + + // name of property + System.out.print(": Name<" + aProps[i].Name); + + // handle of property (only for XFastPropertySet) + System.out.print("> Handle<" + aProps[i].Handle); + + // type of property + System.out.print("> " + aProps[i].Type.toString()); + + // attributes (flags) + System.out.print(" Attributes<"); + short nAttribs = aProps[i].Attributes; + if ((nAttribs & PropertyAttribute.MAYBEVOID) != 0) + System.out.print("MAYBEVOID|"); + if ((nAttribs & PropertyAttribute.BOUND) != 0) + System.out.print("BOUND|"); + if ((nAttribs & PropertyAttribute.CONSTRAINED) != 0) + System.out.print("CONSTRAINED|"); + if ((nAttribs & PropertyAttribute.READONLY) != 0) + System.out.print("READONLY|"); + if ((nAttribs & PropertyAttribute.TRANSIENT) != 0) + System.out.print("TRANSIENT|"); + if ((nAttribs & PropertyAttribute.MAYBEAMBIGUOUS ) != 0) + System.out.print("MAYBEAMBIGUOUS|"); + if ((nAttribs & PropertyAttribute.MAYBEDEFAULT) != 0) + System.out.print("MAYBEDEFAULT|"); + if ((nAttribs & PropertyAttribute.REMOVEABLE) != 0) + System.out.print("REMOVEABLE|"); + System.out.println("0>"); + } + } catch (Exception e) { + // If anything goes wrong, give the user a stack trace + e.printStackTrace(System.out); + } + } + + private boolean checkType(XPropertySet xProps, String aName, + String expected) + { + boolean ret = true; + System.out.println("Checking " + expected); + + String getting = + getPropertyByName(xProps, aName).getClass().getName(); + + if (!getting.equals(expected)) + { + System.out.println("\t Expected: " + expected); + System.out.println("\t Getting: " + getting); + ret = false; + } + + if (ret) + { + System.out.println("...OK"); + } + return ret; + } + + private Object getPropertyByName(XPropertySet xProps, String aName) + { + Object ret = null; + + try + { + ret = xProps.getPropertyValue(aName); + } + catch (Exception e) + { + System.out.println("\tCouldn't get Property " + aName); + System.out.println("\tMessage " + e); + } + + return ret; + } + + private boolean addProperty(XPropertyContainer xPropContainer, + String aName, short attr, Object defaults) + { + boolean ret = true; + + try + { + xPropContainer.addProperty(aName, attr, defaults); + } + catch (Exception e) + { + ret = false; + System.out.println("\tCouldn't get Property " + aName); + System.out.println("\tMessage " + e); + } + + return ret; + } + + 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( "------------------------------------------------------------" ); + System.out.println( "starting class: " + DocumentInfo.class.getName() ); + System.out.println( "------------------------------------------------------------" ); + connection.setUp(); + } + + @AfterClass public static void tearDownConnection() + throws InterruptedException, com.sun.star.uno.Exception + { + System.out.println( "------------------------------------------------------------" ); + System.out.println( "finishing class: " + DocumentInfo.class.getName() ); + System.out.println( "------------------------------------------------------------" ); + connection.tearDown(); + } + private static final OfficeConnection connection = new OfficeConnection(); +} diff --git a/sfx2/qa/complex/DocumentMetadataAccessTest.java b/sfx2/qa/complex/sfx2/DocumentMetadataAccess.java index a61280c45fe5..d145b9028473 100644..100755 --- a/sfx2/qa/complex/DocumentMetadataAccessTest.java +++ b/sfx2/qa/complex/sfx2/DocumentMetadataAccess.java @@ -25,38 +25,60 @@ * ************************************************************************/ -package complex.framework; +package complex.sfx2; -import complexlib.ComplexTestCase; +// import complexlib.ComplexTestCase; +import com.sun.star.beans.Pair; +import com.sun.star.rdf.Literal; +import com.sun.star.rdf.XLiteral; +import com.sun.star.rdf.XNamedGraph; +import com.sun.star.rdf.BlankNode; +import com.sun.star.rdf.XQuerySelectResult; +import com.sun.star.rdf.XNode; +import com.sun.star.rdf.XDocumentRepository; +import com.sun.star.rdf.XMetadatable; +import com.sun.star.rdf.Statement; +import com.sun.star.rdf.FileFormat; +import com.sun.star.rdf.URIs; +import com.sun.star.rdf.URI; +import com.sun.star.rdf.XDocumentMetadataAccess; +import com.sun.star.rdf.XRepositorySupplier; +import com.sun.star.rdf.XRepository; +import com.sun.star.rdf.XBlankNode; +import com.sun.star.rdf.XURI; import helper.StreamSimulator; import com.sun.star.uno.UnoRuntime; import com.sun.star.uno.XComponentContext; -import com.sun.star.uno.Any; import com.sun.star.lang.XMultiServiceFactory; import com.sun.star.lang.XComponent; -import com.sun.star.lang.XInitialization; + import com.sun.star.lang.XServiceInfo; import com.sun.star.lang.IllegalArgumentException; import com.sun.star.lang.WrappedTargetException; import com.sun.star.lang.WrappedTargetRuntimeException; import com.sun.star.beans.XPropertySet; import com.sun.star.beans.PropertyValue; -import com.sun.star.beans.Pair; import com.sun.star.beans.StringPair; import com.sun.star.container.XEnumerationAccess; import com.sun.star.container.XEnumeration; -import com.sun.star.container.ElementExistException; -import com.sun.star.container.NoSuchElementException; import com.sun.star.io.XInputStream; -import com.sun.star.io.XOutputStream; import com.sun.star.util.XCloseable; import com.sun.star.frame.XStorable; -import com.sun.star.frame.XLoadable; import com.sun.star.text.XTextDocument; import com.sun.star.text.XTextRange; import com.sun.star.text.XText; -import com.sun.star.rdf.*; +import complex.sfx2.tools.TestDocument; +import lib.TestParameters; + + +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.*; /** * Test case for interface com.sun.star.rdf.XDocumentMetadataAccess @@ -68,7 +90,7 @@ import com.sun.star.rdf.*; * * @author mst */ -public class DocumentMetadataAccessTest extends ComplexTestCase +public class DocumentMetadataAccess { XMultiServiceFactory xMSF; XComponentContext xContext; @@ -105,72 +127,77 @@ public class DocumentMetadataAccessTest extends ComplexTestCase XRepositorySupplier xRS; XDocumentMetadataAccess xDMA; - public String[] getTestMethodNames () - { - return new String[] { "check", "checkRDFa" }; - } +// public String[] getTestMethodNames () +// { +// return new String[] { "check", "checkRDFa" }; +// } + /** + * The test parameters + */ + private static TestParameters param = null; - public void before() + @Before public void before() { try { - xMSF = (XMultiServiceFactory) param.getMSF(); - assure("could not create MultiServiceFactory.", xMSF != null); - XPropertySet xPropertySet = (XPropertySet) - UnoRuntime.queryInterface(XPropertySet.class, xMSF); + xMSF = getMSF(); + param = new TestParameters(); + param.put("ServiceFactory", xMSF); // important for param.getMSF() + + assertNotNull("could not create MultiServiceFactory.", xMSF); + XPropertySet xPropertySet = UnoRuntime.queryInterface(XPropertySet.class, xMSF); Object defaultCtx = xPropertySet.getPropertyValue("DefaultContext"); - xContext = (XComponentContext) - UnoRuntime.queryInterface(XComponentContext.class, defaultCtx); - assure("could not get component context.", xContext != null); + xContext = UnoRuntime.queryInterface(XComponentContext.class, defaultCtx); + assertNotNull("could not get component context.", xContext); tempDir = util.utils.getOfficeTemp/*Dir*/(xMSF); - log.println("tempdir: " + tempDir); + System.out.println("tempdir: " + tempDir); foo = URI.create(xContext, "uri:foo"); - assure("foo", null != foo); + assertNotNull("foo", foo); bar = URI.create(xContext, "uri:bar"); - assure("bar", null != bar); + assertNotNull("bar", bar); baz = URI.create(xContext, "uri:baz"); - assure("baz", null != baz); + assertNotNull("baz", baz); blank1 = BlankNode.create(xContext, "_:1"); - assure("blank1", null != blank1); + assertNotNull("blank1", blank1); blank2 = BlankNode.create(xContext, "_:2"); - assure("blank2", null != blank2); + assertNotNull("blank2", blank2); blank3 = BlankNode.create(xContext, "_:3"); - assure("blank3", null != blank3); + assertNotNull("blank3", blank3); blank4 = BlankNode.create(xContext, "_:4"); - assure("blank4", null != blank4); + assertNotNull("blank4", blank4); rdf_type = URI.createKnown(xContext, URIs.RDF_TYPE); - assure("rdf_type", null != rdf_type); + assertNotNull("rdf_type", rdf_type); rdfs_label = URI.createKnown(xContext, URIs.RDFS_LABEL); - assure("rdfs_label", null != rdfs_label); + assertNotNull("rdfs_label", rdfs_label); pkg_Document = URI.createKnown(xContext, URIs.PKG_DOCUMENT); - assure("pkg_Document", null != pkg_Document); + assertNotNull("pkg_Document", pkg_Document); pkg_hasPart = URI.createKnown(xContext, URIs.PKG_HASPART); - assure("pkg_hasPart", null != pkg_hasPart); + assertNotNull("pkg_hasPart", pkg_hasPart); pkg_MetadataFile = URI.createKnown(xContext, URIs.PKG_METADATAFILE); - assure("pkg_MetadataFile", null != pkg_MetadataFile); + assertNotNull("pkg_MetadataFile", pkg_MetadataFile); odf_ContentFile = URI.createKnown(xContext, URIs.ODF_CONTENTFILE); - assure("odf_ContentFile", null != odf_ContentFile); + assertNotNull("odf_ContentFile", odf_ContentFile); odf_StylesFile = URI.createKnown(xContext, URIs.ODF_STYLESFILE); - assure("odf_StylesFile", null != odf_StylesFile); + assertNotNull("odf_StylesFile", odf_StylesFile); odf_Element = URI.createKnown(xContext, URIs.ODF_ELEMENT); - assure("odf_Element", null != odf_Element); + assertNotNull("odf_Element", odf_Element); } catch (Exception e) { report(e); } } - public void after() + @After public void after() { xRep = null; xRS = null; xDMA = null; } - public void check() + @Test public void check() { XComponent xComp = null; XComponent xComp2 = null; @@ -178,7 +205,7 @@ public class DocumentMetadataAccessTest extends ComplexTestCase XEnumeration xStmtsEnum; XNamedGraph xManifest; - log.println("Creating document with Repository..."); + System.out.println("Creating document with Repository..."); // we cannot create a XDMA directly, we must create // a document and get it from there :( @@ -186,248 +213,241 @@ public class DocumentMetadataAccessTest extends ComplexTestCase PropertyValue[] loadProps = new PropertyValue[1]; loadProps[0] = new PropertyValue(); loadProps[0].Name = "Hidden"; - loadProps[0].Value = new Boolean(true); + loadProps[0].Value = true; xComp = util.DesktopTools.openNewDoc(xMSF, "swriter", loadProps); - XTextDocument xText = (XTextDocument) UnoRuntime.queryInterface( - XTextDocument.class, xComp); + XTextDocument xText = UnoRuntime.queryInterface(XTextDocument.class, xComp); - XRepositorySupplier xRS = (XRepositorySupplier) - UnoRuntime.queryInterface(XRepositorySupplier.class, xComp); - assure("xRS null", null != xRS); - XDocumentMetadataAccess xDMA = (XDocumentMetadataAccess) - UnoRuntime.queryInterface(XDocumentMetadataAccess.class, xRS); - assure("xDMA null", null != xDMA); - xRep = xRS.getRDFRepository(); - assure("xRep null", null != xRep); + XRepositorySupplier xRepoSupplier = UnoRuntime.queryInterface(XRepositorySupplier.class, xComp); + assertNotNull("xRS null", xRepoSupplier); + XDocumentMetadataAccess xDocMDAccess = UnoRuntime.queryInterface(XDocumentMetadataAccess.class, xRepoSupplier); + assertNotNull("xDMA null", xDocMDAccess); + xRep = xRepoSupplier.getRDFRepository(); + assertNotNull("xRep null", xRep); - log.println("...done"); + System.out.println("...done"); - log.println("Checking that new repository is initialized..."); + System.out.println("Checking that new repository is initialized..."); - XURI xBaseURI = (XURI) xDMA; + XURI xBaseURI = (XURI) xDocMDAccess; String baseURI = xBaseURI.getStringValue(); - assure("new: baseURI", - null != xBaseURI && !xBaseURI.getStringValue().equals("")); + assertNotNull("new: baseURI", xBaseURI ); + assertTrue("new: baseURI", !xBaseURI.getStringValue().equals("")); - assure("new: # graphs", 1 == xRep.getGraphNames().length); + assertTrue("new: # graphs", 1 == xRep.getGraphNames().length); XURI manifest = URI.createNS(xContext, xBaseURI.getStringValue(), manifestPath); xManifest = xRep.getGraph(manifest); - assure("new: manifest graph", null != xManifest); + assertTrue("new: manifest graph", null != xManifest); Statement[] manifestStmts = getManifestStmts(xBaseURI); xStmtsEnum = xRep.getStatements(null, null, null); - assure("new: manifest graph", eq(xStmtsEnum, manifestStmts)); + assertTrue("new: manifest graph", eq(xStmtsEnum, manifestStmts)); - log.println("...done"); + System.out.println("...done"); - log.println("Checking some invalid args..."); + System.out.println("Checking some invalid args..."); String content = "behold, for i am the content."; XTextRange xTR = new TestRange(content); XMetadatable xM = (XMetadatable) xTR; try { - xDMA.getElementByURI(null); - assure("getElementByURI: null allowed", false); + xDocMDAccess.getElementByURI(null); + fail("getElementByURI: null allowed"); } catch (IllegalArgumentException e) { // ignore } try { - xDMA.getMetadataGraphsWithType(null); - assure("getMetadataGraphsWithType: null URI allowed", false); + xDocMDAccess.getMetadataGraphsWithType(null); + fail("getMetadataGraphsWithType: null URI allowed"); } catch (IllegalArgumentException e) { // ignore } try { - xDMA.addMetadataFile("", new XURI[0]); - assure("addMetadataFile: empty filename allowed", false); + xDocMDAccess.addMetadataFile("", new XURI[0]); + fail("addMetadataFile: empty filename allowed"); } catch (IllegalArgumentException e) { // ignore } try { - xDMA.addMetadataFile("/foo", new XURI[0]); - assure("addMetadataFile: absolute filename allowed", false); + xDocMDAccess.addMetadataFile("/foo", new XURI[0]); + fail("addMetadataFile: absolute filename allowed"); } catch (IllegalArgumentException e) { // ignore } try { - xDMA.addMetadataFile("fo\"o", new XURI[0]); - assure("addMetadataFile: invalid filename allowed", false); + xDocMDAccess.addMetadataFile("fo\"o", new XURI[0]); + fail("addMetadataFile: invalid filename allowed"); } catch (IllegalArgumentException e) { // ignore } try { - xDMA.addMetadataFile("../foo", new XURI[0]); - assure("addMetadataFile: filename with .. allowed", false); + xDocMDAccess.addMetadataFile("../foo", new XURI[0]); + fail("addMetadataFile: filename with .. allowed"); } catch (IllegalArgumentException e) { // ignore } try { - xDMA.addMetadataFile("foo/../../bar", new XURI[0]); - assure("addMetadataFile: filename with nest .. allowed", false); + xDocMDAccess.addMetadataFile("foo/../../bar", new XURI[0]); + fail("addMetadataFile: filename with nest .. allowed"); } catch (IllegalArgumentException e) { // ignore } try { - xDMA.addMetadataFile("foo/././bar", new XURI[0]); - assure("addMetadataFile: filename with nest . allowed", false); + xDocMDAccess.addMetadataFile("foo/././bar", new XURI[0]); + fail("addMetadataFile: filename with nest . allowed"); } catch (IllegalArgumentException e) { // ignore } try { - xDMA.addMetadataFile("content.xml", new XURI[0]); - assure("addMetadataFile: content.xml allowed", false); + xDocMDAccess.addMetadataFile("content.xml", new XURI[0]); + fail("addMetadataFile: content.xml allowed"); } catch (IllegalArgumentException e) { // ignore } try { - xDMA.addMetadataFile("styles.xml", new XURI[0]); - assure("addMetadataFile: styles.xml allowed", false); + xDocMDAccess.addMetadataFile("styles.xml", new XURI[0]); + fail("addMetadataFile: styles.xml allowed"); } catch (IllegalArgumentException e) { // ignore } try { - xDMA.addMetadataFile("meta.xml", new XURI[0]); - assure("addMetadataFile: meta.xml allowed", false); + xDocMDAccess.addMetadataFile("meta.xml", new XURI[0]); + fail("addMetadataFile: meta.xml allowed"); } catch (IllegalArgumentException e) { // ignore } try { - xDMA.addMetadataFile("settings.xml", new XURI[0]); - assure("addMetadataFile: settings.xml allowed", false); + xDocMDAccess.addMetadataFile("settings.xml", new XURI[0]); + fail("addMetadataFile: settings.xml allowed"); } catch (IllegalArgumentException e) { // ignore } try { - xDMA.importMetadataFile(FileFormat.RDF_XML, null, "foo", + xDocMDAccess.importMetadataFile(FileFormat.RDF_XML, null, "foo", foo, new XURI[0]); - assure("importMetadataFile: null stream allowed", false); + fail("importMetadataFile: null stream allowed"); } catch (IllegalArgumentException e) { // ignore } + + final String sEmptyRDF = TestDocument.getUrl("empty.rdf"); try { - XInputStream xFooIn = - new StreamSimulator(tempDir + "empty.rdf", true, param); - xDMA.importMetadataFile(FileFormat.RDF_XML, xFooIn, "", + XInputStream xFooIn = new StreamSimulator(sEmptyRDF, true, param); + xDocMDAccess.importMetadataFile(FileFormat.RDF_XML, xFooIn, "", foo, new XURI[0]); - assure("importMetadataFile: empty filename allowed", false); + fail("importMetadataFile: empty filename allowed"); } catch (IllegalArgumentException e) { // ignore } try { XInputStream xFooIn = - new StreamSimulator(tempDir + "empty.rdf", true, param); - xDMA.importMetadataFile(FileFormat.RDF_XML, xFooIn, "meta.xml", + new StreamSimulator(sEmptyRDF, true, param); + xDocMDAccess.importMetadataFile(FileFormat.RDF_XML, xFooIn, "meta.xml", foo, new XURI[0]); - assure("importMetadataFile: meta.xml filename allowed", false); + fail("importMetadataFile: meta.xml filename allowed"); } catch (IllegalArgumentException e) { // ignore } try { XInputStream xFooIn = - new StreamSimulator(tempDir + "empty.rdf", true, param); - xDMA.importMetadataFile(FileFormat.RDF_XML, + new StreamSimulator(sEmptyRDF, true, param); + xDocMDAccess.importMetadataFile(FileFormat.RDF_XML, xFooIn, "foo", null, new XURI[0]); - assure("importMetadataFile: null base URI allowed", false); + fail("importMetadataFile: null base URI allowed"); } catch (IllegalArgumentException e) { // ignore } try { XInputStream xFooIn = - new StreamSimulator(tempDir + "empty.rdf", true, param); - xDMA.importMetadataFile(FileFormat.RDF_XML, + new StreamSimulator(sEmptyRDF, true, param); + xDocMDAccess.importMetadataFile(FileFormat.RDF_XML, xFooIn, "foo", rdf_type, new XURI[0]); - assure("importMetadataFile: non-absolute base URI allowed", - false); + fail("importMetadataFile: non-absolute base URI allowed"); } catch (IllegalArgumentException e) { // ignore } try { - xDMA.removeMetadataFile(null); - assure("removeMetadataFile: null URI allowed", false); + xDocMDAccess.removeMetadataFile(null); + fail("removeMetadataFile: null URI allowed"); } catch (IllegalArgumentException e) { // ignore } try { - xDMA.addContentOrStylesFile(""); - assure("addContentOrStylesFile: empty filename allowed", - false); + xDocMDAccess.addContentOrStylesFile(""); + fail("addContentOrStylesFile: empty filename allowed"); } catch (IllegalArgumentException e) { // ignore } try { - xDMA.addContentOrStylesFile("/content.xml"); - assure("addContentOrStylesFile: absolute filename allowed", - false); + xDocMDAccess.addContentOrStylesFile("/content.xml"); + fail("addContentOrStylesFile: absolute filename allowed"); } catch (IllegalArgumentException e) { // ignore } try { - xDMA.addContentOrStylesFile("foo.rdf"); - assure("addContentOrStylesFile: invalid filename allowed", - false); + xDocMDAccess.addContentOrStylesFile("foo.rdf"); + fail("addContentOrStylesFile: invalid filename allowed"); } catch (IllegalArgumentException e) { // ignore } try { - xDMA.removeContentOrStylesFile(""); - assure("removeContentOrStylesFile: empty filename allowed", - false); + xDocMDAccess.removeContentOrStylesFile(""); + fail("removeContentOrStylesFile: empty filename allowed"); } catch (IllegalArgumentException e) { // ignore } try { - xDMA.loadMetadataFromStorage(null, foo, null); - assure("loadMetadataFromStorage: null storage allowed", false); + xDocMDAccess.loadMetadataFromStorage(null, foo, null); + fail("loadMetadataFromStorage: null storage allowed"); } catch (IllegalArgumentException e) { // ignore } try { - xDMA.storeMetadataToStorage(null/*, base*/); - assure("storeMetadataToStorage: null storage allowed", false); + xDocMDAccess.storeMetadataToStorage(null/*, base*/); + fail("storeMetadataToStorage: null storage allowed"); } catch (IllegalArgumentException e) { // ignore } try { - xDMA.loadMetadataFromMedium(new PropertyValue[0]); - assure("loadMetadataFromMedium: empty medium allowed", false); + xDocMDAccess.loadMetadataFromMedium(new PropertyValue[0]); + fail("loadMetadataFromMedium: empty medium allowed"); } catch (IllegalArgumentException e) { // ignore } try { - xDMA.storeMetadataToMedium(new PropertyValue[0]); - assure("storeMetadataToMedium: empty medium allowed", false); + xDocMDAccess.storeMetadataToMedium(new PropertyValue[0]); + fail("storeMetadataToMedium: empty medium allowed"); } catch (IllegalArgumentException e) { // ignore } - log.println("...done"); + System.out.println("...done"); - log.println("Checking file addition/removal..."); + System.out.println("Checking file addition/removal..."); - xDMA.removeContentOrStylesFile(contentPath); + xDocMDAccess.removeContentOrStylesFile(contentPath); xStmtsEnum = xManifest.getStatements(null, null, null); - assure("removeContentOrStylesFile (content)", + assertTrue("removeContentOrStylesFile (content)", eq(xStmtsEnum, new Statement[] { manifestStmts[0], manifestStmts[2], manifestStmts[4] })); - xDMA.addContentOrStylesFile(contentPath); + xDocMDAccess.addContentOrStylesFile(contentPath); xStmtsEnum = xManifest.getStatements(null, null, null); - assure("addContentOrStylesFile (content)", + assertTrue("addContentOrStylesFile (content)", eq(xStmtsEnum, manifestStmts)); - xDMA.removeContentOrStylesFile(stylesPath); + xDocMDAccess.removeContentOrStylesFile(stylesPath); xStmtsEnum = xManifest.getStatements(null, null, null); - assure("removeContentOrStylesFile (styles)", + assertTrue("removeContentOrStylesFile (styles)", eq(xStmtsEnum, new Statement[] { manifestStmts[0], manifestStmts[1], manifestStmts[3] })); - xDMA.addContentOrStylesFile(stylesPath); + xDocMDAccess.addContentOrStylesFile(stylesPath); xStmtsEnum = xManifest.getStatements(null, null, null); - assure("addContentOrStylesFile (styles)", + assertTrue("addContentOrStylesFile (styles)", eq(xStmtsEnum, manifestStmts)); XURI xFoo = URI.createNS(xContext, xBaseURI.getStringValue(), @@ -438,70 +458,67 @@ public class DocumentMetadataAccessTest extends ComplexTestCase new Statement(xFoo, rdf_type, pkg_MetadataFile, manifest); Statement xM_FooTypeBar = new Statement(xFoo, rdf_type, bar, manifest); - xDMA.addMetadataFile(fooPath, new XURI[] { bar }); + xDocMDAccess.addMetadataFile(fooPath, new XURI[] { bar }); xStmtsEnum = xManifest.getStatements(null, null, null); - assure("addMetadataFile", + assertTrue("addMetadataFile", eq(xStmtsEnum, merge(manifestStmts, new Statement[] { xM_BaseHaspartFoo, xM_FooTypeMetadata, xM_FooTypeBar }))); - XURI[] graphsBar = xDMA.getMetadataGraphsWithType(bar); - assure("getMetadataGraphsWithType", + XURI[] graphsBar = xDocMDAccess.getMetadataGraphsWithType(bar); + assertTrue("getMetadataGraphsWithType", graphsBar.length == 1 && eq(graphsBar[0], xFoo)); - xDMA.removeMetadataFile(xFoo); + xDocMDAccess.removeMetadataFile(xFoo); xStmtsEnum = xManifest.getStatements(null, null, null); - assure("removeMetadataFile", + assertTrue("removeMetadataFile", eq(xStmtsEnum, manifestStmts)); - log.println("...done"); + System.out.println("...done"); - log.println("Checking mapping..."); + System.out.println("Checking mapping..."); - XEnumerationAccess xTextEnum = (XEnumerationAccess) - UnoRuntime.queryInterface(XEnumerationAccess.class, - xText.getText()); + XEnumerationAccess xTextEnum = UnoRuntime.queryInterface(XEnumerationAccess.class, xText.getText()); Object o = xTextEnum.createEnumeration().nextElement(); - XMetadatable xMeta1 = (XMetadatable) UnoRuntime.queryInterface( - XMetadatable.class, o); + XMetadatable xMeta1 = UnoRuntime.queryInterface(XMetadatable.class, o); XURI uri; XMetadatable xMeta; - xMeta = xDMA.getElementByURI(xMeta1); - assure("getElementByURI: null", null != xMeta); + xMeta = xDocMDAccess.getElementByURI(xMeta1); + assertTrue("getElementByURI: null", null != xMeta); String XmlId = xMeta.getMetadataReference().Second; String XmlId1 = xMeta1.getMetadataReference().Second; - assure("getElementByURI: no xml id", !XmlId.equals("")); - assure("getElementByURI: different xml id", XmlId.equals(XmlId1)); + assertTrue("getElementByURI: no xml id", !XmlId.equals("")); + assertTrue("getElementByURI: different xml id", XmlId.equals(XmlId1)); - log.println("...done"); + System.out.println("...done"); - log.println("Checking storing and loading..."); + System.out.println("Checking storing and loading..."); XURI xFoobar = URI.createNS(xContext, xBaseURI.getStringValue(), fooBarPath); Statement[] metadataStmts = getMetadataFileStmts(xBaseURI, fooBarPath); - xDMA.addMetadataFile(fooBarPath, new XURI[0]); + xDocMDAccess.addMetadataFile(fooBarPath, new XURI[0]); xStmtsEnum = xRep.getStatements(null, null, null); - assure("addMetadataFile", + assertTrue("addMetadataFile", eq(xStmtsEnum, merge(manifestStmts, metadataStmts ))); Statement xFoobar_FooBarFoo = new Statement(foo, bar, foo, xFoobar); xRep.getGraph(xFoobar).addStatement(foo, bar, foo); xStmtsEnum = xRep.getStatements(null, null, null); - assure("addStatement", + assertTrue("addStatement", eq(xStmtsEnum, merge(manifestStmts, merge(metadataStmts, new Statement[] { xFoobar_FooBarFoo })))); PropertyValue noMDNoContentFile = new PropertyValue(); noMDNoContentFile.Name = "URL"; - noMDNoContentFile.Value = util.utils.getFullTestURL("CUSTOM.odt"); + noMDNoContentFile.Value = TestDocument.getUrl("CUSTOM.odt"); PropertyValue noMDFile = new PropertyValue(); noMDFile.Name = "URL"; - noMDFile.Value = util.utils.getFullTestURL("TEST.odt"); + noMDFile.Value = TestDocument.getUrl("TEST.odt"); PropertyValue file = new PropertyValue(); file.Name = "URL"; file.Value = tempDir + "TESTDMA.odt"; @@ -520,76 +537,72 @@ public class DocumentMetadataAccessTest extends ComplexTestCase xStmtsEnum = xRep.getStatements(null, null, null); XURI[] graphs = xRep.getGraphNames(); - xDMA.storeMetadataToMedium(args); + xDocMDAccess.storeMetadataToMedium(args); // this should re-init - xDMA.loadMetadataFromMedium(argsEmptyNoContent); - xRep = xRS.getRDFRepository(); - assure("xRep null", null != xRep); - assure("baseURI still tdoc?", - !baseURI.equals(xDMA.getStringValue())); - Statement[] manifestStmts2 = getManifestStmts((XURI) xDMA); + xDocMDAccess.loadMetadataFromMedium(argsEmptyNoContent); + xRep = xRepoSupplier.getRDFRepository(); + assertTrue("xRep null", null != xRep); + assertTrue("baseURI still tdoc?", + !baseURI.equals(xDocMDAccess.getStringValue())); + Statement[] manifestStmts2 = getManifestStmts((XURI) xDocMDAccess); xStmtsEnum = xRep.getStatements(null, null, null); // there is no content or styles file in here, so we have just // the package stmt - assure("loadMetadataFromMedium (no metadata, no content)", + assertTrue("loadMetadataFromMedium (no metadata, no content)", eq(xStmtsEnum, new Statement[] { manifestStmts2[0] })); // this should re-init - xDMA.loadMetadataFromMedium(argsEmpty); - xRep = xRS.getRDFRepository(); - assure("xRep null", null != xRep); - assure("baseURI still tdoc?", - !baseURI.equals(xDMA.getStringValue())); - Statement[] manifestStmts3 = getManifestStmts((XURI) xDMA); + xDocMDAccess.loadMetadataFromMedium(argsEmpty); + xRep = xRepoSupplier.getRDFRepository(); + assertTrue("xRep null", null != xRep); + assertTrue("baseURI still tdoc?", + !baseURI.equals(xDocMDAccess.getStringValue())); + Statement[] manifestStmts3 = getManifestStmts((XURI) xDocMDAccess); xStmtsEnum = xRep.getStatements(null, null, null); - assure("loadMetadataFromMedium (no metadata)", + assertTrue("loadMetadataFromMedium (no metadata)", eq(xStmtsEnum, manifestStmts3)); - xDMA.loadMetadataFromMedium(args); - xRep = xRS.getRDFRepository(); - assure("xRep null", null != xRep); - Statement[] manifestStmts4 = getManifestStmts((XURI) xDMA); - Statement[] metadataStmts4 = getMetadataFileStmts((XURI) xDMA, + xDocMDAccess.loadMetadataFromMedium(args); + xRep = xRepoSupplier.getRDFRepository(); + assertTrue("xRep null", null != xRep); + Statement[] manifestStmts4 = getManifestStmts((XURI) xDocMDAccess); + Statement[] metadataStmts4 = getMetadataFileStmts((XURI) xDocMDAccess, fooBarPath); xStmtsEnum = xRep.getStatements(null, null, null); - assure("some graph(s) not reloaded", + assertTrue("some graph(s) not reloaded", graphs.length == xRep.getGraphNames().length); - XURI xFoobar4 = URI.createNS(xContext, xDMA.getStringValue(), + XURI xFoobar4 = URI.createNS(xContext, xDocMDAccess.getStringValue(), fooBarPath); Statement xFoobar_FooBarFoo4 = new Statement(foo, bar, foo, xFoobar4); - assure("loadMetadataFromMedium (re-load)", + assertTrue("loadMetadataFromMedium (re-load)", eq(xStmtsEnum, merge(manifestStmts4, merge(metadataStmts4, new Statement[] { xFoobar_FooBarFoo4 })))); - log.println("...done"); + System.out.println("...done"); - log.println("Checking storing and loading via model..."); + System.out.println("Checking storing and loading via model..."); String f = tempDir + "TESTPARA.odt"; - XStorable xStor = (XStorable) UnoRuntime.queryInterface( - XStorable.class, xRS); + XStorable xStor = UnoRuntime.queryInterface(XStorable.class, xRepoSupplier); xStor.storeToURL(f, new PropertyValue[0]); xComp2 = util.DesktopTools.loadDoc(xMSF, f, loadProps); - XDocumentMetadataAccess xDMA2 = (XDocumentMetadataAccess) - UnoRuntime.queryInterface(XDocumentMetadataAccess.class, - xComp2); - assure("xDMA2 null", null != xDMA2); + XDocumentMetadataAccess xDMA2 = UnoRuntime.queryInterface(XDocumentMetadataAccess.class, xComp2); + assertTrue("xDMA2 null", null != xDMA2); - XRepositorySupplier xRS2 = (XRepositorySupplier) - UnoRuntime.queryInterface(XRepositorySupplier.class, xComp2); - assure("xRS2 null", null != xRS2); + XRepositorySupplier xRS2 = UnoRuntime.queryInterface(XRepositorySupplier.class, xComp2); + assertTrue("xRS2 null", null != xRS2); XRepository xRep2 = xRS2.getRDFRepository(); - assure("xRep2 null", null != xRep2); + assertTrue("xRep2 null", null != xRep2); Statement[] manifestStmts5 = getManifestStmts((XURI) xDMA2); Statement[] metadataStmts5 = getMetadataFileStmts((XURI) xDMA2, @@ -600,11 +613,11 @@ public class DocumentMetadataAccessTest extends ComplexTestCase new Statement(foo, bar, foo, xFoobar5); xStmtsEnum = xRep.getStatements(null, null, null); XEnumeration xStmtsEnum2 = xRep2.getStatements(null, null, null); - assure("load: repository differs", + assertTrue("load: repository differs", eq(xStmtsEnum2, merge(manifestStmts5, merge(metadataStmts5, new Statement[] { xFoobar_FooBarFoo5 })))); - log.println("...done"); + System.out.println("...done"); } catch (Exception e) { report(e); @@ -614,99 +627,91 @@ public class DocumentMetadataAccessTest extends ComplexTestCase } } - public void checkRDFa() + @Test public void checkRDFa() { XComponent xComp = null; - String file; try { - file = util.utils.getFullTestURL("TESTRDFA.odt"); + final String file = TestDocument.getUrl("TESTRDFA.odt"); xComp = loadRDFa(file); if (xComp != null) { - file = tempDir + "TESTRDFA.odt"; - storeRDFa(xComp, file); + final String sNewFile = tempDir + "TESTRDFA.odt"; + storeRDFa(xComp, sNewFile); close(xComp); - xComp = loadRDFa(file); + + xComp = loadRDFa(sNewFile); } } finally { close(xComp); } } - public void storeRDFa(XComponent xComp, String file) + private void storeRDFa(XComponent xComp, String file) { try { - log.println("Storing test document..."); + System.out.println("Storing test document..."); - XStorable xStor = (XStorable) UnoRuntime.queryInterface( - XStorable.class, xComp); + XStorable xStor = UnoRuntime.queryInterface(XStorable.class, xComp); xStor.storeToURL(file, new PropertyValue[0]); - log.println("...done"); + System.out.println("...done"); } catch (Exception e) { report(e); } } - public XComponent loadRDFa(String file) + private XComponent loadRDFa(String file) { XComponent xComp = null; try { - log.println("Loading test document..."); + System.out.println("Loading test document..."); PropertyValue[] loadProps = new PropertyValue[1]; loadProps[0] = new PropertyValue(); loadProps[0].Name = "Hidden"; - loadProps[0].Value = new Boolean(true); + loadProps[0].Value = true; xComp = util.DesktopTools.loadDoc(xMSF, file, loadProps); - XRepositorySupplier xRS = (XRepositorySupplier) - UnoRuntime.queryInterface(XRepositorySupplier.class, xComp); - assure("xRS null", null != xRS); + XRepositorySupplier xRepoSupplier = UnoRuntime.queryInterface(XRepositorySupplier.class, xComp); + assertTrue("xRS null", null != xRepoSupplier); - XDocumentRepository xRep = (XDocumentRepository) - UnoRuntime.queryInterface(XDocumentRepository.class, - xRS.getRDFRepository()); - assure("xRep null", null != xRep); + XDocumentRepository xDocRepository = UnoRuntime.queryInterface(XDocumentRepository.class, xRepoSupplier.getRDFRepository()); + assertTrue("xRep null", null != xDocRepository); - XTextDocument xTextDoc = (XTextDocument) - UnoRuntime.queryInterface(XTextDocument.class, xComp); + XTextDocument xTextDoc = UnoRuntime.queryInterface(XTextDocument.class, xComp); XText xText = xTextDoc.getText(); - XEnumerationAccess xEA = (XEnumerationAccess) - UnoRuntime.queryInterface(XEnumerationAccess.class, xText); + XEnumerationAccess xEA = UnoRuntime.queryInterface(XEnumerationAccess.class, xText); XEnumeration xEnum = xEA.createEnumeration(); - log.println("...done"); + System.out.println("...done"); - log.println("Checking RDFa in loaded test document..."); + System.out.println("Checking RDFa in loaded test document..."); XMetadatable xPara; Pair<Statement[], Boolean> result; Statement x_FooBarLit1 = new Statement(foo, bar, mkLit("1"), null); - xPara = (XMetadatable) UnoRuntime.queryInterface( - XMetadatable.class, xEnum.nextElement()); - result = xRep.getStatementRDFa(xPara); - assure("RDFa: 1", + xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); + result = xDocRepository.getStatementRDFa(xPara); + assertTrue("RDFa: 1", !result.Second && eq(result.First, new Statement[] { x_FooBarLit1 })); Statement x_FooBarLit2 = new Statement(foo, bar, mkLit("2"), null); - xPara = (XMetadatable) UnoRuntime.queryInterface( - XMetadatable.class, xEnum.nextElement()); - result = xRep.getStatementRDFa(xPara); - assure("RDFa: 2", + xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); + result = xDocRepository.getStatementRDFa(xPara); + assertTrue("RDFa: 2", !result.Second && eq(result.First, new Statement[] { x_FooBarLit2 @@ -714,54 +719,47 @@ public class DocumentMetadataAccessTest extends ComplexTestCase Statement x_BlankBarLit3 = new Statement(blank1, bar, mkLit("3"), null); - xPara = (XMetadatable) UnoRuntime.queryInterface( - XMetadatable.class, xEnum.nextElement()); - result = xRep.getStatementRDFa(xPara); - assure("RDFa: 3", + xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); + result = xDocRepository.getStatementRDFa(xPara); + assertTrue("RDFa: 3", !result.Second && eq(result.First, new Statement[] { x_BlankBarLit3 })); - XBlankNode b3 = (XBlankNode) UnoRuntime.queryInterface( - XBlankNode.class, result.First[0].Subject); + XBlankNode b3 = UnoRuntime.queryInterface(XBlankNode.class, result.First[0].Subject); Statement x_BlankBarLit4 = new Statement(blank2, bar, mkLit("4"), null); - xPara = (XMetadatable) UnoRuntime.queryInterface( - XMetadatable.class, xEnum.nextElement()); - result = xRep.getStatementRDFa(xPara); - assure("RDFa: 4", + xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); + result = xDocRepository.getStatementRDFa(xPara); + assertTrue("RDFa: 4", !result.Second && eq(result.First, new Statement[] { x_BlankBarLit4 })); - XBlankNode b4 = (XBlankNode) UnoRuntime.queryInterface( - XBlankNode.class, result.First[0].Subject); + XBlankNode b4 = UnoRuntime.queryInterface(XBlankNode.class, result.First[0].Subject); Statement x_BlankBarLit5 = new Statement(blank1, bar, mkLit("5"), null); - xPara = (XMetadatable) UnoRuntime.queryInterface( - XMetadatable.class, xEnum.nextElement()); - result = xRep.getStatementRDFa(xPara); - assure("RDFa: 5", + xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); + result = xDocRepository.getStatementRDFa(xPara); + assertTrue("RDFa: 5", !result.Second && eq(result.First, new Statement[] { x_BlankBarLit5 })); - XBlankNode b5 = (XBlankNode) UnoRuntime.queryInterface( - XBlankNode.class, result.First[0].Subject); + XBlankNode b5 = UnoRuntime.queryInterface(XBlankNode.class, result.First[0].Subject); - assure("RDFa: 3 != 4", + assertTrue("RDFa: 3 != 4", !b3.getStringValue().equals(b4.getStringValue())); - assure("RDFa: 3 == 5", + assertTrue("RDFa: 3 == 5", b3.getStringValue().equals(b5.getStringValue())); Statement x_FooBarLit6 = new Statement(foo, bar, mkLit("6"), null); Statement x_FooBazLit6 = new Statement(foo, baz, mkLit("6"), null); - xPara = (XMetadatable) UnoRuntime.queryInterface( - XMetadatable.class, xEnum.nextElement()); - result = xRep.getStatementRDFa(xPara); - assure("RDFa: 6", + xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); + result = xDocRepository.getStatementRDFa(xPara); + assertTrue("RDFa: 6", !result.Second && eq(result.First, new Statement[] { x_FooBarLit6, x_FooBazLit6 @@ -770,10 +768,9 @@ public class DocumentMetadataAccessTest extends ComplexTestCase Statement x_FooBarLit7 = new Statement(foo, bar, mkLit("7"), null); Statement x_FooBazLit7 = new Statement(foo, baz, mkLit("7"), null); Statement x_FooFooLit7 = new Statement(foo, foo, mkLit("7"), null); - xPara = (XMetadatable) UnoRuntime.queryInterface( - XMetadatable.class, xEnum.nextElement()); - result = xRep.getStatementRDFa(xPara); - assure("RDFa: 7", + xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); + result = xDocRepository.getStatementRDFa(xPara); + assertTrue("RDFa: 7", !result.Second && eq(result.First, new Statement[] { x_FooBarLit7, x_FooBazLit7, x_FooFooLit7 @@ -784,28 +781,25 @@ public class DocumentMetadataAccessTest extends ComplexTestCase Statement x_FooBarLit = new Statement(foo, bar, lit, null); Statement x_FooBarLittype = new Statement(foo, bar, lit_type, null); - xPara = (XMetadatable) UnoRuntime.queryInterface( - XMetadatable.class, xEnum.nextElement()); - result = xRep.getStatementRDFa(xPara); - assure("RDFa: 8", + xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); + result = xDocRepository.getStatementRDFa(xPara); + assertTrue("RDFa: 8", result.Second && eq(result.First, new Statement[] { x_FooBarLit })); - xPara = (XMetadatable) UnoRuntime.queryInterface( - XMetadatable.class, xEnum.nextElement()); - result = xRep.getStatementRDFa(xPara); - assure("RDFa: 9", + xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); + result = xDocRepository.getStatementRDFa(xPara); + assertTrue("RDFa: 9", result.Second && eq(result.First, new Statement[] { x_FooBarLit })); - xPara = (XMetadatable) UnoRuntime.queryInterface( - XMetadatable.class, xEnum.nextElement()); - result = xRep.getStatementRDFa(xPara); - assure("RDFa: 10", + xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); + result = xDocRepository.getStatementRDFa(xPara); + assertTrue("RDFa: 10", result.Second && eq(result.First, new Statement[] { x_FooBarLittype @@ -813,10 +807,9 @@ public class DocumentMetadataAccessTest extends ComplexTestCase Statement x_FooBarLit11 = new Statement(foo, bar, mkLit("11", bar), null); - xPara = (XMetadatable) UnoRuntime.queryInterface( - XMetadatable.class, xEnum.nextElement()); - result = xRep.getStatementRDFa(xPara); - assure("RDFa: 11", + xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); + result = xDocRepository.getStatementRDFa(xPara); + assertTrue("RDFa: 11", !result.Second && eq(result.First, new Statement[] { x_FooBarLit11 @@ -825,19 +818,17 @@ public class DocumentMetadataAccessTest extends ComplexTestCase XURI xFile = URI.createNS(xContext, file, "/" + contentPath); Statement x_FileBarLit12 = new Statement(xFile, bar, mkLit("12"), null); - xPara = (XMetadatable) UnoRuntime.queryInterface( - XMetadatable.class, xEnum.nextElement()); - result = xRep.getStatementRDFa(xPara); - assure("RDFa: 12", + xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); + result = xDocRepository.getStatementRDFa(xPara); + assertTrue("RDFa: 12", !result.Second && eq(result.First, new Statement[] { x_FileBarLit12 })); - xPara = (XMetadatable) UnoRuntime.queryInterface( - XMetadatable.class, xEnum.nextElement()); - result = xRep.getStatementRDFa(xPara); - assure("RDFa: 13", + xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); + result = xDocRepository.getStatementRDFa(xPara); + assertTrue("RDFa: 13", result.Second && eq(result.First, new Statement[] { x_FooBarLit @@ -845,51 +836,45 @@ public class DocumentMetadataAccessTest extends ComplexTestCase Statement x_FooLabelLit14 = new Statement(foo, rdfs_label, mkLit("14"), null); - xPara = (XMetadatable) UnoRuntime.queryInterface( - XMetadatable.class, xEnum.nextElement()); - result = xRep.getStatementRDFa(xPara); - assure("RDFa: 14", + xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); + result = xDocRepository.getStatementRDFa(xPara); + assertTrue("RDFa: 14", result.Second && eq(result.First, new Statement[] { - x_FooBarLit + /* x_FooLabelLit14 */ x_FooBarLit })); - xPara = (XMetadatable) UnoRuntime.queryInterface( - XMetadatable.class, xEnum.nextElement()); - result = xRep.getStatementRDFa(xPara); - assure("RDFa: 15", eq(result.First, new Statement[] { } )); + xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); + result = xDocRepository.getStatementRDFa(xPara); + assertTrue("RDFa: 15", eq(result.First, new Statement[] { } )); - xPara = (XMetadatable) UnoRuntime.queryInterface( - XMetadatable.class, xEnum.nextElement()); - result = xRep.getStatementRDFa(xPara); - assure("RDFa: 16", eq(result.First, new Statement[] { } )); + xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); + result = xDocRepository.getStatementRDFa(xPara); + assertTrue("RDFa: 16", eq(result.First, new Statement[] { } )); - xPara = (XMetadatable) UnoRuntime.queryInterface( - XMetadatable.class, xEnum.nextElement()); - result = xRep.getStatementRDFa(xPara); - assure("RDFa: 17", eq(result.First, new Statement[] { } )); + xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); + result = xDocRepository.getStatementRDFa(xPara); + assertTrue("RDFa: 17", eq(result.First, new Statement[] { } )); - xPara = (XMetadatable) UnoRuntime.queryInterface( - XMetadatable.class, xEnum.nextElement()); - result = xRep.getStatementRDFa(xPara); - assure("RDFa: 18", eq(result.First, new Statement[] { } )); + xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); + result = xDocRepository.getStatementRDFa(xPara); + assertTrue("RDFa: 18", eq(result.First, new Statement[] { } )); - xPara = (XMetadatable) UnoRuntime.queryInterface( - XMetadatable.class, xEnum.nextElement()); - result = xRep.getStatementRDFa(xPara); - assure("RDFa: 19", eq(result.First, new Statement[] { } )); + xPara = UnoRuntime.queryInterface(XMetadatable.class, xEnum.nextElement()); + result = xDocRepository.getStatementRDFa(xPara); + assertTrue("RDFa: 19", eq(result.First, new Statement[] { } )); - xPara = (XMetadatable) UnoRuntime.queryInterface( + xPara = UnoRuntime.queryInterface( XMetadatable.class, xEnum.nextElement()); - result = xRep.getStatementRDFa(xPara); - assure("RDFa: 20", eq(result.First, new Statement[] { } )); + result = xDocRepository.getStatementRDFa(xPara); + assertTrue("RDFa: 20", eq(result.First, new Statement[] { } )); - xPara = (XMetadatable) UnoRuntime.queryInterface( + xPara = UnoRuntime.queryInterface( XMetadatable.class, xEnum.nextElement()); - result = xRep.getStatementRDFa(xPara); - assure("RDFa: 21", eq(result.First, new Statement[] { } )); + result = xDocRepository.getStatementRDFa(xPara); + assertTrue("RDFa: 21", eq(result.First, new Statement[] { } )); - log.println("...done"); + System.out.println("...done"); } catch (Exception e) { report(e); @@ -905,33 +890,35 @@ public class DocumentMetadataAccessTest extends ComplexTestCase { if (e instanceof WrappedTargetException) { - log.println("Cause:"); + System.out.println("Cause:"); Exception cause = (Exception) (((WrappedTargetException)e).TargetException); - log.println(cause.toString()); + System.out.println(cause.toString()); report2(cause); } else if (e instanceof WrappedTargetRuntimeException) { - log.println("Cause:"); + System.out.println("Cause:"); Exception cause = (Exception) (((WrappedTargetRuntimeException)e).TargetException); - log.println(cause.toString()); + System.out.println(cause.toString()); report2(cause); } } public void report(Exception e) { - log.println("Exception occurred:"); - e.printStackTrace((java.io.PrintWriter) log); + System.out.println("Exception occurred:"); + e.printStackTrace(System.out); report2(e); - failed(); + fail(); } static void close(XComponent i_comp) { try { - XCloseable xClos = (XCloseable) UnoRuntime.queryInterface( - XCloseable.class, i_comp); - if (xClos != null) xClos.close(true); + XCloseable xClos = UnoRuntime.queryInterface(XCloseable.class, i_comp); + if (xClos != null) + { + xClos.close(true); + } } catch (Exception e) { } } @@ -960,14 +947,16 @@ public class DocumentMetadataAccessTest extends ComplexTestCase } public static String toS(XNode n) { - if (null == n) return "< null >"; + if (null == n) + { + return "< null >"; + } return n.getStringValue(); } static boolean isBlank(XNode i_node) { - XBlankNode blank = (XBlankNode) UnoRuntime.queryInterface( - XBlankNode.class, i_node); + XBlankNode blank = UnoRuntime.queryInterface(XBlankNode.class, i_node); return blank != null; } @@ -1000,7 +989,7 @@ public class DocumentMetadataAccessTest extends ComplexTestCase java.util.Collection c = new java.util.Vector(); while (i_Enum.hasMoreElements()) { Statement s = (Statement) i_Enum.nextElement(); -//log.println("toSeq: " + s.getSubject().getStringValue() + " " + s.getPredicate().getStringValue() + " " + s.getObject().getStringValue() + "."); +//System.out.println("toSeq: " + s.getSubject().getStringValue() + " " + s.getPredicate().getStringValue() + " " + s.getObject().getStringValue() + "."); c.add(s); } // return (Statement[]) c.toArray(); @@ -1035,11 +1024,17 @@ public class DocumentMetadataAccessTest extends ComplexTestCase { XNode[] left = (XNode[]) i_Left; XNode[] right = (XNode[]) i_Right; - if (left.length != right.length) throw new RuntimeException(); + if (left.length != right.length) + { + throw new RuntimeException(); + } for (int i = 0; i < left.length; ++i) { int eq = (left[i].getStringValue().compareTo( right[i].getStringValue())); - if (eq != 0) return eq; + if (eq != 0) + { + return eq; + } } return 0; } @@ -1078,23 +1073,23 @@ public class DocumentMetadataAccessTest extends ComplexTestCase XURI lG = i_Left.Graph; XURI rG = i_Right.Graph; if (!eq(lG, rG)) { - log.println("Graphs differ: " + toS(lG) + " != " + toS(rG)); + System.out.println("Graphs differ: " + toS(lG) + " != " + toS(rG)); return false; } if (!eq(i_Left.Subject, i_Right.Subject)) { - log.println("Subjects differ: " + + System.out.println("Subjects differ: " + i_Left.Subject.getStringValue() + " != " + i_Right.Subject.getStringValue()); return false; } if (!eq(i_Left.Predicate, i_Right.Predicate)) { - log.println("Predicates differ: " + + System.out.println("Predicates differ: " + i_Left.Predicate.getStringValue() + " != " + i_Right.Predicate.getStringValue()); return false; } if (!eq(i_Left.Object, i_Right.Object)) { - log.println("Objects differ: " + + System.out.println("Objects differ: " + i_Left.Object.getStringValue() + " != " + i_Right.Object.getStringValue()); return false; @@ -1105,7 +1100,7 @@ public class DocumentMetadataAccessTest extends ComplexTestCase static boolean eq(Statement[] i_Result, Statement[] i_Expected) { if (i_Result.length != i_Expected.length) { - log.println("eq: different lengths: " + i_Result.length + " " + + System.out.println("eq: different lengths: " + i_Result.length + " " + i_Expected.length); return false; } @@ -1113,8 +1108,13 @@ public class DocumentMetadataAccessTest extends ComplexTestCase java.util.Arrays.asList(i_Expected).toArray(); java.util.Arrays.sort(i_Result, new StmtComp()); java.util.Arrays.sort(expected, new StmtComp()); - for (int i = 0; i < expected.length; ++i) { - if (!eq(i_Result[i], expected[i])) return false; + for (int i = 0; i < expected.length; ++i) + { + // This is better for debug! + final Statement a = i_Result[i]; + final Statement b = expected[i]; + final boolean cond = eq(a, b); + if (!cond) return false; } return true; } @@ -1141,15 +1141,15 @@ public class DocumentMetadataAccessTest extends ComplexTestCase static boolean eq(XQuerySelectResult i_Result, String[] i_Vars, XNode[][] i_Bindings) throws Exception { - String[] vars = (String[]) i_Result.getBindingNames(); + String[] vars = i_Result.getBindingNames(); XEnumeration iter = (XEnumeration) i_Result; XNode[][] bindings = toSeqs(iter); if (vars.length != i_Vars.length) { - log.println("var lengths differ"); + System.out.println("var lengths differ"); return false; } if (bindings.length != i_Bindings.length) { - log.println("binding lengths differ: " + i_Bindings.length + + System.out.println("binding lengths differ: " + i_Bindings.length + " vs " + bindings.length ); return false; } @@ -1157,16 +1157,16 @@ public class DocumentMetadataAccessTest extends ComplexTestCase java.util.Arrays.sort(i_Bindings, new BindingComp()); for (int i = 0; i < i_Bindings.length; ++i) { if (i_Bindings[i].length != i_Vars.length) { - log.println("TEST ERROR!"); + System.out.println("TEST ERROR!"); throw new Exception(); } if (bindings[i].length != i_Vars.length) { - log.println("binding length and var length differ"); + System.out.println("binding length and var length differ"); return false; } for (int j = 0; j < i_Vars.length; ++j) { if (!eq(bindings[i][j], i_Bindings[i][j])) { - log.println("bindings differ: " + + System.out.println("bindings differ: " + toS(bindings[i][j]) + " != " + toS(i_Bindings[i][j])); return false; } @@ -1174,7 +1174,7 @@ public class DocumentMetadataAccessTest extends ComplexTestCase } for (int i = 0; i < i_Vars.length; ++i) { if (!vars[i].equals(i_Vars[i])) { - log.println("variable names differ: " + + System.out.println("variable names differ: " + vars[i] + " != " + i_Vars[i]); return false; } @@ -1253,17 +1253,27 @@ public class DocumentMetadataAccessTest extends ComplexTestCase public String getLocalName() { return ""; } public StringPair getMetadataReference() - { return new StringPair(m_Stream, m_XmlId); } + { + return new StringPair(m_Stream, m_XmlId); + } public void setMetadataReference(StringPair i_Ref) throws IllegalArgumentException - { m_Stream = (String)i_Ref.First; m_XmlId = (String)i_Ref.Second; } + { + m_Stream = i_Ref.First; + m_XmlId = i_Ref.Second; + } public void ensureMetadataReference() - { m_Stream = "content.xml"; m_XmlId = "42"; } + { + m_Stream = "content.xml"; + m_XmlId = "42"; + } public String getImplementationName() { return null; } public String[] getSupportedServiceNames() { return null; } public boolean supportsService(String i_Svc) - { return i_Svc.equals("com.sun.star.text.Paragraph"); } + { + return i_Svc.equals("com.sun.star.text.Paragraph"); + } public XText getText() { return null; } public XTextRange getStart() { return null; } @@ -1271,5 +1281,33 @@ public class DocumentMetadataAccessTest extends ComplexTestCase public String getString() { return m_Text; } public void setString(String i_Str) { m_Text = i_Str; } } + + + + 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( "------------------------------------------------------------" ); + System.out.println( "starting class: " + DocumentMetadataAccess.class.getName() ); + System.out.println( "------------------------------------------------------------" ); + connection.setUp(); + } + + @AfterClass public static void tearDownConnection() + throws InterruptedException, com.sun.star.uno.Exception + { + System.out.println( "------------------------------------------------------------" ); + System.out.println( "finishing class: " + DocumentMetadataAccess.class.getName() ); + System.out.println( "------------------------------------------------------------" ); + connection.tearDown(); + } + + private static final OfficeConnection connection = new OfficeConnection(); + } diff --git a/sfx2/qa/complex/DocumentMetaData.java b/sfx2/qa/complex/sfx2/DocumentProperties.java index ae7970227c75..01ccaa21619b 100644..100755 --- a/sfx2/qa/complex/DocumentMetaData.java +++ b/sfx2/qa/complex/sfx2/DocumentProperties.java @@ -25,16 +25,14 @@ * ************************************************************************/ -package complex.framework; +package complex.sfx2; -import complexlib.ComplexTestCase; -import helper.StreamSimulator; +import complex.sfx2.tools.TestDocument; import com.sun.star.uno.UnoRuntime; import com.sun.star.uno.XComponentContext; -import com.sun.star.uno.Any; import com.sun.star.lang.XInitialization; -import com.sun.star.lang.XSingleServiceFactory; + import com.sun.star.lang.XMultiServiceFactory; import com.sun.star.lang.Locale; import com.sun.star.lang.EventObject; @@ -51,10 +49,15 @@ import com.sun.star.beans.NamedValue; import com.sun.star.beans.PropertyAttribute; import com.sun.star.beans.UnknownPropertyException; import com.sun.star.beans.IllegalTypeException; -import com.sun.star.embed.XStorage; -import com.sun.star.io.XInputStream; + import com.sun.star.document.XDocumentProperties; +import org.junit.After; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; +import org.openoffice.test.OfficeConnection; +import static org.junit.Assert.*; /** * Test case for the service com.sun.star.document.DocumentProperties. @@ -63,13 +66,9 @@ import com.sun.star.document.XDocumentProperties; * * @author mst */ -public class DocumentMetaData extends ComplexTestCase +public class DocumentProperties { - public String[] getTestMethodNames () { - return new String[] { "check", "cleanup" }; - } - - public void cleanup() { + @After public void cleanup() { // nothing to do } @@ -77,7 +76,7 @@ public class DocumentMetaData extends ComplexTestCase class Listener implements XModifyListener { private boolean m_Called; - public Listener() { + Listener() { m_Called = false; } @@ -95,19 +94,18 @@ public class DocumentMetaData extends ComplexTestCase } } - public void check() { + @Test public void check() { try { - XMultiServiceFactory xMSF = (XMultiServiceFactory) param.getMSF(); - assure("could not create MultiServiceFactory.", xMSF != null); - XPropertySet xPropertySet = (XPropertySet) - UnoRuntime.queryInterface(XPropertySet.class, xMSF); + XMultiServiceFactory xMSF = getMSF(); + assertNotNull("could not create MultiServiceFactory.", xMSF); + XPropertySet xPropertySet = UnoRuntime.queryInterface(XPropertySet.class, xMSF); Object defaultCtx = xPropertySet.getPropertyValue("DefaultContext"); - XComponentContext xContext = (XComponentContext) - UnoRuntime.queryInterface(XComponentContext.class, defaultCtx); - assure("could not get component context.", xContext != null); + XComponentContext xContext = UnoRuntime.queryInterface(XComponentContext.class, defaultCtx); + assertNotNull("could not get component context.", xContext); + // TODO: Path to temp String temp = util.utils.getOfficeTemp/*Dir*/(xMSF); - log.println("tempdir: " + temp); + System.out.println("tempdir: " + temp); PropertyValue[] noArgs = { }; PropertyValue mimetype = new PropertyValue(); @@ -120,61 +118,56 @@ public class DocumentMetaData extends ComplexTestCase cfile.Value = temp + "EMPTY.odt"; PropertyValue[] mimeEmptyArgs = { mimetype, cfile }; - log.println("Creating service DocumentProperties..."); + System.out.println("Creating service DocumentProperties..."); Object oDP = // xMSF.createInstanceWithContext( // "com.sun.star.document.DocumentProperties", xContext); xMSF.createInstance("com.sun.star.document.DocumentProperties"); - XDocumentProperties xDP = (XDocumentProperties) - UnoRuntime.queryInterface(XDocumentProperties.class, oDP); + XDocumentProperties xDP = UnoRuntime.queryInterface(XDocumentProperties.class, oDP); - log.println("...done"); + System.out.println("...done"); - log.println("Checking initialize ..."); + System.out.println("Checking initialize ..."); - XDocumentProperties xDP2 = (XDocumentProperties) - UnoRuntime.queryInterface(XDocumentProperties.class, - xMSF.createInstance( - "com.sun.star.document.DocumentProperties")); - XInitialization xInit = (XInitialization) - UnoRuntime.queryInterface(XInitialization.class, xDP2); + XDocumentProperties xDP2 = UnoRuntime.queryInterface(XDocumentProperties.class, xMSF.createInstance("com.sun.star.document.DocumentProperties")); + XInitialization xInit = UnoRuntime.queryInterface(XInitialization.class, xDP2); xInit.initialize(new Object[] { }); - log.println("...done"); + System.out.println("...done"); - log.println("Checking storing default-initialized meta data ..."); + System.out.println("Checking storing default-initialized meta data ..."); // xDP2.storeToMedium(temp + "EMPTY.odt", mimeArgs); xDP2.storeToMedium("", mimeEmptyArgs); - log.println("...done"); + System.out.println("...done"); - log.println("Checking loading default-initialized meta data ..."); + System.out.println("Checking loading default-initialized meta data ..."); // xDP2.loadFromMedium(temp + "EMPTY.odt", noArgs); xDP2.loadFromMedium("", mimeEmptyArgs); - assure ("Author", "".equals(xDP2.getAuthor())); + assertTrue ("Author", "".equals(xDP2.getAuthor())); - log.println("...done"); + System.out.println("...done"); - log.println("(Not) Checking preservation of custom meta data ..."); + System.out.println("(Not) Checking preservation of custom meta data ..."); - xDP2.loadFromMedium(util.utils.getFullTestURL("CUSTOM.odt"), + xDP2.loadFromMedium(TestDocument.getUrl("CUSTOM.odt"), noArgs); - assure ("Author", "".equals(xDP2.getAuthor())); + assertTrue ("Author", "".equals(xDP2.getAuthor())); xDP2.storeToMedium(temp + "CUSTOM.odt", mimeArgs); //FIXME: now what? comparing for binary equality seems useless // we could unzip the written file and grep for the custom stuff // but would that work on windows... - log.println("...done"); + System.out.println("...done"); - log.println("Checking loading from test document..."); + System.out.println("Checking loading from test document..."); - String file = util.utils.getFullTestURL("TEST.odt"); + String file = TestDocument.getUrl("TEST.odt"); xDP.loadFromMedium(file, noArgs); /* XInputStream xStream = new StreamSimulator("./testdocuments/TEST.odt", true, param); @@ -188,68 +181,67 @@ public class DocumentMetaData extends ComplexTestCase XStorage.class, oStor); xDP.loadFromStorage(xStor);*/ - log.println("...done"); + System.out.println("...done"); - log.println("Checking meta-data import..."); + System.out.println("Checking meta-data import..."); - assure ("Author", "Karl-Heinz Mustermann".equals(xDP.getAuthor())); - assure ("Generator", + assertTrue("Author", "Karl-Heinz Mustermann".equals(xDP.getAuthor())); + assertTrue("Generator", "StarOffice/8$Solaris_x86 OpenOffice.org_project/680m232$Build-9227" .equals(xDP.getGenerator())); - assure ("CreationDate", 2007 == xDP.getCreationDate().Year); - assure ("Title", "Urgent Memo".equals(xDP.getTitle())); - assure ("Subject", "Wichtige Mitteilung".equals(xDP.getSubject())); - assure ("Description", + assertTrue("CreationDate", 2007 == xDP.getCreationDate().Year); + assertTrue("Title", "Urgent Memo".equals(xDP.getTitle())); + assertTrue("Subject", "Wichtige Mitteilung".equals(xDP.getSubject())); + assertTrue("Description", "Modern internal company memorandum in full-blocked style" .equals(xDP.getDescription())); -// assure ("Language", "".equals(xDP.getLanguage())); - assure ("ModifiedBy", +// assertTrue("Language", "".equals(xDP.getLanguage())); + assertTrue("ModifiedBy", "Karl-Heinz Mustermann".equals(xDP.getModifiedBy())); - assure ("ModificationDate", 10 == xDP.getModificationDate().Month); - assure ("PrintedBy", + assertTrue("ModificationDate", 10 == xDP.getModificationDate().Month); + assertTrue("PrintedBy", "Karl-Heinz Mustermann".equals(xDP.getPrintedBy())); - assure ("PrintDate", 29 == xDP.getPrintDate().Day); - assure ("TemplateName", + assertTrue("PrintDate", 29 == xDP.getPrintDate().Day); + assertTrue("TemplateName", "Modern Memo".equals(xDP.getTemplateName())); - assure ("TemplateURL", + assertTrue("TemplateURL", xDP.getTemplateURL().endsWith("memmodern.ott")); - assure ("TemplateDate", 17 == xDP.getTemplateDate().Hours); - assure ("AutoloadURL", "../TEST.odt".equals(xDP.getAutoloadURL())); - assure ("AutoloadSecs", 0 == xDP.getAutoloadSecs()); - assure ("DefaultTarget", "_blank".equals(xDP.getDefaultTarget())); - assure ("EditingCycles", 3 == xDP.getEditingCycles()); - assure ("EditingDuration", 320 == xDP.getEditingDuration()); + assertTrue("TemplateDate", 17 == xDP.getTemplateDate().Hours); + assertTrue("AutoloadURL", "../TEST.odt".equals(xDP.getAutoloadURL())); + assertTrue("AutoloadSecs", 0 == xDP.getAutoloadSecs()); + assertTrue("DefaultTarget", "_blank".equals(xDP.getDefaultTarget())); + assertTrue("EditingCycles", 3 == xDP.getEditingCycles()); + assertTrue("EditingDuration", 320 == xDP.getEditingDuration()); String[] kws = xDP.getKeywords(); - assure ("Keywords", fromArray(kws).containsAll( + assertTrue("Keywords", fromArray(kws).containsAll( fromArray(new Object[] { "Asien", "Memo", "Reis" }))); NamedValue[] ds = xDP.getDocumentStatistics(); /* for (int i = 0; i < ds.length; ++i) { - log.println("nv: " + ds[i].Name + " " + ds[i].Value); + System.out.println("nv: " + ds[i].Name + " " + ds[i].Value); } NamedValue nv1 = new NamedValue("WordCount", new Integer(23)); NamedValue nv2 = new NamedValue("WordCount", new Integer(23)); - log.println("eq: " + nv1.equals(nv2)); // grrr, this is false... + System.out.println("eq: " + nv1.equals(nv2)); // grrr, this is false... */ - assure ("DocumentStatistics:WordCount", containsNV(ds, + assertTrue("DocumentStatistics:WordCount", containsNV(ds, new NamedValue("WordCount", new Integer(23)))); - assure ("DocumentStatistics:PageCount", containsNV(ds, + assertTrue("DocumentStatistics:PageCount", containsNV(ds, new NamedValue("PageCount", new Integer(1)))); XPropertyContainer udpc = xDP.getUserDefinedProperties(); - XPropertySet udps = (XPropertySet) UnoRuntime.queryInterface( - XPropertySet.class, udpc); - assure ("UserDefined 1", "Dies ist ein wichtiger Hinweis" + XPropertySet udps = UnoRuntime.queryInterface( XPropertySet.class, udpc ); + assertTrue("UserDefined 1", "Dies ist ein wichtiger Hinweis" .equals(udps.getPropertyValue("Hinweis"))); - assure ("UserDefined 2", ("Kann Spuren von N" + assertTrue("UserDefined 2", ("Kann Spuren von N" + new String(new byte[] { (byte) 0xc3, (byte) 0xbc }, "UTF-8") + "ssen enthalten") .equals(udps.getPropertyValue("Warnung"))); - log.println("...done"); + System.out.println("...done"); - log.println("Checking meta-data updates..."); + System.out.println("Checking meta-data updates..."); String str; DateTime dt = new DateTime(); @@ -258,75 +250,75 @@ public class DocumentMetaData extends ComplexTestCase str = "me"; xDP.setAuthor(str); - assure ("setAuthor", str.equals(xDP.getAuthor())); + assertTrue("setAuthor", str.equals(xDP.getAuthor())); str = "the computa"; xDP.setGenerator(str); - assure ("setGenerator", str.equals(xDP.getGenerator())); + assertTrue("setGenerator", str.equals(xDP.getGenerator())); dt.Year = 2038; dt.Month = 1; dt.Day = 1; xDP.setCreationDate(dt); - assure ("setCreationDate", dt.Year == xDP.getCreationDate().Year); + assertTrue("setCreationDate", dt.Year == xDP.getCreationDate().Year); str = "El t'itulo"; xDP.setTitle(str); - assure ("setTitle", str.equals(xDP.getTitle())); + assertTrue("setTitle", str.equals(xDP.getTitle())); str = "Ein verkommenes Subjekt"; xDP.setSubject(str); - assure ("setSubject", str.equals(xDP.getSubject())); + assertTrue("setSubject", str.equals(xDP.getSubject())); str = "Este descripci'on no es importante"; xDP.setDescription(str); - assure ("setDescription", str.equals(xDP.getDescription())); + assertTrue("setDescription", str.equals(xDP.getDescription())); l.Language = "en"; l.Country = "GB"; xDP.setLanguage(l); Locale l2 = xDP.getLanguage(); - assure ("setLanguage Lang", l.Language.equals(l2.Language)); - assure ("setLanguage Cty", l.Country.equals(l2.Country)); + assertTrue("setLanguage Lang", l.Language.equals(l2.Language)); + assertTrue("setLanguage Cty", l.Country.equals(l2.Country)); str = "myself"; xDP.setModifiedBy(str); - assure ("setModifiedBy", str.equals(xDP.getModifiedBy())); + assertTrue("setModifiedBy", str.equals(xDP.getModifiedBy())); dt.Year = 2042; xDP.setModificationDate(dt); - assure ("setModificationDate", + assertTrue("setModificationDate", dt.Year == xDP.getModificationDate().Year); str = "i didnt do it"; xDP.setPrintedBy(str); - assure ("setPrintedBy", str.equals(xDP.getPrintedBy())); + assertTrue("setPrintedBy", str.equals(xDP.getPrintedBy())); dt.Year = 2024; xDP.setPrintDate(dt); - assure ("setPrintDate", dt.Year == xDP.getPrintDate().Year); + assertTrue("setPrintDate", dt.Year == xDP.getPrintDate().Year); str = "blah"; xDP.setTemplateName(str); - assure ("setTemplateName", str.equals(xDP.getTemplateName())); + assertTrue("setTemplateName", str.equals(xDP.getTemplateName())); str = "gopher://some-hole-in-the-ground/"; xDP.setTemplateURL(str); - assure ("setTemplateURL", str.equals(xDP.getTemplateURL())); + assertTrue("setTemplateURL", str.equals(xDP.getTemplateURL())); dt.Year = 2043; xDP.setTemplateDate(dt); - assure ("setTemplateDate", dt.Year == xDP.getTemplateDate().Year); + assertTrue("setTemplateDate", dt.Year == xDP.getTemplateDate().Year); str = "http://nowhere/"; xDP.setAutoloadURL(str); - assure ("setAutoloadURL", str.equals(xDP.getAutoloadURL())); + assertTrue("setAutoloadURL", str.equals(xDP.getAutoloadURL())); i = 3661; // this might not work (due to conversion via double...) xDP.setAutoloadSecs(i); -// log.println("set: " + i + " get: " + xDP.getAutoloadSecs()); - assure ("setAutoloadSecs", i == xDP.getAutoloadSecs()); +// System.out.println("set: " + i + " get: " + xDP.getAutoloadSecs()); + assertTrue("setAutoloadSecs", i == xDP.getAutoloadSecs()); str = "_blank"; xDP.setDefaultTarget(str); - assure ("setDefaultTarget", str.equals(xDP.getDefaultTarget())); + assertTrue("setDefaultTarget", str.equals(xDP.getDefaultTarget())); i = 42; xDP.setEditingCycles((short) i); - assure ("setEditingCycles", i == xDP.getEditingCycles()); + assertTrue("setEditingCycles", i == xDP.getEditingCycles()); i = 84; xDP.setEditingDuration(i); - assure ("setEditingDuration", i == xDP.getEditingDuration()); + assertTrue("setEditingDuration", i == xDP.getEditingDuration()); str = ""; String[] kws2 = new String[] { "keywordly", "keywordlike", "keywordalicious" }; xDP.setKeywords(kws2); kws = xDP.getKeywords(); - assure ("setKeywords", fromArray(kws).containsAll(fromArray(kws2))); + assertTrue("setKeywords", fromArray(kws).containsAll(fromArray(kws2))); NamedValue[] ds2 = new NamedValue[] { new NamedValue("SyllableCount", new Integer(9)), @@ -334,16 +326,16 @@ public class DocumentMetaData extends ComplexTestCase new NamedValue("SentenceCount", new Integer(7)) }; xDP.setDocumentStatistics(ds2); ds = xDP.getDocumentStatistics(); - assure ("setDocumentStatistics:SyllableCount", containsNV(ds, + assertTrue("setDocumentStatistics:SyllableCount", containsNV(ds, new NamedValue("SyllableCount", new Integer(9)))); - assure ("setDocumentStatistics:FrameCount", containsNV(ds, + assertTrue("setDocumentStatistics:FrameCount", containsNV(ds, new NamedValue("FrameCount", new Integer(2)))); - assure ("setDocumentStatistics:SentenceCount", containsNV(ds, + assertTrue("setDocumentStatistics:SentenceCount", containsNV(ds, new NamedValue("SentenceCount", new Integer(7)))); - log.println("...done"); + System.out.println("...done"); - log.println("Checking user-defined meta-data updates..."); + System.out.println("Checking user-defined meta-data updates..."); // actually, this tests the PropertyBag service // but maybe the DocumentProperties service will be implemented @@ -369,8 +361,7 @@ public class DocumentMetaData extends ComplexTestCase dur.Seconds = 555; dur.MilliSeconds = 444; - udpc.addProperty("Frobnicate", PropertyAttribute.REMOVEABLE, - new Boolean(b)); + udpc.addProperty("Frobnicate", PropertyAttribute.REMOVEABLE, b); udpc.addProperty("FrobDuration", PropertyAttribute.REMOVEABLE, dur); udpc.addProperty("FrobDuration2", PropertyAttribute.REMOVEABLE, t); udpc.addProperty("FrobEndDate", PropertyAttribute.REMOVEABLE, date); @@ -384,109 +375,106 @@ public class DocumentMetaData extends ComplexTestCase udpc.removeProperty("Info 1"); udpc.removeProperty("Removed"); } catch (UnknownPropertyException e) { - assure("removeProperty failed", false); + fail("removeProperty failed"); } try { udpc.addProperty("Forbidden", PropertyAttribute.REMOVEABLE, new String[] { "foo", "bar" }); - assure("inserting value of non-supported type did not fail", - false); + fail("inserting value of non-supported type did not fail"); } catch (IllegalTypeException e) { // ignore } - assure ("UserDefined bool", new Boolean(b).equals( + assertTrue("UserDefined bool", new Boolean(b).equals( udps.getPropertyValue("Frobnicate"))); - assure ("UserDefined duration", eqDuration(dur, (Duration) + assertTrue("UserDefined duration", eqDuration(dur, (Duration) udps.getPropertyValue("FrobDuration"))); - assure ("UserDefined time", eqTime(t, (Time) + assertTrue("UserDefined time", eqTime(t, (Time) udps.getPropertyValue("FrobDuration2"))); - assure ("UserDefined date", eqDate(date, (Date) + assertTrue("UserDefined date", eqDate(date, (Date) udps.getPropertyValue("FrobEndDate"))); - assure ("UserDefined datetime", eqDateTime(dt, (DateTime) + assertTrue("UserDefined datetime", eqDateTime(dt, (DateTime) udps.getPropertyValue("FrobStartTime"))); - assure ("UserDefined float", new Double(d).equals( + assertTrue("UserDefined float", new Double(d).equals( udps.getPropertyValue("Pi"))); - assure ("UserDefined string", "bar".equals( + assertTrue("UserDefined string", "bar".equals( udps.getPropertyValue("Foo"))); - assure ("UserDefined empty name", "eeeeek".equals( + assertTrue("UserDefined empty name", "eeeeek".equals( udps.getPropertyValue(""))); try { udps.getPropertyValue("Removed"); - assure("UserDefined remove didn't", false); + fail("UserDefined remove didn't"); } catch (UnknownPropertyException e) { // ok } - log.println("...done"); + System.out.println("...done"); - log.println("Checking storing meta-data to file..."); + System.out.println("Checking storing meta-data to file..."); xDP.storeToMedium(temp + "TEST.odt", mimeArgs); - log.println("...done"); + System.out.println("...done"); - log.println("Checking loading meta-data from stored file..."); + System.out.println("Checking loading meta-data from stored file..."); xDP.loadFromMedium(temp + "TEST.odt", noArgs); - log.println("...done"); + System.out.println("...done"); - log.println("Checking user-defined meta-data from stored file..."); + System.out.println("Checking user-defined meta-data from stored file..."); udpc = xDP.getUserDefinedProperties(); - udps = (XPropertySet) UnoRuntime.queryInterface( - XPropertySet.class, udpc); + udps = UnoRuntime.queryInterface( XPropertySet.class, udpc ); - assure ("UserDefined bool", new Boolean(b).equals( + assertTrue("UserDefined bool", new Boolean(b).equals( udps.getPropertyValue("Frobnicate"))); - assure ("UserDefined duration", eqDuration(dur, (Duration) + assertTrue("UserDefined duration", eqDuration(dur, (Duration) udps.getPropertyValue("FrobDuration"))); // this is now a Duration! Duration t_dur = new Duration(false, (short)0, (short)0, (short)0, t.Hours, t.Minutes, t.Seconds, (short)(10 * t.HundredthSeconds)); - assure ("UserDefined time", eqDuration(t_dur, (Duration) + assertTrue("UserDefined time", eqDuration(t_dur, (Duration) udps.getPropertyValue("FrobDuration2"))); - assure ("UserDefined date", eqDate(date, (Date) + assertTrue("UserDefined date", eqDate(date, (Date) udps.getPropertyValue("FrobEndDate"))); - assure ("UserDefined datetime", eqDateTime(dt, (DateTime) + assertTrue("UserDefined datetime", eqDateTime(dt, (DateTime) udps.getPropertyValue("FrobStartTime"))); - assure ("UserDefined float", new Double(d).equals( + assertTrue("UserDefined float", new Double(d).equals( udps.getPropertyValue("Pi"))); - assure ("UserDefined string", "bar".equals( + assertTrue("UserDefined string", "bar".equals( udps.getPropertyValue("Foo"))); try { udps.getPropertyValue("Removed"); - assure("UserDefined remove didn't", false); + fail("UserDefined remove didn't"); } catch (UnknownPropertyException e) { // ok } - log.println("...done"); + System.out.println("...done"); - log.println("Checking notification listener interface..."); + System.out.println("Checking notification listener interface..."); Listener listener = new Listener(); - XModifyBroadcaster xMB = (XModifyBroadcaster) - UnoRuntime.queryInterface(XModifyBroadcaster.class, xDP); + XModifyBroadcaster xMB = UnoRuntime.queryInterface( XModifyBroadcaster.class, xDP ); xMB.addModifyListener(listener); xDP.setAuthor("not me"); - assure ("Listener Author", listener.reset()); + assertTrue("Listener Author", listener.reset()); udpc.addProperty("Listener", PropertyAttribute.REMOVEABLE, "foo"); - assure ("Listener UserDefined Add", listener.reset()); + assertTrue("Listener UserDefined Add", listener.reset()); udps.setPropertyValue("Listener", "bar"); - assure ("Listener UserDefined Set", listener.reset()); + assertTrue("Listener UserDefined Set", listener.reset()); udpc.removeProperty("Listener"); - assure ("Listener UserDefined Remove", listener.reset()); + assertTrue("Listener UserDefined Remove", listener.reset()); xMB.removeModifyListener(listener); udpc.addProperty("Listener2", PropertyAttribute.REMOVEABLE, "foo"); - assure ("Removed Listener UserDefined Add", !listener.reset()); + assertTrue("Removed Listener UserDefined Add", !listener.reset()); - log.println("...done"); + System.out.println("...done"); } catch (Exception e) { report(e); @@ -538,9 +526,36 @@ public class DocumentMetaData extends ComplexTestCase } public void report(Exception e) { - log.println("Exception occurred:"); - e.printStackTrace((java.io.PrintWriter) log); - failed(); + System.out.println("Exception occurred:"); + e.printStackTrace(); + fail(); + } + + + 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( "------------------------------------------------------------" ); + System.out.println( "starting class: " + DocumentProperties.class.getName() ); + System.out.println( "------------------------------------------------------------" ); + connection.setUp(); + } + + @AfterClass public static void tearDownConnection() + throws InterruptedException, com.sun.star.uno.Exception + { + System.out.println( "------------------------------------------------------------" ); + System.out.println( "finishing class: " + DocumentProperties.class.getName() ); + System.out.println( "------------------------------------------------------------" ); + connection.tearDown(); + } + + private static final OfficeConnection connection = new OfficeConnection(); + } diff --git a/sfx2/qa/complex/sfx2/GlobalEventBroadcaster.java b/sfx2/qa/complex/sfx2/GlobalEventBroadcaster.java new file mode 100755 index 000000000000..41bd66ccb5b9 --- /dev/null +++ b/sfx2/qa/complex/sfx2/GlobalEventBroadcaster.java @@ -0,0 +1,273 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ +package complex.sfx2; + +import com.sun.star.awt.XWindow; +import com.sun.star.document.XEventBroadcaster; +import com.sun.star.document.XEventListener; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.sheet.XSpreadsheetDocument; +import com.sun.star.text.XTextDocument; +import com.sun.star.uno.UnoRuntime; +import complex.sfx2.tools.WriterHelper; + +import java.util.ArrayList; + +import util.UITools; + +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.*; + + +/** + * This testcase checks the GlobalEventBroadcaster + * it will add an XEventListener and verify the Events + * raised when opening/changing and closing Office Documents + */ +public class GlobalEventBroadcaster { + XMultiServiceFactory m_xMSF = null; + XEventBroadcaster m_xEventBroadcaster = null; + ArrayList notifyEvents = new ArrayList(); + // XTextDocument xTextDoc; + XSpreadsheetDocument xSheetDoc; + XEventListener m_xEventListener = new EventListenerImpl(); + + @Before public void initialize() { + m_xMSF = getMSF(); + System.out.println("check wether there is a valid MultiServiceFactory"); + + assertNotNull("## Couldn't get MultiServiceFactory make sure your Office is started", m_xMSF); + + System.out.println("... done"); + + System.out.println( + "Create an instance of com.sun.star.frame.GlobalEventBroadcaster"); + + Object GlobalEventBroadcaster = null; + + try { + GlobalEventBroadcaster = m_xMSF.createInstance( + "com.sun.star.frame.GlobalEventBroadcaster"); + } catch (com.sun.star.uno.Exception e) { + fail("## Exception while creating instance"); + } + + System.out.println("... done"); + + System.out.println("check wether the created instance is valid"); + + assertNotNull("couldn't create service", GlobalEventBroadcaster); + + System.out.println("... done"); + + System.out.println( + "try to query the XEventBroadcaster from the gained Object"); + m_xEventBroadcaster = UnoRuntime.queryInterface(XEventBroadcaster.class, GlobalEventBroadcaster); + + if (util.utils.isVoid(m_xEventBroadcaster)) { + fail("couldn't get XEventBroadcaster"); + } + + System.out.println("... done"); + + System.out.println("adding Listener"); + m_xEventBroadcaster.addEventListener(m_xEventListener); + System.out.println("... done"); + } + + @Test public void checkWriter() { + System.out.println("-- Checking Writer --"); + + WriterHelper wHelper = new WriterHelper(m_xMSF); + String[] expected; + System.out.println("opening an empty writer doc"); + notifyEvents.clear(); + { + XTextDocument xTextDoc = wHelper.openEmptyDoc(); + shortWait(); + expected = new String[] { "OnUnfocus", "OnCreate", "OnViewCreated", "OnFocus" }; + + assertTrue("Wrong events fired when opening empty doc", + proveExpectation(expected)); + System.out.println("... done"); + + System.out.println("changing the writer doc"); + notifyEvents.clear(); + xTextDoc.getText().setString("GlobalEventBroadcaster"); + shortWait(); + expected = new String[] { "OnModifyChanged" }; + + assertTrue("Wrong events fired when changing doc", + proveExpectation(expected)); + System.out.println("... done"); + + System.out.println("closing the empty writer doc"); + notifyEvents.clear(); + wHelper.closeDoc(xTextDoc); + shortWait(); + } + expected = new String[] { "OnUnfocus", "OnFocus", "OnViewClosed", "OnUnload" }; + + assertTrue("Wrong events fired when closing empty doc", + proveExpectation(expected)); + System.out.println("... done"); + + System.out.println("opening an writer doc via Window-New Window"); + notifyEvents.clear(); + { + XTextDocument xTextDoc = wHelper.openFromDialog(".uno:NewWindow", "", false); + + shortWait(); + expected = new String[] { "OnUnfocus", "OnCreate", "OnViewCreated", "OnFocus", "OnUnfocus", "OnViewCreated", "OnFocus", }; + + assertTrue("Wrong events fired when opening an writer doc via Window-New Window", + proveExpectation(expected)); + System.out.println("... done"); + + System.out.println("closing the created writer doc"); + notifyEvents.clear(); + + wHelper.closeDoc(xTextDoc); + shortWait(); + } + expected = new String[] { "OnViewClosed", "OnUnfocus", "OnFocus", "OnViewClosed", "OnUnload" }; + + assertTrue("Wrong events fired when closing Window-New Window", + proveExpectation(expected)); + + System.out.println("... done"); + // TODO: It seems not possible to close the document without interactiv question + // there the follow test will not be execute + if (false) { + System.out.println("Opening document with label wizard"); + XTextDocument xTextDoc = wHelper.openFromDialog("private:factory/swriter?slot=21051", "", false); + shortWait(); + XWindow xWindow = UnoRuntime.queryInterface(XWindow.class, wHelper.getToolkit().getActiveTopWindow()); + UITools ut = new UITools(m_xMSF,xWindow); + notifyEvents.clear(); + System.out.println("pressing button 'New Document'"); + try{ + ut.clickButton ("New Document"); + } catch (Exception e) { + System.out.println("Couldn't press Button"); + } + System.out.println("... done"); + shortWait(); + shortWait(); + shortWait(); + expected = new String[] { "OnViewClosed", "OnCreate", "OnFocus", "OnModifyChanged" }; + + assertTrue("Wrong events fired when starting labels wizard", + proveExpectation(expected)); + + System.out.println("Try to close document..."); + wHelper.closeDoc(xTextDoc); + shortWait(); + wHelper.closeFromDialog(); + shortWait(); + xTextDoc = null; + } + + System.out.println("-- Done Writer --"); + } + + @After public void cleanup() { + System.out.println("removing Listener"); + m_xEventBroadcaster.removeEventListener(m_xEventListener); + System.out.println("... done"); + } + + /** + * Sleeps for 0.5 sec. to allow StarOffice to react on <code> + * reset</code> call. + */ + private void shortWait() { + try { + Thread.sleep(2000); + } catch (InterruptedException e) { + System.out.println("While waiting :" + e); + } + } + + private boolean proveExpectation(String[] expected) { + boolean locRes = true; + boolean failure = false; + + System.out.println("Fired Events:"); + for (int k=0;k<notifyEvents.size();k++) { + System.out.println("\t- "+notifyEvents.get(k)); + } + + for (int i = 0; i < expected.length; i++) { + locRes = notifyEvents.contains(expected[i]); + + if (!locRes) { + System.out.println("The event " + expected[i] + " isn't fired"); + failure = true; + } + } + + return !failure; + } + + public class EventListenerImpl implements XEventListener { + public void disposing(com.sun.star.lang.EventObject eventObject) { + System.out.println("disposing: " + eventObject.Source.toString()); + } + + public void notifyEvent(com.sun.star.document.EventObject eventObject) { + notifyEvents.add(eventObject.EventName); + } + } + + 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() CheckGlobalEventBroadcaster_writer1"); + connection.tearDown(); + } + + private static final OfficeConnection connection = new OfficeConnection(); + +} diff --git a/sfx2/qa/complex/sfx2/StandaloneDocumentInfo.java b/sfx2/qa/complex/sfx2/StandaloneDocumentInfo.java new file mode 100755 index 000000000000..1e9cbb1f4738 --- /dev/null +++ b/sfx2/qa/complex/sfx2/StandaloneDocumentInfo.java @@ -0,0 +1,99 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ +package complex.sfx2; + +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.uno.UnoRuntime; +import complex.sfx2.standalonedocinfo.StandaloneDocumentInfoTest; +import complex.sfx2.standalonedocinfo.Test01; + +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.*; + +/* Document here +*/ + +public class StandaloneDocumentInfo { + private XMultiServiceFactory m_xMSF = null; + + @Before public void before() { + try { + m_xMSF = getMSF(); + } catch(Exception e) { + fail( "Failed to create service factory!" ); + } + if( m_xMSF ==null ) { + fail( "Failed to create service factory!" ); + } + } + + @After public void after() { + m_xMSF = null; + } + + @Test public void ExecuteTest01() { + StandaloneDocumentInfoTest aTest = new Test01 (m_xMSF); + assertTrue( "Test01 failed!", aTest.test() ); + } + + + + + 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( "------------------------------------------------------------" ); + System.out.println( "starting class: " + StandaloneDocumentInfo.class.getName() ); + System.out.println( "------------------------------------------------------------" ); + connection.setUp(); + } + + @AfterClass public static void tearDownConnection() + throws InterruptedException, com.sun.star.uno.Exception + { + System.out.println( "------------------------------------------------------------" ); + System.out.println( "finishing class: " + StandaloneDocumentInfo.class.getName() ); + System.out.println( "------------------------------------------------------------" ); + connection.tearDown(); + } + + private static final OfficeConnection connection = new OfficeConnection(); + +} + + diff --git a/sfx2/qa/complex/sfx2/UndoManager.java b/sfx2/qa/complex/sfx2/UndoManager.java new file mode 100755 index 000000000000..f37530aba726 --- /dev/null +++ b/sfx2/qa/complex/sfx2/UndoManager.java @@ -0,0 +1,1464 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +package complex.sfx2; + +import com.sun.star.accessibility.XAccessible; +import com.sun.star.accessibility.XAccessibleAction; +import com.sun.star.awt.Point; +import com.sun.star.awt.Size; +import com.sun.star.awt.XControl; +import com.sun.star.awt.XControlModel; +import com.sun.star.beans.NamedValue; +import com.sun.star.beans.XPropertySet; +import com.sun.star.container.NoSuchElementException; +import com.sun.star.container.XChild; +import com.sun.star.container.XIndexContainer; +import com.sun.star.container.XNameContainer; +import com.sun.star.container.XNameReplace; +import com.sun.star.container.XSet; +import com.sun.star.document.EmptyUndoStackException; +import com.sun.star.document.UndoContextNotClosedException; +import com.sun.star.document.UndoFailedException; +import com.sun.star.document.UndoManagerEvent; +import com.sun.star.document.XEmbeddedScripts; +import com.sun.star.document.XEventsSupplier; +import com.sun.star.document.XUndoAction; +import com.sun.star.lang.EventObject; +import com.sun.star.lang.IndexOutOfBoundsException; +import com.sun.star.lang.XEventListener; +import java.lang.reflect.InvocationTargetException; +import org.openoffice.test.tools.OfficeDocument; +import com.sun.star.document.XUndoManagerSupplier; +import com.sun.star.document.XUndoManager; +import com.sun.star.document.XUndoManagerListener; +import com.sun.star.drawing.XControlShape; +import com.sun.star.drawing.XDrawPage; +import com.sun.star.drawing.XDrawPageSupplier; +import com.sun.star.drawing.XShapes; +import com.sun.star.lang.XComponent; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.lang.XServiceInfo; +import com.sun.star.lang.XSingleComponentFactory; +import com.sun.star.lang.XTypeProvider; +import com.sun.star.script.ScriptEventDescriptor; +import com.sun.star.script.XEventAttacherManager; +import com.sun.star.script.XLibraryContainer; +import com.sun.star.task.XJob; +import com.sun.star.uno.Type; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.uno.XComponentContext; +import com.sun.star.util.InvalidStateException; +import com.sun.star.util.NotLockedException; +import com.sun.star.view.XControlAccess; +import complex.sfx2.undo.CalcDocumentTest; +import complex.sfx2.undo.ChartDocumentTest; +import complex.sfx2.undo.DocumentTest; +import complex.sfx2.undo.DrawDocumentTest; +import complex.sfx2.undo.ImpressDocumentTest; +import complex.sfx2.undo.WriterDocumentTest; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.Stack; +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; +import static org.junit.Assert.*; +import org.openoffice.test.OfficeConnection; +import org.openoffice.test.tools.DocumentType; +import org.openoffice.test.tools.SpreadsheetDocument; + +/** + * Unit test for the UndoManager API + * + * @author frank.schoenheit@oracle.com + */ +public class UndoManager +{ + // ----------------------------------------------------------------------------------------------------------------- + @Before + public void beforeTest() throws com.sun.star.uno.Exception + { + m_currentTestCase = null; + m_currentDocument = null; + m_undoListener = null; + + // at our service factory, insert a new factory for our CallbackComponent + // this will allow the Basic code in our test documents to call back into this test case + // here, by just instantiating this service + final XSet globalFactory = UnoRuntime.queryInterface( XSet.class, getORB() ); + m_callbackFactory = new CallbackComponentFactory(); + globalFactory.insert( m_callbackFactory ); + } + + // ----------------------------------------------------------------------------------------------------------------- + @Test + public void checkWriterUndo() throws Exception + { + m_currentTestCase = new WriterDocumentTest( getORB() ); + impl_checkUndo(); + } + + // ----------------------------------------------------------------------------------------------------------------- + @Test + public void checkCalcUndo() throws Exception + { + m_currentTestCase = new CalcDocumentTest( getORB() ); + impl_checkUndo(); + } + + // ----------------------------------------------------------------------------------------------------------------- + @Test + public void checkDrawUndo() throws Exception + { + m_currentTestCase = new DrawDocumentTest( getORB() ); + impl_checkUndo(); + } + + // ----------------------------------------------------------------------------------------------------------------- + @Test + public void checkImpressUndo() throws Exception + { + m_currentTestCase = new ImpressDocumentTest( getORB() ); + impl_checkUndo(); + } + + // ----------------------------------------------------------------------------------------------------------------- + @Test + public void checkChartUndo() throws Exception + { + m_currentTestCase = new ChartDocumentTest( getORB() ); + impl_checkUndo(); + } + + // ----------------------------------------------------------------------------------------------------------------- +//#i116813# disabled @Test + public void checkBrokenScripts() throws com.sun.star.uno.Exception, InterruptedException + { + System.out.println( "testing: broken scripts" ); + + m_currentDocument = OfficeDocument.blankDocument( getORB(), DocumentType.CALC ); + m_undoListener = new UndoListener(); + getUndoManager().addUndoManagerListener( m_undoListener ); + + impl_setupBrokenBasicScript(); + final String scriptURI = "vnd.sun.star.script:default.callbacks.brokenScript?language=Basic&location=document"; + + // ............................................................................................................. + // scenario 1: Pressing a button which is bound to execute the script + // (This is one of the many cases where SfxObjectShell::CallXScript is invoked) + + // set up the button + final XPropertySet buttonModel = impl_setupButton(); + buttonModel.setPropertyValue( "Label", "exec broken script" ); + impl_assignScript( buttonModel, "XActionListener", "actionPerformed", + scriptURI ); + + // switch the doc's view to form alive mode (so the button will actually work) + m_currentDocument.getCurrentView().dispatch( ".uno:SwitchControlDesignMode" ); + + // click the button + m_callbackCalled = false; + impl_clickButton( buttonModel ); + // the macro is executed asynchronously by the button, so wait at most 2 seconds for the callback to be + // triggered + impl_waitFor( m_callbackCondition, 2000 ); + // check the callback has actually been called + assertTrue( "clicking the test button did not work as expected - basic script not called", m_callbackCalled ); + + // again, since the script is executed asynchronously, we might arrive here while its execution + // is not completely finished. Give OOo another (at most) 2 seconds to finish it. + m_undoListener.waitForAllContextsClosed( 20000 ); + // assure that the Undo Context Depth of the doc is still "0": The Basic script entered such a + // context, and didn't close it (thus it is broken), but the application framework should have + // auto-closed the context after the macro finished. + assertEquals( "undo context was not auto-closed as expected", 0, m_undoListener.getCurrentUndoContextDepth() ); + + // ............................................................................................................. + // scenario 2: dispatching the script URL. Technically, this is equivalent to configuring the + // script into a menu or toolbar, and selecting the respective menu/toolbar item + m_callbackCalled = false; + m_currentDocument.getCurrentView().dispatch( scriptURI ); + assertTrue( "dispatching the Script URL did not work as expected - basic script not called", m_callbackCalled ); + // same as above: The script didn't close the context, but the OOo framework should have + assertEquals( "undo context was not auto-closed as expected", 0, m_undoListener.getCurrentUndoContextDepth() ); + + // ............................................................................................................. + // scenario 3: assigning the script to some document event, and triggering this event + final XEventsSupplier eventSupplier = UnoRuntime.queryInterface( XEventsSupplier.class, m_currentDocument.getDocument() ); + final XNameReplace events = UnoRuntime.queryInterface( XNameReplace.class, eventSupplier.getEvents() ); + final NamedValue[] scriptDescriptor = new NamedValue[] { + new NamedValue( "EventType", "Script" ), + new NamedValue( "Script", scriptURI ) + }; + events.replaceByName( "OnViewCreated", scriptDescriptor ); + + // The below doesn't work: event notification is broken in m96, see http://www.openoffice.org/issues/show_bug.cgi?id=116313 +/* m_callbackCalled = false; + m_currentDocument.getCurrentView().dispatch( ".uno:NewWindow" ); + assertTrue( "triggering an event did not work as expected - basic script not called", m_callbackCalled ); + // same as above: The script didn't close the context, but the OOo framework should have + assertEquals( "undo context was not auto-closed as expected", 0, m_undoListener.getCurrentUndoContextDepth() ); + */ + + // ............................................................................................................. + // scenario 4: let the script enter an Undo context, but not close it, as usual. + // Additionally, let the script close the document - the OOo framework code which cares for + // auto-closing of Undo contexts should survive this, ideally ... + m_closeAfterCallback = true; + m_callbackCalled = false; + m_currentDocument.getCurrentView().dispatch( scriptURI ); + assertTrue( m_callbackCalled ); + assertTrue( "The Basic script should have closed the document.", m_undoListener.isDisposed() ); + m_currentDocument = null; + } + + // ----------------------------------------------------------------------------------------------------------------- + @Test + public void checkSerialization() throws com.sun.star.uno.Exception, InterruptedException + { + System.out.println( "testing: request serialization" ); + + m_currentDocument = OfficeDocument.blankDocument( getORB(), DocumentType.CALC ); + final XUndoManager undoManager = getUndoManager(); + + final int threadCount = 10; + final int actionsPerThread = 10; + final int actionCount = threadCount * actionsPerThread; + + // add some actions to the UndoManager, each knowing its position on the stack + final Object lock = new Object(); + final Integer actionsUndone[] = new Integer[] { 0 }; + for ( int i=actionCount; i>0; ) + undoManager.addUndoAction( new CountingUndoAction( --i, lock, actionsUndone ) ); + + // some concurrent threads which undo the actions + Thread[] threads = new Thread[threadCount]; + for ( int i=0; i<threadCount; ++i ) + { + threads[i] = new Thread() + { + @Override + public void run() + { + for ( int j=0; j<actionsPerThread; ++j ) + { + try { undoManager.undo(); } + catch ( final Exception e ) + { + fail( "Those dummy actions are not expected to fail." ); + return; + } + } + } + }; + } + + // start the threads + for ( int i=0; i<threadCount; ++i ) + threads[i].start(); + + // wait for them to be finished + for ( int i=0; i<threadCount; ++i ) + threads[i].join(); + + // ensure all actions have been undone + assertEquals( "not all actions have been undone", actionCount, actionsUndone[0].intValue() ); + } + + // ----------------------------------------------------------------------------------------------------------------- + @After + public void afterTest() + { + if ( m_currentTestCase != null ) + m_currentTestCase.closeDocument(); + else if ( m_currentDocument != null ) + m_currentDocument.close(); + m_currentTestCase = null; + m_currentDocument = null; + m_callbackFactory.dispose(); + } + + // ----------------------------------------------------------------------------------------------------------------- + /** + * returns the undo manager belonging to a given document + * @return + */ + private XUndoManager getUndoManager() + { + final XUndoManagerSupplier suppUndo = UnoRuntime.queryInterface( XUndoManagerSupplier.class, m_currentDocument.getDocument() ); + final XUndoManager undoManager = suppUndo.getUndoManager(); + assertTrue( UnoRuntime.areSame( undoManager.getParent(), m_currentDocument.getDocument() ) ); + return undoManager; + } + + // ----------------------------------------------------------------------------------------------------------------- + private void impl_waitFor( final Object i_condition, final int i_milliSeconds ) throws InterruptedException + { + synchronized( i_condition ) + { + i_condition.wait( i_milliSeconds ); + } + } + + // ----------------------------------------------------------------------------------------------------------------- + private void impl_setupBrokenBasicScript() + { + try + { + final XEmbeddedScripts embeddedScripts = UnoRuntime.queryInterface( XEmbeddedScripts.class, m_currentDocument.getDocument() ); + final XLibraryContainer basicLibs = embeddedScripts.getBasicLibraries(); + final XNameContainer basicLib = basicLibs.createLibrary( "default" ); + + final String brokenScriptCode = + "Option Explicit\n" + + "\n" + + "Sub brokenScript\n" + + " Dim callback as Object\n" + + " ThisComponent.UndoManager.enterUndoContext( \"" + getCallbackUndoContextTitle() + "\" )\n" + + "\n" + + " callback = createUnoService( \"" + getCallbackComponentServiceName() + "\" )\n" + + " Dim emptyArgs() as new com.sun.star.beans.NamedValue\n" + + " Dim result as String\n" + + " result = callback.execute( emptyArgs() )\n" + + " If result = \"close\" Then\n" + + " ThisComponent.close( TRUE )\n" + + " End If\n" + + "End Sub\n" + + "\n"; + + basicLib.insertByName( "callbacks", brokenScriptCode ); + } + catch( com.sun.star.uno.Exception e ) + { + fail( "caught an exception while setting up the script: " + e.toString() ); + } + } + + // ----------------------------------------------------------------------------------------------------------------- + private XPropertySet impl_setupButton() throws com.sun.star.uno.Exception + { + // let the document create a shape + final XMultiServiceFactory docAsFactory = UnoRuntime.queryInterface( XMultiServiceFactory.class, + m_currentDocument.getDocument() ); + final XControlShape xShape = UnoRuntime.queryInterface( XControlShape.class, + docAsFactory.createInstance( "com.sun.star.drawing.ControlShape" ) ); + + // position and size of the shape + xShape.setSize( new Size( 28 * 100, 10 * 100 ) ); + xShape.setPosition( new Point( 10 * 100, 10 * 100 ) ); + + // create the form component (the model of a form control) + final String sQualifiedComponentName = "com.sun.star.form.component.CommandButton"; + final XControlModel controlModel = UnoRuntime.queryInterface( XControlModel.class, + getORB().createInstance( sQualifiedComponentName ) ); + + // knitt both + xShape.setControl( controlModel ); + + // add the shape to the shapes collection of the document + SpreadsheetDocument spreadsheetDoc = (SpreadsheetDocument)m_currentDocument; + final XDrawPageSupplier suppDrawPage = UnoRuntime.queryInterface( XDrawPageSupplier.class, + spreadsheetDoc.getSheet( 0 ) ); + final XDrawPage insertIntoPage = suppDrawPage.getDrawPage(); + + final XShapes sheetShapes = UnoRuntime.queryInterface( XShapes.class, insertIntoPage ); + sheetShapes.add( xShape ); + + return UnoRuntime.queryInterface( XPropertySet.class, controlModel ); + } + + // ----------------------------------------------------------------------------------------------------------------- + private void impl_assignScript( final XPropertySet i_controlModel, final String i_interfaceName, + final String i_interfaceMethod, final String i_scriptURI ) + { + try + { + final XChild modelAsChild = UnoRuntime.queryInterface( XChild.class, i_controlModel ); + final XIndexContainer parentForm = UnoRuntime.queryInterface( XIndexContainer.class, modelAsChild.getParent() ); + + final XEventAttacherManager manager = UnoRuntime.queryInterface( XEventAttacherManager.class, parentForm ); + + int containerPosition = -1; + for ( int i = 0; i < parentForm.getCount(); ++i ) + { + final XPropertySet child = UnoRuntime.queryInterface( XPropertySet.class, parentForm.getByIndex( i ) ); + if ( UnoRuntime.areSame( child, i_controlModel ) ) + { + containerPosition = i; + break; + } + } + assertFalse( "could not find the given control model within its parent", containerPosition == -1 ); + manager.registerScriptEvent( containerPosition, new ScriptEventDescriptor( + i_interfaceName, + i_interfaceMethod, + "", + "Script", + i_scriptURI + ) ); + } + catch( com.sun.star.uno.Exception e ) + { + fail( "caught an exception while assigning the script event to the button: " + e.toString() ); + } + } + + // ----------------------------------------------------------------------------------------------------------------- + private void impl_clickButton( final XPropertySet i_buttonModel ) throws NoSuchElementException, IndexOutOfBoundsException + { + final XControlAccess controlAccess = UnoRuntime.queryInterface( XControlAccess.class, + m_currentDocument.getCurrentView().getController() ); + final XControl control = controlAccess.getControl( UnoRuntime.queryInterface( XControlModel.class, i_buttonModel ) ); + final XAccessible accessible = UnoRuntime.queryInterface( XAccessible.class, control ); + final XAccessibleAction controlActions = UnoRuntime.queryInterface( XAccessibleAction.class, accessible.getAccessibleContext() ); + for ( int i=0; i<controlActions.getAccessibleActionCount(); ++i ) + { + if ( controlActions.getAccessibleActionDescription(i).equals( "click" ) ) + { + controlActions.doAccessibleAction(i); + return; + } + } + fail( "did not find the accessible action named 'click'" ); + } + + // ----------------------------------------------------------------------------------------------------------------- + private static class UndoListener implements XUndoManagerListener + { + public void undoActionAdded( UndoManagerEvent i_event ) + { + assertFalse( "|undoActionAdded| called after document was disposed", m_isDisposed ); + + ++m_undoActionsAdded; + m_mostRecentlyAddedAction = i_event.UndoActionTitle; + } + + public void actionUndone( UndoManagerEvent i_event ) + { + assertFalse( "|actionUndone| called after document was disposed", m_isDisposed ); + + ++m_undoCount; + m_mostRecentlyUndone = i_event.UndoActionTitle; + } + + public void actionRedone( UndoManagerEvent i_event ) + { + assertFalse( "|actionRedone| called after document was disposed", m_isDisposed ); + + ++m_redoCount; + } + + public void allActionsCleared( EventObject eo ) + { + assertFalse( "|allActionsCleared| called after document was disposed", m_isDisposed ); + + m_wasCleared = true; + } + + public void redoActionsCleared( EventObject eo ) + { + assertFalse( "|redoActionsCleared| called after document was disposed", m_isDisposed ); + + m_redoWasCleared = true; + } + + public void resetAll( EventObject i_event ) + { + assertFalse( "|resetAll| called after document was disposed", m_isDisposed ); + + m_managerWasReset = true; + m_activeUndoContexts.clear(); + } + + public void enteredContext( UndoManagerEvent i_event ) + { + assertFalse( "|enteredContext| called after document was disposed", m_isDisposed ); + + m_activeUndoContexts.push( i_event.UndoActionTitle ); + assertEquals( "different opinions on the context nesting level (after entering)", + m_activeUndoContexts.size(), i_event.UndoContextDepth ); + } + + public void enteredHiddenContext( UndoManagerEvent i_event ) + { + assertFalse( "|enteredHiddenContext| called after document was disposed", m_isDisposed ); + + m_activeUndoContexts.push( i_event.UndoActionTitle ); + assertEquals( "different opinions on the context nesting level (after entering hidden)", + m_activeUndoContexts.size(), i_event.UndoContextDepth ); + } + + public void leftContext( UndoManagerEvent i_event ) + { + assertFalse( "|leftContext| called after document was disposed", m_isDisposed ); + + assertEquals( "nested undo context descriptions do not match", m_activeUndoContexts.pop(), i_event.UndoActionTitle ); + assertEquals( "different opinions on the context nesting level (after leaving)", + m_activeUndoContexts.size(), i_event.UndoContextDepth ); + m_leftContext = true; + impl_notifyContextDepth(); + } + + public void leftHiddenContext( UndoManagerEvent i_event ) + { + assertFalse( "|leftHiddenContext| called after document was disposed", m_isDisposed ); + assertEquals( "|leftHiddenContext| is not expected to notify an action title", 0, i_event.UndoActionTitle.length() ); + + m_activeUndoContexts.pop(); + assertEquals( "different opinions on the context nesting level (after leaving)", + m_activeUndoContexts.size(), i_event.UndoContextDepth ); + m_leftHiddenContext = true; + impl_notifyContextDepth(); + } + + public void cancelledContext( UndoManagerEvent i_event ) + { + assertFalse( "|cancelledContext| called after document was disposed", m_isDisposed ); + assertEquals( "|cancelledContext| is not expected to notify an action title", 0, i_event.UndoActionTitle.length() ); + + m_activeUndoContexts.pop(); + assertEquals( "different opinions on the context nesting level (after cancelling)", + m_activeUndoContexts.size(), i_event.UndoContextDepth ); + m_cancelledContext = true; + impl_notifyContextDepth(); + } + + public void disposing( EventObject i_event ) + { + m_isDisposed = true; + } + + public void waitForAllContextsClosed( final int i_milliSeconds ) throws InterruptedException + { + synchronized ( m_allContextsClosedCondition ) + { + if ( m_activeUndoContexts.empty() ) + return; + m_allContextsClosedCondition.wait( i_milliSeconds ); + } + } + + private void impl_notifyContextDepth() + { + synchronized ( m_allContextsClosedCondition ) + { + if ( m_activeUndoContexts.empty() ) + { + m_allContextsClosedCondition.notifyAll(); + } + } + } + + private int getUndoActionsAdded() { return m_undoActionsAdded; } + private int getUndoActionCount() { return m_undoCount; } + private int getRedoActionCount() { return m_redoCount; } + private String getCurrentUndoContextTitle() { return m_activeUndoContexts.peek(); } + private String getMostRecentlyAddedActionTitle() { return m_mostRecentlyAddedAction; }; + private String getMostRecentlyUndoneTitle() { return m_mostRecentlyUndone; } + private int getCurrentUndoContextDepth() { return m_activeUndoContexts.size(); } + private boolean isDisposed() { return m_isDisposed; } + private boolean wasContextLeft() { return m_leftContext; } + private boolean wasHiddenContextLeft() { return m_leftHiddenContext; } + private boolean hasContextBeenCancelled() { return m_cancelledContext; } + private boolean wereStacksCleared() { return m_wasCleared; } + private boolean wasRedoStackCleared() { return m_redoWasCleared; } + private boolean wasManagerReset() { return m_managerWasReset; } + + void reset() + { + m_undoActionsAdded = m_undoCount = m_redoCount = 0; + m_activeUndoContexts.clear(); + m_mostRecentlyAddedAction = m_mostRecentlyUndone = null; + // m_isDisposed is not cleared, intentionally + m_leftContext = m_leftHiddenContext = m_cancelledContext = m_wasCleared = m_redoWasCleared = m_managerWasReset = false; + } + + private int m_undoActionsAdded = 0; + private int m_undoCount = 0; + private int m_redoCount = 0; + private boolean m_isDisposed = false; + private boolean m_leftContext = false; + private boolean m_leftHiddenContext = false; + private boolean m_cancelledContext = false; + private boolean m_wasCleared = false; + private boolean m_redoWasCleared = false; + private boolean m_managerWasReset = false; + private Stack< String > + m_activeUndoContexts = new Stack<String>(); + private String m_mostRecentlyAddedAction = null; + private String m_mostRecentlyUndone = null; + private final Object m_allContextsClosedCondition = new Object(); + }; + + // ----------------------------------------------------------------------------------------------------------------- + private void impl_checkUndo() throws Exception + { + System.out.println( "testing: " + m_currentTestCase.getDocumentDescription() ); + m_currentDocument = m_currentTestCase.getDocument(); + m_currentTestCase.initializeDocument(); + m_currentTestCase.verifyInitialDocumentState(); + + final XUndoManager undoManager = getUndoManager(); + undoManager.clear(); + assertFalse( "clearing the Undo manager should result in the impossibility to undo anything", undoManager.isUndoPossible() ); + assertFalse( "clearing the Undo manager should result in the impossibility to redo anything", undoManager.isRedoPossible() ); + + m_undoListener = new UndoListener(); + undoManager.addUndoManagerListener( m_undoListener ); + + impl_testSingleModification( undoManager ); + impl_testMultipleModifications( undoManager ); + impl_testCustomUndoActions( undoManager ); + impl_testLocking( undoManager ); + impl_testNestedContexts( undoManager ); + impl_testErrorHandling( undoManager ); + impl_testContextHandling( undoManager ); + impl_testStackHandling( undoManager ); + impl_testClearance( undoManager ); + impl_testHiddenContexts( undoManager ); + + // close the document, ensure the Undo manager listener gets notified + m_currentTestCase.closeDocument(); + m_currentTestCase = null; + m_currentDocument = null; + assertTrue( "document is closed, but the UndoManagerListener has not been notified of the disposal", m_undoListener.isDisposed() ); + } + + // ----------------------------------------------------------------------------------------------------------------- + private void impl_testSingleModification( final XUndoManager i_undoManager ) throws com.sun.star.uno.Exception + { + m_currentTestCase.doSingleModification(); + m_currentTestCase.verifySingleModificationDocumentState(); + + // undo the modification, ensure the listener got the proper notifications + assertEquals( "We did not yet do a undo!", 0, m_undoListener.getUndoActionCount() ); + i_undoManager.undo(); + assertEquals( "A simple undo does not result in the proper Undo count.", + 1, m_undoListener.getUndoActionCount() ); + + // verify the document is in its initial state, again + m_currentTestCase.verifyInitialDocumentState(); + + // redo the modification, ensure the listener got the proper notifications + assertEquals( "did not yet do a redo!", 0, m_undoListener.getRedoActionCount() ); + i_undoManager.redo(); + assertEquals( "did a redo, but got no notification of it!", 1, m_undoListener.getRedoActionCount() ); + // ensure the document is in the proper state, again + m_currentTestCase.verifySingleModificationDocumentState(); + + // now do an Undo via the UI (aka the dispatch API), and see if this works, and notifies the listener as + // expected + m_currentTestCase.getDocument().getCurrentView().dispatch( ".uno:Undo" ); + m_currentTestCase.verifyInitialDocumentState(); + assertEquals( "UI-Undo does not notify the listener", 2, m_undoListener.getUndoActionCount() ); + } + + // ----------------------------------------------------------------------------------------------------------------- + private void impl_testMultipleModifications( final XUndoManager i_undoManager ) throws com.sun.star.uno.Exception + { + m_undoListener.reset(); + assertEquals( "unexpected initial undo context depth", 0, m_undoListener.getCurrentUndoContextDepth() ); + i_undoManager.enterUndoContext( "Batch Changes" ); + assertEquals( "unexpected undo context depth after entering a context", + 1, m_undoListener.getCurrentUndoContextDepth() ); + assertEquals( "entering an Undo context has not been notified properly", + "Batch Changes", m_undoListener.getCurrentUndoContextTitle() ); + + final int modifications = m_currentTestCase.doMultipleModifications(); + assertEquals( "unexpected number of undo actions while doing batch changes to the document", + modifications, m_undoListener.getUndoActionsAdded() ); + assertEquals( "seems the document operations touched the undo context depth", + 1, m_undoListener.getCurrentUndoContextDepth() ); + + i_undoManager.leaveUndoContext(); + assertEquals( "unexpected undo context depth after leaving the last context", + 0, m_undoListener.getCurrentUndoContextDepth() ); + assertEquals( "no Undo done, yet - still the listener has been notified of an Undo action", + 0, m_undoListener.getUndoActionCount() ); + + i_undoManager.undo(); + assertEquals( "Just did an undo - the listener should have been notified", 1, m_undoListener.getUndoActionCount() ); + m_currentTestCase.verifyInitialDocumentState(); + } + + // ----------------------------------------------------------------------------------------------------------------- + private void impl_testCustomUndoActions( final XUndoManager i_undoManager ) throws com.sun.star.uno.Exception + { + i_undoManager.clear(); + m_undoListener.reset(); + assertFalse( "undo stack not empty after clearing the undo manager", i_undoManager.isUndoPossible() ); + assertFalse( "redo stack not empty after clearing the undo manager", i_undoManager.isRedoPossible() ); + assertArrayEquals( ">0 descriptions for an empty undo stack?", + new String[0], i_undoManager.getAllUndoActionTitles() ); + assertArrayEquals( ">0 descriptions for an empty redo stack?", + new String[0], i_undoManager.getAllRedoActionTitles() ); + + // add two actions, one directly, one within a context + final CustomUndoAction action1 = new CustomUndoAction( "UndoAction1" ); + i_undoManager.addUndoAction( action1 ); + assertEquals( "Adding an undo action not observed by the listener", 1, m_undoListener.getUndoActionsAdded() ); + assertEquals( "Adding an undo action did not notify the proper title", + action1.getTitle(), m_undoListener.getMostRecentlyAddedActionTitle() ); + final String contextTitle = "Undo Context"; + i_undoManager.enterUndoContext( contextTitle ); + final CustomUndoAction action2 = new CustomUndoAction( "UndoAction2" ); + i_undoManager.addUndoAction( action2 ); + assertEquals( "Adding an undo action not observed by the listener", + 2, m_undoListener.getUndoActionsAdded() ); + assertEquals( "Adding an undo action did not notify the proper title", + action2.getTitle(), m_undoListener.getMostRecentlyAddedActionTitle() ); + i_undoManager.leaveUndoContext(); + + // see if the manager has proper descriptions + assertArrayEquals( "unexpected Redo descriptions after adding two actions", + new String[0], i_undoManager.getAllRedoActionTitles() ); + assertArrayEquals( "unexpected Undo descriptions after adding two actions", + new String[]{contextTitle, action1.getTitle()}, i_undoManager.getAllUndoActionTitles() ); + + // undo one action + i_undoManager.undo(); + assertEquals( "improper action title notified during programmatic Undo", + contextTitle, m_undoListener.getMostRecentlyUndoneTitle() ); + assertTrue( "nested custom undo action has not been undone as expected", action2.undoCalled() ); + assertFalse( "nested custom undo action has not been undone as expected", action1.undoCalled() ); + assertArrayEquals( "unexpected Redo descriptions after undoing a nested custom action", + new String[]{contextTitle}, i_undoManager.getAllRedoActionTitles() ); + assertArrayEquals( "unexpected Undo descriptions after undoing a nested custom action", + new String[]{action1.getTitle()}, i_undoManager.getAllUndoActionTitles() ); + + // undo the second action, via UI dispatches + m_currentTestCase.getDocument().getCurrentView().dispatch( ".uno:Undo" ); + assertEquals( "improper action title notified during UI Undo", action1.getTitle(), m_undoListener.getMostRecentlyUndoneTitle() ); + assertTrue( "nested custom undo action has not been undone as expected", action1.undoCalled() ); + assertArrayEquals( "unexpected Redo descriptions after undoing the second custom action", + new String[]{action1.getTitle(), contextTitle}, i_undoManager.getAllRedoActionTitles() ); + assertArrayEquals( "unexpected Undo descriptions after undoing the second custom action", + new String[0], i_undoManager.getAllUndoActionTitles() ); + + // check the actions are disposed when the stacks are cleared + i_undoManager.clear(); + assertTrue( action1.disposed() && action2.disposed() ); + } + + // ----------------------------------------------------------------------------------------------------------------- + private void impl_testLocking( final XUndoManager i_undoManager ) throws com.sun.star.uno.Exception + { + i_undoManager.reset(); + m_undoListener.reset(); + + // implicit Undo actions, triggered by changes to the document + assertFalse( "unexpected initial locking state", i_undoManager.isLocked() ); + i_undoManager.lock(); + assertTrue( "just locked the manager, why does it lie?", i_undoManager.isLocked() ); + m_currentTestCase.doSingleModification(); + assertEquals( "when the Undo manager is locked, no implicit additions should happen", + 0, m_undoListener.getUndoActionsAdded() ); + i_undoManager.unlock(); + assertEquals( "unlock is not expected to add collected actions - they should be discarded", + 0, m_undoListener.getUndoActionsAdded() ); + assertFalse( "just unlocked the manager, why does it lie?", i_undoManager.isLocked() ); + + // explicit Undo actions + i_undoManager.lock(); + i_undoManager.addUndoAction( new CustomUndoAction() ); + i_undoManager.unlock(); + assertEquals( "explicit Undo actions are expected to be ignored when the manager is locked", + 0, m_undoListener.getUndoActionsAdded() ); + + // Undo contexts while being locked + i_undoManager.lock(); + i_undoManager.enterUndoContext( "Dummy Context" ); + i_undoManager.enterHiddenUndoContext(); + assertEquals( "entering Undo contexts should be ignored when the manager is locked", 0, m_undoListener.getCurrentUndoContextDepth() ); + i_undoManager.leaveUndoContext(); + i_undoManager.leaveUndoContext(); + i_undoManager.unlock(); + + // |unlock| error handling + assertFalse( "internal error: manager should not be locked at this point in time", i_undoManager.isLocked() ); + boolean caughtExpected = false; + try { i_undoManager.unlock(); } catch ( final NotLockedException e ) { caughtExpected = true; } + assertTrue( "unlocking the manager when it is not locked should throw", caughtExpected ); + } + + // ----------------------------------------------------------------------------------------------------------------- + private void impl_testContextHandling( final XUndoManager i_undoManager ) throws com.sun.star.uno.Exception + { + // ............................................................................................................. + // part I: non-empty contexts + i_undoManager.reset(); + m_undoListener.reset(); + + // put one action on the undo and one on the redo stack, as precondition for the following tests + final XUndoAction undoAction1 = new CustomUndoAction( "Undo Action 1" ); + i_undoManager.addUndoAction( undoAction1 ); + final XUndoAction undoAction2 = new CustomUndoAction( "Undo Action 2" ); + i_undoManager.addUndoAction( undoAction2 ); + i_undoManager.undo(); + assertTrue( "precondition for context handling tests not met (1)", i_undoManager.isUndoPossible() ); + assertTrue( "precondition for context handling tests not met (2)", i_undoManager.isRedoPossible() ); + assertArrayEquals( new String[] { undoAction1.getTitle() }, i_undoManager.getAllUndoActionTitles() ); + assertArrayEquals( new String[] { undoAction2.getTitle() }, i_undoManager.getAllRedoActionTitles() ); + + final String[] expectedRedoActionComments = new String[] { undoAction2.getTitle() }; + assertArrayEquals( expectedRedoActionComments, i_undoManager.getAllRedoActionTitles() ); + + // enter a context + i_undoManager.enterUndoContext( "Undo Context" ); + // this should not (yet) touch the redo stack + assertArrayEquals( expectedRedoActionComments, i_undoManager.getAllRedoActionTitles() ); + assertEquals( "unexpected undo context depth after entering a context", 1, m_undoListener.getCurrentUndoContextDepth() ); + // add a single action + XUndoAction undoAction3 = new CustomUndoAction( "Undo Action 3" ); + i_undoManager.addUndoAction( undoAction3 ); + // still, the redo stack should be untouched - added at a lower level does not affect it at all + assertArrayEquals( expectedRedoActionComments, i_undoManager.getAllRedoActionTitles() ); + + // while the context is open, its title should already contribute to the stack, ... + assertEquals( "Undo Context", i_undoManager.getCurrentUndoActionTitle() ); + // ... getAllUndo/RedoActionTitles should operate on the top level, not on the level defined by the open + // context, ... + assertArrayEquals( new String[] { "Undo Context", undoAction1.getTitle() }, + i_undoManager.getAllUndoActionTitles() ); + // ... but Undo and Redo should be impossible as long as the context is open + assertFalse( i_undoManager.isUndoPossible() ); + assertFalse( i_undoManager.isRedoPossible() ); + + // leave the context, check the listener has been notified properly, and the notified context depth is correct + i_undoManager.leaveUndoContext(); + assertTrue( m_undoListener.wasContextLeft() ); + assertFalse( m_undoListener.wasHiddenContextLeft() ); + assertFalse( m_undoListener.hasContextBeenCancelled() ); + assertEquals( "unexpected undo context depth leaving a non-empty context", 0, m_undoListener.getCurrentUndoContextDepth() ); + // leaving a non-empty context should have cleare the redo stack + assertArrayEquals( new String[0], i_undoManager.getAllRedoActionTitles() ); + assertTrue( m_undoListener.wasRedoStackCleared() ); + + // ............................................................................................................. + // part II: empty contexts + i_undoManager.reset(); + m_undoListener.reset(); + + // enter a context, leave it immediately without adding an action to it + i_undoManager.enterUndoContext( "Undo Context" ); + i_undoManager.leaveUndoContext(); + assertFalse( m_undoListener.wasContextLeft() ); + assertFalse( m_undoListener.wasHiddenContextLeft() ); + assertTrue( m_undoListener.hasContextBeenCancelled() ); + assertFalse( "leaving an empty context should silently remove it, and not contribute to the stack", + i_undoManager.isUndoPossible() ); + } + + // ----------------------------------------------------------------------------------------------------------------- + private void impl_testNestedContexts( final XUndoManager i_undoManager ) throws com.sun.star.uno.Exception + { + i_undoManager.reset(); + m_undoListener.reset(); + i_undoManager.enterUndoContext( "context 1" ); + i_undoManager.enterUndoContext( "context 1.1" ); + final CustomUndoAction action1 = new CustomUndoAction( "action 1.1.1" ); + i_undoManager.addUndoAction( action1 ); + i_undoManager.enterUndoContext( "context 1.1.2" ); + final CustomUndoAction action2 = new CustomUndoAction( "action 1.1.2.1" ); + i_undoManager.addUndoAction( action2 ); + i_undoManager.leaveUndoContext(); + final CustomUndoAction action3 = new CustomUndoAction( "action 1.1.3" ); + i_undoManager.addUndoAction( action3 ); + i_undoManager.leaveUndoContext(); + i_undoManager.leaveUndoContext(); + final CustomUndoAction action4 = new CustomUndoAction( "action 1.2" ); + i_undoManager.addUndoAction( action4 ); + + i_undoManager.undo(); + assertEquals( "undoing a single action notifies a wrong title", action4.getTitle(), m_undoListener.getMostRecentlyUndoneTitle() ); + assertTrue( "custom Undo not called", action4.undoCalled() ); + assertFalse( "too many custom Undos called", action1.undoCalled() || action2.undoCalled() || action3.undoCalled() ); + i_undoManager.undo(); + assertTrue( "nested actions not properly undone", action1.undoCalled() && action2.undoCalled() && action3.undoCalled() ); + } + + // ----------------------------------------------------------------------------------------------------------------- + private void impl_testErrorHandling( final XUndoManager i_undoManager ) throws com.sun.star.uno.Exception + { + i_undoManager.reset(); + m_undoListener.reset(); + + // try retrieving the comments for the current Undo/Redo - this should fail + boolean caughtExpected = false; + try { i_undoManager.getCurrentUndoActionTitle(); } + catch( final EmptyUndoStackException e ) { caughtExpected = true; } + assertTrue( "trying the title of the current Undo action is expected to fail for an empty stack", caughtExpected ); + + caughtExpected = false; + try { i_undoManager.getCurrentRedoActionTitle(); } + catch( final EmptyUndoStackException e ) { caughtExpected = true; } + assertTrue( "trying the title of the current Redo action is expected to fail for an empty stack", caughtExpected ); + + caughtExpected = false; + try { i_undoManager.undo(); } catch ( final EmptyUndoStackException e ) { caughtExpected = true; } + assertTrue( "undo should throw if no Undo action is on the stack", caughtExpected ); + + caughtExpected = false; + try { i_undoManager.redo(); } catch ( final EmptyUndoStackException e ) { caughtExpected = true; } + assertTrue( "redo should throw if no Redo action is on the stack", caughtExpected ); + + caughtExpected = false; + try { i_undoManager.leaveUndoContext(); } catch ( final InvalidStateException e ) { caughtExpected = true; } + assertTrue( "leaveUndoContext should throw if no context is currently open", caughtExpected ); + + caughtExpected = false; + try { i_undoManager.addUndoAction( null ); } catch ( com.sun.star.lang.IllegalArgumentException e ) { caughtExpected = true; } + assertTrue( "adding a NULL action should be rejected", caughtExpected ); + + i_undoManager.reset(); + i_undoManager.addUndoAction( new CustomUndoAction() ); + i_undoManager.addUndoAction( new CustomUndoAction() ); + i_undoManager.undo(); + i_undoManager.enterUndoContext( "Undo Context" ); + // those methods should fail when a context is open: + final String[] methodNames = new String[] { "undo", "redo", "clear", "clearRedo" }; + for ( int i=0; i<methodNames.length; ++i ) + { + caughtExpected = false; + try + { + Method method = i_undoManager.getClass().getMethod( methodNames[i], new Class[0] ); + method.invoke( i_undoManager, new Object[0] ); + } + catch ( IllegalAccessException ex ) { } + catch ( IllegalArgumentException ex ) { } + catch ( InvocationTargetException ex ) + { + Throwable targetException = ex.getTargetException(); + caughtExpected = ( targetException instanceof UndoContextNotClosedException ); + } + catch ( NoSuchMethodException ex ) { } + catch ( SecurityException ex ) { } + + assertTrue( methodNames[i] + " should be rejected when there is an open context", caughtExpected ); + } + i_undoManager.leaveUndoContext(); + + // try Undo actions which fail in their Undo/Redo + for ( int i=0; i<4; ++i ) + { + final boolean undo = ( i < 2 ); + final boolean doByAPI = ( i % 2 ) == 0; + + i_undoManager.reset(); + i_undoManager.addUndoAction( new CustomUndoAction() ); + i_undoManager.addUndoAction( new FailingUndoAction( undo ? FAIL_UNDO : FAIL_REDO ) ); + i_undoManager.addUndoAction( new CustomUndoAction() ); + i_undoManager.undo(); + if ( !undo ) + i_undoManager.undo(); + // assert preconditions for the below test + assertTrue( i_undoManager.isUndoPossible() ); + assertTrue( i_undoManager.isRedoPossible() ); + + boolean caughtUndoFailed = false; + try + { + if ( undo ) + if ( doByAPI ) + i_undoManager.undo(); + else + m_currentTestCase.getDocument().getCurrentView().dispatch( ".uno:Undo" ); + else + if ( doByAPI ) + i_undoManager.redo(); + else + m_currentTestCase.getDocument().getCurrentView().dispatch( ".uno:Redo" ); + } + catch ( UndoFailedException e ) + { + caughtUndoFailed = true; + } + if ( doByAPI ) + assertTrue( "Exceptions in XUndoAction.undo should be propagated at the API", caughtUndoFailed ); + else + assertFalse( "Undo/Redo by UI should not let escape Exceptions", caughtUndoFailed ); + if ( undo ) + { + assertFalse( "a failing Undo should clear the Undo stack", i_undoManager.isUndoPossible() ); + assertTrue( "a failing Undo should /not/ clear the Redo stack", i_undoManager.isRedoPossible() ); + } + else + { + assertTrue( "a failing Redo should /not/ clear the Undo stack", i_undoManager.isUndoPossible() ); + assertFalse( "a failing Redo should clear the Redo stack", i_undoManager.isRedoPossible() ); + } + } + } + + // ----------------------------------------------------------------------------------------------------------------- + private void impl_testStackHandling( final XUndoManager i_undoManager ) throws com.sun.star.uno.Exception + { + i_undoManager.reset(); + m_undoListener.reset(); + + assertFalse( i_undoManager.isUndoPossible() ); + assertFalse( i_undoManager.isRedoPossible() ); + + i_undoManager.addUndoAction( new CustomUndoAction() ); + assertTrue( i_undoManager.isUndoPossible() ); + assertFalse( i_undoManager.isRedoPossible() ); + i_undoManager.addUndoAction( new CustomUndoAction() ); + assertTrue( i_undoManager.isUndoPossible() ); + assertFalse( i_undoManager.isRedoPossible() ); + i_undoManager.undo(); + assertTrue( i_undoManager.isUndoPossible() ); + assertTrue( i_undoManager.isRedoPossible() ); + i_undoManager.undo(); + assertFalse( i_undoManager.isUndoPossible() ); + assertTrue( i_undoManager.isRedoPossible() ); + i_undoManager.addUndoAction( new CustomUndoAction() ); + assertTrue( i_undoManager.isUndoPossible() ); + assertFalse( "adding a new action should have cleared the Redo stack", i_undoManager.isRedoPossible() ); + } + + // ----------------------------------------------------------------------------------------------------------------- + private void impl_testClearance( final XUndoManager i_undoManager ) throws com.sun.star.uno.Exception + { + i_undoManager.reset(); + m_undoListener.reset(); + + // add an action, clear the stack, verify the listener has been called + i_undoManager.addUndoAction( new CustomUndoAction() ); + assertFalse( "clearance listener unexpectedly called", m_undoListener.wereStacksCleared() ); + assertFalse( "redo-clearance listener unexpectedly called", m_undoListener.wasRedoStackCleared() ); + i_undoManager.clear(); + assertTrue( "clearance listener not called as expected", m_undoListener.wereStacksCleared() ); + assertFalse( "redo-clearance listener unexpectedly called (2)", m_undoListener.wasRedoStackCleared() ); + + // ensure the listener is also called if the stack is actually empty at the moment of the call + m_undoListener.reset(); + assertFalse( i_undoManager.isUndoPossible() ); + i_undoManager.clear(); + assertTrue( "clearance listener is also expected to be called if the stack was empty before", m_undoListener.wereStacksCleared() ); + + // ensure the proper listeners are called for clearRedo + m_undoListener.reset(); + i_undoManager.clearRedo(); + assertFalse( m_undoListener.wereStacksCleared() ); + assertTrue( m_undoListener.wasRedoStackCleared() ); + + // ensure the redo listener is also called upon implicit redo stack clearance + m_undoListener.reset(); + i_undoManager.addUndoAction( new CustomUndoAction() ); + i_undoManager.addUndoAction( new CustomUndoAction() ); + i_undoManager.undo(); + assertTrue( i_undoManager.isUndoPossible() ); + assertTrue( i_undoManager.isRedoPossible() ); + i_undoManager.addUndoAction( new CustomUndoAction() ); + assertFalse( i_undoManager.isRedoPossible() ); + assertTrue( "implicit clearance of the Redo stack does not notify listeners", m_undoListener.wasRedoStackCleared() ); + + // test resetting the manager + m_undoListener.reset(); + i_undoManager.addUndoAction( new CustomUndoAction() ); + i_undoManager.addUndoAction( new CustomUndoAction() ); + i_undoManager.undo(); + assertTrue( i_undoManager.isUndoPossible() ); + assertTrue( i_undoManager.isRedoPossible() ); + i_undoManager.reset(); + assertFalse( i_undoManager.isUndoPossible() ); + assertFalse( i_undoManager.isRedoPossible() ); + assertTrue( "|reset| does not properly notify", m_undoListener.wasManagerReset() ); + + // resetting the manager, with open undo contexts + m_undoListener.reset(); + i_undoManager.addUndoAction( new CustomUndoAction() ); + i_undoManager.enterUndoContext( "Undo Context" ); + i_undoManager.addUndoAction( new CustomUndoAction() ); + i_undoManager.enterHiddenUndoContext(); + i_undoManager.reset(); + assertTrue( "|reset| while contexts are open does not properly notify", m_undoListener.wasManagerReset() ); + // verify the manager really has the proper context depth now + i_undoManager.enterUndoContext( "Undo Context" ); + assertEquals( "seems that |reset| did not really close the open contexts", 1, m_undoListener.getCurrentUndoContextDepth() ); + } + + // ----------------------------------------------------------------------------------------------------------------- + private void impl_testHiddenContexts( final XUndoManager i_undoManager ) throws com.sun.star.uno.Exception + { + i_undoManager.reset(); + m_undoListener.reset(); + assertFalse( "precondition for testing hidden undo contexts not met", i_undoManager.isUndoPossible() ); + + // entering a hidden context should be rejected if the stack is empty + boolean caughtExpected = false; + try { i_undoManager.enterHiddenUndoContext(); } + catch ( final EmptyUndoStackException e ) { caughtExpected = true; } + assertTrue( "entering hidden contexts should be denied on an empty stack", caughtExpected ); + + // but it should be allowed if the context is not empty + final CustomUndoAction undoAction0 = new CustomUndoAction( "Step 0" ); + i_undoManager.addUndoAction( undoAction0 ); + final CustomUndoAction undoAction1 = new CustomUndoAction( "Step 1" ); + i_undoManager.addUndoAction( undoAction1 ); + i_undoManager.enterHiddenUndoContext(); + final CustomUndoAction hiddenUndoAction = new CustomUndoAction( "hidden context action" ); + i_undoManager.addUndoAction( hiddenUndoAction ); + i_undoManager.leaveUndoContext(); + assertFalse( "leaving a hidden should not call |leftUndocontext|", m_undoListener.wasContextLeft() ); + assertTrue( "leaving a hidden does not call |leftHiddenUndocontext|", m_undoListener.wasHiddenContextLeft() ); + assertFalse( "leaving a non-empty hidden context claims to have cancelled it", m_undoListener.hasContextBeenCancelled() ); + assertEquals( "leaving a hidden context is not properly notified", 0, m_undoListener.getCurrentUndoContextDepth() ); + assertArrayEquals( "unexpected Undo stack after leaving a hidden context", + new String[] { undoAction1.getTitle(), undoAction0.getTitle() }, + i_undoManager.getAllUndoActionTitles() ); + + // and then calling |undo| once should not only undo everything in the hidden context, but also + // the previous action - but not more + i_undoManager.undo(); + assertTrue( "Undo after leaving a hidden context does not actually undo the context actions", + hiddenUndoAction.undoCalled() ); + assertTrue( "Undo after leaving a hidden context does not undo the predecessor action", + undoAction1.undoCalled() ); + assertFalse( "Undo after leaving a hidden context undoes too much", + undoAction0.undoCalled() ); + + // leaving an empty hidden context should call the proper notification method + m_undoListener.reset(); + i_undoManager.enterHiddenUndoContext(); + i_undoManager.leaveUndoContext(); + assertFalse( m_undoListener.wasContextLeft() ); + assertFalse( m_undoListener.wasHiddenContextLeft() ); + assertTrue( m_undoListener.hasContextBeenCancelled() ); + + // nesting hidden and normal contexts + m_undoListener.reset(); + i_undoManager.reset(); + final CustomUndoAction action0 = new CustomUndoAction( "action 0" ); + i_undoManager.addUndoAction( action0 ); + i_undoManager.enterUndoContext( "context 1" ); + final CustomUndoAction action1 = new CustomUndoAction( "action 1" ); + i_undoManager.addUndoAction( action1 ); + i_undoManager.enterHiddenUndoContext(); + final CustomUndoAction action2 = new CustomUndoAction( "action 2" ); + i_undoManager.addUndoAction( action2 ); + i_undoManager.enterUndoContext( "context 2" ); + // is entering a hidden context rejected even at the nesting level > 0 (the above test was for nesting level == 0)? + caughtExpected = false; + try { i_undoManager.enterHiddenUndoContext(); } + catch( final EmptyUndoStackException e ) { caughtExpected = true; } + assertTrue( "at a nesting level > 0, denied hidden contexts does not work as expected", caughtExpected ); + final CustomUndoAction action3 = new CustomUndoAction( "action 3" ); + i_undoManager.addUndoAction( action3 ); + i_undoManager.enterHiddenUndoContext(); + assertEquals( "mixed hidden/normal context do are not properly notified", 4, m_undoListener.getCurrentUndoContextDepth() ); + i_undoManager.leaveUndoContext(); + assertTrue( "the left context was empty - why wasn't 'cancelled' notified?", m_undoListener.hasContextBeenCancelled() ); + assertFalse( m_undoListener.wasContextLeft() ); + assertFalse( m_undoListener.wasHiddenContextLeft() ); + i_undoManager.leaveUndoContext(); + i_undoManager.leaveUndoContext(); + i_undoManager.leaveUndoContext(); + i_undoManager.undo(); + assertFalse( "one action too much has been undone", action0.undoCalled() ); + assertTrue( action1.undoCalled() ); + assertTrue( action2.undoCalled() ); + assertTrue( action3.undoCalled() ); + } + + // ----------------------------------------------------------------------------------------------------------------- + private XComponentContext getContext() + { + return m_connection.getComponentContext(); + } + + // ----------------------------------------------------------------------------------------------------------------- + private XMultiServiceFactory getORB() + { + final XMultiServiceFactory xMSF1 = UnoRuntime.queryInterface( + XMultiServiceFactory.class, getContext().getServiceManager() ); + return xMSF1; + } + + // ----------------------------------------------------------------------------------------------------------------- + @BeforeClass + public static void setUpConnection() throws Exception + { + System.out.println( "--------------------------------------------------------------------------------" ); + System.out.println( "starting class: " + UndoManager.class.getName() ); + System.out.println( "connecting ..." ); + m_connection.setUp(); + } + + // ----------------------------------------------------------------------------------------------------------------- + @AfterClass + public static void tearDownConnection() throws InterruptedException, com.sun.star.uno.Exception + { + System.out.println(); + System.out.println( "tearing down connection" ); + m_connection.tearDown(); + System.out.println( "finished class: " + UndoManager.class.getName() ); + System.out.println( "--------------------------------------------------------------------------------" ); + } + + // ----------------------------------------------------------------------------------------------------------------- + private static class CustomUndoAction implements XUndoAction, XComponent + { + CustomUndoAction() + { + m_title = "Custom Undo Action"; + } + + CustomUndoAction( final String i_title ) + { + m_title = i_title; + } + + public String getTitle() + { + return m_title; + } + + public void undo() throws UndoFailedException + { + m_undoCalled = true; + } + + public void redo() throws UndoFailedException + { + m_redoCalled = true; + } + + public void dispose() + { + m_disposed = true; + } + + public void addEventListener( XEventListener xl ) + { + fail( "addEventListener is not expected to be called in the course of this test" ); + } + + public void removeEventListener( XEventListener xl ) + { + fail( "removeEventListener is not expected to be called in the course of this test" ); + } + + boolean undoCalled() { return m_undoCalled; } + boolean redoCalled() { return m_redoCalled; } + boolean disposed() { return m_disposed; } + + private final String m_title; + private boolean m_undoCalled = false; + private boolean m_redoCalled = false; + private boolean m_disposed = false; + } + + private static short FAIL_UNDO = 1; + private static short FAIL_REDO = 2; + + private static class FailingUndoAction implements XUndoAction + { + FailingUndoAction( final short i_failWhich ) + { + m_failWhich = i_failWhich; + } + + public String getTitle() + { + return "failing undo"; + } + + public void undo() throws UndoFailedException + { + if ( m_failWhich != FAIL_REDO ) + impl_throw(); + } + + public void redo() throws UndoFailedException + { + if ( m_failWhich != FAIL_UNDO ) + impl_throw(); + } + + private void impl_throw() throws UndoFailedException + { + throw new UndoFailedException(); + } + + private final short m_failWhich; + } + + // ----------------------------------------------------------------------------------------------------------------- + private static class CountingUndoAction implements XUndoAction + { + CountingUndoAction( final int i_expectedOrder, final Object i_lock, final Integer[] i_actionsUndoneCounter ) + { + m_expectedOrder = i_expectedOrder; + m_lock = i_lock; + m_actionsUndoneCounter = i_actionsUndoneCounter; + } + + public String getTitle() + { + return "Counting Undo Action"; + } + + public void undo() throws UndoFailedException + { + synchronized( m_lock ) + { + assertEquals( "Undo action called out of order", m_expectedOrder, m_actionsUndoneCounter[0].intValue() ); + ++m_actionsUndoneCounter[0]; + } + } + + public void redo() throws UndoFailedException + { + fail( "CountingUndoAction.redo is not expected to be called in this test." ); + } + private final int m_expectedOrder; + private final Object m_lock; + private Integer[] m_actionsUndoneCounter; + } + + // ----------------------------------------------------------------------------------------------------------------- + private static String getCallbackUndoContextTitle() + { + return "Some Unfinished Undo Context"; + } + + // ----------------------------------------------------------------------------------------------------------------- + private static String getCallbackComponentServiceName() + { + return "org.openoffice.complex.sfx2.Callback"; + } + + // ----------------------------------------------------------------------------------------------------------------- + /** + * a factory for a callback component which, at OOo runtime, is inserted into OOo's "component repository" + */ + private class CallbackComponentFactory implements XSingleComponentFactory, XServiceInfo, XComponent + { + public Object createInstanceWithContext( XComponentContext i_context ) throws com.sun.star.uno.Exception + { + return new CallbackComponent(); + } + + public Object createInstanceWithArgumentsAndContext( Object[] i_arguments, XComponentContext i_context ) throws com.sun.star.uno.Exception + { + return createInstanceWithContext( i_context ); + } + + public String getImplementationName() + { + return "org.openoffice.complex.sfx2.CallbackComponent"; + } + + public boolean supportsService( String i_serviceName ) + { + return i_serviceName.equals( getCallbackComponentServiceName() ); + } + + public String[] getSupportedServiceNames() + { + return new String[] { getCallbackComponentServiceName() }; + } + + public void dispose() + { + final EventObject event = new EventObject( this ); + + final ArrayList eventListenersCopy = (ArrayList)m_eventListeners.clone(); + final Iterator iter = eventListenersCopy.iterator(); + while ( iter.hasNext() ) + { + ((XEventListener)iter.next()).disposing( event ); + } + } + + public void addEventListener( XEventListener i_listener ) + { + if ( i_listener != null ) + m_eventListeners.add( i_listener ); + } + + public void removeEventListener( XEventListener i_listener ) + { + m_eventListeners.remove( i_listener ); + } + + private final ArrayList m_eventListeners = new ArrayList(); + }; + + // ----------------------------------------------------------------------------------------------------------------- + private class CallbackComponent implements XJob, XTypeProvider + { + CallbackComponent() + { + } + + public Object execute( NamedValue[] i_parameters ) throws com.sun.star.lang.IllegalArgumentException, com.sun.star.uno.Exception + { + // this method is called from within the Basic script which is to check whether the OOo framework + // properly cleans up unfinished Undo contexts. It is called immediately after the context has been + // entered, so verify the expected Undo manager state. + assertEquals( getCallbackUndoContextTitle(), m_undoListener.getCurrentUndoContextTitle() ); + assertEquals( 1, m_undoListener.getCurrentUndoContextDepth() ); + + synchronized( m_callbackCondition ) + { + m_callbackCalled = true; + m_callbackCondition.notifyAll(); + } + return m_closeAfterCallback ? "close" : ""; + } + + public Type[] getTypes() + { + final Class interfaces[] = getClass().getInterfaces(); + Type types[] = new Type[ interfaces.length ]; + for ( int i = 0; i < interfaces.length; ++i ) + types[i] = new Type(interfaces[i]); + return types; + } + + public byte[] getImplementationId() + { + return getClass().toString().getBytes(); + } + } + + private static final OfficeConnection m_connection = new OfficeConnection(); + private DocumentTest m_currentTestCase; + private OfficeDocument m_currentDocument; + private UndoListener m_undoListener; + private CallbackComponentFactory m_callbackFactory = null; + private boolean m_callbackCalled = false; + private boolean m_closeAfterCallback = false; + private final Object m_callbackCondition = new Object(); +} diff --git a/sfx2/qa/complex/docinfo/makefile.mk b/sfx2/qa/complex/sfx2/makefile.mk index 0c350f1a9618..20b170fba3b4 100644..100755 --- a/sfx2/qa/complex/docinfo/makefile.mk +++ b/sfx2/qa/complex/sfx2/makefile.mk @@ -25,32 +25,60 @@ # #************************************************************************* -PRJ = ..$/..$/.. -TARGET = DocumentProperties +.IF "$(OOO_JUNIT_JAR)" == "" +nothing .PHONY: + @echo ----------------------------------------------------- + @echo - JUnit not available, not building anything + @echo ----------------------------------------------------- +.ELSE # IF "$(OOO_JUNIT_JAR)" != "" + +PRJ = ../../.. PRJNAME = sfx2 -PACKAGE = complex$/docinfo +TARGET = qa_complex +PACKAGE = complex/sfx2 # --- Settings ----------------------------------------------------- - .INCLUDE: settings.mk #----- compile .java files ----------------------------------------- -JARFILES = ridl.jar unoil.jar jurt.jar juh.jar java_uno.jar OOoRunner.jar -JAVAFILES = DocumentProperties.java - -#----- make a jar from compiled files ------------------------------ +JARFILES = OOoRunnerLight.jar ridl.jar test.jar test-tools.jar unoil.jar +EXTRAJARFILES = $(OOO_JUNIT_JAR) +JAVAFILES = $(shell @$(FIND) . -name "*.java") \ -MAXLINELENGTH = 100000 +#----- create a jar from compiled files ---------------------------- -JARCLASSDIRS = $(PACKAGE) JARTARGET = $(TARGET).jar -JARCOMPRESS = TRUE + +#----- JUnit tests class ------------------------------------------- + +JAVATESTFILES = \ + DocumentInfo.java \ + DocumentProperties.java \ + StandaloneDocumentInfo.java \ + DocumentMetadataAccess.java \ + UndoManager.java \ + +# disabled: #i115674# +# GlobalEventBroadcaster.java \ # --- Targets ------------------------------------------------------ -.INCLUDE : target.mk +.INCLUDE: target.mk + +ALL : ALLTAR + +# --- subsequent tests --------------------------------------------- + +.IF "$(OOO_SUBSEQUENT_TESTS)" != "" + +.INCLUDE: installationtest.mk + +ALLTAR : javatest + + # Sample how to debug + # JAVAIFLAGS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=9003,suspend=y +.END # "$(OOO_SUBSEQUENT_TESTS)" == "" -run: - $(JAVAI) $(JAVAIFLAGS) -cp $(CLASSPATH) org.openoffice.Runner -TestBase java_complex -o $(PACKAGE:s#$/#.#).$(JAVAFILES:b) +.END # ELSE "$(OOO_JUNIT_JAR)" != "" diff --git a/sfx2/qa/complex/standalonedocumentinfo/StandaloneDocumentInfoTest.java b/sfx2/qa/complex/sfx2/standalonedocinfo/StandaloneDocumentInfoTest.java index f5512bf9723b..d255f3d16822 100644..100755 --- a/sfx2/qa/complex/standalonedocumentinfo/StandaloneDocumentInfoTest.java +++ b/sfx2/qa/complex/sfx2/standalonedocinfo/StandaloneDocumentInfoTest.java @@ -24,7 +24,7 @@ * for a copy of the LGPLv3 License. * ************************************************************************/ -package complex.standalonedocumentinfo; +package complex.sfx2.standalonedocinfo; public interface StandaloneDocumentInfoTest { boolean test(); diff --git a/sfx2/qa/complex/standalonedocumentinfo/Test01.java b/sfx2/qa/complex/sfx2/standalonedocinfo/Test01.java index 92c59d81e1c4..bf54bb4ca90b 100644..100755 --- a/sfx2/qa/complex/standalonedocumentinfo/Test01.java +++ b/sfx2/qa/complex/sfx2/standalonedocinfo/Test01.java @@ -24,16 +24,10 @@ * for a copy of the LGPLv3 License. * ************************************************************************/ -package complex.standalonedocumentinfo; - -import com.sun.star.beans.Property; -import com.sun.star.beans.XProperty; -import com.sun.star.beans.XPropertySetInfo; -import com.sun.star.io.IOException; -import com.sun.star.io.XInputStream; -import com.sun.star.io.XOutputStream; -import complexlib.ComplexTestCase; +package complex.sfx2.standalonedocinfo; +import complex.sfx2.standalonedocinfo.TestHelper; +import complex.sfx2.standalonedocinfo.StandaloneDocumentInfoTest; import com.sun.star.lang.XMultiServiceFactory; import com.sun.star.document.XStandaloneDocumentInfo; import com.sun.star.io.XTempFile; @@ -43,19 +37,15 @@ import com.sun.star.beans.PropertyValue; import com.sun.star.beans.XPropertySet; import com.sun.star.uno.UnoRuntime; import com.sun.star.uno.AnyConverter; -import com.sun.star.task.ErrorCodeIOException; -import java.util.Properties; -import java.util.Random; -import share.LogWriter; public class Test01 implements StandaloneDocumentInfoTest { XMultiServiceFactory m_xMSF = null; TestHelper m_aTestHelper = null; - public Test01 ( XMultiServiceFactory xMSF, LogWriter aLogWriter ) { + public Test01 ( XMultiServiceFactory xMSF ) { m_xMSF = xMSF; - m_aTestHelper = new TestHelper( aLogWriter, "Test01: " ); + m_aTestHelper = new TestHelper( "Test01: " ); } public boolean test() { @@ -71,19 +61,16 @@ public class Test01 implements StandaloneDocumentInfoTest { m_aTestHelper.Message ( "==============================" ); //create a new temporary file Object oTempFile = m_xMSF.createInstance ( "com.sun.star.io.TempFile" ); - XTempFile xTempFile = (XTempFile) UnoRuntime.queryInterface ( - XTempFile.class, oTempFile ); + XTempFile xTempFile = UnoRuntime.queryInterface(XTempFile.class, oTempFile); //create a text document and initiallize it Object oTextDocument = m_xMSF.createInstance ( "com.sun.star.text.TextDocument" ); - XLoadable xLoadable = (XLoadable) UnoRuntime.queryInterface ( - XLoadable.class, oTextDocument ); + XLoadable xLoadable = UnoRuntime.queryInterface(XLoadable.class, oTextDocument); xLoadable.initNew(); m_aTestHelper.Message ( "New document initialized." ); //store the instance to the temporary file URL - XStorable xStorable = (XStorable) UnoRuntime.queryInterface ( - XStorable.class, oTextDocument ); + XStorable xStorable = UnoRuntime.queryInterface(XStorable.class, oTextDocument); String sURL = AnyConverter.toString ( xTempFile.getUri () ); PropertyValue aProps[] = new PropertyValue[2]; aProps[0] = new PropertyValue(); @@ -101,15 +88,13 @@ public class Test01 implements StandaloneDocumentInfoTest { Object oStandaloneDocInfo = m_xMSF.createInstance ( "com.sun.star.document.StandaloneDocumentInfo" ); XStandaloneDocumentInfo xStandaloneDocInfo = - (XStandaloneDocumentInfo) UnoRuntime.queryInterface ( - XStandaloneDocumentInfo.class, oStandaloneDocInfo ); + UnoRuntime.queryInterface(XStandaloneDocumentInfo.class, oStandaloneDocInfo); xStandaloneDocInfo.loadFromURL ( sURL ); m_aTestHelper.Message ( "StandaloneDocumentInfo loaded." ); //get the title from the object and check it XPropertySet xPropSet = - (XPropertySet)UnoRuntime.queryInterface ( - XPropertySet.class, oStandaloneDocInfo ); + UnoRuntime.queryInterface(XPropertySet.class, oStandaloneDocInfo); String sTitle = xPropSet.getPropertyValue ( "Title" ).toString (); m_aTestHelper.Message ( "Get title: " + sTitle ); if ( sTitle.compareTo ( sDocTitle[i] ) != 0 ) { @@ -134,14 +119,12 @@ public class Test01 implements StandaloneDocumentInfoTest { Object oStandaloneDocInfo_ = m_xMSF.createInstance ( "com.sun.star.document.StandaloneDocumentInfo" ); XStandaloneDocumentInfo xStandaloneDocInfo_ = - (XStandaloneDocumentInfo)UnoRuntime.queryInterface ( - XStandaloneDocumentInfo.class, oStandaloneDocInfo_ ); + UnoRuntime.queryInterface(XStandaloneDocumentInfo.class, oStandaloneDocInfo_); xStandaloneDocInfo_.loadFromURL ( sURL ); m_aTestHelper.Message ( "New StandaloneDocumentInfo loaded." ); //get the title and check it - XPropertySet xPropSet_ = (XPropertySet)UnoRuntime.queryInterface ( - XPropertySet.class, oStandaloneDocInfo_ ); + XPropertySet xPropSet_ = UnoRuntime.queryInterface(XPropertySet.class, oStandaloneDocInfo_); String sTitle_ = xPropSet_.getPropertyValue ( "Title" ).toString (); m_aTestHelper.Message ( "Get new title: " + sTitle_ ); if ( sTitle_.compareTo ( sTitle ) != 0 ) { diff --git a/sfx2/qa/complex/standalonedocumentinfo/TestHelper.java b/sfx2/qa/complex/sfx2/standalonedocinfo/TestHelper.java index f319fe412227..a650ce9bb2e4 100644..100755 --- a/sfx2/qa/complex/standalonedocumentinfo/TestHelper.java +++ b/sfx2/qa/complex/sfx2/standalonedocinfo/TestHelper.java @@ -24,25 +24,25 @@ * for a copy of the LGPLv3 License. * ************************************************************************/ -package complex.standalonedocumentinfo; +package complex.sfx2.standalonedocinfo; -import share.LogWriter; public class TestHelper { - LogWriter m_aLogWriter; + String m_sTestPrefix; - /** Creates a new instance of TestHelper */ - public TestHelper ( LogWriter aLogWriter, String sTestPrefix ) { - m_aLogWriter = aLogWriter; + /** Creates a new instance of TestHelper + * @param sTestPrefix + */ + public TestHelper ( String sTestPrefix ) { m_sTestPrefix = sTestPrefix; } public void Error ( String sError ) { - m_aLogWriter.println ( m_sTestPrefix + "Error: " + sError ); + System.out.println ( m_sTestPrefix + "Error: " + sError ); } public void Message ( String sMessage ) { - m_aLogWriter.println ( m_sTestPrefix + sMessage ); + System.out.println ( m_sTestPrefix + sMessage ); } } diff --git a/sfx2/qa/complex/testdocuments/CUSTOM.odt b/sfx2/qa/complex/sfx2/testdocuments/CUSTOM.odt Binary files differindex 831a8f451dfd..831a8f451dfd 100644..100755 --- a/sfx2/qa/complex/testdocuments/CUSTOM.odt +++ b/sfx2/qa/complex/sfx2/testdocuments/CUSTOM.odt diff --git a/sfx2/qa/complex/testdocuments/TEST.odt b/sfx2/qa/complex/sfx2/testdocuments/TEST.odt Binary files differindex 7c6f0b60f7b0..7c6f0b60f7b0 100644..100755 --- a/sfx2/qa/complex/testdocuments/TEST.odt +++ b/sfx2/qa/complex/sfx2/testdocuments/TEST.odt diff --git a/sfx2/qa/complex/testdocuments/TESTRDFA.odt b/sfx2/qa/complex/sfx2/testdocuments/TESTRDFA.odt Binary files differindex d59739142df6..d59739142df6 100644..100755 --- a/sfx2/qa/complex/testdocuments/TESTRDFA.odt +++ b/sfx2/qa/complex/sfx2/testdocuments/TESTRDFA.odt diff --git a/sfx2/qa/complex/sfx2/testdocuments/empty.rdf b/sfx2/qa/complex/sfx2/testdocuments/empty.rdf new file mode 100755 index 000000000000..af62bab39dfa --- /dev/null +++ b/sfx2/qa/complex/sfx2/testdocuments/empty.rdf @@ -0,0 +1,13 @@ +<?xml version="1.0"?> + +<RDF + xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:s="http://www.w3.org/2000/01/rdf-schema#"> + +<!-- + This is the RDF Schema for the RDF data model as described in the + Resource Description Framework (RDF) Model and Syntax Specification + http://www.w3.org/TR/REC-rdf-syntax --> + +</RDF> diff --git a/sfx2/qa/complex/DocHelper/DialogThread.java b/sfx2/qa/complex/sfx2/tools/DialogThread.java index 7151ccbb292d..e67e65f218db 100644..100755 --- a/sfx2/qa/complex/DocHelper/DialogThread.java +++ b/sfx2/qa/complex/sfx2/tools/DialogThread.java @@ -24,7 +24,7 @@ * for a copy of the LGPLv3 License. * ************************************************************************/ -package complex.framework.DocHelper; +package complex.sfx2.tools; import com.sun.star.beans.PropertyValue; import com.sun.star.frame.XController; @@ -37,9 +37,6 @@ import com.sun.star.uno.UnoRuntime; import com.sun.star.util.URL; import com.sun.star.util.XURLTransformer; -import java.lang.Thread; - - /** * This class opens a given dialog in a separate Thread by dispatching an url * @@ -55,21 +52,17 @@ public class DialogThread extends Thread { this.m_url = url; } + @Override public void run() { - XModel aModel = (XModel) UnoRuntime.queryInterface(XModel.class, - m_xDoc); + XModel aModel = UnoRuntime.queryInterface( XModel.class, m_xDoc ); XController xController = aModel.getCurrentController(); //Opening Dialog try { - XDispatchProvider xDispProv = (XDispatchProvider) UnoRuntime.queryInterface( - XDispatchProvider.class, - xController.getFrame()); - XURLTransformer xParser = (com.sun.star.util.XURLTransformer) UnoRuntime.queryInterface( - XURLTransformer.class, - m_xMSF.createInstance( - "com.sun.star.util.URLTransformer")); + XDispatchProvider xDispProv = UnoRuntime.queryInterface( XDispatchProvider.class, xController.getFrame() ); + XURLTransformer xParser = UnoRuntime.queryInterface( XURLTransformer.class, + m_xMSF.createInstance( "com.sun.star.util.URLTransformer" ) ); // Because it's an in/out parameter // we must use an array of URL objects. diff --git a/sfx2/qa/complex/sfx2/tools/TestDocument.java b/sfx2/qa/complex/sfx2/tools/TestDocument.java new file mode 100755 index 000000000000..8f2108df358e --- /dev/null +++ b/sfx2/qa/complex/sfx2/tools/TestDocument.java @@ -0,0 +1,40 @@ +/************************************************************************* +* +* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +* +* Copyright 2000, 2010 Oracle and/or its affiliates. +* +* OpenOffice.org - a multi-platform office productivity suite +* +* This file is part of OpenOffice.org. +* +* OpenOffice.org is free software: you can redistribute it and/or modify +* it under the terms of the GNU Lesser General Public License version 3 +* only, as published by the Free Software Foundation. +* +* OpenOffice.org is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Lesser General Public License version 3 for more details +* (a copy is included in the LICENSE file that accompanied this code). +* +* You should have received a copy of the GNU Lesser General Public License +* version 3 along with OpenOffice.org. If not, see +* <http://www.openoffice.org/license.html> +* for a copy of the LGPLv3 License. +* +************************************************************************/ + +package complex.sfx2.tools; + +import java.io.File; +import org.openoffice.test.OfficeFileUrl; +import org.openoffice.test.Argument; + +public final class TestDocument { + public static String getUrl(String name) { + return OfficeFileUrl.getAbsolute(new File(Argument.get("tdoc"), name)); + } + + private TestDocument() {} +} diff --git a/sfx2/qa/complex/DocHelper/WriterHelper.java b/sfx2/qa/complex/sfx2/tools/WriterHelper.java index b65e8e915423..4767028572bb 100644..100755 --- a/sfx2/qa/complex/DocHelper/WriterHelper.java +++ b/sfx2/qa/complex/sfx2/tools/WriterHelper.java @@ -24,7 +24,7 @@ * for a copy of the LGPLv3 License. * ************************************************************************/ -package complex.framework.DocHelper; +package complex.sfx2.tools; import com.sun.star.accessibility.AccessibleRole; import com.sun.star.accessibility.XAccessible; @@ -40,7 +40,6 @@ import com.sun.star.text.XTextDocument; import com.sun.star.uno.UnoRuntime; import com.sun.star.util.XCloseable; -import complex.framework.DocHelper.DialogThread; import java.io.PrintWriter; import util.AccessibilityTools; @@ -73,19 +72,20 @@ public class WriterHelper { * @return if an error occurs the errormessage is returned and an empty String if not */ public String closeDoc(XTextDocument xTextDoc) { - XCloseable closer = (XCloseable) UnoRuntime.queryInterface( - XCloseable.class, xTextDoc); + XCloseable closer = UnoRuntime.queryInterface(XCloseable.class, xTextDoc); String err = ""; try { closer.close(true); } catch (com.sun.star.util.CloseVetoException e) { err = "couldn't close document " + e; + System.out.println(err); } return err; } + private XTextDocument xLocalDoc = null; /** a TextDocument is opened by pressing a button in a dialog given by uno-URL * @param url the uno-URL of the dialog to be opened * @param createButton the language dependend label of the button to be pressed @@ -95,30 +95,25 @@ public class WriterHelper { */ public XTextDocument openFromDialog(String url, String createButton, boolean destroyLocal) { - XTextDocument xLocalDoc = WriterTools.createTextDoc(m_xMSF); - XComponent comp = (XComponent) UnoRuntime.queryInterface( - XComponent.class, xLocalDoc); + xLocalDoc = WriterTools.createTextDoc(m_xMSF); + XComponent comp = UnoRuntime.queryInterface(XComponent.class, xLocalDoc); DialogThread diagThread = new DialogThread(comp, m_xMSF, url); diagThread.start(); shortWait(); if (createButton.length() > 1) { XExtendedToolkit tk = getToolkit(); - AccessibilityTools at = new AccessibilityTools(); Object atw = tk.getActiveTopWindow(); - XWindow xWindow = (XWindow) UnoRuntime.queryInterface( - XWindow.class, atw); + XWindow xWindow = UnoRuntime.queryInterface(XWindow.class, atw); - XAccessible xRoot = at.getAccessibleObject(xWindow); - XAccessibleContext buttonContext = at.getAccessibleObjectForRole( + XAccessible xRoot = AccessibilityTools.getAccessibleObject(xWindow); + XAccessibleContext buttonContext = AccessibilityTools.getAccessibleObjectForRole( xRoot, AccessibleRole.PUSH_BUTTON, createButton); - XAccessibleAction buttonAction = (XAccessibleAction) UnoRuntime.queryInterface( - XAccessibleAction.class, - buttonContext); + XAccessibleAction buttonAction = UnoRuntime.queryInterface(XAccessibleAction.class, buttonContext); try { System.out.println("Name: " + @@ -133,47 +128,52 @@ public class WriterHelper { XDesktop xDesktop = getDesktop(); - XTextDocument returnDoc = (XTextDocument) UnoRuntime.queryInterface( - XTextDocument.class, - xDesktop.getCurrentComponent()); + XTextDocument returnDoc = UnoRuntime.queryInterface(XTextDocument.class, xDesktop.getCurrentComponent()); if (destroyLocal) { closeDoc(xLocalDoc); + xLocalDoc = null; } return returnDoc; } + public void closeFromDialog() + { + closeDoc(xLocalDoc); + xLocalDoc = null; + } + public void kill() + { + XDesktop xDesktop = getDesktop(); + xDesktop.terminate(); + } + public XTextDocument DocByAutopilot(XMultiServiceFactory msf, int[] indexes, boolean destroyLocal, String bName) { - XTextDocument xLocalDoc = WriterTools.createTextDoc(m_xMSF); + XTextDocument xTextDoc = WriterTools.createTextDoc(m_xMSF); Object toolkit = null; try { toolkit = msf.createInstance("com.sun.star.awt.Toolkit"); } catch (com.sun.star.uno.Exception e) { - e.printStackTrace(); + e.printStackTrace( System.err ); } - XExtendedToolkit tk = (XExtendedToolkit) UnoRuntime.queryInterface( - XExtendedToolkit.class, toolkit); + XExtendedToolkit tk = UnoRuntime.queryInterface(XExtendedToolkit.class, toolkit); shortWait(); - AccessibilityTools at = new AccessibilityTools(); - Object atw = tk.getActiveTopWindow(); - XWindow xWindow = (XWindow) UnoRuntime.queryInterface(XWindow.class, - atw); + XWindow xWindow = UnoRuntime.queryInterface(XWindow.class, atw); - XAccessible xRoot = at.getAccessibleObject(xWindow); + XAccessible xRoot = AccessibilityTools.getAccessibleObject(xWindow); - XAccessibleContext ARoot = at.getAccessibleObjectForRole(xRoot, + XAccessibleContext ARoot = AccessibilityTools.getAccessibleObjectForRole(xRoot, AccessibleRole.MENU_BAR); - XAccessibleSelection sel = (XAccessibleSelection) UnoRuntime.queryInterface( - XAccessibleSelection.class, ARoot); + XAccessibleSelection sel = UnoRuntime.queryInterface(XAccessibleSelection.class, ARoot); for (int k = 0; k < indexes.length; k++) { try { @@ -181,8 +181,7 @@ public class WriterHelper { shortWait(); ARoot = ARoot.getAccessibleChild(indexes[k]) .getAccessibleContext(); - sel = (XAccessibleSelection) UnoRuntime.queryInterface( - XAccessibleSelection.class, ARoot); + sel = UnoRuntime.queryInterface(XAccessibleSelection.class, ARoot); } catch (com.sun.star.lang.IndexOutOfBoundsException e) { } } @@ -191,17 +190,13 @@ public class WriterHelper { atw = tk.getActiveTopWindow(); - xWindow = (XWindow) UnoRuntime.queryInterface(XWindow.class, atw); + xWindow = UnoRuntime.queryInterface(XWindow.class, atw); - xRoot = at.getAccessibleObject(xWindow); + xRoot = AccessibilityTools.getAccessibleObject(xWindow); //at.printAccessibleTree(new PrintWriter(System.out),xRoot); - XAccessibleAction action = (XAccessibleAction) UnoRuntime.queryInterface( - XAccessibleAction.class, - at.getAccessibleObjectForRole(xRoot, - AccessibleRole.PUSH_BUTTON, - bName)); + XAccessibleAction action = UnoRuntime.queryInterface(XAccessibleAction.class, AccessibilityTools.getAccessibleObjectForRole(xRoot, AccessibleRole.PUSH_BUTTON, bName)); try { action.doAccessibleAction(0); @@ -212,17 +207,13 @@ public class WriterHelper { atw = tk.getActiveTopWindow(); - xWindow = (XWindow) UnoRuntime.queryInterface(XWindow.class, atw); + xWindow = UnoRuntime.queryInterface(XWindow.class, atw); - xRoot = at.getAccessibleObject(xWindow); + xRoot = AccessibilityTools.getAccessibleObject(xWindow); - at.printAccessibleTree(new PrintWriter(System.out),xRoot); + AccessibilityTools.printAccessibleTree(new PrintWriter(System.out),xRoot); - action = (XAccessibleAction) UnoRuntime.queryInterface( - XAccessibleAction.class, - at.getAccessibleObjectForRole(xRoot, - AccessibleRole.PUSH_BUTTON, - "Yes")); + action = UnoRuntime.queryInterface(XAccessibleAction.class, AccessibilityTools.getAccessibleObjectForRole(xRoot, AccessibleRole.PUSH_BUTTON, "Yes")); try { if (action != null) action.doAccessibleAction(0); @@ -233,12 +224,10 @@ public class WriterHelper { XDesktop xDesktop = getDesktop(); - XTextDocument returnDoc = (XTextDocument) UnoRuntime.queryInterface( - XTextDocument.class, - xDesktop.getCurrentComponent()); + XTextDocument returnDoc = UnoRuntime.queryInterface(XTextDocument.class, xDesktop.getCurrentComponent()); if (destroyLocal) { - closeDoc(xLocalDoc); + closeDoc(xTextDoc); } return returnDoc; @@ -266,11 +255,10 @@ public class WriterHelper { toolkit = m_xMSF.createInstance("com.sun.star.awt.Toolkit"); } catch (com.sun.star.uno.Exception e) { System.out.println("Couldn't get toolkit"); - e.printStackTrace(); + e.printStackTrace( System.err ); } - XExtendedToolkit tk = (XExtendedToolkit) UnoRuntime.queryInterface( - XExtendedToolkit.class, toolkit); + XExtendedToolkit tk = UnoRuntime.queryInterface(XExtendedToolkit.class, toolkit); return tk; } @@ -285,11 +273,10 @@ public class WriterHelper { desk = m_xMSF.createInstance("com.sun.star.frame.Desktop"); } catch (com.sun.star.uno.Exception e) { System.out.println("Couldn't get desktop"); - e.printStackTrace(); + e.printStackTrace( System.err ); } - XDesktop xDesktop = (XDesktop) UnoRuntime.queryInterface( - XDesktop.class, desk); + XDesktop xDesktop = UnoRuntime.queryInterface(XDesktop.class, desk); return xDesktop; } diff --git a/sfx2/qa/complex/sfx2/undo/CalcDocumentTest.java b/sfx2/qa/complex/sfx2/undo/CalcDocumentTest.java new file mode 100755 index 000000000000..34825fdbada9 --- /dev/null +++ b/sfx2/qa/complex/sfx2/undo/CalcDocumentTest.java @@ -0,0 +1,96 @@ +package complex.sfx2.undo; + +import org.openoffice.test.tools.SpreadsheetDocument; +import com.sun.star.table.XCellRange; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.table.XCell; +import com.sun.star.uno.UnoRuntime; +import org.openoffice.test.tools.DocumentType; +import static org.junit.Assert.*; + +/** + * implements the {@link DocumentTest} interface on top of a spreadsheet document + * @author frank.schoenheit@oracle.com + */ +public class CalcDocumentTest extends DocumentTestBase +{ + public CalcDocumentTest( final XMultiServiceFactory i_orb ) throws Exception + { + super( i_orb, DocumentType.CALC ); + } + + public String getDocumentDescription() + { + return "spreadsheet document"; + } + + public void initializeDocument() throws com.sun.star.uno.Exception + { + final XCell cellA1 = getCellA1(); + cellA1.setValue( INIT_VALUE ); + assertEquals( "initializing the cell value didn't work", cellA1.getValue(), INIT_VALUE, 0 ); + + XCellRange range = UnoRuntime.queryInterface( XCellRange.class, + ((SpreadsheetDocument)m_document).getSheet(0) ); + + for ( int i=0; i<12; ++i ) + { + XCell cell = range.getCellByPosition( 1, i ); + cell.setFormula( "" ); + } + } + + public void doSingleModification() throws com.sun.star.uno.Exception + { + final XCell cellA1 = getCellA1(); + assertEquals( "initial cell value not as expected", INIT_VALUE, cellA1.getValue(), 0 ); + cellA1.setValue( MODIFIED_VALUE ); + assertEquals( "modified cell value not as expected", MODIFIED_VALUE, cellA1.getValue(), 0 ); + } + + public void verifyInitialDocumentState() throws com.sun.star.uno.Exception + { + final XCell cellA1 = getCellA1(); + assertEquals( "cell A1 doesn't have its initial value", INIT_VALUE, cellA1.getValue(), 0 ); + + XCellRange range = UnoRuntime.queryInterface( XCellRange.class, + ((SpreadsheetDocument)m_document).getSheet(0) ); + for ( int i=0; i<12; ++i ) + { + final XCell cell = range.getCellByPosition( 1, i ); + assertEquals( "Cell B" + (i+1) + " not having its initial value (an empty string)", "", cell.getFormula() ); + } + } + + public void verifySingleModificationDocumentState() throws com.sun.star.uno.Exception + { + final XCell cellA1 = getCellA1(); + assertEquals( "cell A1 doesn't have the value which we gave it", MODIFIED_VALUE, cellA1.getValue(), 0 ); + } + + public int doMultipleModifications() throws com.sun.star.uno.Exception + { + XCellRange range = UnoRuntime.queryInterface( XCellRange.class, + ((SpreadsheetDocument)m_document).getSheet(0) ); + + final String[] months = new String[] { + "January", "February", "March", "April", "May", "June", "July", "August", + "September", "October", "November", "December" }; + for ( int i=0; i<12; ++i ) + { + final XCell cell = range.getCellByPosition( 1, i ); + cell.setFormula( months[i] ); + } + return 12; + } + + private XCell getCellA1() throws com.sun.star.uno.Exception + { + XCellRange range = UnoRuntime.queryInterface( XCellRange.class, + ((SpreadsheetDocument)m_document).getSheet(0) ); + return range.getCellByPosition( 0, 0 ); + } + + private static final double INIT_VALUE = 100.0; + private static final double MODIFIED_VALUE = 200.0; +} diff --git a/sfx2/qa/complex/sfx2/undo/ChartDocumentTest.java b/sfx2/qa/complex/sfx2/undo/ChartDocumentTest.java new file mode 100755 index 000000000000..7c8421ec6e5b --- /dev/null +++ b/sfx2/qa/complex/sfx2/undo/ChartDocumentTest.java @@ -0,0 +1,277 @@ +/************************************************************************* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + *************************************************************************/ + +package complex.sfx2.undo; + +import com.sun.star.chart2.XAxis; +import com.sun.star.chart2.XCoordinateSystem; +import com.sun.star.chart2.XCoordinateSystemContainer; +import com.sun.star.awt.Size; +import com.sun.star.beans.NamedValue; +import com.sun.star.beans.XPropertySet; +import com.sun.star.chart2.XChartDocument; +import com.sun.star.chart2.XDiagram; +import com.sun.star.container.XIndexAccess; +import com.sun.star.document.UndoFailedException; +import com.sun.star.document.XUndoAction; +import com.sun.star.document.XUndoManager; +import com.sun.star.document.XUndoManagerSupplier; +import com.sun.star.drawing.XShape; +import com.sun.star.embed.EmbedStates; +import com.sun.star.embed.EmbedVerbs; +import com.sun.star.embed.VerbDescriptor; +import com.sun.star.embed.WrongStateException; +import com.sun.star.embed.XEmbeddedObject; +import com.sun.star.embed.XStateChangeBroadcaster; +import com.sun.star.embed.XStateChangeListener; +import com.sun.star.lang.EventObject; +import com.sun.star.lang.IndexOutOfBoundsException; +import com.sun.star.lang.WrappedTargetException; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.text.XTextContent; +import com.sun.star.text.XTextRange; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.view.XSelectionSupplier; +import org.openoffice.test.tools.DocumentType; +import org.openoffice.test.tools.OfficeDocument; +import static org.junit.Assert.*; + +/** + * @author frank.schoenheit@oracle.com + */ +public class ChartDocumentTest implements DocumentTest +{ + public ChartDocumentTest( final XMultiServiceFactory i_orb ) throws com.sun.star.uno.Exception, InterruptedException + { + m_textDocument = OfficeDocument.blankDocument( i_orb, DocumentType.WRITER ); + + // create a OLE shape in the document + final XMultiServiceFactory factory = UnoRuntime.queryInterface( XMultiServiceFactory.class, m_textDocument.getDocument() ); + final String shapeServiceName = "com.sun.star.text.TextEmbeddedObject"; + final XPropertySet shapeProps = UnoRuntime.queryInterface( XPropertySet.class, factory.createInstance( shapeServiceName ) ); + shapeProps.setPropertyValue("CLSID", "12dcae26-281f-416f-a234-c3086127382e"); + + final XShape shape = UnoRuntime.queryInterface( XShape.class, shapeProps ); + shape.setSize( new Size( 16000, 9000 ) ); + + final XTextContent chartTextContent = UnoRuntime.queryInterface( XTextContent.class, shapeProps ); + + final XSelectionSupplier selSupplier = UnoRuntime.queryInterface( XSelectionSupplier.class, + m_textDocument.getCurrentView().getController() ); + final Object selection = selSupplier.getSelection(); + final XTextRange textRange = getAssociatedTextRange( selection ); + if ( textRange == null ) + throw new RuntimeException( "can't locate a text range" ); + + // insert the chart + textRange.getText().insertTextContent(textRange, chartTextContent, false); + + // retrieve the chart model + XChartDocument chartDoc = UnoRuntime.queryInterface( XChartDocument.class, shapeProps.getPropertyValue( "Model" ) ); + m_chartDocument = new OfficeDocument( i_orb, chartDoc ); + + // actually activate the object + final XEmbeddedObject embeddedChart = UnoRuntime.queryInterface( XEmbeddedObject.class, + shapeProps.getPropertyValue( "EmbeddedObject" ) ); + embeddedChart.doVerb( EmbedVerbs.MS_OLEVERB_SHOW ); + + final int state = embeddedChart.getCurrentState(); + if ( state != EmbedStates.UI_ACTIVE ) + fail( "unable to activate the embedded chart" ); + } + + public String getDocumentDescription() + { + return "chart document"; + } + + public void initializeDocument() throws com.sun.star.uno.Exception + { + final XPropertySet wallProperties = impl_getWallProperties(); + wallProperties.setPropertyValue( "FillStyle", com.sun.star.drawing.FillStyle.SOLID ); + wallProperties.setPropertyValue( "FillColor", 0x00FFFFFF ); + } + + public void closeDocument() + { + m_textDocument.close(); + } + + private XPropertySet impl_getWallProperties() + { + final XChartDocument chartDoc = UnoRuntime.queryInterface( XChartDocument.class, m_chartDocument.getDocument() ); + final XDiagram diagram = chartDoc.getFirstDiagram(); + final XPropertySet wallProperties = diagram.getWall(); + return wallProperties; + } + + private XPropertySet impl_getYAxisProperties() + { + XPropertySet axisProperties = null; + try + { + final XChartDocument chartDoc = UnoRuntime.queryInterface( XChartDocument.class, m_chartDocument.getDocument() ); + final XDiagram diagram = chartDoc.getFirstDiagram(); + final XCoordinateSystemContainer coordContainer = UnoRuntime.queryInterface( XCoordinateSystemContainer.class, diagram ); + final XCoordinateSystem[] coordSystems = coordContainer.getCoordinateSystems(); + final XCoordinateSystem coordSystem = coordSystems[0]; + final XAxis primaryYAxis = coordSystem.getAxisByDimension( 1, 0 ); + axisProperties = UnoRuntime.queryInterface( XPropertySet.class, primaryYAxis ); + } + catch ( Exception ex ) + { + fail( "internal error: could not retrieve primary Y axis properties" ); + } + return axisProperties; + } + + private XUndoManager impl_getUndoManager() + { + final XUndoManagerSupplier undoManagerSupp = UnoRuntime.queryInterface( XUndoManagerSupplier.class, m_chartDocument.getDocument() ); + final XUndoManager undoManager = undoManagerSupp.getUndoManager(); + return undoManager; + } + + public void doSingleModification() throws com.sun.star.uno.Exception + { + final XPropertySet wallProperties = impl_getWallProperties(); + + // simulate an Undo action, as long as the chart implementation doesn't add Undo actions itself + final XUndoManager undoManager = impl_getUndoManager(); + undoManager.addUndoAction( new PropertyUndoAction( wallProperties, "FillColor", 0xCCFF44 ) ); + // (the UndoAction will actually set the property value) + } + + public void verifyInitialDocumentState() throws com.sun.star.uno.Exception + { + final XPropertySet wallProperties = impl_getWallProperties(); + assertEquals( 0x00FFFFFF, ((Integer)wallProperties.getPropertyValue( "FillColor" )).intValue() ); + } + + public void verifySingleModificationDocumentState() throws com.sun.star.uno.Exception + { + final XPropertySet wallProperties = impl_getWallProperties(); + assertEquals( 0xCCFF44, ((Integer)wallProperties.getPropertyValue( "FillColor" )).intValue() ); + } + + public int doMultipleModifications() throws com.sun.star.uno.Exception + { + final XPropertySet axisProperties = impl_getYAxisProperties(); + + final XUndoManager undoManager = impl_getUndoManager(); + undoManager.addUndoAction( new PropertyUndoAction( axisProperties, "LineWidth", 300 ) ); + undoManager.addUndoAction( new PropertyUndoAction( axisProperties, "LineColor", 0x000000 ) ); + + return 2; + } + + public OfficeDocument getDocument() + { + return m_chartDocument; + } + + private XTextRange getAssociatedTextRange( final Object i_object ) throws WrappedTargetException, IndexOutOfBoundsException + { + // possible cases: + // 1. a container of other objects - e.g. selection of 0 to n text portions, or 1 to n drawing objects + final XIndexAccess indexer = UnoRuntime.queryInterface( XIndexAccess.class, i_object ); + if ((indexer != null) && indexer.getCount() > 0) { + final int count = indexer.getCount(); + for (int i = 0; i < count; ++i) { + final XTextRange range = getAssociatedTextRange( indexer.getByIndex(i) ); + if (range != null) { + return range; + } + } + } + // 2. another TextContent, having an anchor we can use + final XTextContent textContent = UnoRuntime.queryInterface(XTextContent.class, i_object); + if (textContent != null) { + final XTextRange range = textContent.getAnchor(); + if (range != null) { + return range; + } + } + + // an object which supports XTextRange directly + final XTextRange range = UnoRuntime.queryInterface(XTextRange.class, i_object); + if (range != null) { + return range; + } + + return null; + } + + private static class PropertyUndoAction implements XUndoAction + { + PropertyUndoAction( final XPropertySet i_component, final String i_propertyName, final Object i_newValue ) throws com.sun.star.uno.Exception + { + m_component = i_component; + m_propertyName = i_propertyName; + m_newValue = i_newValue; + + m_oldValue = i_component.getPropertyValue( m_propertyName ); + i_component.setPropertyValue( m_propertyName, m_newValue ); + } + + public String getTitle() + { + return "some dummy Undo Action"; + } + + public void undo() throws UndoFailedException + { + try + { + m_component.setPropertyValue( m_propertyName, m_oldValue ); + } + catch ( com.sun.star.uno.Exception ex ) + { + throw new UndoFailedException( "", this, ex ); + } + } + + public void redo() throws UndoFailedException + { + try + { + m_component.setPropertyValue( m_propertyName, m_newValue ); + } + catch ( com.sun.star.uno.Exception ex ) + { + throw new UndoFailedException( "", this, ex ); + } + } + + private final XPropertySet m_component; + private final String m_propertyName; + private final Object m_oldValue; + private final Object m_newValue; + } + + private final OfficeDocument m_textDocument; + private final OfficeDocument m_chartDocument; +} diff --git a/sfx2/qa/complex/sfx2/undo/DocumentTest.java b/sfx2/qa/complex/sfx2/undo/DocumentTest.java new file mode 100755 index 000000000000..d6de90884673 --- /dev/null +++ b/sfx2/qa/complex/sfx2/undo/DocumentTest.java @@ -0,0 +1,61 @@ +package complex.sfx2.undo; + +import org.openoffice.test.tools.OfficeDocument; + +/** + * wrapper around an OfficeDocument, for running a standardized test procedure (related do Undo functionality) + * on the document. + * + * @author frank.schoenheit@oracle.com + */ +public interface DocumentTest +{ + /** + * returns a human-readable description for the document/type which the tests operates on + */ + public String getDocumentDescription(); + + /** + * initializes the document to a state where the subsequent tests can be ran + */ + public void initializeDocument() throws com.sun.star.uno.Exception; + + /** + * closes the document which the test is based on + */ + public void closeDocument(); + + /** + * does a simple modification to the document, which results in one Undo action being auto-generated + * by the OOo implementation + */ + public void doSingleModification() throws com.sun.star.uno.Exception; + + /** + * verifies the document is in the same state as after {@link #initializeDocument} + */ + public void verifyInitialDocumentState() throws com.sun.star.uno.Exception; + + /** + * verifies the document is in the state as expected after {@link #doSingleModification} + * @throws com.sun.star.uno.Exception + */ + public void verifySingleModificationDocumentState() throws com.sun.star.uno.Exception; + + /** + * does multiple modifications do the document, which would normally result in multiple Undo actions. + * + * The test framework will encapsulate the call into an {@link XUndoManager.enterUndoContext()} and + * {@link XUndoManager.leaveUndoContext()} call. + * + * @return + * the number of modifications done to the document. The caller assumes (and asserts) that the number + * of actions on the Undo stack equals this number. + */ + public int doMultipleModifications() throws com.sun.star.uno.Exception; + + /** + * returns the document which the test operates on + */ + public OfficeDocument getDocument(); +} diff --git a/sfx2/qa/complex/sfx2/undo/DocumentTestBase.java b/sfx2/qa/complex/sfx2/undo/DocumentTestBase.java new file mode 100755 index 000000000000..11adc80c2e85 --- /dev/null +++ b/sfx2/qa/complex/sfx2/undo/DocumentTestBase.java @@ -0,0 +1,29 @@ +package complex.sfx2.undo; + +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.uno.Exception; +import org.openoffice.test.tools.DocumentType; +import org.openoffice.test.tools.OfficeDocument; + +/** + * @author frank.schoenheit@oracle.com + */ +abstract class DocumentTestBase implements DocumentTest +{ + DocumentTestBase( final XMultiServiceFactory i_orb, final DocumentType i_docType ) throws Exception + { + m_document = OfficeDocument.blankDocument( i_orb, i_docType ); + } + + public OfficeDocument getDocument() + { + return m_document; + } + + public void closeDocument() + { + m_document.close(); + } + + protected final OfficeDocument m_document; +} diff --git a/sfx2/qa/complex/standalonedocumentinfo/StandaloneDocumentInfoUnitTest.java b/sfx2/qa/complex/sfx2/undo/DrawDocumentTest.java index 0136f8941df5..d98e1372dea5 100644..100755 --- a/sfx2/qa/complex/standalonedocumentinfo/StandaloneDocumentInfoUnitTest.java +++ b/sfx2/qa/complex/sfx2/undo/DrawDocumentTest.java @@ -1,5 +1,4 @@ /************************************************************************* - * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * Copyright 2000, 2010 Oracle and/or its affiliates. @@ -23,47 +22,25 @@ * <http://www.openoffice.org/license.html> * for a copy of the LGPLv3 License. * - ************************************************************************/ -package complex.standalonedocumentinfo; - -import complexlib.ComplexTestCase; -import com.sun.star.lang.XMultiServiceFactory; -import com.sun.star.uno.UnoRuntime; - -/* Document here -*/ + *************************************************************************/ -public class StandaloneDocumentInfoUnitTest extends ComplexTestCase { - private XMultiServiceFactory m_xMSF = null; +package complex.sfx2.undo; - public String[] getTestMethodNames() { - return new String[] { - "ExecuteTest01"}; - } - - public String[] getTestObjectNames() { - return new String[] {"StandaloneDocumentInfoUnitTest"}; - } - - public void before() { - try { - m_xMSF = (XMultiServiceFactory)param.getMSF(); - } catch(Exception e) { - failed( "Failed to create service factory!" ); - } - if( m_xMSF ==null ) { - failed( "Failed to create service factory!" ); - } - } - - public void after() { - m_xMSF = null; +import com.sun.star.lang.XMultiServiceFactory; +import org.openoffice.test.tools.DocumentType; + +/** + * @author frank.schoenheit@oracle.com + */ +public class DrawDocumentTest extends DrawingOrPresentationDocumentTest +{ + public DrawDocumentTest( XMultiServiceFactory i_orb ) throws com.sun.star.uno.Exception + { + super( i_orb, DocumentType.DRAWING ); } - public void ExecuteTest01() { - StandaloneDocumentInfoTest aTest = new Test01 (m_xMSF, log); - assure( "Test01 failed!", aTest.test() ); + public String getDocumentDescription() + { + return "drawing document"; } } - - diff --git a/sfx2/qa/complex/sfx2/undo/DrawingOrPresentationDocumentTest.java b/sfx2/qa/complex/sfx2/undo/DrawingOrPresentationDocumentTest.java new file mode 100755 index 000000000000..916e1908e93d --- /dev/null +++ b/sfx2/qa/complex/sfx2/undo/DrawingOrPresentationDocumentTest.java @@ -0,0 +1,196 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +package complex.sfx2.undo; + +import com.sun.star.awt.Rectangle; +import com.sun.star.document.XUndoManager; +import com.sun.star.document.XUndoManagerSupplier; +import com.sun.star.document.XUndoAction; +import com.sun.star.awt.Point; +import com.sun.star.awt.Size; +import com.sun.star.beans.XPropertySet; +import com.sun.star.drawing.CircleKind; +import com.sun.star.drawing.XDrawPages; +import com.sun.star.drawing.XDrawPagesSupplier; +import com.sun.star.drawing.XShape; +import com.sun.star.drawing.XShapes; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.uno.UnoRuntime; +import org.openoffice.test.tools.DocumentType; +import static org.junit.Assert.*; + +/** + * implements the {@link DocumentTest} interface on top of a drawing document + * @author frank.schoenheit@oracle.com + */ +public abstract class DrawingOrPresentationDocumentTest extends DocumentTestBase +{ + public DrawingOrPresentationDocumentTest( XMultiServiceFactory i_orb, final DocumentType i_docType ) throws com.sun.star.uno.Exception + { + super( i_orb, i_docType ); + } + + public void initializeDocument() throws com.sun.star.uno.Exception + { + // remove all shapes - Impress has two default shapes in a new doc; just get rid of them + final XShapes firstPageShapes = getFirstPageShapes(); + while ( firstPageShapes.getCount() > 0 ) + firstPageShapes.remove( UnoRuntime.queryInterface( XShape.class, firstPageShapes.getByIndex( 0 ) ) ); + } + + public void doSingleModification() throws com.sun.star.uno.Exception + { + // add a simple centered shape to the first page + Rectangle pagePlayground = impl_getFirstPagePlayground(); + impl_createCircleShape( + ( pagePlayground.X + ( pagePlayground.Width - BIG_CIRCLE_SIZE ) / 2 ), + ( pagePlayground.Y + ( pagePlayground.Height - BIG_CIRCLE_SIZE ) / 2 ), + BIG_CIRCLE_SIZE, + FILL_COLOR + ); + } + + public void verifyInitialDocumentState() throws com.sun.star.uno.Exception + { + final XShapes firstPageShapes = getFirstPageShapes(); + assertEquals( "there should be no shapes at all", 0, firstPageShapes.getCount() ); + } + + public void verifySingleModificationDocumentState() throws com.sun.star.uno.Exception + { + final XShapes firstPageShapes = getFirstPageShapes(); + assertEquals( "there should be one shape, not more, not less", 1, firstPageShapes.getCount() ); + + final Object shape = firstPageShapes.getByIndex(0); + verifyShapeGeometry( shape, BIG_CIRCLE_SIZE, BIG_CIRCLE_SIZE ); + final XPropertySet shapeProps = UnoRuntime.queryInterface( XPropertySet.class, shape ); + assertEquals( "wrong circle tpye", CIRCLE_TYPE.getValue(), ((CircleKind)shapeProps.getPropertyValue( "CircleKind" )).getValue() ); + //assertEquals( "wrong circle fill color", FILL_COLOR, ((Integer)shapeProps.getPropertyValue( "FillColor" )).intValue() ); + // disable this particular check: A bug in the drawing layer API restores the FillColor to its + // default value upon re-insertion. This is issue #i115080# + } + + public int doMultipleModifications() throws com.sun.star.uno.Exception + { + // add a simple centered shape to the first page + Rectangle pagePlayground = impl_getFirstPagePlayground(); + impl_createCircleShape( + pagePlayground.X, + pagePlayground.Y, + SMALL_CIRCLE_SIZE, + ALTERNATE_FILL_COLOR + ); + impl_createCircleShape( + pagePlayground.X + pagePlayground.Width - SMALL_CIRCLE_SIZE, + pagePlayground.Y, + SMALL_CIRCLE_SIZE, + ALTERNATE_FILL_COLOR + ); + impl_createCircleShape( + pagePlayground.X, + pagePlayground.Y + pagePlayground.Height - SMALL_CIRCLE_SIZE, + SMALL_CIRCLE_SIZE, + ALTERNATE_FILL_COLOR + ); + impl_createCircleShape( + pagePlayground.X + pagePlayground.Width - SMALL_CIRCLE_SIZE, + pagePlayground.Y + pagePlayground.Height - SMALL_CIRCLE_SIZE, + SMALL_CIRCLE_SIZE, + ALTERNATE_FILL_COLOR + ); + return 4; + } + + private void impl_createCircleShape( final int i_x, final int i_y, final int i_size, final int i_color ) throws com.sun.star.uno.Exception + { + final XPropertySet shapeProps = getDocument().createInstance( "com.sun.star.drawing.EllipseShape", XPropertySet.class ); + shapeProps.setPropertyValue( "CircleKind", CIRCLE_TYPE ); + shapeProps.setPropertyValue( "FillColor", i_color ); + + final XShape shape = UnoRuntime.queryInterface( XShape.class, shapeProps ); + final Size shapeSize = new Size( i_size, i_size ); + shape.setSize( shapeSize ); + final Point shapePos = new Point( i_x, i_y ); + shape.setPosition( shapePos ); + + final XShapes pageShapes = UnoRuntime.queryInterface( XShapes.class, getFirstPageShapes() ); + pageShapes.add( shape ); + + // Sadly, Draw/Impress currently do not create Undo actions for programmatic changes to the document. + // Which renders the test here slightly useless ... unless we fake the Undo actions ourself. + final XUndoManagerSupplier suppUndoManager = UnoRuntime.queryInterface( XUndoManagerSupplier.class, getDocument().getDocument() ); + final XUndoManager undoManager = suppUndoManager.getUndoManager(); + undoManager.addUndoAction( new ShapeInsertionUndoAction( shape, pageShapes ) ); + } + + private Rectangle impl_getFirstPagePlayground() throws com.sun.star.uno.Exception + { + final XShapes firstPageShapes = getFirstPageShapes(); + final XPropertySet firstPageProps = UnoRuntime.queryInterface( XPropertySet.class, firstPageShapes ); + final int pageWidth = ((Integer)firstPageProps.getPropertyValue( "Width" )).intValue(); + final int pageHeight = ((Integer)firstPageProps.getPropertyValue( "Height" )).intValue(); + final int borderLeft = ((Integer)firstPageProps.getPropertyValue( "BorderLeft" )).intValue(); + final int borderTop = ((Integer)firstPageProps.getPropertyValue( "BorderTop" )).intValue(); + final int borderRight = ((Integer)firstPageProps.getPropertyValue( "BorderRight" )).intValue(); + final int borderBottom = ((Integer)firstPageProps.getPropertyValue( "BorderBottom" )).intValue(); + return new Rectangle( borderLeft, borderTop, pageWidth - borderLeft - borderRight, pageHeight - borderTop - borderBottom ); + } + + /** + * returns the XShapes interface of the first page of our drawing document + */ + private XShapes getFirstPageShapes() throws com.sun.star.uno.Exception + { + final XDrawPagesSupplier suppPages = UnoRuntime.queryInterface( XDrawPagesSupplier.class, getDocument().getDocument() ); + final XDrawPages pages = suppPages.getDrawPages(); + return UnoRuntime.queryInterface( XShapes.class, pages.getByIndex( 0 ) ); + } + + /** + * verifies the given shape has the given size + */ + private void verifyShapeGeometry( final Object i_shapeObject, final int i_expectedWidth, final int i_expectedHeight ) + throws com.sun.star.uno.Exception + { + final XShape shape = UnoRuntime.queryInterface( XShape.class, i_shapeObject ); + final Size shapeSize = shape.getSize(); + assertEquals( "unexpected shape width", i_expectedWidth, shapeSize.Width ); + assertEquals( "unexpected shape height", i_expectedHeight, shapeSize.Height ); + } + + private static class ShapeInsertionUndoAction implements XUndoAction + { + ShapeInsertionUndoAction( final XShape i_shape, final XShapes i_shapeCollection ) + { + m_shape = i_shape; + m_shapeCollection = i_shapeCollection; + } + + public String getTitle() + { + return "insert shape"; + } + + public void undo() + { + m_shapeCollection.remove( m_shape ); + } + + public void redo() + { + m_shapeCollection.add( m_shape ); + } + + private final XShape m_shape; + private final XShapes m_shapeCollection; + } + + private static CircleKind CIRCLE_TYPE = CircleKind.FULL; + private static int FILL_COLOR = 0xCC2244; + private static int ALTERNATE_FILL_COLOR = 0x44CC22; + private static int BIG_CIRCLE_SIZE = 5000; + private static int SMALL_CIRCLE_SIZE = 2000; +} diff --git a/sfx2/qa/complex/sfx2/undo/ImpressDocumentTest.java b/sfx2/qa/complex/sfx2/undo/ImpressDocumentTest.java new file mode 100755 index 000000000000..c15fc760e0c3 --- /dev/null +++ b/sfx2/qa/complex/sfx2/undo/ImpressDocumentTest.java @@ -0,0 +1,46 @@ +/************************************************************************* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + *************************************************************************/ + +package complex.sfx2.undo; + +import com.sun.star.lang.XMultiServiceFactory; +import org.openoffice.test.tools.DocumentType; + +/** + * @author frank.schoenheit@oracle.com + */ +public class ImpressDocumentTest extends DrawingOrPresentationDocumentTest +{ + public ImpressDocumentTest( XMultiServiceFactory i_orb ) throws com.sun.star.uno.Exception + { + super( i_orb, DocumentType.PRESENTATION ); + } + + public String getDocumentDescription() + { + return "presentation document"; + } +} diff --git a/sfx2/qa/complex/sfx2/undo/WriterDocumentTest.java b/sfx2/qa/complex/sfx2/undo/WriterDocumentTest.java new file mode 100755 index 000000000000..702fb85ebb11 --- /dev/null +++ b/sfx2/qa/complex/sfx2/undo/WriterDocumentTest.java @@ -0,0 +1,104 @@ +package complex.sfx2.undo; + +import com.sun.star.text.XTextRange; +import com.sun.star.beans.XPropertySet; +import com.sun.star.table.XCell; +import com.sun.star.table.XCellRange; +import com.sun.star.text.XTextCursor; +import com.sun.star.text.XTextTable; +import com.sun.star.text.XText; +import com.sun.star.text.XTextDocument; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.uno.UnoRuntime; +import org.openoffice.test.tools.DocumentType; +import static org.junit.Assert.*; + +/** + * implements the {@link DocumentTest} interface on top of a spreadsheet document + * @author frank.schoenheit@oracle.com + */ +public class WriterDocumentTest extends DocumentTestBase +{ + public WriterDocumentTest( final XMultiServiceFactory i_orb ) throws com.sun.star.uno.Exception + { + super( i_orb, DocumentType.WRITER ); + } + + public String getDocumentDescription() + { + return "text document"; + } + + public void initializeDocument() throws com.sun.star.uno.Exception + { + // TODO? + } + + public void doSingleModification() throws com.sun.star.uno.Exception + { + final XTextDocument textDoc = UnoRuntime.queryInterface( XTextDocument.class, getDocument().getDocument() ); + final XText docText = textDoc.getText(); + docText.setString( s_blindText ); + } + + public void verifyInitialDocumentState() throws com.sun.star.uno.Exception + { + final XTextDocument textDoc = UnoRuntime.queryInterface( XTextDocument.class, getDocument().getDocument() ); + final XText docText = textDoc.getText(); + assertEquals( "document should be empty", "", docText.getString() ); + } + + public void verifySingleModificationDocumentState() throws com.sun.star.uno.Exception + { + final XTextDocument textDoc = UnoRuntime.queryInterface( XTextDocument.class, getDocument().getDocument() ); + final XText docText = textDoc.getText(); + assertEquals( "blind text not found", s_blindText, docText.getString() ); + } + + public int doMultipleModifications() throws com.sun.star.uno.Exception + { + final XTextDocument textDoc = UnoRuntime.queryInterface( XTextDocument.class, getDocument().getDocument() ); + final XText docText = textDoc.getText(); + + int expectedUndoActions = 0; + + // create a cursor + final XTextCursor cursor = docText.createTextCursor(); + + // create a table + final XTextTable textTable = UnoRuntime.queryInterface( XTextTable.class, + getDocument().createInstance( "com.sun.star.text.TextTable" ) ); + textTable.initialize( 3, 3 ); + final XPropertySet tableProps = UnoRuntime.queryInterface( XPropertySet.class, textTable ); + tableProps.setPropertyValue( "BackColor", 0xCCFF44 ); + + // insert the table into the doc + docText.insertTextContent( cursor, textTable, false ); + ++expectedUndoActions; //FIXME this will create 2 actions! currently the event is sent for every individual action; should it be sent for top-level actions only? how many internal actions are created is an implementation detail! + ++expectedUndoActions; + + // write some content into the center cell + final XCellRange cellRange = UnoRuntime.queryInterface( XCellRange.class, textTable ); + final XCell centerCell = cellRange.getCellByPosition( 1, 1 ); + final XTextRange cellText = UnoRuntime.queryInterface( XTextRange.class, centerCell ); + cellText.setString( "Undo Manager API Test" ); + ++expectedUndoActions; + + // give it another color + final XPropertySet cellProps = UnoRuntime.queryInterface( XPropertySet.class, centerCell ); + cellProps.setPropertyValue( "BackColor", 0x44CCFF ); + ++expectedUndoActions; + + return expectedUndoActions; + } + + private static final String s_blindText = + "Lorem ipsum dolor. Sit amet penatibus. A cum turpis. Aenean ac eu. " + + "Ligula est urna nulla vestibulum ullamcorper. Nec sit in amet tincidunt mus. " + + "Tellus sagittis mi. Suscipit cursus in vestibulum in eros ipsum felis cursus lectus " + + "nunc quis condimentum in risus nec wisi aenean luctus hendrerit magna habitasse commodo orci. " + + "Nisl etiam quis. Vestibulum justo eleifend aliquet luctus sed turpis volutpat ullamcorper " + + "aliquam penatibus sagittis pede tincidunt egestas. Nibh massa lectus. Sem mattis purus morbi " + + "scelerisque turpis donec urna phasellus. Quis at lacus. Viverra mauris mollis. " + + "Dolor tincidunt condimentum."; +} diff --git a/sfx2/qa/complex/standalonedocumentinfo/makefile.mk b/sfx2/qa/complex/standalonedocumentinfo/makefile.mk deleted file mode 100644 index c65556aeb763..000000000000 --- a/sfx2/qa/complex/standalonedocumentinfo/makefile.mk +++ /dev/null @@ -1,85 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -PRJ = ..$/..$/.. -TARGET = StandaloneDocumentInfoUnitTest -PRJNAME = binfilter -PACKAGE = complex$/standalonedocumentinfo - -# --- Settings ----------------------------------------------------- -.INCLUDE: settings.mk - - -#----- compile .java files ----------------------------------------- - -JARFILES = ridl.jar unoil.jar jurt.jar juh.jar java_uno.jar OOoRunner.jar - -JAVAFILES =\ - StandaloneDocumentInfoUnitTest.java\ - StandaloneDocumentInfoTest.java\ - Test01.java\ - TestHelper.java\ - -JAVACLASSFILES = $(foreach,i,$(JAVAFILES) $(CLASSDIR)$/$(PACKAGE)$/$(i:b).class) - -#----- make a jar from compiled files ------------------------------ - -MAXLINELENGTH = 100000 - -JARCLASSDIRS = $(PACKAGE) -JARTARGET = $(TARGET).jar -JARCOMPRESS = TRUE - -# --- Parameters for the test -------------------------------------- - -# start an office if the parameter is set for the makefile -.IF "$(OFFICE)" == "" -CT_APPEXECCOMMAND = -.ELSE -CT_APPEXECCOMMAND = -AppExecutionCommand "$(OFFICE)$/soffice -accept=socket,host=localhost,port=8100;urp;" -.ENDIF - -# test base is java complex -CT_TESTBASE = -TestBase java_complex - -# test looks something like the.full.package.TestName -CT_TEST = -o $(PACKAGE:s\$/\.\).$(JAVAFILES:b) - -# start the runner application -CT_APP = org.openoffice.Runner - -# --- Targets ------------------------------------------------------ - -.INCLUDE: target.mk - -RUN: run - -run: - +java -cp $(CLASSPATH) $(CT_APP) $(CT_TESTBASE) $(CT_APPEXECCOMMAND) $(CT_TEST) - - - diff --git a/sfx2/qa/complex/tests.sce b/sfx2/qa/complex/tests.sce deleted file mode 100644 index c38852927ede..000000000000 --- a/sfx2/qa/complex/tests.sce +++ /dev/null @@ -1,3 +0,0 @@ --o complex.framework.DocumentMetaData --o complex.framework.DocumentMetadataAccessTest -#-o complex.framework.CheckGlobalEventBroadcaster_writer1 |