summaryrefslogtreecommitdiff
path: root/bean/qa
diff options
context:
space:
mode:
Diffstat (limited to 'bean/qa')
-rw-r--r--bean/qa/complex/OOoBeanTest.java659
-rw-r--r--bean/qa/complex/ScreenComparer.java236
-rw-r--r--bean/qa/complex/WriterFrame.java212
-rw-r--r--bean/qa/complex/makefile.mk99
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 .
+