[gui-test] big forest fix

Get rid of varargs in functions, replace them with lists.
Add NodeRenderer to ExtendedCellReaders.
ExtendedJTreePathFinder fix case with no visible root.
This commit is contained in:
Sergey Karashevich
2018-08-17 17:28:29 +03:00
parent c2c8a20118
commit 1fc7ee6f86
5 changed files with 46 additions and 36 deletions
@@ -15,6 +15,7 @@
*/
package com.intellij.testGuiFramework.cellReader
import com.intellij.ide.util.treeView.NodeRenderer
import com.intellij.testGuiFramework.framework.GuiTestUtil
import com.intellij.testGuiFramework.impl.GuiTestUtilKt.findAllWithBFS
import com.intellij.ui.MultilineTreeCellRenderer
@@ -95,7 +96,8 @@ class ExtendedJComboboxCellReader : BasicJComboBoxCellReader(), JComboBoxCellRea
private fun getValueWithCellRenderer(cellRendererComponent: Component): String? {
val result = when (cellRendererComponent) {
is JLabel -> cellRendererComponent.text
is SimpleColoredComponent -> cellRendererComponent.getText()
is NodeRenderer -> cellRendererComponent.getFirstText() //should stands before SimpleColoredComponent because it is more specific
is SimpleColoredComponent -> cellRendererComponent.getFullText()
is MultilineTreeCellRenderer -> cellRendererComponent.text
else -> cellRendererComponent.findText()
}
@@ -103,9 +105,13 @@ private fun getValueWithCellRenderer(cellRendererComponent: Component): String?
}
private fun SimpleColoredComponent.getText(): String?
private fun SimpleColoredComponent.getFullText(): String?
= this.iterator().asSequence().joinToString()
private fun SimpleColoredComponent.getFirstText(): String?
= this.iterator().next()
private fun Component.findText(): String? {
try {
assert(this is Container)
@@ -118,8 +124,8 @@ private fun Component.findText(): String? {
)
resultList.addAll(
findAllWithBFS(container, SimpleColoredComponent::class.java)
.filter { !it.getText().isNullOrEmpty() }
.map { it.getText()!! }
.filter { !it.getFullText().isNullOrEmpty() }
.map { it.getFullText()!! }
)
return resultList.firstOrNull { !it.isEmpty() }
}
@@ -228,7 +228,7 @@ open class ExtendedJTreeDriver(robot: Robot = GuiRobotHolder.robot) : JTreeDrive
stringPath
.list2tree()
.forEach {
path = ExtendedJTreePathFinder(tree).findMatchingPathByPredicate(predicate, *it.toTypedArray())
path = ExtendedJTreePathFinder(tree).findMatchingPathByPredicate(predicate, it)
expandPath(tree, path)
}
return path
@@ -17,47 +17,52 @@ class ExtendedJTreePathFinder(val jTree: JTree) {
private val cellReader: JTreeCellReader = ExtendedJTreeCellReader()
fun findMatchingPath(vararg pathStrings: String): TreePath =
findMatchingPathByPredicate(Predicate.equality, *pathStrings)
fun findMatchingPath(pathStrings: List<String>): TreePath =
findMatchingPathByPredicate(Predicate.equality, pathStrings)
fun findMatchingPathWithVersion(vararg pathStrings: String): TreePath =
findMatchingPathByPredicate(Predicate.withVersion, *pathStrings)
fun findMatchingPathWithVersion(pathStrings: List<String>): TreePath =
findMatchingPathByPredicate(Predicate.withVersion, pathStrings)
// this is ex-XPath version
fun findMatchingPathByPredicate(predicate: FinderPredicate, vararg pathStrings: String): TreePath {
fun findMatchingPathByPredicate(predicate: FinderPredicate, pathStrings: List<String>): TreePath {
val model = jTree.model
if (jTree.isRootVisible) {
val childValue = jTree.value(model.root) ?: ""
if (!predicate(pathStrings[0], childValue)) pathNotFound(*pathStrings)
if (pathStrings.size == 1) return TreePath(arrayOf<Any>(model.root))
if (predicate(pathStrings[0], childValue)) {
if (pathStrings.size == 1) return TreePath(arrayOf<Any>(model.root))
return traverseChildren(jTree, model.root, TreePath(model.root), predicate, pathStrings.drop(1)) ?: throw pathNotFound(pathStrings)
}
else {
pathNotFound(pathStrings)
}
}
return traverseChildren(jTree, model.root, TreePath(model.root), predicate, *pathStrings) ?: throw pathNotFound(*pathStrings)
return traverseChildren(jTree, model.root, TreePath(model.root), predicate, pathStrings) ?: throw pathNotFound(pathStrings)
}
fun exists(vararg pathStrings: String) =
existsByPredicate(Predicate.equality, *pathStrings)
fun exists(pathStrings: List<String>) =
existsByPredicate(Predicate.equality, pathStrings)
fun existsWithVersion(vararg pathStrings: String) =
existsByPredicate(Predicate.withVersion, *pathStrings)
fun existsWithVersion(pathStrings: List<String>) =
existsByPredicate(Predicate.withVersion, pathStrings)
fun existsByPredicate(predicate: FinderPredicate, vararg pathStrings: String): Boolean {
return try{
fun existsByPredicate(predicate: FinderPredicate, pathStrings: List<String>): Boolean {
return try {
findMatchingPathByPredicate(
pathStrings = *pathStrings,
pathStrings = pathStrings,
predicate = predicate
)
true
}
catch (e: Exception){
catch (e: Exception) {
false
}
}
fun traverseChildren(jTree: JTree,
node: Any,
pathTree: TreePath,
predicate: FinderPredicate,
vararg pathStrings: String): TreePath? {
node: Any,
pathTree: TreePath,
predicate: FinderPredicate,
pathStrings: List<String>): TreePath? {
val childCount = jTree.model.getChildCount(node)
val order = pathStrings[0].getOrder() ?: 0
@@ -76,7 +81,7 @@ class ExtendedJTreePathFinder(val jTree: JTree) {
newPath
}
else {
traverseChildren(jTree, child, newPath, predicate, *pathStrings.toList().subList(1, pathStrings.size).toTypedArray())
traverseChildren(jTree, child, newPath, predicate, pathStrings.subList(1, pathStrings.size))
}
}
else {
@@ -118,8 +123,8 @@ class ExtendedJTreePathFinder(val jTree: JTree) {
}
// exception wrappers
private fun pathNotFound(vararg path: String): LocationUnavailableException {
throw LocationUnavailableException("Unable to find path \"${path.toList()}\"")
private fun pathNotFound(path: List<String>): LocationUnavailableException {
throw LocationUnavailableException("Unable to find path \"$path\"")
}
private fun multipleMatchingNodes(pathString: String, parentText: Any): LocationUnavailableException {
@@ -131,9 +136,9 @@ class ExtendedJTreePathFinder(val jTree: JTree) {
fun findPathToNodeWithVersion(node: String) = findPathToNodeByPredicate(node, Predicate.withVersion)
fun findPathToNodeByPredicate(node: String, predicate: FinderPredicate): TreePath{
// expandNodes()
// Pause.pause(1000) //Wait for EDT thread to finish expanding
fun findPathToNodeByPredicate(node: String, predicate: FinderPredicate): TreePath {
// expandNodes()
// Pause.pause(1000) //Wait for EDT thread to finish expanding
val result: MutableList<String> = mutableListOf()
var currentNode = jTree.model.root as DefaultMutableTreeNode
val e = currentNode.preorderEnumeration()
@@ -148,6 +153,6 @@ class ExtendedJTreePathFinder(val jTree: JTree) {
currentNode = currentNode.parent as DefaultMutableTreeNode
result.add(0, currentNode.toString())
}
return findMatchingPathByPredicate(predicate, *result.toTypedArray())
return findMatchingPathByPredicate(predicate, result)
}
}
@@ -1,7 +1,6 @@
// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.testGuiFramework.fixtures
import com.intellij.testGuiFramework.driver.ExtendedJTreeDriver
import com.intellij.testGuiFramework.driver.ExtendedJTreePathFinder
import com.intellij.ui.treeStructure.treetable.TreeTable
import org.fest.swing.core.MouseButton
@@ -20,7 +19,7 @@ class TreeTableFixture(val robot: Robot, val target: TreeTable) :
ComponentPreconditions.checkEnabledAndShowing(target)
val tree = target.tree
val path = ExtendedJTreePathFinder(tree).findMatchingPath(*pathStrings)
val path = ExtendedJTreePathFinder(tree).findMatchingPath(pathStrings.toList())
var x = target.location.x + (0 until column).sumBy { target.columnModel.getColumn(it).width }
x += target.columnModel.getColumn(column).width / 3
@@ -102,7 +102,7 @@ import javax.swing.tree.TreePath
GuiTestUtilKt.waitUntil(condition = "correct path to click is found", timeout = Timeouts.seconds02) {
try {
partialPath = ExtendedJTreePathFinder(tree)
.findMatchingPathByPredicate(predicate = predicate, pathStrings = *partialList.toTypedArray())
.findMatchingPathByPredicate(predicate = predicate, pathStrings = partialList)
partialPath != null
}
catch (e: Exception) {
@@ -176,5 +176,5 @@ import javax.swing.tree.TreePath
fun TreePath.getPathStrings(jTree: JTree): List<String> {
val cellReader = ExtendedJTreeCellReader()
val pathStrings = this.path.map { cellReader.valueAt(jTree, it) ?: throw Exception("Unable to read value (value is null) for a tree")}
return if (pathStrings.first().isEmpty()) pathStrings.drop(1) else pathStrings
return if (pathStrings.first().isEmpty() || !jTree.isRootVisible) pathStrings.drop(1) else pathStrings
}