;; -*- compile-command: "guile -L . cc-test.scm"; -*- (use-modules (srfi srfi-64) (cc)) (test-begin "harness") (test-equal "max rgb all zeros" '(0 0 0) (take-max-instances '(0 0 0) '(0 0 0))) (test-equal "max rgb no change" '(0 0 0) (take-max-instances '(0 0 0) '(-1 -2 -3))) (test-equal "max rgb all change" '(-1 -2 -3) (take-max-instances '(-2 -3 -4) '(-1 -2 -3))) (test-equal "max rgb red change" '(99 0 0) (take-max-instances '(0 0 0) '(99 0 -1))) (test-equal "max rgb mix" '(42 53 69) (take-max-instances '(42 7 13) '(21 53 69))) (test-equal "zero all empty string" '(0 0 0) (draw->colors "")) (test-equal "1 red draw" '(1 0 0) (draw->colors "1 red")) (test-equal "1 green draw" '(0 1 0) (draw->colors "1 green,")) (test-equal "2 blue draw" '(0 0 2) (draw->colors "2 blue,")) (test-equal "1 of each" '(1 1 1) (draw->colors "1 red, 1 green, 1 blue,")) (test-equal "mix of each, random order" '(72 56 24) (draw->colors "56 green, 24 blue, 72 red")) (test-equal "zero draw game" '(0 0 0) (game->seen "")) (test-equal "two red single" '(2 0 0) (game->seen " 2 red")) (test-equal "one red repeat" '(1 0 0) (game->seen "1 red; 1 red; 1 red")) (test-equal "one red one blue repeat" '(1 0 1) (game->seen "1 red; 1 blue; 1 red")) (test-equal "escalating reds" '(3 0 0) (game->seen "1 red; 2 red; 3 red")) (test-equal "deescalating reds" '(3 0 0) (game->seen "3 red; 2 red; 1 red")) (test-equal "realistic game" '(4 2 6) (game->seen "3 blue, 4 red; 1 red, 2 green, 6 blue; 2 green")) (test-equal "zero games returns empty alist" '() (games->at-least "")) (test-equal "one game zero draws returns zeros" '((0 . (0 0 0))) (games->at-least " Game 0: ")) (test-equal "one game one draw one color" '((0 . (0 1 0))) (games->at-least " Game 0: 1 green ")) (test-equal "varied game counter one game one draw" '((42 . (0 1 0))) (games->at-least " Game 42: 1 green ")) (test-equal "two games of one draw" '((1 . (1 0 0)) (0 . (0 1 0))) (games->at-least " Game 0: 1 green Game 1: 1 red ")) (test-equal "two games of multiple draws" '((2 . (1 6 1)) (0 . (0 1 2))) (games->at-least " Game 0: 1 green; 2 blue Game 2: 1 red; 6 green, 1 blue ")) (test-equal "many games many draws" '((5 . (6 3 2)) (4 . (14 3 15)) (3 . (20 13 6)) (2 . (1 3 4)) (1 . (4 2 6))) (games->at-least " Game 1: 3 blue, 4 red; 1 red, 2 green, 6 blue; 2 green Game 2: 1 blue, 2 green; 3 green, 4 blue, 1 red; 1 green, 1 blue Game 3: 8 green, 6 blue, 20 red; 5 blue, 4 red, 13 green; 5 green, 1 red Game 4: 1 green, 3 red, 6 blue; 3 green, 6 red; 3 green, 15 blue, 14 red Game 5: 6 red, 1 blue, 3 green; 2 blue, 1 red, 2 green ")) (test-equal "no games results in no possible games" '() (filter-possible-games '() '(0 0 0))) (test-equal "one impossible game" '() (filter-possible-games '((1 . (99 99 99))) '(0 0 0))) (test-equal "one possible game" '((1 . (0 0 0))) (filter-possible-games '((1 . (0 0 0))) '(99 99 99))) (test-equal "one possible game borderline" '((1 . (99 99 99))) (filter-possible-games '((1 . (99 99 99))) '(99 99 99))) (test-equal "game crossed one" '() (filter-possible-games '((1 . (99 99 100))) '(99 99 99))) (test-equal "two possible zero impossible" '((1 . (99 98 99)) (3 . (101 52 99))) (filter-possible-games '((1 . (99 98 99)) (3 . (101 52 99))) '(101 99 99))) (test-equal "zero possible two impossible" '() (filter-possible-games '((1 . (99 98 99)) (3 . (101 52 99))) '(100 97 99))) (test-equal "one possible one impossible" '((1 . (99 98 99))) (filter-possible-games '((1 . (99 98 99)) (3 . (101 52 99))) '(100 99 99))) (test-equal "sum zero possible games" '(0 . 0) (cc "Game 0: 99 red" 0 0 0)) (test-equal "sum one possible games" '(1 . 0) (cc "Game 1: -1 red" 0 0 0)) (test-equal "sum realistic input" '(8 . 2286) (cc " Game 1: 3 blue, 4 red; 1 red, 2 green, 6 blue; 2 green Game 2: 1 blue, 2 green; 3 green, 4 blue, 1 red; 1 green, 1 blue Game 3: 8 green, 6 blue, 20 red; 5 blue, 4 red, 13 green; 5 green, 1 red Game 4: 1 green, 3 red, 6 blue; 3 green, 6 red; 3 green, 15 blue, 14 red Game 5: 6 red, 1 blue, 3 green; 2 blue, 1 red, 2 green " 12 13 14)) (test-end "harness")