diff options
Diffstat (limited to 'bean/qa/complex')
-rw-r--r-- | bean/qa/complex/OOoBeanTest.java | 659 | ||||
-rw-r--r-- | bean/qa/complex/ScreenComparer.java | 236 | ||||
-rw-r--r-- | bean/qa/complex/WriterFrame.java | 212 | ||||
-rw-r--r-- | bean/qa/complex/makefile.mk | 99 |
4 files changed, 1206 insertions, 0 deletions
diff --git a/bean/qa/complex/OOoBeanTest.java b/bean/qa/complex/OOoBeanTest.java new file mode 100644 index 000000000000..8c8dfcd8d308 --- /dev/null +++ b/bean/qa/complex/OOoBeanTest.java @@ -0,0 +1,659 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: OOoBeanTest.java,v $ + * $Revision: 1.4 $ + * + * 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; + + +import complexlib.ComplexTestCase; +import java.io.*; +import java.awt.Rectangle; +import java.awt.Insets; +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.awt.image.BufferedImage; +import java.awt.image.PixelGrabber; +import java.awt.GridBagLayout; +import java.awt.GridBagConstraints; +import java.awt.event.*; +import java.awt.Frame; +import java.awt.Toolkit; +import java.awt.Robot; +import java.awt.event.KeyEvent; +import java.awt.Button; +import javax.imageio.ImageIO; +import javax.imageio.stream.FileImageOutputStream; +import com.sun.star.comp.beans.OOoBean; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.text.XTextDocument; + +import java.awt.*; + +public class OOoBeanTest extends ComplexTestCase +{ + + 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. + */ + 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. + */ + boolean isWindows() + { + boolean ret = false; + String os = System.getProperty("os.name"); + if (os != null) + { + os = os.trim(); + if (os.indexOf("Win") == 0) + ret = true; + } + return ret; + } + + public 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 = + (XTextDocument) 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 + */ + public void test1() throws Exception + { + WriterFrame f = null; + try + { + f = new WriterFrame(100 ,100, 500 ,400, false); + f.setText("OOoBean test."); + Thread.sleep(1000); + } + finally + { + if (f != null) + f.dispose(); + } + } + + /** Sizing, painting + */ + public void test2() throws Exception + { + WriterFrame f = null; + ScreenComparer capturer = null; + try + { + f = new WriterFrame(100, 100, 500,500, false); + if (f.checkUnoFramePosition() == false) + failed("Sizing error: Client are of Java frame does not match the UNO window.", true); + 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) + failed("Sizing error: Frame was iconified.", true); + f.setExtendedState(Frame.NORMAL); + Thread.sleep(getSleepTime(200)); + if (f.checkUnoFramePosition() == false) + failed("Sizing error: Frame size set back to normal after it was iconified.", true); + capturer.grabTwo(f.getClientArea()); + if (capturer.compare() == false) + { + failed("Painting error: Minimize (iconify) frame and back to normal size.", true); + 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) + failed("Sizing error: Frame maximized.", true); + f.setExtendedState(Frame.NORMAL); + Thread.sleep(getSleepTime(200)); + if (f.checkUnoFramePosition() == false) + failed("Sizing error: Frame set from maximized to normal.", true); + capturer.grabTwo(f.getClientArea()); + if (capturer.compare() == false) + { + failed("Painting error: Maximize frame and back to normal size", true); + 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) + failed("Sizing error: Frame moved.", true); + + capturer.grabTwo(f.getClientArea()); + if (capturer.compare() == false) + { + failed("Painting error: Move frame to a different position.", true); + 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) + { + failed("Painting error: Move frame to a different position.", true); + 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) + failed("Sizing error: Frame moved from back to front.", true); + + capturer.grabTwo(f.getClientArea()); + if (capturer.compare() == false) + { + failed("Painting error: Move frame to back and to front.", true); + 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 + */ + public void test3() throws Exception + { + WriterFrame f = null; + try + { + f = new WriterFrame(100, 100, 500, 300, true); + if (f.checkUnoFramePosition() == false) + failed("Sizing error.", true); + + } + finally + { + if (f != null) + f.dispose(); + } + } + + /** Test repeated OOoBean.aquireSystemWindow and OOoBean.releaseSystemWindow + * calls. + */ + public void test4() throws Exception + { + WriterFrame f = null; + try + { + f = new WriterFrame(100, 100, 500, 300, false); + OOoBean b = f.getBean(); + for (int i = 0; i < 100; i++) + { + b.releaseSystemWindow(); + b.aquireSystemWindow(); + } + if (f.checkUnoFramePosition() == false) + failed("Sizing error.", true); + } + 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. + */ + public void test5() throws Exception + { + WriterFrame f = null; + try + { + f = new WriterFrame(100, 100, 500, 400, false); + 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) + { + failed("Painting error: adding and removing OOoBean " + + "repeatedly to java.lang.Frame.", true); + capturer.writeImages(); + } + + if (f.checkUnoFramePosition() == false) + failed("Sizing error.", true); + + } + 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. + */ + public void test6() throws Exception + { + for (int j = 0; j < 10; j++) + { + final OOoBean bean = new OOoBean(); + 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())) + { + failed("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", true); + 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 withing the event dispatch + * thread. Using Thread.sleep at various points (#1, #2, #3) seems to workaround + * the problem. + */ + public void test6a() throws Exception + { + for (int j = 0; j < 50; j++) + { + final OOoBean bean = new OOoBean(); + 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)) + { + failed("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", true); + 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. + */ + public void test7() throws Exception + { + WriterFrame f = null; + try + { + f = new WriterFrame(100 ,100, 500 ,400, false); + 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) + failed("Repeated loading of a document failed."); + Thread.sleep(1000); + } + } + finally + { + if (f != null) + f.dispose(); + } + } + + /** Using multiple instances of OOoBean at the same time + */ + public void test8() throws Exception + { + OOoBean bean1 = new OOoBean(); + BeanPanel bp1 = new BeanPanel(bean1); + OOoBean bean2 = new OOoBean(); + BeanPanel bp2 = new BeanPanel(bean2); + OOoBean bean3 = new OOoBean(); + BeanPanel bp3 = new BeanPanel(bean3); + OOoBean bean4 = new OOoBean(); + 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); + } + } + +} + + diff --git a/bean/qa/complex/ScreenComparer.java b/bean/qa/complex/ScreenComparer.java new file mode 100644 index 000000000000..8ef7bc5d9c55 --- /dev/null +++ b/bean/qa/complex/ScreenComparer.java @@ -0,0 +1,236 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: ScreenComparer.java,v $ + * $Revision: 1.4 $ + * + * 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; + + +import complexlib.ComplexTestCase; +import java.io.File; +import java.awt.Rectangle; +import java.awt.BorderLayout; +import java.awt.image.BufferedImage; +import java.awt.image.PixelGrabber; +import java.awt.event.*; +import java.awt.Frame; +import javax.imageio.ImageIO; +import javax.imageio.stream.FileImageOutputStream; + + + +class ScreenComparer +{ + Rectangle m_rect; + BufferedImage m_img1; + BufferedImage m_img2; + BufferedImage m_imgDiff; + + int m_diffColor; + public ScreenComparer(int x, int y, int width, int height) + { + this(new Rectangle(x, y, width, height)); + } + + public ScreenComparer(Rectangle location) + { + m_rect = location; + int red = 0xff; + int alpha = 0xff; + m_diffColor = (alpha << 24); + m_diffColor = m_diffColor | (red << 16); + } + + public ScreenComparer() + { + this(new Rectangle(0, 0, 0, 0)); + } + + public void reset() + { + m_rect = null; + m_img1 = null; + m_img2 = null; + m_imgDiff = null; + } + + public Rectangle getLocation() + { + return m_rect; + } + public void grabOne() throws Exception + { + grabOne(m_rect); + } + + public void grabOne(Rectangle r) throws Exception + { + java.awt.Robot robot = new java.awt.Robot(); + m_img1 = robot.createScreenCapture(r); + } + + public void grabTwo() throws Exception + { + grabTwo(m_rect); + } + + public void grabTwo(Rectangle r) throws Exception + { + java.awt.Robot robot = new java.awt.Robot(); + m_img2 = robot.createScreenCapture(r); + } + + public boolean compare() throws Exception + { + if (m_img1 == null || m_img2 == null) + throw new Exception("Only one image captured!"); + boolean ret = true; + int w1 = m_img1.getWidth(); + int h1 = m_img1.getHeight(); + int w2 = m_img2.getWidth(); + int h2 = m_img2.getHeight(); + + if (w1 != w2 || h1 != h2) + { + System.out.println("### 1\n"); + //Different size. Create an image that holds both images. + int w = w1 > w2 ? w1 : w2; + int h = h1 > h2 ? h1 : h2; + m_imgDiff = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB); + for (int y = 0; y < h; y ++) + { + for (int x = 0; x < w; x++) + { + boolean bOutOfRange = false; + int pixel1 = 0; + int pixel2 = 0; + //get the pixel for m_img1 + if (x < w1 && y < h1) + pixel1 = m_img1.getRGB(x, y); + else + bOutOfRange = true; + + if (x < w2 && y < h2) + pixel2 = m_img2.getRGB(x, y); + else + bOutOfRange = true; + + if (bOutOfRange || pixel1 != pixel2) + m_imgDiff.setRGB(x, y, m_diffColor); + else + m_imgDiff.setRGB(x, y, pixel1); + + } + } + return false; + } + + //Images have same dimension + int[] pixels1 = new int[w1 * h1]; + PixelGrabber pg = new PixelGrabber( + m_img1.getSource(), 0, 0, w1, h1, pixels1, 0, w1); + pg.grabPixels(); + + int[] pixels2 = new int[w2 * h2]; + PixelGrabber pg2 = new PixelGrabber( + m_img2.getSource(), 0, 0, w2, h2, pixels2, 0, w2); + pg2.grabPixels(); + + m_imgDiff = new BufferedImage(w1, h1, BufferedImage.TYPE_INT_ARGB); + + //First check if the the images differ. + int lenAr = pixels1.length; + int index = 0; + for (index = 0; index < lenAr; index++) + { + if (pixels1[index] != pixels2[index]) + break; + } + + //If the images are different, then create the diff image + if (index < lenAr) + { + for (int y = 0; y < h1; y++) + { + for (int x = 0; x < w1; x++) + { + int offset = y * w1 + x; + if (pixels1[offset] != pixels2[offset]) + { + ret = ret && false; + m_imgDiff.setRGB(x, y, m_diffColor); + } + else + { + m_imgDiff.setRGB(x, y, pixels1[offset]); + } + } + } + } + return ret; + } + + /** Writes Images to a location. The + * directory is determined by the java property OOoBean.Images + * + */ + public void writeImages() throws Exception + { + String imgLocation = System.getProperty("OOoBean.Images", ""); + File file_tmp = File.createTempFile("OOoBean", "", new File(imgLocation)); + File file1 = new File(file_tmp.getPath()+".png"); + file_tmp.delete(); + if (m_img1 != null) + { + ImageIO.write(m_img1, "png", file1); + System.out.println("\nCompared images:"); + System.out.println("1. " + file1.getPath()); + } + file1= null; + file_tmp= null; + file_tmp = File.createTempFile("OOoBean", "", new File(imgLocation)); + file1 = new File(file_tmp.getPath()+".png"); + file_tmp.delete(); + if (m_img2 != null) + { + ImageIO.write(m_img2, "png", file1); + System.out.println("2. " + file1.getPath()); + } + file1= null; + file_tmp= null; + file_tmp = File.createTempFile("OOoBean", "_diff", new File(imgLocation)); + file1 = new File(file_tmp.getPath()+".png"); + file_tmp.delete(); + if (m_imgDiff != null) + { + ImageIO.write(m_imgDiff, "png", file1); + System.out.println("Diff image: " + file1.getPath() + "\n"); + } + } + +} + diff --git a/bean/qa/complex/WriterFrame.java b/bean/qa/complex/WriterFrame.java new file mode 100644 index 000000000000..16e680cf8d22 --- /dev/null +++ b/bean/qa/complex/WriterFrame.java @@ -0,0 +1,212 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: WriterFrame.java,v $ + * $Revision: 1.4 $ + * + * 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; + + +import complexlib.ComplexTestCase; +import java.awt.Rectangle; +import java.awt.Insets; +import java.awt.BorderLayout; +import java.awt.event.*; +import java.awt.Frame; +import java.awt.Dimension; +import com.sun.star.comp.beans.OOoBean; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.text.XTextDocument; + + +class WriterFrame extends java.awt.Frame +{ + com.sun.star.comp.beans.OOoBean m_bean; + String m_sDocURL = "private:factory/swriter"; + + /** + @param loadBeforeVisible + the OOoBean is added to the frame before it is displayable. Then the Java Frame does + not have a native window peer yet. + */ + public WriterFrame(int x, int y, int width, int height, boolean loadBeforeVisible) throws Exception + { + + if (loadBeforeVisible == false) + { + m_bean = new com.sun.star.comp.beans.OOoBean(); + add(m_bean, BorderLayout.CENTER); + pack(); + setBounds(x, y, width, height); + setVisible(true); + m_bean.loadFromURL(m_sDocURL, null); + validate(); + } + else + { + m_bean = new com.sun.star.comp.beans.OOoBean(); + m_bean.loadFromURL(m_sDocURL, null); + add(m_bean, BorderLayout.CENTER); + pack(); + setBounds(x, y, width, height); + setVisible(true); + m_bean.aquireSystemWindow(); + } + } + + public WriterFrame() throws Exception + { + this(0, 0, 800, 400, false); + } + + public void setText(String s) throws Exception + { + com.sun.star.frame.XModel model = (com.sun.star.frame.XModel)m_bean.getDocument(); + com.sun.star.text.XTextDocument myDoc = + (XTextDocument) UnoRuntime.queryInterface(com.sun.star.text.XTextDocument.class, + model); + com.sun.star.text.XText xText = myDoc.getText(); + com.sun.star.text.XTextCursor xTCursor = xText.createTextCursor(); + //inserting some Text + xText.insertString( xTCursor, s, false ); + } + + public String getText() throws Exception + { + com.sun.star.frame.XModel model = (com.sun.star.frame.XModel)m_bean.getDocument(); + com.sun.star.text.XTextDocument myDoc = + (XTextDocument) UnoRuntime.queryInterface(com.sun.star.text.XTextDocument.class, + model); + com.sun.star.text.XText xText = myDoc.getText(); + return xText.getString(); + } + + public void dispose() { + m_bean.stopOOoConnection(); + setVisible(false); + super.dispose(); + } + + OOoBean getBean() + { + return m_bean; + } + + /** Makes sure the document is displayed at the beginning. + * This is important for comparing screenshots. + */ + public void goToStart() throws Exception + { + com.sun.star.frame.XModel xModel = (com.sun.star.frame.XModel)m_bean.getDocument(); + com.sun.star.frame.XController xController = xModel.getCurrentController(); + + com.sun.star.text.XTextViewCursorSupplier xVCSupplier = + (com.sun.star.text.XTextViewCursorSupplier) UnoRuntime.queryInterface ( + com.sun.star.text.XTextViewCursorSupplier.class, xController ); + + com.sun.star.text.XTextViewCursor xTViewCursor = xVCSupplier.getViewCursor ( ); + xTViewCursor.gotoStart(false); + } + + + public void pageDown() throws Exception + { + com.sun.star.frame.XModel xModel = (com.sun.star.frame.XModel)m_bean.getDocument(); + com.sun.star.frame.XController xController = xModel.getCurrentController(); + + com.sun.star.text.XTextViewCursorSupplier xVCSupplier = + (com.sun.star.text.XTextViewCursorSupplier) UnoRuntime.queryInterface ( + com.sun.star.text.XTextViewCursorSupplier.class, xController ); + com.sun.star.text.XTextViewCursor xTViewCursor = xVCSupplier.getViewCursor ( ); + com.sun.star.view.XScreenCursor xScreenCursor = + (com.sun.star.view.XScreenCursor) UnoRuntime.queryInterface ( + com.sun.star.view.XScreenCursor.class, xTViewCursor ); + xScreenCursor.screenDown(); + } + + public Rectangle getClientArea() + { + + Insets i = getInsets(); + Rectangle r = getBounds(); + Rectangle rc = new Rectangle(r.x + i.left, r.y + i.top, + r.width - i.left - i.right, + r.height - i.top - i.bottom); + return rc; + } + + public Rectangle getUnoFramePosition() throws Exception + { + com.sun.star.awt.XWindow win = m_bean.getFrame().getContainerWindow(); + com.sun.star.awt.Rectangle rect = win.getPosSize(); + return new Rectangle(rect.X, rect.Y, rect.Width, rect.Height); + } + + /** After resizing the Java frame, the UNO window shall be resized + * as well, which is checked by this method. + */ + public boolean checkUnoFramePosition() throws Exception + { + Rectangle client = getClientArea(); + Rectangle unoWin = getUnoFramePosition(); + + if (client.x != unoWin.x + || client.y != unoWin.y + || client.width != unoWin.width + || client.height != unoWin.height) + { + System.out.println("\nPosition of client are of Java frame does not match the postion" + + "of the UNO window. These are the values of Java frame, followed by" + + "the UNO window: "); + System.out.println(client); + System.out.println(unoWin); + System.out.println(""); + return false; + } + + return true; + } + + public void removeOOoBean() throws Exception + { + //OOoBean.releaseSystemWindow need not be called because + //LocalOfficeWindow overrides removeNotify. + //However because of bt4745222 which was fixed in 1.4.2_04, + //this is very very slow. The workaround is use releaseSystemWindow + //beforehand. + m_bean.releaseSystemWindow(); + remove(m_bean); + } + + public void addOOoBean() throws Exception + { + add(m_bean, BorderLayout.CENTER); + m_bean.aquireSystemWindow(); + validate(); + } + +} + diff --git a/bean/qa/complex/makefile.mk b/bean/qa/complex/makefile.mk new file mode 100644 index 000000000000..4fb1ce0ea8b2 --- /dev/null +++ b/bean/qa/complex/makefile.mk @@ -0,0 +1,99 @@ +#************************************************************************* +# +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# Copyright 2008 by Sun Microsystems, Inc. +# +# OpenOffice.org - a multi-platform office productivity suite +# +# $RCSfile: makefile.mk,v $ +# +# $Revision: 1.5.8.1 $ +# +# 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 := ..$/.. +PRJNAME := bean +TARGET := test_bean +PACKAGE = complex + +.INCLUDE: settings.mk + +#----- compile .java files ----------------------------------------- + +JARFILES = officebean.jar ridl.jar unoil.jar jurt.jar juh.jar java_uno.jar OOoRunner.jar +JAVAFILES = OOoBeanTest.java ScreenComparer.java WriterFrame.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 -------------------------------------- + +# 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 + +CT_NOOFFICE = -NoOffice + + +OFFICE_CLASSPATH_TMP:=$(foreach,i,$(JARFILES) $(office)$/program$/classes$/$(i)$(PATH_SEPERATOR)) + +OFFICE_CLASSPATH=$(OFFICE_CLASSPATH_TMP:t"")$(SOLARBINDIR)$/OOoRunner.jar$(PATH_SEPERATOR)$(CLASSDIR) + +OOOBEAN_OPTIONS=-Dcom.sun.star.officebean.Options=-norestore -DOOoBean.Images=$(MISC) + + +.INCLUDE: target.mk + +ALLTAR : RUNINSTRUCTIONS + +# --- Targets ------------------------------------------------------ + +#The OOoBean uses the classpath to find the office installation. +#Therefore we must use the jar files from the office. +RUN: + java -cp $(OFFICE_CLASSPATH) $(OOOBEAN_OPTIONS) $(CT_APP) $(CT_NOOFFICE) $(CT_TESTBASE) $(CT_TEST) +run: RUN + +rund: + java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8100 -cp $(OFFICE_CLASSPATH) $(OOOBEAN_OPTIONS) $(CT_APP) $(CT_NOOFFICE) $(CT_TESTBASE) $(CT_TEST) + + + +RUNINSTRUCTIONS : + @echo . + @echo ########################### N O T E ###################################### + @echo . + @echo "To run the test you have to provide the office location." + @echo Example: + @echo dmake run office="d:/myOffice" + @echo . + |