There are some drawbacks: - No properly lazy golden tests. This would in principle be nice when e.g. using `pretty-simple`. - Because tests can be created dynamically, they can't be listed up front without running them. This presumably makes filtering slightly more annoying to use in practice. - Terminal output is less compact than tasty, both horizontally and vertically. There appears to be no way to change this. - We end up defining an orphan `Monoid (TestDefM '[] () ())` instance, to avoid changing much downstream code. Note though that this is not strictly necessary, and could potentially be contributed upstream. - There's a warning about threads in GHCI which we can't seem to disable. - The license forbids use in commercial projects without sponsoring. Thankfully that doesn't apply here. Anyway, it's generally very impressive. It simplifies a few things for us, and will particularly help when we come to want to specify dependencies between tests.
47 lines
1.8 KiB
Haskell
47 lines
1.8 KiB
Haskell
module Main (main) where
|
|
|
|
import Pre
|
|
|
|
import Data.Text qualified as T
|
|
import Data.Text.IO qualified as T
|
|
import Puzzles.Day1 qualified as Day1
|
|
import Puzzles.Day10 qualified as Day10
|
|
import Puzzles.Day2 qualified as Day2
|
|
import Puzzles.Day3 qualified as Day3
|
|
import Puzzles.Day4 qualified as Day4
|
|
import Puzzles.Day5 qualified as Day5
|
|
import Puzzles.Day6 qualified as Day6
|
|
import Puzzles.Day7 qualified as Day7
|
|
import Puzzles.Day8 qualified as Day8
|
|
import Puzzles.Day9 qualified as Day9
|
|
|
|
main :: IO ()
|
|
main =
|
|
sydTest $ doNotRandomiseExecutionOrder $ for_ enumerate \isRealData@(bool "examples" "real" -> t) ->
|
|
describe t $ for_
|
|
[ Day1.puzzle
|
|
, Day2.puzzle
|
|
, Day3.puzzle
|
|
, Day4.puzzle
|
|
, Day5.puzzle
|
|
, Day6.puzzle
|
|
, Day7.puzzle
|
|
, Day8.puzzle
|
|
, Day9.puzzle
|
|
, Day10.puzzle
|
|
]
|
|
\Puzzle{number, parser, parts, extraTests} ->
|
|
let
|
|
pt = show number
|
|
parseFile fp =
|
|
either (fail . ("parse failure: " <>) . errorBundlePretty) pure
|
|
. runParser (parser isRealData <* eof) fp
|
|
=<< T.readFile fp
|
|
in
|
|
describe pt do
|
|
input <- liftIO $ parseFile $ "../inputs/" <> t <> "/" <> pt
|
|
sequence_ $ flip mapWithIndexOutputParameterisedFunctionList parts \(show . succ -> n) pp ->
|
|
it n . pureGoldenTextFile ("../outputs/" <> t <> "/" <> pt <> "/" <> n) $
|
|
T.show (pp input) <> "\n"
|
|
describe "extra" $ extraTests isRealData ("../outputs/" <> t <> "/" <> pt <> "/extra/") input
|