advent-of-code/2023/haskell/tests/Main.hs

159 lines
4 KiB
Haskell
Raw Normal View History

2023-12-01 23:03:57 +01:00
{-# LANGUAGE OverloadedStrings #-}
module Main (main) where
2023-12-05 20:31:36 +01:00
import Test.HUnit (Test(..), assertEqual, runTestTT, failures)
2023-12-01 23:03:57 +01:00
import qualified System.Exit as Exit
import qualified Day01
2023-12-02 13:42:14 +01:00
import qualified Day02
2023-12-03 13:12:15 +01:00
import qualified Day03
2023-12-04 23:07:37 +01:00
import qualified Day04
2023-12-05 20:31:36 +01:00
import qualified Day05
2023-12-06 20:33:19 +01:00
import qualified Day06
2023-12-01 23:03:57 +01:00
day01 :: Test
2023-12-05 20:31:36 +01:00
day01 =
let parsedA = Day01.parse inputA
parsedB = Day01.parse inputB
in TestList
[ TestCase $ assertEqual "A" (Right 142) (Day01.solveA <$> parsedA)
, TestCase $ assertEqual "B" (Right 281) (Day01.solveB <$> parsedB)
]
2023-12-01 23:03:57 +01:00
where
2023-12-05 20:31:36 +01:00
inputA =
"1abc2\n\
\pqr3stu8vwx\n\
\a1b2c3d4e5f\n\
\treb7uchet\n"
inputB =
"two1nine\n\
\eightwothree\n\
\abcone2threexyz\n\
\xtwone3four\n\
\4nineeightseven2\n\
\zoneight234\n\
\7pqrstsixteen\n"
2023-12-01 23:03:57 +01:00
2023-12-02 13:42:14 +01:00
day02 :: Test
2023-12-05 20:31:36 +01:00
day02 =
let parsed = Day02.parse input
in TestList
[ TestCase $ assertEqual "A" (Right 8) (Day02.solveA <$> parsed)
, TestCase $ assertEqual "B" (Right 2286) (Day02.solveB <$> parsed)
]
2023-12-02 13:42:14 +01:00
where
2023-12-02 14:32:05 +01:00
input =
2023-12-05 20:31:36 +01:00
"Game 1: 3 blue, 4 red; 1 red, 2 green, 6 blue; 2 green\n\
\Game 2: 1 blue, 2 green; 3 green, 4 blue, 1 red; 1 green, 1 blue\n\
\Game 3: 8 green, 6 blue, 20 red; 5 blue, 4 red, 13 green; 5 green, 1 red\n\
\Game 4: 1 green, 3 red, 6 blue; 3 green, 6 red; 3 green, 15 blue, 14 red\n\
\Game 5: 6 red, 1 blue, 3 green; 2 blue, 1 red, 2 green\n"
2023-12-01 23:03:57 +01:00
2023-12-03 13:12:15 +01:00
day03 :: Test
2023-12-03 20:02:28 +01:00
day03 =
let parsed = Day03.parse input
in TestList
[ TestCase $ assertEqual "A" (Right 4361) (Day03.solveA <$> parsed)
, TestCase $ assertEqual "B" (Right 467835) (Day03.solveB <$> parsed)
2023-12-03 13:12:15 +01:00
]
where
input =
"467..114..\n\
\...*......\n\
\..35..633.\n\
\......#...\n\
\617*......\n\
\.....+.58.\n\
\..592.....\n\
\......755.\n\
\...$.*....\n\
\.664.598..\n"
2023-12-04 23:07:37 +01:00
day04 :: Test
day04 =
let parsed = Day04.parse input
in TestList
[ TestCase $ assertEqual "A" (Right 13) (Day04.solveA <$> parsed)
, TestCase $ assertEqual "B" (Right 30) (Day04.solveB <$> parsed)
]
where
input =
"Card 1: 41 48 83 86 17 | 83 86 6 31 17 9 48 53\n\
\Card 2: 13 32 20 16 61 | 61 30 68 82 17 32 24 19\n\
\Card 3: 1 21 53 59 44 | 69 82 63 72 16 21 14 1\n\
\Card 4: 41 92 73 84 69 | 59 84 76 51 58 5 54 83\n\
\Card 5: 87 83 26 28 32 | 88 30 70 12 93 22 82 36\n\
\Card 6: 31 18 13 56 72 | 74 77 10 23 35 67 36 11\n"
2023-12-05 20:31:36 +01:00
day05 :: Test
day05 =
let parsed = Day05.parse input
in TestList
[ TestCase $ assertEqual "A" (Right 35) (Day05.solveA <$> parsed)
, TestCase $ assertEqual "B" (Right 46) (Day05.solveB <$> parsed)
]
where
input =
"seeds: 79 14 55 13\n\
\\n\
\seed-to-soil map:\n\
\50 98 2\n\
\52 50 48\n\
\\n\
\soil-to-fertilizer map:\n\
\0 15 37\n\
\37 52 2\n\
\39 0 15\n\
\\n\
\fertilizer-to-water map:\n\
\49 53 8\n\
\0 11 42\n\
\42 0 7\n\
\57 7 4\n\
\\n\
\water-to-light map:\n\
\88 18 7\n\
\18 25 70\n\
\\n\
\light-to-temperature map:\n\
\45 77 23\n\
\81 45 19\n\
\68 64 13\n\
\\n\
\temperature-to-humidity map:\n\
\0 69 1\n\
\1 0 69\n\
\\n\
\humidity-to-location map:\n\
\60 56 37\n\
\56 93 4\n"
2023-12-06 20:33:19 +01:00
day06 :: Test
day06 =
let parsed = Day06.parse input
in TestList
[ TestCase $ assertEqual "A" (Right 288) (Day06.solveA <$> parsed)
, TestCase $ assertEqual "B" (Right 71503) (Day06.solveB <$> parsed)
]
where
input =
"Time: 7 15 30\n\
\Distance: 9 40 200\n"
2023-12-01 23:03:57 +01:00
tests :: Test
tests = TestList
[ TestLabel "day01" day01
2023-12-02 13:42:14 +01:00
, TestLabel "day02" day02
2023-12-03 13:12:15 +01:00
, TestLabel "day03" day03
2023-12-04 23:07:37 +01:00
, TestLabel "day04" day04
2023-12-05 20:31:36 +01:00
, TestLabel "day05" day05
2023-12-06 20:33:19 +01:00
, TestLabel "day06" day06
2023-12-01 23:03:57 +01:00
]
main :: IO ()
main = isFailed . failures =<< runTestTT tests
where
isFailed count
| count > 0 = Exit.exitFailure
| otherwise = Exit.exitSuccess