packages feed

taskell-1.8.2.0: test/Events/State/HistoryTest.hs

{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}

module Events.State.HistoryTest
    ( test_history
    ) where

import ClassyPrelude

import Test.Tasty
import Test.Tasty.HUnit

import Events.State.History
import Events.State.Types

make :: [Integer] -> Integer -> [Integer] -> History Integer
make = History

testHistory :: History Integer
testHistory = make empty 0 empty

-- tests
test_history :: TestTree
test_history =
    testGroup
        "Events.State.History"
        [ testGroup
              "undo"
              [ testCase "empty" (assertEqual "Nothing changes" testHistory (undo testHistory))
              , testCase
                    "one undo"
                    (assertEqual "Goes back" (make empty 0 [1]) (undo $ make [0] 1 empty))
              , testCase
                    "two undo"
                    (assertEqual
                         "Goes back"
                         (make empty 0 [1, 2])
                         (undo . undo $ make [1, 0] 2 empty))
              , testCase
                    "three undo"
                    (assertEqual
                         "Goes back"
                         (make empty 0 [1, 2, 3])
                         (undo . undo . undo $ make [2, 1, 0] 3 empty))
              ]
        , testGroup
              "redo"
              [ testCase "empty" (assertEqual "Nothing changes" testHistory (redo testHistory))
              , testCase
                    "one redo"
                    (assertEqual "Goes forward" (make [0] 1 empty) (redo $ make empty 0 [1]))
              , testCase
                    "two redo"
                    (assertEqual
                         "Goes forward"
                         (make [1, 0] 2 empty)
                         (redo . redo $ make empty 0 [1, 2]))
              , testCase
                    "three redo"
                    (assertEqual
                         "Goes forward"
                         (make [2, 1, 0] 3 empty)
                         (redo . redo . redo $ make empty 0 [1, 2, 3]))
              ]
        , testGroup
              "mix"
              [ testCase
                    "empty"
                    (assertEqual
                         "Nothing changes"
                         testHistory
                         (undo . redo . undo . redo . undo $ testHistory))
              , testCase
                    "redo undo"
                    (assertEqual
                         "Nothing changes"
                         (make [4, 3, 2, 1, 0] 5 [6, 7, 8, 9, 10])
                         (undo . redo $ make [4, 3, 2, 1, 0] 5 [6, 7, 8, 9, 10]))
              , testCase
                    "undo redo"
                    (assertEqual
                         "Nothing changes"
                         (make [4, 3, 2, 1, 0] 5 [6, 7, 8, 9, 10])
                         (redo . undo $ make [4, 3, 2, 1, 0] 5 [6, 7, 8, 9, 10]))
              ]
        , testGroup
              "store"
              [ testCase
                    "empty"
                    (assertEqual "Stores current value" (make [0] 0 empty) (store testHistory))
              , testCase
                    "undo store redo"
                    (assertEqual
                         "Clears redo"
                         (make [4, 3, 2, 1, 0] 4 empty)
                         (redo . store . undo $ make [4, 3, 2, 1, 0] 5 [6, 7, 8, 9, 10]))
              ]
        ]