org.richfaces.tests.metamer.ftest.richTree.AbstractTreeSelectionTest.java Source code

Java tutorial

Introduction

Here is the source code for org.richfaces.tests.metamer.ftest.richTree.AbstractTreeSelectionTest.java

Source

/*
 * JBoss, Home of Professional Open Source
 * Copyright 2010-2016, Red Hat, Inc. and individual contributors
 * by the @authors tag. See the copyright.txt in the distribution for a
 * full listing of individual contributors.
 *
 * This is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; either version 2.1 of
 * the License, or (at your option) any later version.
 *
 * This software 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 for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this software; if not, write to the Free
 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
 */
package org.richfaces.tests.metamer.ftest.richTree;

import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertTrue;

import java.util.Arrays;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.lang.StringUtils;
import org.jboss.arquillian.graphene.Graphene;
import org.jboss.arquillian.graphene.findby.FindByJQuery;
import org.jboss.arquillian.graphene.javascript.JavaScript;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.richfaces.component.SwitchType;
import org.richfaces.fragment.tree.Tree.TreeNode;
import org.richfaces.tests.metamer.ftest.webdriver.utils.MetamerJavascriptUtils;
import org.testng.annotations.BeforeMethod;

/**
 * @author <a href="mailto:jpapouse@redhat.com">Jan Papousek</a>
 * @author <a href="mailto:ppitonak@redhat.com">Pavol Pitonak</a>
 */
public abstract class AbstractTreeSelectionTest extends AbstractTreeTest {

    @FindByJQuery("input:submit[id$=expandAll]")
    private WebElement expandAll;
    @FindBy(css = "span[id$=selection]")
    private WebElement selection;
    @FindBy(css = "span[id$=selectionEventNewSelection]")
    private WebElement newSelection;
    @FindBy(css = "span[id$=selectionEventOldSelection]")
    private WebElement oldSelection;
    @FindBy(css = "span[id$=selectionEventClientId]")
    private WebElement clientId;
    @FindByJQuery(value = "div[id$=richTree] span.rf-trn-sel")
    private List<WebElement> allSelectedItems;
    @JavaScript
    private MetamerJavascriptUtils jsUtils;

    private SwitchType selectionType;

    private static final SwitchType[] selectionTypes = new SwitchType[] { SwitchType.ajax, SwitchType.client };
    private static final SwitchType[] selectionTypeAjax = new SwitchType[] { SwitchType.ajax };
    private static final SwitchType[] selectionTypeClient = new SwitchType[] { SwitchType.client };
    private static final SwitchType[] eventEnabledSelectionTypes = new SwitchType[] { SwitchType.ajax };

    protected Integer[][] selectionPaths = new Integer[][] { { 3, 2 }, { 1, 0, 0 }, { 1 }, { 3, 9, 2 } };

    protected TreeNode treeNode;

    protected void expandAll() {
        for (Integer[] path : selectionPaths) {
            treeNode = null;
            for (int i = 0; i < path.length; i++) {
                int index = path[i];
                treeNode = (treeNode == null) ? tree.advanced().getNodes().get(index)
                        : treeNode.advanced().getNodes().get(index);
                if (i < path.length - 1) {
                    jsUtils.scrollToView(treeNode.advanced().getLabelElement());
                    treeNode.advanced().expand();
                }
            }
        }
    }

    protected String getClientId() {
        return clientId.getText();
    }

    protected Integer[] getIntsFromString(String string) {
        Pattern pattern = Pattern.compile(".*\\[((?:(?:\\d+)(?:, )?)+)\\].*");
        Matcher matcher = pattern.matcher(string);
        if (matcher.find()) {
            String[] strings = StringUtils.split(matcher.group(1), ", ");
            Integer[] numbers = new Integer[strings.length];
            for (int i = 0; i < strings.length; i++) {
                numbers[i] = Integer.valueOf(strings[i]);
            }
            return numbers;
        }
        throw new IllegalStateException("pattern does not match");
    }

    protected Integer[] getNewSelection() {
        return getIntsFromString(newSelection.getText());
    }

    protected Integer[] getOldSelection() {
        return getIntsFromString(oldSelection.getText());
    }

    protected Integer[] getSelection() {
        return getIntsFromString(selection.getText());
    }

    @BeforeMethod(groups = "smoke")
    public void prepareTest() {
        attsSetter().setAttribute(TreeAttributes.selectionType).toValue(selectionType)
                .setAttribute(TreeAttributes.toggleType).toValue(selectionType).asSingleAction().perform();
    }

    protected void testSubNodesSelectionWithEvents() {
        expandAll();
        assertEquals(allSelectedItems.size(), 0);
        boolean checkEvents = selectionType.equals(eventEnabledSelectionTypes[0]);
        Integer[] old = null;
        for (Integer[] path : selectionPaths) {
            treeNode = null;
            for (int index : path) {
                treeNode = (treeNode == null) ? tree.advanced().getNodes().get(index)
                        : treeNode.advanced().getNodes().get(index);
            }
            String previousSelectionValue = selection.getText();
            assertFalse(treeNode.advanced().isSelected());
            jsUtils.scrollToView(treeNode.advanced().getLabelElement());
            getGuarded(treeNode.advanced(), selectionType).select();

            assertTrue(treeNode.advanced().isSelected());
            assertEquals(allSelectedItems.size(), 1);

            if (checkEvents) {
                // there is delay before select triggers output update
                Graphene.waitAjax().until().element(selection).text().not().equalTo(previousSelectionValue);

                assertEquals(getSelection(), path,
                        String.format("Actual Selection (%s) doesn't correspond to expected (%s)",
                                Arrays.deepToString(getSelection()), Arrays.deepToString(path)));

                assertEquals(getNewSelection(), path,
                        String.format("Actual New selection (%s) doesn't correspond to expected (%s)",
                                Arrays.deepToString(getNewSelection()), Arrays.deepToString(path)));
                if (old != null) {
                    assertEquals(getOldSelection(), old,
                            String.format("Actual Old selection (%s) doesn't correspond to expected (%s)",
                                    Arrays.deepToString(getOldSelection()), Arrays.deepToString(old)));
                } else {
                    assertEquals(oldSelection.getText(), "[]");
                }
                old = getNewSelection();
            }
        }
    }
}