garnet/haskell/Main.hs

69 lines
3.0 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
import Data.Text qualified as T
2025-12-02 09:11:42 +00:00
import Data.Text.IO qualified as T
2026-01-06 22:38:34 +00:00
import Data.Text.Lazy.IO qualified as TL
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
import System.Console.Terminal.Size qualified as Terminal.Size
2025-12-02 00:32:49 +00:00
main :: IO ()
2026-01-06 18:48:37 +00:00
main = do
2026-01-06 23:16:08 +00:00
-- terminalWidth <- Terminal.Size.width <<$>> Terminal.Size.size -- TODO this doesn't work in GHCID or GHCIWatch...
2026-01-06 22:52:43 +00:00
terminalWidth <- pure $ Just 60
2026-01-06 18:54:40 +00:00
putStrLn $ drawTree $ show <$> getTestTree tests
2026-01-06 22:52:43 +00:00
TL.putStrLn . displayTestResultsConsole terminalWidth =<< runTests () tests
2026-01-06 18:48:37 +00:00
tests :: TestTree IO ()
tests =
test "tests" pure $
enumerate <&> \isRealData@(bool "examples" "real" -> t) ->
2026-01-07 00:43:51 +00:00
test (mkTestName $ T.pack t) pure $
2026-01-06 18:48:37 +00:00
[ 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
2026-01-07 00:43:51 +00:00
(mkTestName $ T.pack pt)
2026-01-06 18:48:59 +00:00
( \() -> do
let fp = "../inputs/" <> t <> "/" <> pt
input <-
either (assertFailure . T.pack . ("parse failure: " <>) . errorBundlePretty) pure
2026-01-06 18:48:59 +00:00
. runParser (parser isRealData <* eof) fp
=<< liftIO (T.readFile fp)
2026-01-06 18:48:59 +00:00
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
2026-01-07 00:43:51 +00:00
(mkTestName $ T.pack nt)
2026-01-06 18:48:59 +00:00
(\(_, 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]