Skip to content

Commit

Permalink
#208: adds basic TestFX support and an example test
Browse files Browse the repository at this point in the history
  • Loading branch information
rladstaetter committed Mar 19, 2024
1 parent a2e6f3f commit 6136153
Show file tree
Hide file tree
Showing 6 changed files with 140 additions and 0 deletions.
4 changes: 4 additions & 0 deletions app/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,10 @@
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
</dependency>
<dependency>
<groupId>org.testfx</groupId>
<artifactId>testfx-core</artifactId>
</dependency>
<dependency>
<groupId>org.scalatest</groupId>
<artifactId>scalatest_${scala.major.version}</artifactId>
Expand Down
38 changes: 38 additions & 0 deletions app/src/test/scala/app/logorrr/HelloButtonSpec.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package app.logorrr

import app.logorrr.testfx.TestFxSpec
import javafx.scene.Scene
import javafx.scene.control.Button
import javafx.scene.layout.StackPane
import javafx.stage.Stage
import org.testfx.api.FxAssert
import org.testfx.matcher.control.LabeledMatchers

class HelloButtonSpec extends TestFxSpec {

lazy val button = new Button("click me!")

override def start(stage: Stage): Unit = {
button.setId("myButton")
button.setOnAction(_ => button.setText("clicked!"))
stage.setScene(new Scene(new StackPane(button), 100, 100))
stage.show()
}

"foo" in {
FxAssert.verifyThat(button, LabeledMatchers.hasText("click me!"))
FxAssert.verifyThat("#myButton", LabeledMatchers.hasText("click me!"))
FxAssert.verifyThat(".button", LabeledMatchers.hasText("click me!"))
}
"click on button" in {
// when:
clickOn(".button")

// then:
FxAssert.verifyThat(button, LabeledMatchers.hasText("clicked!"))
// or (lookup by css id):
FxAssert.verifyThat("#myButton", LabeledMatchers.hasText("clicked!"))
// or (lookup by css class):
FxAssert.verifyThat(".button", LabeledMatchers.hasText("clicked!"))
}
}
27 changes: 27 additions & 0 deletions app/src/test/scala/app/logorrr/testfx/ApplicationAdapter.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package app.logorrr.testfx

import javafx.application.Application
import javafx.stage.Stage

class ApplicationAdapter(val applicationFixture: ApplicationFixture) extends Application {

@throws[Exception]
override def init(): Unit = {
applicationFixture.init()
}

@throws[Exception]
override def start(primaryStage: Stage): Unit = {
applicationFixture.start(primaryStage)
}

@throws[Exception]
override def stop(): Unit = {
applicationFixture.stop()
}

override def hashCode: Int = applicationFixture.hashCode

override def equals(obj: Any): Boolean = applicationFixture == obj.asInstanceOf[ApplicationAdapter].applicationFixture

}
14 changes: 14 additions & 0 deletions app/src/test/scala/app/logorrr/testfx/ApplicationFixture.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package app.logorrr.testfx

import javafx.stage.Stage

trait ApplicationFixture {
@throws[Exception]
def init(): Unit

@throws[Exception]
def start(stage: Stage): Unit

@throws[Exception]
def stop(): Unit
}
51 changes: 51 additions & 0 deletions app/src/test/scala/app/logorrr/testfx/TestFxSpec.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package app.logorrr.testfx

import javafx.application.{Application, HostServices, Preloader}
import javafx.stage.Stage
import org.scalatest.BeforeAndAfterAll
import org.scalatest.wordspec.AnyWordSpecLike
import org.scalatestplus.scalacheck.Checkers
import org.testfx.api.{FxRobot, FxToolkit}

abstract class TestFxSpec extends FxRobot with AnyWordSpecLike with Checkers with BeforeAndAfterAll with ApplicationFixture {
me =>

override def beforeAll(): Unit = {
// Initialize JavaFX Toolkit
javafx.application.Platform.startup(() => {})
FxToolkit.registerPrimaryStage()
FxToolkit.setupApplication(() => new ApplicationAdapter(me))

}

override def afterAll(): Unit = {
FxToolkit.cleanupAfterTest(me, new ApplicationAdapter(me))
}

def launch(appClass: Class[_ <: Application], appArgs: String*): Application = {
FxToolkit.registerPrimaryStage
FxToolkit.setupApplication(appClass, appArgs: _*)
}

@throws[Exception]
override def init(): Unit = {}

@throws[Exception]
override def start(stage: Stage): Unit = {}

@throws[Exception]
override def stop(): Unit = {}

@deprecated def getHostServices: HostServices = throw new UnsupportedOperationException

@deprecated def getParameters: Application.Parameters = throw new UnsupportedOperationException

@deprecated def notifyPreloader(notification: Preloader.PreloaderNotification): Unit = {
throw new UnsupportedOperationException
}

}




6 changes: 6 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,12 @@
<artifactId>scala-library</artifactId>
<version>${scala.version}</version>
</dependency>
<dependency>
<groupId>org.testfx</groupId>
<artifactId>testfx-core</artifactId>
<version>4.0.18</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
Expand Down

0 comments on commit 6136153

Please sign in to comment.