Writing a Small DSL
In this section, we'll
reimplement some
FlatSpec
ScalaTest
DSLs in order to see how to implement DSLs in Scala.
First, we'll have a look at a simple way to model test cases in Scala using case classes. Then, we'll have a look at how to create a little DSL for creating those test cases.
Modeling Test Cases
Before we can create a DSL, we need to have something to create a DSL for. In our case, we want to create a DSL for specifying tests, so let's have a look at how we could model tests using case classes in Scala:
sealed trait TestResult case class TestFailure(message: String) extends TestResult case object TestSuccess extends TestResult
We'll create an algebraic data type that represents the result of running a test case. The result can either be a failure that contains a message regarding the failure, or a
TestSuccess
that simply indicates that the test passed:
case class TestCase(description: TestDescription, run: () => TestResult) case class TestDescription(name...