Table driven testing is similar to property-based testing, with the difference being that instead of generators providing random values, the set of input values is manually specified. The way we do this is by declaring a table structure that can be hardcoded into the test or loaded from a file.
The easiest approach is to simply include the table in the test, and this works fine if we have a small range of input values or edge cases that we want to test. For example, we may have a function with three Boolean input values and want to test the combinations. The first step is to define the table that contains the combinations we want to test:
    val table = table( 
      headers("a", "b", "c"), 
      row(true, true, true), 
      row(true, false, true), 
      row(true, false, false) 
    ) 
Notice that we use the headers and row...