packages feed

taskell-1.9.0.0: test/IO/Markdown/ParserTest.hs

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

module IO.Markdown.ParserTest
    ( test_parser
    ) where

import ClassyPrelude

import Test.Tasty

import Test.Tasty.HUnit

import Control.Lens   ((&), (.~))
import Data.FileEmbed (embedFile)

import Data.Taskell.Date  (textToTime)
import Data.Taskell.List  (create)
import Data.Taskell.Lists (Lists, analyse, appendToLast, newList)

import qualified Data.Taskell.Subtask as ST (new)
import           Data.Taskell.Task    (Task, addSubtask, due, new, setDescription)
import           IO.Config.Markdown   (Config (Config), defaultConfig, descriptionOutput, dueOutput,
                                       localTimes, subtaskOutput, taskOutput, titleOutput)
import           IO.Markdown.Parser   (parse)

-- error message
err :: Either Text Lists
err = Left "Could not parse file."

-- complete taskell file
file :: Text
file = decodeUtf8 $(embedFile "test/IO/data/roadmap.md")

-- alternative markdown configs
alternativeConfig :: Config
alternativeConfig =
    Config
    { titleOutput = "##"
    , taskOutput = "###"
    , descriptionOutput = ">"
    , dueOutput = "@"
    , subtaskOutput = "-"
    , localTimes = True
    }

-- useful records
task :: Task
task = new "Test Item"

list :: Lists
list = newList "Test" empty

listWithItem :: Lists
listWithItem = appendToLast task list

multiList :: Lists
multiList =
    fromList
        [create "Test" (fromList [new "Test Item"]), create "Test 2" (fromList [new "Test Item 2"])]

makeSubTask :: Text -> Bool -> Lists
makeSubTask t b = appendToLast (addSubtask (ST.new t b) task) list

taskWithSummary :: Task
taskWithSummary = setDescription "Summary" task

taskWithMultiLineSummary :: Task
taskWithMultiLineSummary = setDescription "Summary Line 1\nSummary Line 2" task

listWithSummaryItem :: Lists
listWithSummaryItem = appendToLast taskWithSummary list

listWithMultiLineSummaryItem :: Lists
listWithMultiLineSummaryItem = appendToLast taskWithMultiLineSummary list

taskWithDueDate :: Task
taskWithDueDate = task & due .~ textToTime "2018-04-12"

listWithDueDateItem :: Lists
listWithDueDateItem = appendToLast taskWithDueDate list

-- tests
test_parser :: TestTree
test_parser =
    testGroup
        "IO.Markdown"
        [ testGroup
              "Default Format"
              [ testCase
                    "List Title"
                    (assertEqual "One list" (Right list) (parse defaultConfig "## Test"))
              , testCase
                    "List item"
                    (assertEqual
                         "List item"
                         (Right listWithItem)
                         (parse defaultConfig "## Test\n\n- Test Item"))
              , testCase
                    "Multiple Lists"
                    (assertEqual
                         "List item"
                         (Right multiList)
                         (parse defaultConfig "## Test\n\n- Test Item\n\n## Test 2\n\n- Test Item 2"))
              , testCase
                    "Summary"
                    (assertEqual
                         "Summary"
                         (Right listWithSummaryItem)
                         (parse defaultConfig "## Test\n\n- Test Item\n    > Summary"))
              , testCase
                    "List Item with multi-line Summary"
                    (assertEqual
                         "List item with a summary"
                         (Right listWithMultiLineSummaryItem)
                         (parse
                              defaultConfig
                              "## Test\n\n- Test Item\n    > Summary Line 1\n    > Summary Line 2"))
              , testCase
                    "Due Date"
                    (assertEqual
                         "Due Date"
                         (Right listWithDueDateItem)
                         (parse defaultConfig "## Test\n\n- Test Item\n    @ 2018-04-12"))
              , testCase
                    "Sub-Task"
                    (assertEqual
                         "List item with Sub-Task"
                         (Right (makeSubTask "Blah" False))
                         (parse defaultConfig "## Test\n\n- Test Item\n    * [ ] Blah"))
              , testCase
                    "Complete Sub-Task"
                    (assertEqual
                         "List item with Sub-Task"
                         (Right (makeSubTask "Blah" True))
                         (parse defaultConfig "## Test\n\n- Test Item\n    * [x] Blah"))
              ]
        , testGroup
              "Alternative Format"
              [ testCase
                    "List Title"
                    (assertEqual "One list" (Right list) (parse alternativeConfig "## Test"))
              , testCase
                    "List item"
                    (assertEqual
                         "List item"
                         (Right listWithItem)
                         (parse alternativeConfig "## Test\n\n### Test Item"))
              , testCase
                    "Multiple Lists"
                    (assertEqual
                         "List item"
                         (Right multiList)
                         (parse
                              alternativeConfig
                              "## Test\n\n### Test Item\n\n## Test 2\n\n### Test Item 2"))
              , testCase
                    "Summary"
                    (assertEqual
                         "Summary"
                         (Right listWithSummaryItem)
                         (parse alternativeConfig "## Test\n\n### Test Item\n> Summary"))
              , testCase
                    "List Item with multi-line Summary"
                    (assertEqual
                         "List item with a summary"
                         (Right listWithMultiLineSummaryItem)
                         (parse
                              alternativeConfig
                              "## Test\n\n### Test Item\n> Summary Line 1\n> Summary Line 2"))
              , testCase
                    "Due Date"
                    (assertEqual
                         "Due Date"
                         (Right listWithDueDateItem)
                         (parse alternativeConfig "## Test\n\n### Test Item\n@ 2018-04-12"))
              , testCase
                    "Sub-Task"
                    (assertEqual
                         "List item with Sub-Task"
                         (Right (makeSubTask "Blah" False))
                         (parse alternativeConfig "## Test\n\n### Test Item\n- [ ] Blah"))
              , testCase
                    "Complete Sub-Task"
                    (assertEqual
                         "List item with Sub-Task"
                         (Right (makeSubTask "Blah" True))
                         (parse alternativeConfig "## Test\n\n### Test Item\n- [x] Blah"))
              ]
        , testGroup
              "Errors"
              [ testCase "Blank line" (assertEqual "Parse Error" err (parse defaultConfig ""))
              , testCase
                    "Just spaces"
                    (assertEqual "Parse Error" err (parse defaultConfig "        "))
              , testCase
                    "Just whitespace"
                    (assertEqual "Parse Error" err (parse defaultConfig "  \n  \n \t    "))
              , testCase "Error" (assertEqual "Parse Error" err (parse defaultConfig "Test"))
              , testCase
                    "List item without list"
                    (assertEqual "Parse Error" err (parse defaultConfig "- Test Item"))
              , testCase
                    "Sub task without list item"
                    (assertEqual "Parse Error" err (parse defaultConfig "## Test\n    * Blah"))
              ]
        , testCase
              "File"
              (assertEqual
                   "Parses whole file"
                   (Right "test\nLists: 6\nTasks: 202")
                   (analyse "test" <$> parse defaultConfig file))
        ]