{-# 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.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 ] where testDocS s r = expectParse (parseDocument kw) s (Right r) testDocFile = do doc <- TextIO.readFile "test/test-document.org" assertBool "Expected to parse document" . parseSucceeded $ parseOnly (parseDocument kw) doc 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