All Downloads are FREE. Search and download functionalities are using the official Maven repository.
Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
io.tapack.satisfy.steps.table.BaseTableSteps Maven / Gradle / Ivy
/*
* Copyright © 2015 Tapack, and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* The Research Projects is dual-licensed under the GNU General Public
* License, version 2.0 (GPLv2) and the Tapack Commercial License.
*
* Solely for non-commercial purposes. A purpose is non-commercial only if
* it is in no manner primarily intended for or directed toward commercial
* advantage or private monetary compensation.
*
* This Tapack Software is supplied to you by Tapack in consideration of your
* agreement to the following terms, and your use, installation, modification
* or redistribution of this Tapack Software constitutes acceptance of these
* terms. If you do not agree with these terms, please do not use, install,
* modify or redistribute this Tapack Software.
*
* Neither the name, trademarks, service marks or logos of Tapack may be used
* to endorse or promote products derived from the Tapack Software without
* specific prior written permission from Tapack.
*
* The Tapack Software is provided by Tapack on an "AS IS" basis. TAPACK
* MAKES NO
* WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE, REGARDING THE TAPACK SOFTWARE OR ITS USE AND OPERATION ALONE OR IN
* COMBINATION WITH YOUR PRODUCTS.
*
* IN NO EVENT SHALL TAPACK BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
* OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION
* AND/OR DISTRIBUTION OF THE TAPACK SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER
* THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR
* OTHERWISE, EVEN IF TAPACK HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* A copy of the GNU General Public License is included in the distribution in
* the file LICENSE and at
*
* http://www.gnu.org/licenses/gpl-2.0.html
*
* If you are using the Research Projects for commercial purposes, we
* encourage you to visit
*
* http://products.tapack.io/license
*
* for more details.
*
* This software or hardware and documentation may provide access to
* or information on content, products, and services from third parties.
* Tapack and its affiliates are not responsible for and expressly disclaim
* all warranties of any kind with respect to third-party content, products,
* and services. Tapack and its affiliates will not be responsible for any loss,
* costs, or damages incurred due to your access to or use of third-party
* content, products, or services. If a third-party content exists, the
* additional copyright notices and license terms applicable to portions of the
* software are set forth in the THIRD_PARTY_LICENSE_README file.
*
* Please contact Tapack or visit www.tapack.io if you need additional
* information or have any questions.
*/
package io.tapack.satisfy.steps.table;
import com.google.common.collect.Lists;
import com.google.common.collect.MapDifference;
import com.google.common.collect.Maps;
import io.tapack.satisfy.steps.spi.TableSteps;
import io.tapack.satisfy.steps.spi.WebPage;
import io.tapack.satisfy.steps.spi.WebStepsFactory;
import org.jbehave.core.model.ExamplesTable;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.empty;
import static org.hamcrest.core.IsNot.not;
public class BaseTableSteps implements TableSteps {
private static final String TABLE_TAG = "table";
private final WebPage webPage;
private final By tableIdentity;
private WebElement tableElement;
private TableWebElement table;
public BaseTableSteps(By identity) {
tableIdentity = identity;
webPage = WebStepsFactory.getPage();
}
@Override
public boolean accept(By identity) {
return false;
}
@Override
public void inTableClickOnIdentityInRowsWithParameters(By elementIdentity, ExamplesTable params) {
List matchedRows = getMatchedRows(params);
if (matchedRows.isEmpty()) {
throw new AssertionError("You should define at list one existing " +
"record value");
}
for (WebElement matchedRow : matchedRows) {
WebElement elementToClick = matchedRow.findElement
(elementIdentity);
webPage.clickOn(elementToClick);
}
}
@Override
public void tableContainsRowWithParameters(ExamplesTable params) {
assertThat(getMatchedRows(params), is(not(empty())));
}
@Override
public void tableDoesNotContainRowWithParameters(ExamplesTable params) {
assertThat(getMatchedRows(params), is(empty()));
}
private List getMatchedRows(ExamplesTable params) {
Map rowParams = params.getRow(0);
List tableRows = Arrays.asList(getTable().getRows());
return findMatchedRows(tableRows, rowParams);
}
private TableWebElement getTable() {
if (table == null) {
getTableElement();
parseTable();
}
return table;
}
private List findMatchedRows(List matchedRows,
Map rowToFind) {
List resultedRows = new ArrayList();
for (RowWebElement rowCandidate : matchedRows) {
Map cellsCandidates = cellsFromRow(rowCandidate);
MapDifference diff = Maps.difference
(cellsCandidates, rowToFind);
if (diff.areEqual()) {
resultedRows.add(rowCandidate.getRow());
} else if (diff.entriesOnlyOnRight().isEmpty() && diff
.entriesDiffering().isEmpty()) {
resultedRows.add(rowCandidate.getRow());
} else if (rowCandidate.hasSubRows()) {
for (String commonKey : diff.entriesInCommon().keySet()) {
rowToFind.remove(commonKey);
}
return findMatchedRows(getSubRowsFor(rowCandidate), diff
.entriesOnlyOnRight().isEmpty() ? rowToFind : diff
.entriesOnlyOnRight());
}
}
return resultedRows;
}
private List getSubRowsFor(RowWebElement rowCandidate) {
int rowIndex = rowCandidate.getRowIndex();
List subRows = Lists.newArrayList();
for (RowWebElement row : table.getRows()) {
if (row.getParentRowIndex() == rowIndex) {
subRows.add(row);
}
}
return subRows;
}
private Map cellsFromRow(RowWebElement rowCandidate) {
Map cells = Maps.newHashMap();
int rowIndex = rowCandidate.getRowIndex();
ColumnWebElement[] columns = table.getColumns();
CellWebElement[][] cellsTable = table.getTable();
for (int j = 0; j < columns.length; j++) {
cells.put(columns[j].getColumnKey(), cellsTable[rowIndex][j]
.getCellAsString());
}
return cells;
}
private List headingElements() {
return tableElement.findElements(By.xpath(".//thead/tr/th"));
}
private WebElement getTableElement() {
WebElement rootElement = webPage.element(tableIdentity);
tableElement = rootElement;
if (!rootElement.getTagName().contentEquals(TABLE_TAG))
tableElement = rootElement.findElement(By.tagName(TABLE_TAG));
return tableElement;
}
private List rowElements() {
return tableElement.findElements(By.xpath(".//tr[td]"));
}
private boolean isSubRowElement(WebElement row) {
return row.findElements(By.xpath(".//td[@colspan>1]")).isEmpty();
}
private List getCellsFor(WebElement row) {
return row.findElements(By.xpath("./td"));
}
private void parseTable() {
table = new TableWebElement();
table.setColumns(parseColumns());
table.setRows(parseRows());
RowWebElement[] rows = table.getRows();
ColumnWebElement[] columns = table.getColumns();
CellWebElement[][] cells = new CellWebElement[rows.length][columns
.length];
for (int i = 0; i < rows.length; i++) {
List cellsInRow = getCellsFor(rows[i].getRow());
for (int j = 0; j < columns.length; j++) {
cells[i][j] = new CellWebElement();
WebElement cell = j >= cellsInRow.size() ? cellsInRow.get
(cellsInRow.size() - 1) : cellsInRow.get(j);
cells[i][j].setCell(cell);
cells[i][j].setCellAsString(cell.getText());
cells[i][j].setRowIndex(i);
cells[i][j].setColumnIndex(j);
}
}
table.setTable(cells);
}
private RowWebElement[] parseRows() {
List rowsElements = rowElements();
RowWebElement[] rows = new RowWebElement[rowsElements.size()];
int rowIndex = 0;
int parentRowIndex = -1;
boolean workWithSubRows = false;
for (WebElement row : rowsElements) {
rows[rowIndex] = new RowWebElement();
rows[rowIndex].setRow(row);
rows[rowIndex].setRowKey(row.getText());
rows[rowIndex].setRowIndex(rowIndex);
rows[rowIndex].setParentRowIndex(parentRowIndex);
if (isSubRowElement(row)) {
if (!workWithSubRows) {
workWithSubRows = true;
parentRowIndex = rowIndex != 0 ? rowIndex - 1 : rowIndex;
rows[parentRowIndex].hasSubRows(true);
}
rows[rowIndex].setSubRow(true);
} else if (!isSubRowElement(row) && workWithSubRows) {
workWithSubRows = false;
parentRowIndex = -1;
}
rowIndex++;
}
return rows;
}
private ColumnWebElement[] parseColumns() {
List headings = headingElements();
ColumnWebElement[] columns = new ColumnWebElement[headings.size()];
int columnIndex = 0;
for (WebElement heading : headings) {
columns[columnIndex] = new ColumnWebElement();
columns[columnIndex].setColumn(heading);
columns[columnIndex].setColumnKey(heading.getText());
columns[columnIndex].setColumnIndex(columnIndex);
columnIndex++;
}
return columns;
}
}