Extension Examples
System Out Listener​
A real example of an extension, is the NoSystemOutListener which comes with Kotest.
This extension throws an error if any output is written to standard out.
class MyTestSpec : DescribeSpec({
    listener(NoSystemOutListener)
    describe("All these tests should not write to standard out") {
        it("silence in the court") {
          println("boom") // failure
        }
    }
})
Timer Listener​
Another example would be if we wanted to log the time taken for each test case.
We can do this by using the beforeTest and afterTest functions as follows:
object TimerListener : BeforeTestListener, AfterTestListener {
  var started = 0L
  override fun beforeTest(testCase: TestCase): Unit {
    started = System.currentTimeMillis()
  }
  override fun afterTest(testCase: TestCase, result: TestResult): Unit {
    println("Duration of ${testCase.descriptor} = " + (System.currentTimeMillis() - started))
  }
}
Then we can register like so:
class MyTestClass : FunSpec({
  extensions(TimerListener)
  // tests here
})
Or we could register it project wide:
object MyConfig : AbstractProjectConfig() {
    override fun extensions(): List<Extension> = listOf(TimerListener)
}