/*
* Copyright 2016 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.uberfire.wbtest.selenium;
import java.util.Arrays;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameter;
import org.junit.runners.Parameterized.Parameters;
import org.openqa.selenium.Dimension;
import org.openqa.selenium.Point;
import org.uberfire.wbtest.client.panels.docking.NestedDockingPanelPerspective;
import org.uberfire.workbench.model.CompassPosition;
import static org.junit.Assert.*;
import static org.uberfire.wbtest.selenium.UberAssertions.*;
/**
* Integration tests for the addition and removal of child panels that "dock" on the north, south, east, or west edges
* of their parents.
* <p>
* All test methods are parameterized, so they each try the same test in each of the 4 compass directions.
*/
@RunWith(Parameterized.class)
public class DockingPanelTest extends AbstractSeleniumTest {
@Parameter(0)
public CompassPosition direction;
@Parameters
public static List<Object[]> params() {
return Arrays.asList(new Object[][]{{CompassPosition.NORTH},
{CompassPosition.SOUTH},
{CompassPosition.EAST},
{CompassPosition.WEST}});
}
static CompassPosition opposite(CompassPosition position) {
switch (position) {
case NORTH:
return CompassPosition.SOUTH;
case SOUTH:
return CompassPosition.NORTH;
case EAST:
return CompassPosition.WEST;
case WEST:
return CompassPosition.EAST;
default:
throw new IllegalArgumentException("Position " + position + " has no opposite.");
}
}
static CompassPosition next(CompassPosition position) {
switch (position) {
case NORTH:
return CompassPosition.EAST;
case EAST:
return CompassPosition.SOUTH;
case SOUTH:
return CompassPosition.WEST;
case WEST:
return CompassPosition.NORTH;
default:
throw new IllegalArgumentException("Position " + position + " is not a cardinal direction.");
}
}
@Before
public void goToDockingPerspective() {
driver.get(baseUrl + "#" + NestedDockingPanelPerspective.class.getName());
}
/**
* Tests that panels appear in the correct place when added and get removed from the layout when their only
* contained part is closed. This is really two tests combined into one in order to save time.
*/
@Test
public void testAddAndRemovePanelRelativeToRoot() {
NestingScreenWrapper root = new NestingScreenWrapper(driver,
"root");
NestingScreenWrapper childScreen = root.addChild(direction);
assertTrue(childScreen.isStillInDom());
assertTrue(childScreen.isPanelStillInDom());
assertRelativePosition(direction,
root.getWebElement(),
childScreen.getWebElement());
childScreen.close();
assertFalse(childScreen.isStillInDom());
assertFalse(childScreen.isPanelStillInDom());
}
@Test
public void testAddTwoPanelsToRootRemovingOldestFirst() {
NestingScreenWrapper root = new NestingScreenWrapper(driver,
"root");
NestingScreenWrapper childScreen1 = root.addChild(direction);
NestingScreenWrapper childScreen2 = root.addChild(direction);
assertTrue(childScreen1.isStillInDom());
assertTrue(childScreen1.isPanelStillInDom());
assertTrue(childScreen2.isStillInDom());
assertTrue(childScreen2.isPanelStillInDom());
// each subsequent panel should be added at the edge of what remains of the parent panel
// so we want root < childScreen2 < childScreen1 < window edge
assertRelativePosition(direction,
root.getWebElement(),
childScreen2.getWebElement());
assertRelativePosition(direction,
childScreen2.getWebElement(),
childScreen1.getWebElement());
childScreen1.close();
assertFalse(childScreen1.isStillInDom());
assertFalse(childScreen1.isPanelStillInDom());
assertTrue(childScreen2.isStillInDom());
assertTrue(childScreen2.isPanelStillInDom());
childScreen2.close();
assertFalse(childScreen1.isStillInDom());
assertFalse(childScreen1.isPanelStillInDom());
assertFalse(childScreen2.isStillInDom());
assertFalse(childScreen2.isPanelStillInDom());
}
@Test
public void testAddTwoPanelsToRootRemovingNewestFirst() {
NestingScreenWrapper root = new NestingScreenWrapper(driver,
"root");
NestingScreenWrapper childScreen1 = root.addChild(direction);
NestingScreenWrapper childScreen2 = root.addChild(direction);
assertTrue(childScreen1.isStillInDom());
assertTrue(childScreen1.isPanelStillInDom());
assertTrue(childScreen2.isStillInDom());
assertTrue(childScreen2.isPanelStillInDom());
childScreen2.close();
assertTrue(childScreen1.isStillInDom());
assertTrue(childScreen1.isPanelStillInDom());
assertFalse(childScreen2.isStillInDom());
assertFalse(childScreen2.isPanelStillInDom());
childScreen1.close();
assertFalse(childScreen1.isStillInDom());
assertFalse(childScreen1.isPanelStillInDom());
assertFalse(childScreen2.isStillInDom());
assertFalse(childScreen2.isPanelStillInDom());
}
@Test
public void testAddAndRemoveTwoPanelsAtOppositeEgdes() throws Exception {
NestingScreenWrapper root = new NestingScreenWrapper(driver,
"root");
Dimension originalRootSize = root.getSize();
Point originalRootLocation = root.getLocation();
NestingScreenWrapper childScreen1 = root.addChild(direction);
NestingScreenWrapper childScreen2 = root.addChild(direction);
NestingScreenWrapper childScreen3 = root.addChild(opposite(direction));
NestingScreenWrapper childScreen4 = root.addChild(opposite(direction));
assertTrue(childScreen1.isStillInDom());
assertTrue(childScreen1.isPanelStillInDom());
assertTrue(childScreen2.isStillInDom());
assertTrue(childScreen2.isPanelStillInDom());
assertTrue(childScreen3.isStillInDom());
assertTrue(childScreen3.isPanelStillInDom());
assertTrue(childScreen4.isStillInDom());
assertTrue(childScreen4.isPanelStillInDom());
childScreen2.close();
assertTrue(childScreen1.isStillInDom());
assertTrue(childScreen1.isPanelStillInDom());
assertFalse(childScreen2.isStillInDom());
assertFalse(childScreen2.isPanelStillInDom());
assertTrue(childScreen3.isStillInDom());
assertTrue(childScreen3.isPanelStillInDom());
assertTrue(childScreen4.isStillInDom());
assertTrue(childScreen4.isPanelStillInDom());
childScreen1.close();
assertFalse(childScreen1.isStillInDom());
assertFalse(childScreen1.isPanelStillInDom());
assertFalse(childScreen2.isStillInDom());
assertFalse(childScreen2.isPanelStillInDom());
assertTrue(childScreen3.isStillInDom());
assertTrue(childScreen3.isPanelStillInDom());
assertTrue(childScreen4.isStillInDom());
assertTrue(childScreen4.isPanelStillInDom());
childScreen3.close();
assertFalse(childScreen1.isStillInDom());
assertFalse(childScreen1.isPanelStillInDom());
assertFalse(childScreen2.isStillInDom());
assertFalse(childScreen2.isPanelStillInDom());
assertFalse(childScreen3.isStillInDom());
assertFalse(childScreen3.isPanelStillInDom());
assertTrue(childScreen4.isStillInDom());
assertTrue(childScreen4.isPanelStillInDom());
childScreen4.close();
assertFalse(childScreen1.isStillInDom());
assertFalse(childScreen1.isPanelStillInDom());
assertFalse(childScreen2.isStillInDom());
assertFalse(childScreen2.isPanelStillInDom());
assertFalse(childScreen3.isStillInDom());
assertFalse(childScreen3.isPanelStillInDom());
assertFalse(childScreen4.isStillInDom());
assertFalse(childScreen4.isPanelStillInDom());
// finally, the root screen should be back to its original size and position
assertEquals(originalRootSize,
root.getSize());
assertEquals(originalRootLocation,
root.getLocation());
}
@Test
public void testLastOffAxisPanelSitsBetweenExistingPanels() throws Exception {
NestingScreenWrapper root = new NestingScreenWrapper(driver,
"root");
NestingScreenWrapper onAxisChild1 = root.addChild(direction);
NestingScreenWrapper onAxisChild2 = root.addChild(opposite(direction));
NestingScreenWrapper offAxisChild1 = root.addChild(next(direction));
NestingScreenWrapper offAxisChild2 = root.addChild(next(opposite(direction)));
// the off-axis children should be sandwiched between the on-axis children
// (because the on-axis children were added first, they get more space)
assertRelativePosition(direction,
offAxisChild1.getWebElement(),
onAxisChild1.getWebElement());
assertRelativePosition(direction,
offAxisChild2.getWebElement(),
onAxisChild1.getWebElement());
assertRelativePosition(opposite(direction),
offAxisChild1.getWebElement(),
onAxisChild2.getWebElement());
assertRelativePosition(opposite(direction),
offAxisChild2.getWebElement(),
onAxisChild2.getWebElement());
}
@Test
public void testPanelMakesRoomForChildOnSameAxis() throws Exception {
NestingScreenWrapper root = new NestingScreenWrapper(driver,
"root");
NestingScreenWrapper onAxisChild1 = root.addChild(direction);
Point child1PositionBefore = onAxisChild1.getLocation();
NestingScreenWrapper onAxisChild2 = onAxisChild1.addChild(direction);
Point child1PositionAfter = onAxisChild1.getLocation();
// fudge factor for margins, dividers, padding, headers, etc.
final int fudge = 10;
// checking with inequalities here because there is some extra space for
int expected;
switch (direction) {
case NORTH:
expected = child1PositionBefore.y + onAxisChild2.getSize().height - fudge;
assertTrue("First child panel didn't move far enough south."
+ " Expected y > " + expected + "; got y = " + child1PositionAfter.y,
expected <= child1PositionAfter.y);
break;
case SOUTH:
expected = child1PositionBefore.y - onAxisChild2.getSize().height + fudge;
assertTrue("First child panel didn't move far enough north."
+ " Expected y < " + expected + "; got y = " + child1PositionAfter.y,
expected >= child1PositionAfter.y);
break;
case WEST:
expected = child1PositionBefore.x + onAxisChild2.getSize().width - fudge;
assertTrue("First child panel didn't move far enough east."
+ " Expected x > " + expected + "; got x = " + child1PositionAfter.x,
expected <= child1PositionAfter.x);
break;
case EAST:
expected = child1PositionBefore.x - onAxisChild2.getSize().width + fudge;
assertTrue("First child panel didn't move far enough west."
+ " Expected x < " + expected + "; got x = " + child1PositionAfter.x,
expected >= child1PositionAfter.x);
break;
default:
throw new IllegalStateException("Unknown position " + direction);
}
assertRelativePosition(direction,
root.getWebElement(),
onAxisChild1.getWebElement());
// this is a redundant check, since we already verified child1 moved by child2's size
assertRelativePosition(direction,
onAxisChild1.getWebElement(),
onAxisChild2.getWebElement());
}
}