blob: b465738616b7438394eff4da682f0fef624ec52f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2012, 2015 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.ui.workbench.texteditor.tests;
import java.io.File;
import java.io.PrintStream;
import org.eclipse.test.OrderedTestSuite;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.ImageLoader;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.util.Util;
import org.eclipse.ui.PlatformUI;
import junit.framework.Test;
import junit.framework.TestCase;
public class ScreenshotTest extends TestCase {
public ScreenshotTest(String name) {
super(name);
}
public static Test suite() {
return new OrderedTestSuite(ScreenshotTest.class);
}
public void testScreenshot() throws Exception {
takeScreenshot(ScreenshotTest.class, getName(), System.out);
}
public void testWindowsTaskManagerScreenshots() throws Exception {
if (! Util.isWindows())
return;
Display display= Display.getDefault();
Event event= new Event();
event.type= SWT.KeyDown;
event.keyCode= SWT.CTRL;
System.out.println("* CTRL " + display.post(event));
event.keyCode= SWT.SHIFT;
System.out.println("* SHIFT " + display.post(event));
event.character= SWT.ESC;
event.keyCode= SWT.ESC;
System.out.println("* ESC " + display.post(event));
event.type= SWT.KeyUp;
System.out.println("* ESC up " + display.post(event));
event.character= 0;
event.keyCode= SWT.SHIFT;
System.out.println("* SHIFT up " + display.post(event));
event.keyCode= SWT.CTRL;
System.out.println("* CTRL up " + display.post(event));
runEventQueue();
takeScreenshot(ScreenshotTest.class, getName() + 2, System.out);
event.type= SWT.KeyDown;
event.character= SWT.ESC;
event.keyCode= SWT.ESC;
System.out.println("* ESC " + display.post(event));
event.type= SWT.KeyUp;
System.out.println("* ESC up " + display.post(event));
runEventQueue();
takeScreenshot(ScreenshotTest.class, getName() + 3, System.out);
}
/**
* Takes a screenshot and dumps other debugging information to the given stream.
*
* @param testClass test class that takes the screenshot
* @param name screenshot identifier (e.g. test name)
* @param out print stream to use for diagnostics.
* @return file system path to the screenshot file
*/
public static String takeScreenshot(Class<?> testClass, String name, PrintStream out) {
File resultsHtmlDir= getJunitReportOutput(); // ends up in testresults/linux.gtk.x86_6.0/<class>.<test>.png
if (resultsHtmlDir == null) { // Fallback. Warning: uses same file location on all test platforms:
File eclipseDir= new File("").getAbsoluteFile(); // eclipse-testing/test-eclipse/eclipse
if (isRunByGerritHudsonJob())
resultsHtmlDir= new File(eclipseDir, "/../").getAbsoluteFile(); // ends up in the workspace root
else
resultsHtmlDir= new File(eclipseDir, "../../results/html/").getAbsoluteFile(); // ends up in testresults/html/<class>.<test>.png
}
Display display= PlatformUI.getWorkbench().getDisplay();
// Wiggle the mouse:
Event mouseMove= new Event();
mouseMove.x= 10;
mouseMove.y= 10;
display.post(mouseMove);
runEventQueue();
mouseMove.x= 20;
mouseMove.y= 20;
display.post(mouseMove);
runEventQueue();
// Dump focus control, parents, and shells:
Control focusControl = display.getFocusControl();
out.println("FocusControl: ");
if (focusControl == null) {
System.out.println(" null!");
} else {
StringBuffer indent = new StringBuffer(" ");
do {
out.println(indent.toString() + focusControl);
focusControl = focusControl.getParent();
indent.append(" ");
} while (focusControl != null);
}
Shell[] shells = display.getShells();
if (shells.length > 0) {
out.println("Shells: ");
for (int i = 0; i < shells.length; i++) {
Shell shell = shells[i];
out.print(display.getActiveShell() == shell ? " active, " : " inactive, ");
out.print((shell.isVisible() ? "visible: " : "invisible: ") + shell);
out.println(" @ " + shell.getBounds().toString());
}
}
// Take a screenshot:
GC gc = new GC(display);
Rectangle displayBounds= display.getBounds();
out.println("Display @ " + displayBounds);
final Image image = new Image(display, displayBounds);
gc.copyArea(image, 0, 0);
gc.dispose();
resultsHtmlDir.mkdirs();
String filename = new File(
resultsHtmlDir.getAbsolutePath(),
testClass.getName() + "." + name + ".png").getAbsolutePath();
ImageLoader loader = new ImageLoader();
loader.data = new ImageData[] { image.getImageData() };
loader.save(filename, SWT.IMAGE_PNG);
out.println("Screenshot saved to: " + filename);
image.dispose();
return filename;
}
private static File getJunitReportOutput() {
String[] args= Platform.getCommandLineArgs();
for (int i= 0; i < args.length - 1; i++) {
if ("-junitReportOutput".equals(args[i])) { // see library.xml and org.eclipse.test.EclipseTestRunner
return new File(args[i + 1]).getAbsoluteFile();
}
}
return null;
}
public static boolean isRunByGerritHudsonJob() {
return System.getProperty("user.dir").indexOf("eclipse.platform.text-Gerrit") != -1;
}
private static void runEventQueue() {
Display display= PlatformUI.getWorkbench().getDisplay();
for (int i= 0; i < 10; i++) { // workaround for https://bugs.eclipse.org/323272
while (display.readAndDispatch()) {
// do nothing
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
}
}
}
}