summaryrefslogtreecommitdiffstats
path: root/bean/qa/complex/bean/OOoBeanTest.java
diff options
context:
space:
mode:
Diffstat (limited to 'bean/qa/complex/bean/OOoBeanTest.java')
-rw-r--r--bean/qa/complex/bean/OOoBeanTest.java684
1 files changed, 684 insertions, 0 deletions
diff --git a/bean/qa/complex/bean/OOoBeanTest.java b/bean/qa/complex/bean/OOoBeanTest.java
new file mode 100644
index 000000000..0e23e1701
--- /dev/null
+++ b/bean/qa/complex/bean/OOoBeanTest.java
@@ -0,0 +1,684 @@
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+package complex.bean;
+
+
+import java.awt.event.*;
+
+import com.sun.star.comp.beans.OOoBean;
+import com.sun.star.uno.UnoRuntime;
+
+import java.awt.*;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openoffice.test.OfficeConnection;
+
+import static org.junit.Assert.*;
+
+/**
+ * This only here to expose the protected constructor.
+ */
+class PrivateLocalOfficeConnection extends com.sun.star.comp.beans.LocalOfficeConnection
+{
+ public PrivateLocalOfficeConnection(com.sun.star.uno.XComponentContext xContext)
+ {
+ super(xContext);
+ }
+}
+
+@Deprecated
+public class OOoBeanTest
+{
+
+ /** For X-Windows we need to prolong the time between painting windows. Because
+ it takes longer than on Windows.
+ */
+ private int getSleepTime(int time)
+ {
+ if (!isWindows())
+ {
+ return time * 5;
+ }
+ return time;
+ }
+
+ /** If it cannot be determined if we run on Windows then we assume
+ that we do not.
+ */
+ private boolean isWindows()
+ {
+ boolean ret = false;
+ String os = System.getProperty("os.name");
+ if (os != null)
+ {
+ os = os.trim();
+ if (os.toLowerCase().indexOf("win") == 0)
+ {
+ ret = true;
+ }
+ }
+ return ret;
+ }
+
+ private String getText(OOoBean bean) throws Exception
+ {
+ com.sun.star.frame.XModel model = bean.getDocument();
+ com.sun.star.text.XTextDocument myDoc =
+ UnoRuntime.queryInterface(com.sun.star.text.XTextDocument.class, model);
+ com.sun.star.text.XText xText = myDoc.getText();
+ return xText.getString();
+ }
+
+ /** 1.Create a Java frame
+ * 2.Add OOoBean (no document loaded yet)
+ * 3.Show frame
+ * 4.Load document
+ */
+ @Test public void test1() throws Exception
+ {
+ WriterFrame f = null;
+ try
+ {
+ f = new WriterFrame(100 ,100, 500 ,400, false, connection.getComponentContext());
+ f.setText("OOoBean test.");
+ Thread.sleep(1000);
+ }
+ finally
+ {
+ if (f != null)
+ {
+ f.dispose();
+ }
+ }
+ }
+
+ /** Sizing, painting
+ */
+ @Test public void test2() throws Exception
+ {
+ WriterFrame f = null;
+ ScreenComparer capturer = null;
+ try
+ {
+ f = new WriterFrame(100, 100, 500,500, false, connection.getComponentContext());
+ if (!f.checkUnoFramePosition())
+ {
+ fail("Sizing error: Client are of Java frame does not match the UNO window.");
+ }
+ capturer = new ScreenComparer(100, 100, 500, 500);
+
+ //Minimize Window and back
+ f.goToStart();
+ f.pageDown();
+ Thread.sleep(1000);
+ for (int i = 0; i < 3; i++)
+ {
+ capturer.reset();
+ capturer.grabOne(f.getClientArea());
+ f.setExtendedState(Frame.ICONIFIED);
+ Thread.sleep(getSleepTime(200));
+ if (!f.checkUnoFramePosition())
+ {
+ fail("Sizing error: Frame was iconified.");
+ }
+ f.setExtendedState(Frame.NORMAL);
+ Thread.sleep(getSleepTime(200));
+ if (!f.checkUnoFramePosition())
+ {
+ fail("Sizing error: Frame size set back to normal after it was iconified.");
+ }
+ capturer.grabTwo(f.getClientArea());
+ if (!capturer.compare())
+ {
+ fail("Painting error: Minimize (iconify) frame and back to normal size.");
+ capturer.writeImages();
+ }
+ }
+
+ //Maximize Window and back to normal
+ for (int i = 0; i < 3; i++)
+ {
+ capturer.reset();
+ capturer.grabOne(f.getClientArea());
+ f.setExtendedState(Frame.MAXIMIZED_BOTH);
+ Thread.sleep(getSleepTime(200));
+ if (!f.checkUnoFramePosition())
+ {
+ fail("Sizing error: Frame maximized.");
+ }
+ f.setExtendedState(Frame.NORMAL);
+ Thread.sleep(getSleepTime(200));
+ if (!f.checkUnoFramePosition())
+ {
+ fail("Sizing error: Frame set from maximized to normal.");
+ }
+ capturer.grabTwo(f.getClientArea());
+ if (!capturer.compare())
+ {
+ fail("Painting error: Maximize frame and back to normal size");
+ capturer.writeImages();
+ }
+ }
+
+ //move Window top left
+ capturer.reset();
+ capturer.grabOne(f.getClientArea());
+ Rectangle oldPosition = f.getBounds();
+ f.setBounds(0, 0, oldPosition.width, oldPosition.height);
+ Thread.sleep(getSleepTime(200));
+ if (!f.checkUnoFramePosition())
+ {
+ fail("Sizing error: Frame moved.");
+ }
+
+ capturer.grabTwo(f.getClientArea());
+ if (!capturer.compare())
+ {
+ fail("Painting error: Move frame to a different position.");
+ capturer.writeImages();
+ }
+
+ //move Window down
+ Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
+ int maxY = dim.height - f.getBounds().height;
+
+ int curY = 0;
+ while (curY < maxY)
+ {
+ capturer.reset();
+ capturer.grabOne(f.getClientArea());
+ oldPosition = f.getBounds();
+ f.setBounds(0, curY, oldPosition.width, oldPosition.height);
+ capturer.grabTwo(f.getClientArea());
+ if (!capturer.compare())
+ {
+ fail("Painting error: Move frame to a different position.");
+ capturer.writeImages();
+ }
+ curY+= 50;
+ Thread.sleep(getSleepTime(200));
+ }
+
+ //obscure the window and make it visible again
+
+ oldPosition = f.getBounds();
+
+ Rectangle pos = new Rectangle(oldPosition.x - 50, oldPosition.y - 50,
+ oldPosition.width, oldPosition.height);
+ Frame coverFrame = new Frame();
+ coverFrame.setBounds(pos);
+ capturer.reset();
+ capturer.grabOne(f.getClientArea());
+
+ for (int i = 0; i < 3; i++)
+ {
+ coverFrame.setVisible(true);
+ Thread.sleep(getSleepTime(200));
+ f.toFront();
+ Thread.sleep(getSleepTime(200));
+ if (!f.checkUnoFramePosition())
+ {
+ fail("Sizing error: Frame moved from back to front.");
+ }
+
+ capturer.grabTwo(f.getClientArea());
+ if (!capturer.compare())
+ {
+ fail("Painting error: Move frame to back and to front.");
+ capturer.writeImages();
+ }
+ }
+
+ coverFrame.dispose();
+ }
+ finally
+ {
+ if (f != null)
+ {
+ f.dispose();
+ }
+ }
+ }
+
+ /**
+ 1. Create an OOoBean
+ 2. Load a document
+ 3. Create Frame (do not show yet)
+ 4. Add OOoBean to Frame
+ 5. Show Frame
+ */
+ @Test public void test3() throws Exception
+ {
+ WriterFrame f = null;
+ try
+ {
+ f = new WriterFrame(100, 100, 500, 300, true, connection.getComponentContext());
+ if (!f.checkUnoFramePosition())
+ {
+ fail("Sizing error.");
+ }
+
+ }
+ finally
+ {
+ if (f != null)
+ {
+ f.dispose();
+ }
+ }
+ }
+
+ /** Test repeated OOoBean.aquireSystemWindow and OOoBean.releaseSystemWindow
+ * calls.
+ */
+ @Test public void test4() throws Exception
+ {
+ WriterFrame f = null;
+ try
+ {
+ f = new WriterFrame(100, 100, 500, 300, false, connection.getComponentContext());
+ OOoBean b = f.getBean();
+ for (int i = 0; i < 100; i++)
+ {
+ b.releaseSystemWindow();
+ b.aquireSystemWindow();
+ }
+ if (!f.checkUnoFramePosition())
+ {
+ fail("Sizing error.");
+ }
+ }
+ finally
+ {
+ if (f != null)
+ {
+ f.dispose();
+ }
+ if (!isWindows())
+ {
+ Thread.sleep(10000);
+ }
+ }
+ }
+
+ /** Adding and removing the bean to a Java frame multiple times.
+ * Test painting and sizing.
+ */
+ @Test public void test5() throws Exception
+ {
+ WriterFrame f = null;
+ try
+ {
+ f = new WriterFrame(100, 100, 500, 400, false, connection.getComponentContext());
+ f.goToStart();
+ f.pageDown();
+ Thread.sleep(1000);
+
+ ScreenComparer capturer = new ScreenComparer(100,100,500,400);
+ capturer.grabOne();
+ for (int i = 0; i < 100; i++)
+ {
+ f.removeOOoBean();
+ f.addOOoBean();
+ }
+
+ f.goToStart();
+ f.pageDown();
+ Thread.sleep(getSleepTime(200));
+ capturer.grabTwo();
+
+ if (!capturer.compare())
+ {
+ fail("Painting error: adding and removing OOoBean " +
+ "repeatedly to java.lang.Frame.");
+ capturer.writeImages();
+ }
+
+ if (!f.checkUnoFramePosition())
+ {
+ fail("Sizing error.");
+ }
+
+ }
+ finally
+ {
+ if (f != null)
+ {
+ f.dispose();
+ }
+ if (!isWindows())
+ {
+ Thread.sleep(10000);
+ }
+ }
+ }
+
+
+ /** Test focus (i49454). After repeatedly adding and removing the bean to a window
+ * it should still be possible to enter text in the window. This does not
+ * work all the time on Windows. This is probably a timing problem. When using
+ * Thread.sleep (position #1) then it should work.
+ */
+ @Test public void test6() throws Exception
+ {
+ for (int j = 0; j < 10; j++)
+ {
+ final OOoBean bean = new OOoBean(new PrivateLocalOfficeConnection(connection.getComponentContext()));
+ java.awt.Frame frame = null;
+ bean.setOOoCallTimeOut(10000);
+ try {
+ frame = new java.awt.Frame("OpenOffice.org Demo");
+ frame.add(bean, BorderLayout.CENTER);
+ frame.pack();
+ frame.setSize(600,300);
+ frame.show();
+ bean.loadFromURL("private:factory/swriter", null);
+ // #1
+ Thread.sleep(1000);
+
+ StringBuffer buf = new StringBuffer(1000);
+ for (int i = 0; i < 1; i++)
+ {
+ bean.releaseSystemWindow();
+ frame.remove(bean);
+ frame.add(bean, BorderLayout.CENTER);
+ bean.aquireSystemWindow();
+ }
+
+ if (!isWindows())
+ {
+ Thread.sleep(5000);
+ }
+
+ Robot roby = new Robot();
+ roby.keyPress(KeyEvent.VK_H);
+ roby.keyRelease(KeyEvent.VK_H);
+ buf.append("h");
+
+ String s = getText(bean);
+ if ( ! s.equals(buf.toString()))
+ {
+ fail("Focus error: After removing and adding the bean, the" +
+ "office window does not receive keyboard input.\n" +
+ "Try typing in the window, you've got 30s!!! This " +
+ "test may not work with Linux/Solaris");
+ Thread.sleep(30000);
+ break;
+ }
+ else
+ {
+ Thread.sleep(2000);
+ }
+
+ } finally {
+ bean.stopOOoConnection();
+ frame.dispose();
+ }
+ }
+ }
+
+ /** Tests focus problem just like test6, but the implementation is a little
+ * different. The bean is added and removed from within the event dispatch
+ * thread. Using Thread.sleep at various points (#1, #2, #3) seems to workaround
+ * the problem.
+ */
+ @Test public void test6a() throws Exception
+ {
+ for (int j = 0; j < 50; j++)
+ {
+ final OOoBean bean = new OOoBean(new PrivateLocalOfficeConnection(connection.getComponentContext()));
+ final java.awt.Frame frame = new Frame("Openoffice.org");
+ bean.setOOoCallTimeOut(10000);
+
+ try {
+ frame.add(bean, BorderLayout.CENTER);
+ frame.pack();
+ frame.setSize(600,400);
+ frame.show();
+ bean.loadFromURL("private:factory/swriter", null);
+ frame.validate();
+ // #1
+ Thread.sleep(1000);
+ StringBuffer buf = new StringBuffer(1000);
+ int i = 0;
+
+ for (; i < 1; i++)
+ {
+ EventQueue.invokeAndWait( new Runnable() {
+ public void run() {
+ try {
+
+ bean.releaseSystemWindow();
+ frame.remove(bean);
+ frame.validate();
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ }
+ });
+ // #2
+ Thread.sleep(1000);
+ EventQueue.invokeAndWait( new Runnable() {
+ public void run() {
+ try {
+
+ frame.add(bean, BorderLayout.CENTER);
+ bean.aquireSystemWindow();
+ frame.validate();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ });
+
+ // #3
+ Thread.sleep(1000);
+ }
+
+ if (!isWindows())
+ {
+ Thread.sleep(5000);
+ }
+
+ Robot roby = new Robot();
+ roby.mouseMove(300, 200);
+ roby.waitForIdle();
+ roby.mousePress(InputEvent.BUTTON1_MASK);
+ roby.waitForIdle();
+ roby.mouseRelease(InputEvent.BUTTON1_MASK);
+ roby.waitForIdle();
+ roby.keyPress(KeyEvent.VK_H);
+ roby.waitForIdle();
+ roby.keyRelease(KeyEvent.VK_H);
+ roby.waitForIdle();
+
+ buf.append('h');
+ Thread.sleep(1000);
+ String s = getText(bean);
+ System.out.println(" getText: " + s);
+ if ( ! s.equals(buf.toString()))
+ {
+ roby.mousePress(InputEvent.BUTTON1_MASK);
+ roby.waitForIdle();
+ roby.mouseRelease(InputEvent.BUTTON1_MASK);
+ roby.waitForIdle();
+ roby.keyPress(KeyEvent.VK_H);
+ roby.waitForIdle();
+ roby.keyRelease(KeyEvent.VK_H);
+ roby.waitForIdle();
+
+ String sH = "h";
+ Thread.sleep(1000);
+ String s2 = getText(bean);
+
+ if ( ! sH.equals(s2))
+ {
+ fail("Focus error: After removing and adding the bean, the" +
+ "office window does not receive keyboard input.\n" +
+ "Try typing in the window, you've got 30s!!! This " +
+ "test may not work with Linux/Solaris");
+ System.out.println("j: " + j + " i: " + i);
+ Thread.sleep(30000);
+ break;
+ }
+ }
+
+ } finally {
+ bean.stopOOoConnection();
+ frame.dispose();
+ }
+ }
+ }
+
+ /** Repeatedly loading a document in one and the same OOoBean instance.
+ */
+ @Test public void test7() throws Exception
+ {
+ WriterFrame f = null;
+ try
+ {
+ f = new WriterFrame(100 ,100, 500 ,400, false, connection.getComponentContext());
+ String text = "OOoBean test.";
+
+ for (int i = 0; i < 10; i++)
+ {
+ f.getBean().clear();
+ f.getBean().loadFromURL("private:factory/swriter", null);
+ f.setText(text);
+ f.goToStart();
+ f.validate();
+
+ if (!text.equals(f.getText()))
+ {
+ fail("Repeated loading of a document failed.");
+ }
+ Thread.sleep(1000);
+ }
+ }
+ finally
+ {
+ if (f != null)
+ {
+ f.dispose();
+ }
+ }
+ }
+
+ /** Using multiple instances of OOoBean at the same time
+ */
+ @Test public void test8() throws Exception
+ {
+ OOoBean bean1 = new OOoBean(new PrivateLocalOfficeConnection(connection.getComponentContext()));
+ BeanPanel bp1 = new BeanPanel(bean1);
+ OOoBean bean2 = new OOoBean(new PrivateLocalOfficeConnection(connection.getComponentContext()));
+ BeanPanel bp2 = new BeanPanel(bean2);
+ OOoBean bean3 = new OOoBean(new PrivateLocalOfficeConnection(connection.getComponentContext()));
+ BeanPanel bp3 = new BeanPanel(bean3);
+ OOoBean bean4 = new OOoBean(new PrivateLocalOfficeConnection(connection.getComponentContext()));
+ BeanPanel bp4 = new BeanPanel(bean4);
+
+ try
+ {
+ Frame f = new Frame("OOoBean example with several instances");
+ f.setLayout(new GridBagLayout());
+ GridBagConstraints c = new GridBagConstraints();
+ c.fill = GridBagConstraints.HORIZONTAL;
+ c.weightx = 0.5;
+
+ c.insets = new Insets(0, 0, 0, 10);
+ c.gridx = 0;
+ c.gridy = 0;
+ f.add(bp1, c);
+
+ c.gridx = 1;
+ c.insets = new Insets(0, 0, 0, 0);
+ f.add(bp2, c);
+
+ c.gridx = 0;
+ c.gridy = 1;
+ c.insets = new Insets(10, 0, 0, 10);
+ f.add(bp3, c);
+
+ c.gridx = 1;
+ c.gridy = 1;
+ c.insets = new Insets(10, 0, 0, 0);
+ f.add(bp4, c);
+
+ f.pack();
+ f.setBounds(0, 0, 1000, 600);
+ f.setVisible(true);
+ try {
+ bean1.loadFromURL("private:factory/swriter", null);
+ bean2.loadFromURL("private:factory/swriter", null);
+ bean3.loadFromURL("private:factory/swriter", null);
+ bean4.loadFromURL("private:factory/swriter", null);
+ } catch( Exception e)
+ {
+ e.printStackTrace();
+ }
+ f.validate();
+
+ Thread.sleep(10000);
+ }
+ finally
+ {
+ bean1.stopOOoConnection();
+ bean2.stopOOoConnection();
+ bean3.stopOOoConnection();
+ bean4.stopOOoConnection();
+ }
+ }
+
+ private class BeanPanel extends Panel
+ {
+ private BeanPanel(OOoBean b)
+ {
+ setLayout(new BorderLayout());
+ add(b, BorderLayout.CENTER);
+ }
+ @Override
+ public Dimension getPreferredSize()
+ {
+ return new Dimension(200, 200);
+ }
+ }
+
+
+ // setup and close connections
+ @BeforeClass public static void setUpConnection() throws Exception {
+ System.out.println("setUpConnection()");
+ connection.setUp();
+ }
+
+ @AfterClass public static void tearDownConnection()
+ throws InterruptedException, com.sun.star.uno.Exception
+ {
+ System.out.println("tearDownConnection()");
+ connection.tearDown();
+ }
+
+ private static final OfficeConnection connection = new OfficeConnection();
+
+
+}
+
+