kshefov@638: /* kshefov@638: * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. kshefov@638: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. kshefov@638: * kshefov@638: * This code is free software; you can redistribute it and/or modify it kshefov@638: * under the terms of the GNU General Public License version 2 only, as kshefov@638: * published by the Free Software Foundation. kshefov@638: * kshefov@638: * This code is distributed in the hope that it will be useful, but WITHOUT kshefov@638: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or kshefov@638: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License kshefov@638: * version 2 for more details (a copy is included in the LICENSE file that kshefov@638: * accompanied this code). kshefov@638: * kshefov@638: * You should have received a copy of the GNU General Public License version kshefov@638: * 2 along with this work; if not, write to the Free Software Foundation, kshefov@638: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. kshefov@638: * kshefov@638: * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA kshefov@638: * or visit www.oracle.com if you need additional information or have any kshefov@638: * questions. kshefov@638: */ kshefov@638: kshefov@638: /** kshefov@638: * Base library for JavaFX canvas run by Nashorn testing. kshefov@638: * @subtest kshefov@638: * kshefov@638: * kshefov@638: */ kshefov@638: kshefov@638: var System = Java.type("java.lang.System"); kshefov@638: var AWTImage = Java.type("org.jemmy.image.AWTImage"); kshefov@638: var PNGDecoder = Java.type("org.jemmy.image.PNGDecoder"); kshefov@638: var JemmyFxRoot = Java.type("org.jemmy.fx.Root"); kshefov@638: var AWTRobotCapturer = Java.type("org.jemmy.image.AWTRobotCapturer"); kshefov@638: var ByWindowType = Java.type("org.jemmy.fx.ByWindowType"); kshefov@638: var Scene = Java.type("javafx.scene.Scene"); kshefov@638: var Stage = Java.type("javafx.stage.Stage"); kshefov@638: var File = Java.type("java.io.File"); kshefov@638: var OSInfo = Java.type("sun.awt.OSInfo"); kshefov@638: var OSType = Java.type("sun.awt.OSInfo.OSType"); kshefov@638: var StringBuffer = Java.type("java.lang.StringBuffer"); kshefov@667: var Paint = Java.type("javafx.scene.paint.Paint"); kshefov@667: var Color = Java.type("javafx.scene.paint.Color"); kshefov@667: var Image = Java.type("javafx.scene.image.Image"); kshefov@667: var Canvas = Java.type("javafx.scene.canvas.Canvas"); kshefov@667: var BorderPane = Java.type("javafx.scene.layout.BorderPane"); kshefov@667: var StackPane = Java.type("javafx.scene.layout.StackPane"); kshefov@667: var StrokeLineCap = Java.type("javafx.scene.shape.StrokeLineCap"); kshefov@667: var Platform = Java.type("javafx.application.Platform"); kshefov@667: var Runnable = Java.type("java.lang.Runnable"); kshefov@667: var RunnableExtend = Java.extend(Runnable); kshefov@667: var AnimationTimer = Java.type("javafx.animation.AnimationTimer"); kshefov@667: var AnimationTimerExtend = Java.extend(AnimationTimer); kshefov@667: var Timer = Java.type("java.util.Timer"); kshefov@667: var TimerTask = Java.type("java.util.TimerTask"); kshefov@638: kshefov@638: var TESTNAME = "test"; kshefov@638: var fsep = System.getProperty("file.separator"); kshefov@638: kshefov@638: function checkImageAndExit() { kshefov@638: var raceTimer = new Timer(true); kshefov@638: var timerTask = new TimerTask() { kshefov@638: run: function run() { kshefov@638: var tmpdir = System.getProperty("java.io.tmpdir"); kshefov@638: var timenow = (new Date()).getTime(); kshefov@667: var scrShotTmp = tmpdir + fsep + "screenshot" + timenow +".png"; kshefov@667: var goldenImageDir = __DIR__ + "jfx" + fsep + TESTNAME + fsep + "golden"; kshefov@667: makeScreenShot(scrShotTmp); kshefov@667: var dupImg = isDuplicateImages(scrShotTmp, goldenImageDir); kshefov@667: (new File(scrShotTmp)).delete(); kshefov@667: if (!dupImg) System.err.println("ERROR: screenshot does not match the golden image"); kshefov@638: exit(0); kshefov@638: } kshefov@638: }; kshefov@667: raceTimer.schedule(timerTask, 100); kshefov@638: } kshefov@638: kshefov@638: function makeScreenShot(shootToImg) { kshefov@638: JemmyFxRoot.ROOT.getEnvironment().setImageCapturer(new AWTRobotCapturer()); kshefov@638: var wrap = JemmyFxRoot.ROOT.lookup(new ByWindowType($STAGE.class)).lookup(Scene.class).wrap(0); kshefov@638: var imageJemmy = wrap.getScreenImage(); kshefov@638: imageJemmy.save(shootToImg); kshefov@638: } kshefov@638: kshefov@667: function isDuplicateImages(screenShot, goldenDir) { kshefov@667: var f1 = new File(screenShot); kshefov@638: var f2; kshefov@667: var sb = new StringBuffer(goldenDir); kshefov@638: if (OSInfo.getOSType() == OSType.WINDOWS) { kshefov@638: f2 = new File(sb.append(fsep + "windows.png").toString()); kshefov@638: } else if (OSInfo.getOSType() == OSType.LINUX) { kshefov@638: f2 = new File(sb.append(fsep + "linux.png").toString()); kshefov@638: } else if (OSInfo.getOSType() == OSType.MACOSX) { kshefov@638: f2 = new File(sb.append(fsep + "macosx.png").toString()); kshefov@638: } kshefov@638: if (f1.exists() && f2.exists()) { kshefov@638: var image1 = new AWTImage(PNGDecoder.decode(f1.getAbsolutePath())); kshefov@638: var image2 = new AWTImage(PNGDecoder.decode(f2.getAbsolutePath())); kshefov@638: return image1.compareTo(image2) == null ? true : false; kshefov@638: } kshefov@638: return false; kshefov@638: }