| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| package complex.bean; |
| |
| |
| // import complexlib.ComplexTestCase; |
| import com.sun.star.lang.XMultiServiceFactory; |
| import java.awt.event.*; |
| import java.awt.event.KeyEvent; |
| import com.sun.star.comp.beans.OOoBean; |
| import com.sun.star.uno.UnoRuntime; |
| |
| import java.awt.*; |
| |
| // 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.*; |
| |
| class PrivateLocalOfficeConnection extends com.sun.star.comp.beans.LocalOfficeConnection |
| { |
| public PrivateLocalOfficeConnection(com.sun.star.uno.XComponentContext xContext) |
| { |
| super(xContext); |
| } |
| } |
| |
| public class OOoBeanTest |
| { |
| |
| // public String[] getTestMethodNames() |
| // { |
| // // TODO think about trigger of sub-tests from outside |
| // return new String[] |
| // { |
| // "test1", |
| // "test2", |
| // "test3", |
| // "test4", |
| // "test5", |
| // "test6", |
| // "test6a", |
| // "test7", |
| // "test8" |
| // }; |
| // } |
| |
| /** For X-Windows we need to prolong the time between painting windows. Because |
| it takes longer than on Windows. |
| */ |
| private int getSleepTime(int time) |
| { |
| int ret = time; |
| if (isWindows() == false) |
| { |
| 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 = (com.sun.star.frame.XModel)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 |
| * @throws Exception |
| */ |
| @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 |
| * @throws Exception |
| */ |
| @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() == false) |
| { |
| 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() == false) |
| { |
| fail("Sizing error: Frame was iconified."); |
| } |
| f.setExtendedState(Frame.NORMAL); |
| Thread.sleep(getSleepTime(200)); |
| if (f.checkUnoFramePosition() == false) |
| { |
| fail("Sizing error: Frame size set back to normal after it was iconified."); |
| } |
| capturer.grabTwo(f.getClientArea()); |
| if (capturer.compare() == false) |
| { |
| 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() == false) |
| { |
| fail("Sizing error: Frame maximized."); |
| } |
| f.setExtendedState(Frame.NORMAL); |
| Thread.sleep(getSleepTime(200)); |
| if (f.checkUnoFramePosition() == false) |
| { |
| fail("Sizing error: Frame set from maximized to normal."); |
| } |
| capturer.grabTwo(f.getClientArea()); |
| if (capturer.compare() == false) |
| { |
| 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() == false) |
| { |
| fail("Sizing error: Frame moved."); |
| } |
| |
| capturer.grabTwo(f.getClientArea()); |
| if (capturer.compare() == false) |
| { |
| 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() == false) |
| { |
| 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() == false) |
| { |
| fail("Sizing error: Frame moved from back to front."); |
| } |
| |
| capturer.grabTwo(f.getClientArea()); |
| if (capturer.compare() == false) |
| { |
| fail("Painting error: Move frame to back and to front."); |
| capturer.writeImages(); |
| } |
| } |
| |
| coverFrame.dispose(); |
| } |
| finally |
| { |
| if (f != null) |
| { |
| f.dispose(); |
| } |
| } |
| } |
| |
| /** |
| 1. Create a OOoBean |
| 2. Load a document |
| 3. Create Frame (do not show yet) |
| 4. Add OOoBean to Frame |
| 5. Show Frame |
| * @throws Exception |
| */ |
| @Test public void test3() throws Exception |
| { |
| WriterFrame f = null; |
| try |
| { |
| f = new WriterFrame(100, 100, 500, 300, true, connection.getComponentContext()); |
| if (f.checkUnoFramePosition() == false) |
| { |
| fail("Sizing error."); |
| } |
| |
| } |
| finally |
| { |
| if (f != null) |
| { |
| f.dispose(); |
| } |
| } |
| } |
| |
| /** Test repeated OOoBean.aquireSystemWindow and OOoBean.releaseSystemWindow |
| * calls. |
| * @throws Exception |
| */ |
| @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() == false) |
| { |
| fail("Sizing error."); |
| } |
| } |
| finally |
| { |
| if (f != null) |
| { |
| f.dispose(); |
| } |
| if (isWindows() == false) |
| { |
| Thread.sleep(10000); |
| } |
| } |
| } |
| |
| /** Adding and removing the bean to a Java frame multiple times. |
| * Test painting and sizing. |
| * @throws Exception |
| */ |
| @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() == false) |
| { |
| fail("Painting error: adding and removing OOoBean " + |
| "repeatedly to java.lang.Frame."); |
| capturer.writeImages(); |
| } |
| |
| if (f.checkUnoFramePosition() == false) |
| { |
| fail("Sizing error."); |
| } |
| |
| } |
| finally |
| { |
| if (f != null) |
| { |
| f.dispose(); |
| } |
| if (isWindows() == false) |
| { |
| 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. |
| * @throws Exception |
| */ |
| @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++) |
| { |
| // Thread.sleep(1000); |
| bean.releaseSystemWindow(); |
| frame.remove(bean); |
| // frame.validate(); |
| // Thread.sleep(1000); |
| frame.add(bean, BorderLayout.CENTER); |
| bean.aquireSystemWindow(); |
| // frame.validate(); |
| } |
| |
| if (isWindows() == false) |
| { |
| 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. |
| * @throws Exception |
| */ |
| @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 q = Toolkit.getDefaultToolkit().getSystemEventQueue(); |
| q.invokeAndWait( new Runnable() { |
| public void run() { |
| try { |
| |
| bean.releaseSystemWindow(); |
| frame.remove(bean); |
| frame.validate(); |
| |
| } catch (Exception e) { |
| e.printStackTrace(); |
| } |
| |
| } |
| }); |
| // #2 |
| Thread.sleep(1000); |
| q.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() == false) |
| { |
| 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; |
| } |
| } |
| else |
| { |
| // Thread.sleep(2000); |
| } |
| |
| } finally { |
| bean.stopOOoConnection(); |
| frame.dispose(); |
| } |
| } |
| } |
| |
| /** Repeatedly loading a document in one and the same OOoBean instance. |
| * @throws Exception |
| */ |
| @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()) == false) |
| { |
| 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 |
| * @throws Exception |
| */ |
| |
| @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(); |
| } |
| } |
| |
| class BeanPanel extends Panel |
| { |
| public BeanPanel(OOoBean b) |
| { |
| setLayout(new BorderLayout()); |
| add(b, BorderLayout.CENTER); |
| } |
| public Dimension getPreferredSize() |
| { |
| Container c = getParent(); |
| return new Dimension(200, 200); |
| } |
| } |
| |
| |
| |
| |
| 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()"); |
| connection.tearDown(); |
| } |
| |
| private static final OfficeConnection connection = new OfficeConnection(); |
| |
| |
| } |
| |
| |