{-# LANGUAGE OverloadedStrings #-}
module Document where
import Data.Attoparsec.Text
import Data.Text
import qualified Data.Text as Text
import qualified Data.Text.IO as TextIO
import Test.Tasty
import Test.Tasty.HUnit
import Data.HashMap.Strict
import Data.OrgMode.Parse.Attoparsec.Document
import Data.OrgMode.Parse.Attoparsec.Time
import Data.OrgMode.Types
import Util
parserSmallDocumentTests :: TestTree
parserSmallDocumentTests = testGroup "Attoparsec Small Document"
[ testCase "Parse Empty Document" $
testDocS "" (Document "" [])
, testCase "Parse No Headline" $
testDocS pText (Document pText [])
, testCase "Parse Headline Sample A" $
testDocS sampleAText sampleAParse
, testCase "Parse Headline with Planning" $
testDocS samplePText samplePParse
, testCase "Parse Headline no \n" $
testDocS "* T" (Document "" [emptyHeadline {title="T"}])
, testCase "Parse Document from File" $
testDocFile
, testCase "Parse Document with Subtree List Items" $
testSubtreeListItemDocFile
]
where
testDocS s r = expectParse (parseDocument kw) s (Right r)
testDocFile = do
doc <- TextIO.readFile "test/test-document.org"
let testDoc = parseOnly (parseDocument kw) doc
assertBool "Expected to parse document" (parseSucceeded testDoc)
testSubtreeListItemDocFile = do
doc <- TextIO.readFile "test/subtree-list-items.org"
let subtreeListItemsDoc = parseOnly (parseDocument []) doc
assertBool "Expected to parse document" (subtreeListItemsDoc == goldenSubtreeListItemDoc)
kw = ["TODO", "CANCELED", "DONE"]
pText = "Paragraph text\n.No headline here.\n##--------\n"
parseSucceeded (Right _) = True
parseSucceeded (Left _ ) = False
sampleAText :: Text
sampleAText = Text.concat [sampleParagraph,"* Test1", spaces 20,":Hi there:\n"
,"*\n"
," *\n"
,"* Test2 :Two:Tags:\n"
]
sampleAParse :: Document
sampleAParse = Document
sampleParagraph
[emptyHeadline {title="Test1", tags=["Hi there"]}
,emptyHeadline {section=emptySection{sectionParagraph=" *\n"}}
,emptyHeadline {title="Test2", tags=["Two","Tags"]}
]
samplePText :: Text
samplePText = Text.concat ["* Test3\n"
," SCHEDULED: <2015-06-12 Fri>"
]
samplePParse :: Document
samplePParse = Document
""
[emptyHeadline {title="Test3",section=emptySection{sectionPlannings=plns}}
]
where
plns :: Plannings
plns = Plns con
Right con = parseOnly parsePlannings "SCHEDULED: <2015-06-12 Fri>"
emptyHeadline :: Headline
emptyHeadline =
Headline
{ depth = 1
, stateKeyword = Nothing
, priority = Nothing
, title = ""
, stats = Nothing
, timestamp = Nothing
, tags = []
, section = emptySection
, subHeadlines = []
}
sampleParagraph :: Text
sampleParagraph = "This is some sample text in a paragraph which may contain * , : , and other special characters.\n\n"
spaces :: Int -> Text
spaces = flip Text.replicate " "
emptySection :: Section
emptySection = Section Nothing (Plns mempty) mempty mempty mempty mempty mempty
goldenSubtreeListItemDoc :: Either String Document
goldenSubtreeListItemDoc = Right (Document {documentText = "", documentHeadlines = [Headline {depth = Depth 1, stateKeyword = Nothing, priority = Nothing, title = "Header1", timestamp = Nothing, stats = Nothing, tags = [], section = Section {sectionTimestamp = Nothing, sectionPlannings = Plns (fromList []), sectionClocks = [], sectionProperties = Properties {unProperties = fromList []}, sectionLogbook = Logbook {unLogbook = []}, sectionDrawers = [], sectionParagraph = ""}, subHeadlines = [Headline {depth = Depth 2, stateKeyword = Nothing, priority = Nothing, title = "Header2", timestamp = Nothing, stats = Nothing, tags = [], section = Section {sectionTimestamp = Nothing, sectionPlannings = Plns (fromList []), sectionClocks = [], sectionProperties = Properties {unProperties = fromList []}, sectionLogbook = Logbook {unLogbook = []}, sectionDrawers = [], sectionParagraph = ""}, subHeadlines = [Headline {depth = Depth 3, stateKeyword = Nothing, priority = Nothing, title = "Header3", timestamp = Nothing, stats = Nothing, tags = [], section = Section {sectionTimestamp = Nothing, sectionPlannings = Plns (fromList []), sectionClocks = [], sectionProperties = Properties {unProperties = fromList [("ONE","two")]}, sectionLogbook = Logbook {unLogbook = []}, sectionDrawers = [], sectionParagraph = "\n * Item1\n * Item2\n"}, subHeadlines = []}]},Headline {depth = Depth 2, stateKeyword = Nothing, priority = Nothing, title = "Header4", timestamp = Nothing, stats = Nothing, tags = [], section = Section {sectionTimestamp = Nothing, sectionPlannings = Plns (fromList []), sectionClocks = [], sectionProperties = Properties {unProperties = fromList []}, sectionLogbook = Logbook {unLogbook = []}, sectionDrawers = [], sectionParagraph = ""}, subHeadlines = []}]}]})