packages feed

taskell-1.3.5.0: test/Data/Taskell/TaskTest.hs

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

module Data.Taskell.TaskTest
    ( test_task
    ) where

import ClassyPrelude

import Control.Lens ((.~))

import Test.Tasty
import Test.Tasty.HUnit

import Data.Time (fromGregorianValid)

import qualified Data.Taskell.Subtask       as ST (name, new)
import           Data.Taskell.Task.Internal

testTask :: Task
testTask =
    Task
    { _name = "Test"
    , _description = Nothing
    , _subtasks = fromList [ST.new "One" True, ST.new "Two" False, ST.new "Three" False]
    , _due = Nothing
    }

-- tests
test_task :: TestTree
test_task =
    testGroup
        "Data.Taskell.Task"
        [ testCase "blank" (assertEqual "Returns empty task" (Task "" Nothing empty Nothing) blank)
        , testCase
              "new"
              (assertEqual "Returns a new task" (Task "Hello" Nothing empty Nothing) (new "Hello"))
        , testGroup
              "getSubtask"
              [ testCase
                    "exists"
                    (assertEqual
                         "Returns a the sub-task"
                         (Just (ST.new "Two" False))
                         (getSubtask 1 testTask))
              , testCase
                    "doesn't exist"
                    (assertEqual "Returns Nothing" Nothing (getSubtask 10 testTask))
              ]
        , testGroup
              "setDescription"
              [ testCase
                    "empty sub-tasks"
                    (assertEqual
                         "Updates description"
                         (Task "Test" (Just "Description") empty Nothing)
                         (setDescription "Description" (new "Test")))
              , testCase
                    "empty"
                    (assertEqual
                         "Keeps description as Nothing"
                         (new "Test")
                         (setDescription "" (new "Test")))
              , testCase
                    "blank"
                    (assertEqual
                         "Keeps description as Nothing"
                         (new "Test")
                         (setDescription "   " (new "Test")))
              ]
        , testGroup
              "addSubtask"
              [ testCase
                    "existing"
                    (assertEqual
                         "Returns the task with added subtask"
                         (Task
                              "Test"
                              Nothing
                              (fromList
                                   [ ST.new "One" True
                                   , ST.new "Two" False
                                   , ST.new "Three" False
                                   , ST.new "Four" True
                                   ])
                              Nothing)
                         (addSubtask (ST.new "Four" True) testTask))
              , testCase
                    "empty sub-tasks"
                    (assertEqual
                         "Returns the task with added subtask"
                         (Task "Test" Nothing (fromList [ST.new "One" False]) Nothing)
                         (addSubtask (ST.new "One" False) (new "Test")))
              ]
        , testGroup
              "hasSubtasks"
              [ testCase "existing" (assertEqual "Returns True" True (hasSubtasks testTask))
              , testCase
                    "empty sub-tasks"
                    (assertEqual "Returns False" False (hasSubtasks (new "Test")))
              ]
        , testGroup
              "updateSubtask"
              [ testCase
                    "exists"
                    (assertEqual
                         "Returns updated task"
                         (Task
                              "Test"
                              Nothing
                              (fromList
                                   [ST.new "One" True, ST.new "Cow" False, ST.new "Three" False])
                              Nothing)
                         (updateSubtask 1 (ST.name .~ "Cow") testTask))
              , testCase
                    "doesn't exist"
                    (assertEqual
                         "Returns task"
                         (Task
                              "Test"
                              Nothing
                              (fromList
                                   [ST.new "One" True, ST.new "Two" False, ST.new "Three" False])
                              Nothing)
                         (updateSubtask 10 (ST.name .~ "Cow") testTask))
              ]
        , testGroup
              "removeSubtask"
              [ testCase
                    "exists"
                    (assertEqual
                         "Returns updated task"
                         (Task
                              "Test"
                              Nothing
                              (fromList [ST.new "One" True, ST.new "Three" False])
                              Nothing)
                         (removeSubtask 1 testTask))
              , testCase
                    "doesn't exist"
                    (assertEqual
                         "Returns task"
                         (Task
                              "Test"
                              Nothing
                              (fromList
                                   [ST.new "One" True, ST.new "Two" False, ST.new "Three" False])
                              Nothing)
                         (removeSubtask 10 testTask))
              ]
        , testCase "countSubtasks" (assertEqual "Returns 3" 3 (countSubtasks testTask))
        , testCase
              "countCompleteSubtasks"
              (assertEqual "Returns 1" 1 (countCompleteSubtasks testTask))
        , testGroup
              "contains"
              [ testCase "in task" (assertEqual "Finds in task" True (contains "Test" testTask))
              , testCase "in sub-task" (assertEqual "Find sub-task" True (contains "One" testTask))
              , testCase "missing" (assertEqual "Find sub-task" False (contains "Fish" testTask))
              ]
        , testGroup
              "isBlank"
              [ testCase
                    "blank"
                    (assertEqual "Return True" True (isBlank (Task "" Nothing empty Nothing)))
              , testCase "name not blank" (assertEqual "Returns False" False (isBlank testTask))
              , testCase
                    "description not blank"
                    (assertEqual
                         "Returns False"
                         False
                         (isBlank (Task "" (Just "Blah") empty Nothing)))
              , testCase
                    "subtasks not blank"
                    (assertEqual
                         "Returns False"
                         False
                         (isBlank (Task "" Nothing (fromList [ST.new "One" True]) Nothing)))
              , testCase
                    "due date not blank"
                    (assertEqual
                         "Returns False"
                         False
                         (isBlank (Task "" Nothing empty (fromGregorianValid 2018 05 18))))
              ]
        ]