test/jdk/sanity/client/SwingSet/src/EditorPaneDemoTest.java
author herrick
Mon, 14 Oct 2019 14:36:45 -0400
branchJDK-8200758-branch
changeset 58584 910b14f4fe3a
parent 54240 5294813fe931
permissions -rw-r--r--
8232042: [macos] Installation fails if application name contains spaces Submitted-by: almatvee Reviewed-by: aherrick, asemenyuk

/*
 * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.
 *
 * This code 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 General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */

import static com.sun.swingset3.demos.editorpane.EditorPaneDemo.DEMO_TITLE;
import static com.sun.swingset3.demos.editorpane.EditorPaneDemo.SOURCE_FILES;
import static org.jemmy2ext.JemmyExt.EXACT_STRING_COMPARATOR;
import static org.jemmy2ext.JemmyExt.assertNotBlack;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Insets;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.beans.PropertyChangeListener;
import java.net.URL;
import java.util.concurrent.atomic.AtomicReference;

import javax.swing.UIManager;

import org.jemmy2ext.JemmyExt;
import org.jtregext.GuiTestListener;
import org.netbeans.jemmy.ClassReference;
import org.netbeans.jemmy.image.ImageTool;
import org.netbeans.jemmy.operators.JEditorPaneOperator;
import org.netbeans.jemmy.operators.JFrameOperator;
import org.testng.annotations.Listeners;
import org.testng.annotations.Test;

import com.sun.swingset3.demos.editorpane.EditorPaneDemo;

/*
 * @test
 * @key headful screenshots
 * @summary Verifies SwingSet3 EditorPaneDemo by navigating and and validating
 *  the page contents in all pages
 *
 * @library /sanity/client/lib/jemmy/src
 * @library /sanity/client/lib/Extensions/src
 * @library /sanity/client/lib/SwingSet3/src
 * @modules java.desktop
 *          java.logging
 * @build org.jemmy2ext.JemmyExt
 * @build com.sun.swingset3.demos.editorpane.EditorPaneDemo
 * @run testng/timeout=600 EditorPaneDemoTest
 */
@Listeners(GuiTestListener.class)
public class EditorPaneDemoTest {

    private final static String PROPERTY_NAME_PAGE = "page";
    private final static String INDEX_PAGE_NAME = "index.html";
    private final static String TEXT_IN_INDEX_PAGE = "Octavo Corporation";
    private final static Dimension INDEX_IMAGE_DIMENSION = new Dimension(550, 428);
    private final static Dimension imageDimensions[] = {new Dimension(320, 342),
            new Dimension(420, 290), new Dimension(381, 384),
            new Dimension(316, 498), new Dimension(481 ,325),
            new Dimension(516, 445)};
    private final static String REFERENCE_NAMES[] =
        {"title", "king", "preface", "seaweed", "ant", "bug"};
    private final static String TEXTS_IN_PAGES[] =
        {"Physiological Descriptions", "ROBERT HOOKE",
                "Mankind above other Creatures", "Area A B C D",
                "Observ. XLIX", "Cylinder F F F"};
    private final AtomicReference<URL> newPageURL = new AtomicReference<>();

    /**
     * Testing the navigation through all html pages in EditorPaneDemo by
     * clicking on different references and validating the page contents.
     *
     * @throws Exception
     */
    @Test(dataProvider = "availableLookAndFeels", dataProviderClass = TestHelpers.class)
    public void test(String lookAndFeel) throws Exception {
        UIManager.setLookAndFeel(lookAndFeel);
        new ClassReference(EditorPaneDemo.class.getCanonicalName()).startApplication();

        JFrameOperator frameOperator = new JFrameOperator(DEMO_TITLE);
        frameOperator.setComparator(EXACT_STRING_COMPARATOR);
        PropertyChangeListener pageChangeListener =
                event -> newPageURL.set((URL) event.getNewValue());
        JEditorPaneOperator editorPaneOperator = new JEditorPaneOperator(frameOperator);

        try {
            editorPaneOperator.addPropertyChangeListener(
                    PROPERTY_NAME_PAGE, pageChangeListener);
            // Validation of initial or index page
            URL indexURL = getPageURL(INDEX_PAGE_NAME);
            editorPaneOperator.waitStateOnQueue(comp
                    -> indexURL.equals(editorPaneOperator.getPage()));
            checkImage(editorPaneOperator, INDEX_IMAGE_DIMENSION, INDEX_PAGE_NAME);
            checkTextPresence(editorPaneOperator, TEXT_IN_INDEX_PAGE);

            // Clicking on different references and validating pages by selecting
            // unique texts in each page
            for (int i = 0; i < REFERENCE_NAMES.length; i++) {
                editorPaneOperator.clickOnReference(REFERENCE_NAMES[i]);
                validatePage(editorPaneOperator, i);
            }
        } finally {
            editorPaneOperator.removePropertyChangeListener(
                    PROPERTY_NAME_PAGE, pageChangeListener);
        }
    }

    private void checkTextPresence(
            JEditorPaneOperator editorPaneOperator, String text) {
        editorPaneOperator.selectText(text);
        editorPaneOperator.waitStateOnQueue(comp
                -> text.equals(editorPaneOperator.getSelectedText()));
    }

    private void validatePage(JEditorPaneOperator editorPaneOperator,
            int i) throws Exception {
        URL expectedPageURL = getPageURL(REFERENCE_NAMES[i] + ".html");
        editorPaneOperator.waitStateOnQueue(comp
                -> expectedPageURL.equals(newPageURL.get()));
        checkImage(editorPaneOperator, imageDimensions[i], REFERENCE_NAMES[i]);
        checkTextPresence(editorPaneOperator, TEXTS_IN_PAGES[i]);
    }

    private void checkImage(JEditorPaneOperator editorPaneOperator,
            Dimension imageDim, String pageName) throws Exception {
        // Captures image screen shot and checking some 10 pixels from inner
        // area of the image are not default background color
        Point compLoc = editorPaneOperator.getLocationOnScreen();
        Insets insets = editorPaneOperator.getInsets();
        Rectangle imageRect = new Rectangle(new Point(compLoc.x + insets.left,
                compLoc.y + insets.top), imageDim);
        final int xGap = 100, yGap = 40, columns = 2, rows = 5;
        editorPaneOperator.waitState(comp -> {
            BufferedImage capturedImage = ImageTool.getImage(imageRect);
            assertNotBlack(capturedImage);
            int x = 0, y = 0, i = 0, j;
            for (; i < columns; i++) {
                x += xGap;
                y = 0;
                for (j = 0; j < rows; j++) {
                    y += yGap;
                    if(capturedImage.getRGB(x, y) == Color.WHITE.getRGB()) {
                        // saving image for failure case
                        JemmyExt.save(capturedImage, "capturedimage_" + pageName + "_" +
                                UIManager.getLookAndFeel().getClass().getSimpleName() + ".png");
                        return false;
                    }
                }
            }
            return true;
        });
    }

    /**
     * Gets the URL corresponding to a page name
     *
     * @param pageName : name of the page
     * @return : URL corresponding to page
     */
    private URL getPageURL(String pageName) {
        String url = null;
        for (String sourceFile : SOURCE_FILES) {
            if(sourceFile.endsWith(pageName)) {
                url = sourceFile;
            }
        }
        return getClass().getResource(url);
    }
}