garnet/haskell/Main.hs

65 lines
2.7 KiB
Haskell
Raw Normal View History

2025-12-02 01:37:59 +00:00
module Main (main) where
2025-12-08 12:48:49 +00:00
import Pre
2026-01-05 18:31:34 +00:00
import Data.Finite
2026-01-04 02:14:35 +00:00
import Data.Functor.Contravariant
2025-12-02 09:11:42 +00:00
import Data.Text.IO qualified as T
import Puzzles.Day1 qualified as Day1
2025-12-13 11:19:54 +00:00
import Puzzles.Day10 qualified as Day10
import Puzzles.Day2 qualified as Day2
2025-12-03 11:18:04 +00:00
import Puzzles.Day3 qualified as Day3
2025-12-04 10:00:15 +00:00
import Puzzles.Day4 qualified as Day4
2025-12-05 12:56:40 +00:00
import Puzzles.Day5 qualified as Day5
2025-12-08 13:09:28 +00:00
import Puzzles.Day6 qualified as Day6
2025-12-08 13:32:15 +00:00
import Puzzles.Day7 qualified as Day7
2025-12-08 13:40:55 +00:00
import Puzzles.Day8 qualified as Day8
2025-12-09 10:27:50 +00:00
import Puzzles.Day9 qualified as Day9
2026-01-05 14:37:25 +00:00
import Text.Pretty.Simple (pPrintForceColor)
2025-12-02 00:32:49 +00:00
main :: IO ()
2026-01-06 18:48:37 +00:00
main = do
2026-01-06 18:54:40 +00:00
putStrLn $ drawTree $ show <$> getTestTree tests
2026-01-06 18:48:37 +00:00
pPrintForceColor =<< runTests () tests
tests :: TestTree IO ()
tests =
test "tests" pure $
enumerate <&> \isRealData@(bool "examples" "real" -> t) ->
test (mkTestName t) pure $
[ Day1.puzzle
, Day2.puzzle
, Day3.puzzle
, Day4.puzzle
, Day5.puzzle
, Day6.puzzle
, Day7.puzzle
, Day8.puzzle
, Day9.puzzle
, Day10.puzzle
2026-01-06 18:48:59 +00:00
]
<&> \Puzzle{number = show -> pt, parser, parts, extraTests} ->
testLazy
(mkTestName pt)
( \() -> do
let fp = "../inputs/" <> t <> "/" <> pt
input <-
either (fail . ("parse failure: " <>) . errorBundlePretty) pure
. runParser (parser isRealData <* eof) fp
=<< T.readFile fp
let (rs, os) =
(lookupHList fst &&& foldHListF (HCons . snd) HNil) $
mapHListF (\((Fanout (f, Op o))) -> (o &&& id) $ f input) parts
in pure (input, rs, os)
)
$ ( finites <&> \(n@(show . succ @Int . fromIntegral -> nt)) ->
test
(mkTestName nt)
(\(_, rs, _) -> golden ("../outputs/" <> t <> "/" <> pt <> "/" <> nt) $ rs n <> "\n")
[]
)
<> let ts = extraTests isRealData ("../outputs/" <> t <> "/" <> pt <> "/extra/")
in if null ts
then []
else [testLazy "extra" (\(input, _, os) -> pure (input, os)) ts]