From f66688ed11eb501a83413de2915706b52afbb136 Mon Sep 17 00:00:00 2001 From: Tamino Dauth Date: Tue, 9 Apr 2019 17:35:04 +0200 Subject: [PATCH] Adapt Neo4J backend to hash identifiers #19 We do not need converters anymore. Store hash values only. --- .../api/{neo4j => example}/Example.scala | 5 +- .../GuiStateMachinGMLSerializer.scala | 5 +- .../api/neo4j/ActionConverter.scala | 111 ------------------ .../api/neo4j/ActionTransitionEntity.scala | 14 +-- .../guistatemachine/api/neo4j/Entity.scala | 2 +- .../api/neo4j/GuiStateMachineApiNeo4J.scala | 3 +- .../api/neo4j/GuiStateMachineNeo4J.scala | 34 ++---- .../api/neo4j/Neo4jSessionFactory.scala | 2 +- .../api/neo4j/StateNeo4J.scala | 68 ++++++----- .../api/neo4j/SutStateConverter.scala | 13 -- .../api/neo4j/SutStateEntity.scala | 20 ++-- .../guistatemachine/api/AbstractApiSpec.scala | 2 +- ...achineJavaObjectStreamSerializerSpec.scala | 2 - .../api/neo4j/ActionConverterSpec.scala | 109 ----------------- .../api/neo4j/SutStateConverterSpec.scala | 69 ----------- 15 files changed, 74 insertions(+), 385 deletions(-) rename src/main/scala/de/retest/guistatemachine/api/{neo4j => example}/Example.scala (92%) delete mode 100644 src/main/scala/de/retest/guistatemachine/api/neo4j/ActionConverter.scala delete mode 100644 src/main/scala/de/retest/guistatemachine/api/neo4j/SutStateConverter.scala delete mode 100644 src/test/scala/de/retest/guistatemachine/api/neo4j/ActionConverterSpec.scala delete mode 100644 src/test/scala/de/retest/guistatemachine/api/neo4j/SutStateConverterSpec.scala diff --git a/src/main/scala/de/retest/guistatemachine/api/neo4j/Example.scala b/src/main/scala/de/retest/guistatemachine/api/example/Example.scala similarity index 92% rename from src/main/scala/de/retest/guistatemachine/api/neo4j/Example.scala rename to src/main/scala/de/retest/guistatemachine/api/example/Example.scala index 39c0985..d5c2303 100644 --- a/src/main/scala/de/retest/guistatemachine/api/neo4j/Example.scala +++ b/src/main/scala/de/retest/guistatemachine/api/example/Example.scala @@ -1,4 +1,5 @@ -package de.retest.guistatemachine.api.neo4j +package de.retest.guistatemachine.api.example + import java.util.Arrays import de.retest.guistatemachine.api.GuiStateMachineApi @@ -48,7 +49,7 @@ object Example extends App { "My Window" ) if (numberOfContainedComponents > 0) { - r.addChildren(scala.collection.JavaConverters.seqAsJavaList[Element](0 to numberOfContainedComponents map { _ => + r.addChildren(scala.collection.JavaConversions.seqAsJavaList[Element](0 to numberOfContainedComponents map { _ => getRootElement("x", 0) })) } diff --git a/src/main/scala/de/retest/guistatemachine/api/impl/serialization/GuiStateMachinGMLSerializer.scala b/src/main/scala/de/retest/guistatemachine/api/impl/serialization/GuiStateMachinGMLSerializer.scala index 25a56dd..a9daab4 100644 --- a/src/main/scala/de/retest/guistatemachine/api/impl/serialization/GuiStateMachinGMLSerializer.scala +++ b/src/main/scala/de/retest/guistatemachine/api/impl/serialization/GuiStateMachinGMLSerializer.scala @@ -24,10 +24,7 @@ class GuiStateMachinGMLSerializer(guiStateMachine: GuiStateMachine) extends GuiS // get the gml writer val writer = - new YedGmlWriter.Builder[SutStateIdentifier, GraphActionEdge, AnyRef](graphicsProvider, YedGmlWriter.PRINT_LABELS: _*) - .setEdgeLabelProvider(_.toString) - .setVertexLabelProvider(_.toString) - .build + new YedGmlWriter.Builder[SutStateIdentifier, GraphActionEdge, AnyRef](graphicsProvider, YedGmlWriter.PRINT_LABELS: _*).build // write to file val outputFile = new File(filePath) diff --git a/src/main/scala/de/retest/guistatemachine/api/neo4j/ActionConverter.scala b/src/main/scala/de/retest/guistatemachine/api/neo4j/ActionConverter.scala deleted file mode 100644 index 3fc9b20..0000000 --- a/src/main/scala/de/retest/guistatemachine/api/neo4j/ActionConverter.scala +++ /dev/null @@ -1,111 +0,0 @@ -package de.retest.guistatemachine.api.neo4j - -import de.retest.recheck.ui.descriptors.{Element, SutState} -import de.retest.surili.commons.actions._ -import org.neo4j.ogm.typeconversion.AttributeConverter - -import scala.collection.JavaConverters._ -import scala.xml._ - -/** - * We do not want to store the whole target element as XML again. Hence, we store its retest ID which is unique and - * matches the element in the SUT state and only the additional attributes. - */ -class ActionConverter(val sutState: Option[SutState]) extends AttributeConverter[Action, String] { - - def this() = this(None) - - def toGraphProperty(value: Action): String = { - val nodeBuffer = new NodeBuffer - - nodeBuffer += {value.getClass.getSimpleName} - - if (value.getTargetElement.isPresent) { - val retestId = value.getTargetElement.get().getRetestId - nodeBuffer += {retestId} - } - - value match { - case a: ChangeValueOfAction => - val sequences = a.getKeysToSend map { sequence => - {sequence.toString} - } - nodeBuffer += {sequences} - case a: NavigateToAction => - nodeBuffer += {a.getUrl} - case a: SwitchToWindowAction => - nodeBuffer += {a.getWindowName} - case _ => - } - - val topLevelNode = {nodeBuffer} - val stringBuilder = new StringBuilder("\n") - val prettyPrinter = new PrettyPrinter(0, 2) - prettyPrinter.formatNodes(topLevelNode, TopScope, stringBuilder) - stringBuilder.toString() - } - def toEntityAttribute(value: String): Action = sutState match { - case Some(state) => - val node = scala.xml.XML.loadString(value) - val typeNode = getNodeByTag(node, "type") - typeNode.text match { - case "ChangeValueOfAction" => - val element = getElement(node, state) - val keys = getNodeByTag(node, "keys") - val sequences = keys.child map { c => - c.text - } - new ChangeValueOfAction(element, sequences.toArray) - case "ClickOnAction" => - val element = getElement(node, state) - new ClickOnAction(element) - case "NavigateToAction" => - val urlNode = getNodeByTag(node, "url") - new NavigateToAction(urlNode.text) - case "NavigateBackAction" => new NavigateBackAction - case "NavigateForwardAction" => new NavigateForwardAction - case "NavigateRefreshAction" => new NavigateRefreshAction - case "SwitchToWindowAction" => - val windowNode = getNodeByTag(node, "window") - new SwitchToWindowAction(windowNode.text) - case _ => throw new RuntimeException("Unknown type.") - } - - case None => throw new RuntimeException("We need the SutState to reconstruct the action") - } - - private def getNodeByTag(node: Node, tag: String): Node = { - val matchingNodes = node \\ tag - if (matchingNodes.isEmpty) { - throw new RuntimeException(s"Missing node with tag $tag.") - } else { - matchingNodes.head - } - } - - private def getElement(node: Node, sutState: SutState): Element = { - val retestId = getNodeByTag(node, "retestId").text - getElementByRetestId(retestId, sutState) match { - case Some(element) => element - case None => throw new RuntimeException(s"Missing element with retestId $retestId") - } - } - - private def getElementByRetestId(retestId: String, sutState: SutState): Option[Element] = { - val elements = asScalaBuffer(sutState.getRootElements).toBuffer[Element] - val iterator = elements.iterator - var result: Option[Element] = None - - while (iterator.hasNext && result.isEmpty) { - val element = iterator.next() - result = if (element.getRetestId == retestId) { - Some(element) - } else { - elements ++= asScalaBuffer(element.getContainedElements) - None - } - } - - result - } -} diff --git a/src/main/scala/de/retest/guistatemachine/api/neo4j/ActionTransitionEntity.scala b/src/main/scala/de/retest/guistatemachine/api/neo4j/ActionTransitionEntity.scala index 2e16baa..c927ed0 100644 --- a/src/main/scala/de/retest/guistatemachine/api/neo4j/ActionTransitionEntity.scala +++ b/src/main/scala/de/retest/guistatemachine/api/neo4j/ActionTransitionEntity.scala @@ -1,23 +1,17 @@ package de.retest.guistatemachine.api.neo4j -import de.retest.recheck.ui.descriptors.SutState -import de.retest.surili.commons.actions.Action import org.neo4j.ogm.annotation.{EndNode, Index, RelationshipEntity, StartNode} @RelationshipEntity(`type` = "ACTIONS") -class ActionTransitionEntity(s: SutState, e: SutState, a: Action) extends Entity { - - def this() = this(null, null, null) +class ActionTransitionEntity(s: SutStateEntity, e: SutStateEntity, a: String) extends Entity { @Index - @StartNode val start: SutState = s + @StartNode val start: SutStateEntity = s @Index - @EndNode val end: SutState = e + @EndNode val end: SutStateEntity = e @Index - // TODO #19 We need the previous SutState for the conversion back to the action since we rely on the retest ID only to keep the action small. - //@Convert(classOf[ActionConverter]) - val actionXML: String = new ActionConverter().toGraphProperty(a) + val action: String = a /// The number of times this action has been executed. var counter: Int = 1 diff --git a/src/main/scala/de/retest/guistatemachine/api/neo4j/Entity.scala b/src/main/scala/de/retest/guistatemachine/api/neo4j/Entity.scala index 8779963..9ea1588 100644 --- a/src/main/scala/de/retest/guistatemachine/api/neo4j/Entity.scala +++ b/src/main/scala/de/retest/guistatemachine/api/neo4j/Entity.scala @@ -4,5 +4,5 @@ import org.neo4j.ogm.annotation.{GeneratedValue, Id} abstract class Entity { @Id @GeneratedValue private val id = 0L - def getId: Long = id + def getId: java.lang.Long = id } diff --git a/src/main/scala/de/retest/guistatemachine/api/neo4j/GuiStateMachineApiNeo4J.scala b/src/main/scala/de/retest/guistatemachine/api/neo4j/GuiStateMachineApiNeo4J.scala index 4afc579..9b51fd9 100644 --- a/src/main/scala/de/retest/guistatemachine/api/neo4j/GuiStateMachineApiNeo4J.scala +++ b/src/main/scala/de/retest/guistatemachine/api/neo4j/GuiStateMachineApiNeo4J.scala @@ -3,13 +3,12 @@ package de.retest.guistatemachine.api.neo4j import java.io.File import com.typesafe.scalalogging.Logger -import de.retest.guistatemachine.api.impl.GuiStateMachineImpl import de.retest.guistatemachine.api.{GuiStateMachine, GuiStateMachineApi} import scala.collection.concurrent.TrieMap class GuiStateMachineApiNeo4J extends GuiStateMachineApi { - private val logger = Logger[GuiStateMachineImpl] + private val logger = Logger[GuiStateMachineApiNeo4J] private val stateMachines = TrieMap[String, GuiStateMachine]() // TODO #19 Load existing state machines from the disk. diff --git a/src/main/scala/de/retest/guistatemachine/api/neo4j/GuiStateMachineNeo4J.scala b/src/main/scala/de/retest/guistatemachine/api/neo4j/GuiStateMachineNeo4J.scala index a0f225f..12fe48f 100644 --- a/src/main/scala/de/retest/guistatemachine/api/neo4j/GuiStateMachineNeo4J.scala +++ b/src/main/scala/de/retest/guistatemachine/api/neo4j/GuiStateMachineNeo4J.scala @@ -1,8 +1,6 @@ package de.retest.guistatemachine.api.neo4j -import de.retest.guistatemachine.api.{GuiStateMachine, State} -import de.retest.recheck.ui.descriptors.SutState -import de.retest.surili.commons.actions.Action +import de.retest.guistatemachine.api.{GuiStateMachine, State, SutStateIdentifier} import org.neo4j.ogm.cypher.{ComparisonOperator, Filter} import scala.collection.immutable.HashMap @@ -10,44 +8,36 @@ import scala.collection.immutable.HashMap class GuiStateMachineNeo4J(var uri: String) extends GuiStateMachine { implicit val session = Neo4jSessionFactory.getSessionFactory(uri).openSession() // TODO #19 Close the session at some point? - override def getState(sutState: SutState): State = { + override def getState(sutStateIdentifier: SutStateIdentifier): State = { Neo4jSessionFactory.transaction { - getNodeBySutState(sutState) match { + getNodeBySutStateIdentifier(sutStateIdentifier) match { case None => // Create a new node for the SUT state in the graph database. - session.save(new SutStateEntity(sutState)) + val sutStateEntity = new SutStateEntity(sutStateIdentifier) + session.save(sutStateEntity) // Do nothing if the node for the SUT state does already exist. case _ => } } - StateNeo4J(sutState, this) + StateNeo4J(sutStateIdentifier, this) } - override def executeAction(from: State, a: Action, to: State): State = { - from.addTransition(a, to) - to - } - - override def getAllStates: Map[SutState, State] = + override def getAllStates: Map[SutStateIdentifier, State] = Neo4jSessionFactory.transaction { val allNodes = session.loadAll(classOf[SutStateEntity]) - var result = HashMap[SutState, State]() + var result = HashMap[SutStateIdentifier, State]() val iterator = allNodes.iterator() while (iterator.hasNext) { val node = iterator.next() - val sutState = node.sutState + val sutState = new SutStateIdentifier(node.id) result = result + (sutState -> StateNeo4J(sutState, this)) } result } - override def getAllExploredActions: Set[Action] = Set() // TODO #19 get all relationships in a transaction - - override def getActionExecutionTimes: Map[Action, Int] = Map() // TODO #19 get all execution time properties "counter" from all actions - override def clear(): Unit = Neo4jSessionFactory.transaction { // Deletes all nodes and relationships. @@ -61,10 +51,8 @@ class GuiStateMachineNeo4J(var uri: String) extends GuiStateMachine { uri = otherStateMachine.uri } - // TODO #19 Create an index on the property "sutState": https://neo4j.com/docs/cypher-manual/current/schema/index/#schema-index-create-a-single-property-index - // TODO #19 Should always be used inside of a transaction. - private[neo4j] def getNodeBySutState(sutState: SutState): Option[SutStateEntity] = { - val filter = new Filter("sutState", ComparisonOperator.EQUALS, sutState) // TODO #19 Is this how we filter for an attribute? + private[neo4j] def getNodeBySutStateIdentifier(sutStateIdentifier: SutStateIdentifier): Option[SutStateEntity] = { + val filter = new Filter("id", ComparisonOperator.EQUALS, sutStateIdentifier.hash) val first = session.loadAll(classOf[SutStateEntity], filter).stream().findFirst() if (first.isPresent) { Some(first.get()) diff --git a/src/main/scala/de/retest/guistatemachine/api/neo4j/Neo4jSessionFactory.scala b/src/main/scala/de/retest/guistatemachine/api/neo4j/Neo4jSessionFactory.scala index c5c4f5a..2d22150 100644 --- a/src/main/scala/de/retest/guistatemachine/api/neo4j/Neo4jSessionFactory.scala +++ b/src/main/scala/de/retest/guistatemachine/api/neo4j/Neo4jSessionFactory.scala @@ -13,7 +13,7 @@ object Neo4jSessionFactory { case Some(sessionFactory) => sessionFactory case None => val conf = new Configuration.Builder().uri(uri).build - val sessionFactory = new SessionFactory(conf, "de.retest.guistatemachine.api.neo4j") + val sessionFactory = new SessionFactory(conf, this.getClass.getPackage.getName) sessionFactories += (uri -> sessionFactory) sessionFactory } diff --git a/src/main/scala/de/retest/guistatemachine/api/neo4j/StateNeo4J.scala b/src/main/scala/de/retest/guistatemachine/api/neo4j/StateNeo4J.scala index 170b87d..729fa94 100644 --- a/src/main/scala/de/retest/guistatemachine/api/neo4j/StateNeo4J.scala +++ b/src/main/scala/de/retest/guistatemachine/api/neo4j/StateNeo4J.scala @@ -1,25 +1,24 @@ package de.retest.guistatemachine.api.neo4j -import de.retest.guistatemachine.api.{ActionTransitions, State} -import de.retest.recheck.ui.descriptors.SutState -import de.retest.surili.commons.actions.Action +import de.retest.guistatemachine.api.{ActionIdentifier, ActionTransitions, State, SutStateIdentifier} import org.neo4j.ogm.cypher.{ComparisonOperator, Filter} import scala.collection.immutable.HashMap -case class StateNeo4J(sutState: SutState, guiStateMachine: GuiStateMachineNeo4J) extends State { +case class StateNeo4J(sutStateIdentifier: SutStateIdentifier, guiStateMachine: GuiStateMachineNeo4J) extends State { implicit val session = guiStateMachine.session - override def getSutState: SutState = sutState - override def getOutgoingActionTransitions: Map[Action, ActionTransitions] = + override def getSutStateIdentifier: SutStateIdentifier = sutStateIdentifier + // TODO #19 Can we somehow convert the outgoing relations directly from the SutStateEntity? + override def getOutgoingActionTransitions: Map[ActionIdentifier, ActionTransitions] = Neo4jSessionFactory.transaction { - val filter = new Filter("start", ComparisonOperator.EQUALS, sutState) + val filter = new Filter("start", ComparisonOperator.EQUALS, sutStateIdentifier.hash) val transitions = session.loadAll(classOf[ActionTransitionEntity], filter) - var result = HashMap[Action, ActionTransitions]() + var result = HashMap[ActionIdentifier, ActionTransitions]() val iterator = transitions.iterator() while (iterator.hasNext) { val relationship = iterator.next() - val action = new ActionConverter(Some(relationship.start)).toEntityAttribute(relationship.actionXML) - val targetSutState = relationship.end + val action = new ActionIdentifier(relationship.action) + val targetSutState = new SutStateIdentifier(relationship.end.id) val counter = relationship.counter val actionTransitions = if (result.contains(action)) { val existing = result(action) @@ -31,16 +30,16 @@ case class StateNeo4J(sutState: SutState, guiStateMachine: GuiStateMachineNeo4J) } result } - - def getIncomingActionTransitions: Map[Action, ActionTransitions] = Neo4jSessionFactory.transaction { - val filter = new Filter("end", ComparisonOperator.EQUALS, sutState) + // TODO #19 Can we somehow convert the incoming relations directly from the SutStateEntity? + def getIncomingActionTransitions: Map[ActionIdentifier, ActionTransitions] = Neo4jSessionFactory.transaction { + val filter = new Filter("end", ComparisonOperator.EQUALS, sutStateIdentifier.hash) val transitions = session.loadAll(classOf[ActionTransitionEntity], filter) - var result = HashMap[Action, ActionTransitions]() + var result = HashMap[ActionIdentifier, ActionTransitions]() val iterator = transitions.iterator() while (iterator.hasNext) { val relationship = iterator.next() - val action = new ActionConverter(Some(relationship.start)).toEntityAttribute(relationship.actionXML) - val sourceSutState = relationship.start + val action = new ActionIdentifier(relationship.action) + val sourceSutState = new SutStateIdentifier(relationship.start.id) val counter = relationship.counter val actionTransitions = if (result.contains(action)) { val existing = result(action) @@ -53,22 +52,33 @@ case class StateNeo4J(sutState: SutState, guiStateMachine: GuiStateMachineNeo4J) result } - private[api] override def addTransition(a: Action, to: State): Int = Neo4jSessionFactory.transaction { - val filterStart = new Filter("start", ComparisonOperator.EQUALS, sutState) - val filterAction = new Filter("action", ComparisonOperator.EQUALS, a) - val targetSutState = to.asInstanceOf[StateNeo4J].sutState - val filterEnd = new Filter("end", ComparisonOperator.EQUALS, targetSutState) - val transitions = session.loadAll(classOf[ActionTransitionEntity], filterStart.and(filterAction).and(filterEnd)) - val first = transitions.stream().findFirst() - val counter = if (first.isPresent) { - first.get().counter = first.get().counter + 1 - session.save(first.get()) - first.get().counter + private[api] override def addTransition(a: ActionIdentifier, to: State): Int = Neo4jSessionFactory.transaction { + /* + TODO #19 Filter for start and end states. + val filterStart = new Filter("start", ComparisonOperator.EQUALS, sutStateIdentifier.hash) + val filterEnd = new Filter("end", ComparisonOperator.EQUALS, targetSutStateIdentifier.hash) + filterStart.and(filterAction).and(filterEnd) + */ + + val filterAction = new Filter("action", ComparisonOperator.EQUALS, a.hash) + val targetSutStateIdentifier = to.asInstanceOf[StateNeo4J].sutStateIdentifier + + import scala.collection.JavaConversions._ + val transitions = session.loadAll(classOf[ActionTransitionEntity], filterAction).toSeq + + val matchingTransitions = transitions.filter(actionTransitionEntity => + actionTransitionEntity.start.id == sutStateIdentifier.hash && actionTransitionEntity.end.id == targetSutStateIdentifier.hash) + if (matchingTransitions.nonEmpty) { + val first: ActionTransitionEntity = matchingTransitions.head + first.counter = first.counter + 1 + session.save(first) + first.counter } else { - val transition = new ActionTransitionEntity(sutState, targetSutState, a) + val sourceState = guiStateMachine.getNodeBySutStateIdentifier(sutStateIdentifier).get + val targetState = guiStateMachine.getNodeBySutStateIdentifier(targetSutStateIdentifier).get + val transition = new ActionTransitionEntity(sourceState, targetState, a.hash) session.save(transition) 1 } - counter } } diff --git a/src/main/scala/de/retest/guistatemachine/api/neo4j/SutStateConverter.scala b/src/main/scala/de/retest/guistatemachine/api/neo4j/SutStateConverter.scala deleted file mode 100644 index 21bb175..0000000 --- a/src/main/scala/de/retest/guistatemachine/api/neo4j/SutStateConverter.scala +++ /dev/null @@ -1,13 +0,0 @@ -package de.retest.guistatemachine.api.neo4j -import java.io.ByteArrayInputStream -import java.nio.charset.StandardCharsets - -import de.retest.recheck.XmlTransformerUtil -import de.retest.recheck.ui.descriptors.SutState -import org.neo4j.ogm.typeconversion.AttributeConverter - -class SutStateConverter extends AttributeConverter[SutState, String] { - def toGraphProperty(value: SutState): String = XmlTransformerUtil.getXmlTransformer.toXML(value) - def toEntityAttribute(value: String): SutState = - XmlTransformerUtil.getXmlTransformer.fromXML[SutState](new ByteArrayInputStream(value.getBytes(StandardCharsets.UTF_8))) -} diff --git a/src/main/scala/de/retest/guistatemachine/api/neo4j/SutStateEntity.scala b/src/main/scala/de/retest/guistatemachine/api/neo4j/SutStateEntity.scala index fbe6d6f..cc5f8c2 100644 --- a/src/main/scala/de/retest/guistatemachine/api/neo4j/SutStateEntity.scala +++ b/src/main/scala/de/retest/guistatemachine/api/neo4j/SutStateEntity.scala @@ -1,15 +1,19 @@ package de.retest.guistatemachine.api.neo4j -import de.retest.recheck.ui.descriptors.SutState -import org.neo4j.ogm.annotation._ -import org.neo4j.ogm.annotation.typeconversion.Convert +import de.retest.guistatemachine.api.SutStateIdentifier +import org.neo4j.ogm.annotation.{Relationship, _} + +import scala.collection.mutable @NodeEntity -class SutStateEntity(state: SutState) extends Entity { +class SutStateEntity( + @Id + //@Index(unique = true) + val id: java.lang.String) { - def this() = this(null) + def this(sutStateIdentifier: SutStateIdentifier) = this(sutStateIdentifier.hash) + def this() = this("") - @Index(unique = true) - @Convert(classOf[SutStateConverter]) - val sutState: SutState = state + @Relationship(`type` = "ACTIONS", direction = Relationship.INCOMING) val incomingActionTransitions = mutable.HashSet[ActionTransitionEntity]() + @Relationship(`type` = "ACTIONS", direction = Relationship.OUTGOING) val outgoingActionTransitions = mutable.HashSet[ActionTransitionEntity]() } diff --git a/src/test/scala/de/retest/guistatemachine/api/AbstractApiSpec.scala b/src/test/scala/de/retest/guistatemachine/api/AbstractApiSpec.scala index 1da2772..ff3f227 100644 --- a/src/test/scala/de/retest/guistatemachine/api/AbstractApiSpec.scala +++ b/src/test/scala/de/retest/guistatemachine/api/AbstractApiSpec.scala @@ -37,7 +37,7 @@ abstract trait AbstractApiSpec extends WordSpec with Matchers { "My Window" ) if (numberOfContainedComponents > 0) { - r.addChildren(scala.collection.JavaConverters.seqAsJavaList[Element](0 to numberOfContainedComponents map { _ => + r.addChildren(scala.collection.JavaConversions.seqAsJavaList[Element](0 to numberOfContainedComponents map { _ => getRootElement("x", 0) })) } diff --git a/src/test/scala/de/retest/guistatemachine/api/impl/serialization/GuiStateMachineJavaObjectStreamSerializerSpec.scala b/src/test/scala/de/retest/guistatemachine/api/impl/serialization/GuiStateMachineJavaObjectStreamSerializerSpec.scala index 8cd5f31..d9c5f1e 100644 --- a/src/test/scala/de/retest/guistatemachine/api/impl/serialization/GuiStateMachineJavaObjectStreamSerializerSpec.scala +++ b/src/test/scala/de/retest/guistatemachine/api/impl/serialization/GuiStateMachineJavaObjectStreamSerializerSpec.scala @@ -26,8 +26,6 @@ class GuiStateMachineJavaObjectStreamSerializerSpec extends AbstractApiSpec with val rootElementC = getRootElement("c", 0) val action0 = new NavigateToAction("http://google.com") val action0Identifier = new ActionIdentifier(action0) - val action1 = new NavigateToAction("http://wikipedia.org") - val action1Identifier = new ActionIdentifier(action1) val initialSutState = createSutState(rootElementA, rootElementB, rootElementC) val initialSutStateIdentifier = new SutStateIdentifier(initialSutState) diff --git a/src/test/scala/de/retest/guistatemachine/api/neo4j/ActionConverterSpec.scala b/src/test/scala/de/retest/guistatemachine/api/neo4j/ActionConverterSpec.scala deleted file mode 100644 index c0d8e0b..0000000 --- a/src/test/scala/de/retest/guistatemachine/api/neo4j/ActionConverterSpec.scala +++ /dev/null @@ -1,109 +0,0 @@ -package de.retest.guistatemachine.api.neo4j - -import java.util - -import de.retest.guistatemachine.api.AbstractApiSpec -import de.retest.surili.commons.actions._ -import org.scalatest.BeforeAndAfterEach - -class ActionConverterSpec extends AbstractApiSpec with BeforeAndAfterEach { - private val rootElement = getRootElement("a", 0) - private val sutState = createSutState(rootElement) - private val cut = new ActionConverter(Some(sutState)) - - "ActionConverter" should { - - "convert ChangeValueOfAction" in { - val list = util.Arrays.asList("foo", "bar", "waa") - val cs = list.toArray(new Array[CharSequence](list.size)) - val action = new ChangeValueOfAction(rootElement, cs) - - val result = cut.toGraphProperty(action) - result shouldEqual - """ - |ChangeValueOfActionretestIdfoobarwaa - |""".stripMargin - - val loadedAction = cut.toEntityAttribute(result) - loadedAction shouldEqual action - } - - "convert ClickOnAction" in { - val action = new ClickOnAction(rootElement) - - val result = cut.toGraphProperty(action) - result shouldEqual - """ - |ClickOnActionretestId - |""".stripMargin - - val loadedAction = cut.toEntityAttribute(result) - loadedAction shouldEqual action - } - - "convert NavigateToAction" in { - val action = new NavigateToAction("http://google.com") - - val result = cut.toGraphProperty(action) - result shouldEqual - """ - |NavigateToActionhttp://google.com - |""".stripMargin - - val loadedAction = cut.toEntityAttribute(result) - loadedAction shouldEqual action - } - - "convert NavigateBackAction" in { - val action = new NavigateBackAction() - - val result = cut.toGraphProperty(action) - result shouldEqual - """ - |NavigateBackAction - |""".stripMargin - - val loadedAction = cut.toEntityAttribute(result) - loadedAction shouldEqual action - } - - "convert NavigateForwardAction" in { - val action = new NavigateForwardAction() - - val result = cut.toGraphProperty(action) - result shouldEqual - """ - |NavigateForwardAction - |""".stripMargin - - val loadedAction = cut.toEntityAttribute(result) - loadedAction shouldEqual action - } - - "convert NavigateRefreshAction" in { - val action = new NavigateRefreshAction() - - val result = cut.toGraphProperty(action) - result shouldEqual - """ - |NavigateRefreshAction - |""".stripMargin - - val loadedAction = cut.toEntityAttribute(result) - loadedAction shouldEqual action - } - - "convert SwitchToWindowAction" in { - val action = new SwitchToWindowAction("test") - - val result = cut.toGraphProperty(action) - result shouldEqual - """ - |SwitchToWindowActiontest - |""".stripMargin - - val loadedAction = cut.toEntityAttribute(result) - loadedAction shouldEqual action - } - } -} diff --git a/src/test/scala/de/retest/guistatemachine/api/neo4j/SutStateConverterSpec.scala b/src/test/scala/de/retest/guistatemachine/api/neo4j/SutStateConverterSpec.scala deleted file mode 100644 index 6f3bd68..0000000 --- a/src/test/scala/de/retest/guistatemachine/api/neo4j/SutStateConverterSpec.scala +++ /dev/null @@ -1,69 +0,0 @@ -package de.retest.guistatemachine.api.neo4j - -import de.retest.guistatemachine.api.AbstractApiSpec -import org.scalatest.BeforeAndAfterEach - -class SutStateConverterSpec extends AbstractApiSpec with BeforeAndAfterEach { - - "SutStateConverter" should { - "save and load SutState " in { - val cut = new SutStateConverter - val rootElementA = getRootElement("a", 0) - val rootElementB = getRootElement("b", 0) - val rootElementC = getRootElement("c", 0) - val initialSutState = createSutState(rootElementA, rootElementB, rootElementC) - - val result = cut.toGraphProperty(initialSutState) - result shouldEqual - """ - | - | - | - | - | a - | a - | a - | - | - | - | - | prefix_039058c6f2c0cb492c533b0a4d14ef77cc0f78abccced5287d84a1a2011cfb81 - | PNG - | - | - | - | - | - | b - | b - | b - | - | - | - | - | prefix_039058c6f2c0cb492c533b0a4d14ef77cc0f78abccced5287d84a1a2011cfb81 - | PNG - | - | - | - | - | - | c - | c - | c - | - | - | - | - | prefix_039058c6f2c0cb492c533b0a4d14ef77cc0f78abccced5287d84a1a2011cfb81 - | PNG - | - | - | - |""".stripMargin - - val loadedSutState = cut.toEntityAttribute(result) - loadedSutState shouldEqual initialSutState - } - } -}