1 /*
   2  * Copyright (c) 2007, 2017, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation. Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 package org.jemmy.image;
  26 
  27 import java.awt.EventQueue;
  28 import java.awt.Frame;
  29 import java.io.File;
  30 import java.io.IOException;
  31 import java.lang.reflect.InvocationTargetException;
  32 import java.util.logging.Level;
  33 import java.util.logging.Logger;
  34 import org.jemmy.Rectangle;
  35 import org.jemmy.TimeoutExpiredException;
  36 import org.jemmy.control.Wrap;
  37 import org.jemmy.env.Environment;
  38 import org.jemmy.operators.AWTScreen;
  39 import org.jemmy.operators.Screen;
  40 import org.testng.annotations.AfterClass;
  41 import org.testng.annotations.AfterMethod;
  42 import org.testng.annotations.BeforeClass;
  43 import org.testng.annotations.BeforeMethod;
  44 import org.testng.annotations.Test;
  45 
  46 import static org.testng.Assert.fail;
  47 
  48 /**
  49  *
  50  * @author shura
  51  */
  52 public class ScreenAreaImageTest {
  53 
  54     public ScreenAreaImageTest() {
  55     }
  56 
  57     static ImageLoader loader;
  58 
  59     @BeforeClass
  60     public static void setUpClass() throws Exception {
  61         Screen.setSCREEN(new AWTScreen());
  62     }
  63 
  64     @AfterClass
  65     public static void tearDownClass() throws Exception {
  66     }
  67     File tmpDump = null;
  68     File tmpDumpPart = null;
  69     Wrap<Object> area;
  70     Frame frm;
  71     Rectangle part = new Rectangle(10, 10, 80, 80);
  72 
  73     @BeforeMethod
  74     public void setUp() throws IOException, InterruptedException {
  75         Environment.getEnvironment().setImageCapturer(new AWTRobotCapturer());
  76         loader = new FilesystemImageLoader();
  77         frm = new Frame("some frame");
  78         frm.setVisible(true);
  79         frm.setSize(100, 100);
  80         frm.setLocation(100, 100);
  81         area = new Wrap<Object>(Environment.getEnvironment(), "screen area") {
  82 
  83             @Override
  84             public Rectangle getScreenBounds() {
  85                 return new Rectangle(100, 100, 100, 100);
  86             }
  87         };
  88         // Added timeout to prevent failures due to Windows Vista Visual Effects
  89         Thread.sleep(1000);
  90         tmpDump = File.createTempFile("screen", ".png");
  91         tmpDumpPart = File.createTempFile("screenPart", ".png");
  92         area.getScreenImage().save(tmpDump.getAbsolutePath());
  93         area.getScreenImage(part).save(tmpDumpPart.getAbsolutePath());
  94         try {
  95             Thread.sleep(2000);
  96         } catch (InterruptedException ex) {
  97             Logger.getLogger(ScreenImageTest.class.getName()).log(Level.SEVERE, null, ex);
  98         }
  99     }
 100 
 101     @AfterMethod
 102     public void tearDown() {
 103         frm.setVisible(false);
 104     }
 105 
 106     @Test
 107     public void compareFull() {
 108         try {
 109             area.waitImage(loader.load(tmpDump.getAbsolutePath()), null, null);
 110         } catch(TimeoutExpiredException e) {
 111             fail(e.getLocalizedMessage());
 112             throw e;
 113         }
 114     }
 115 
 116     @Test
 117     public void comparePart() {
 118         try {
 119             area.waitImage(loader.load(tmpDumpPart.getAbsolutePath()), part, null, null);
 120         } catch(TimeoutExpiredException e) {
 121             fail(e.getLocalizedMessage());
 122             throw e;
 123         }
 124     }
 125 
 126     @Test
 127     public void compareNegative() throws InterruptedException, InvocationTargetException {
 128         EventQueue.invokeAndWait(new Runnable() {
 129 
 130             public void run() {
 131                 frm.setVisible(false);
 132             }
 133         });
 134         Thread.sleep(100);
 135         try {
 136             area.waitImage(loader.load(tmpDump.getAbsolutePath()), null, null);
 137             // TODO: Test unstable. Sometimes passes
 138             fail();
 139         } catch(TimeoutExpiredException e) {
 140         }
 141     }
 142 }