taskell-1.9.3.0: test/Taskell/IO/Markdown/SerializerTest.hs
{-# LANGUAGE TemplateHaskell #-}
module Taskell.IO.Markdown.SerializerTest
( test_serializer
) where
import ClassyPrelude
import Test.Tasty
import Test.Tasty.HUnit
import Control.Lens ((&), (.~))
import Control.Monad.Reader (runReader)
import Data.FileEmbed (embedFile)
import Data.Time.Zones (utcTZ)
import Data.Time.Zones.All (TZLabel (America__New_York), tzByLabel)
import Taskell.Data.Date (textToTime)
import qualified Taskell.Data.List as L (append, empty)
import Taskell.Data.Lists (Lists, appendToLast, newList)
import qualified Taskell.Data.Subtask as ST (new)
import Taskell.Data.Task (Task, addSubtask, due, new, setDescription)
import Taskell.IO.Config.Markdown (Config (..), defaultConfig)
import Taskell.IO.Markdown.Parser (parse)
import Taskell.IO.Markdown.Serializer (MarkdownInfo (MarkdownInfo), serialize)
-- complete taskell file
file :: Text
file = decodeUtf8 $(embedFile "test/Taskell/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
lists :: Lists
lists = fromList [L.append task (L.empty "To Do"), L.append (new "Fish") (L.empty "Done")]
listWithItem :: Lists
listWithItem = appendToLast task list
makeSubTask :: Text -> Bool -> Lists
makeSubTask t b = appendToLast (addSubtask (ST.new t b) task) list
makeSubTasks :: [Text] -> Bool -> Lists
makeSubTasks ts b = appendToLast (foldr addSubtask task subtasks) list
where
subtasks = flip ST.new b <$> ts
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
taskWithDueTime :: Task
taskWithDueTime = task & due .~ textToTime "2018-04-12 12:00 UTC"
listWithDueTimeItem :: Lists
listWithDueTimeItem = appendToLast taskWithDueTime list
-- reader
defaultReader :: MarkdownInfo
defaultReader = MarkdownInfo utcTZ defaultConfig
alternativeReader :: MarkdownInfo
alternativeReader = MarkdownInfo utcTZ alternativeConfig
-- simplify tests
serialize' :: MarkdownInfo -> Lists -> Text
serialize' md ls = runReader (serialize ls) md
-- tests
test_serializer :: TestTree
test_serializer =
testGroup
"IO.Markdown"
[ testGroup
"Serialisation"
[ testGroup
"Default Format"
[ testCase
"Standard lists"
(assertEqual
"Markdown formatted output"
"## To Do\n\n- Test Item\n\n## Done\n\n- Fish\n"
(serialize' defaultReader lists))
, testCase
"Standard list"
(assertEqual
"Markdown formatted output"
"## Test\n\n- Test Item\n"
(serialize' defaultReader listWithItem))
, testCase
"Standard list with summary"
(assertEqual
"Markdown formatted output"
"## Test\n\n- Test Item\n > Summary\n"
(serialize' defaultReader listWithSummaryItem))
, testCase
"Standard list with date"
(assertEqual
"Markdown formatted output"
"## Test\n\n- Test Item\n @ 2018-04-12\n"
(serialize' defaultReader listWithDueDateItem))
, testCase
"Standard list with date - timezone"
(assertEqual
"Use UTC timezone"
"## Test\n\n- Test Item\n @ 2018-04-12 12:00 UTC\n"
(serialize'
(MarkdownInfo (tzByLabel America__New_York) defaultConfig)
listWithDueTimeItem))
, testCase
"Standard list with sub-task"
(assertEqual
"Markdown formatted output"
"## Test\n\n- Test Item\n * [x] Blah\n"
(serialize' defaultReader (makeSubTask "Blah" True)))
, testCase
"Standard list with sub-tasks"
(assertEqual
"Markdown formatted output"
"## Test\n\n- Test Item\n * [x] Blah\n * [x] Cow\n * [x] Spoon\n"
(serialize'
defaultReader
(makeSubTasks ["Spoon", "Cow", "Blah"] True)))
, testCase
"Standard list with multi-line summary"
(assertEqual
"Markdown formatted output"
"## Test\n\n- Test Item\n > Summary Line 1\n > Summary Line 2\n"
(serialize' defaultReader listWithMultiLineSummaryItem))
]
, testGroup
"Alternative Format"
[ testCase
"Standard list"
(assertEqual
"Markdown formatted output"
"## Test\n\n### Test Item\n"
(serialize' alternativeReader listWithItem))
, testCase
"Standard list with sub-task"
(assertEqual
"Markdown formatted output"
"## Test\n\n### Test Item\n- [ ] Blah\n"
(serialize' alternativeReader (makeSubTask "Blah" False)))
, testCase
"Standard list with date - timezone"
(assertEqual
"Uses local timezone"
"## Test\n\n### Test Item\n@ 2018-04-12 08:00 EDT\n"
(serialize'
(MarkdownInfo (tzByLabel America__New_York) alternativeConfig)
listWithDueTimeItem))
]
]
, testCase
"Parse then serialize"
(assertEqual
"Returns same text"
(Right file)
(serialize' defaultReader <$> parse defaultConfig file))
]