/* * 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(); } } } }