{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE RankNTypes #-} module Timestamps where import Control.Applicative ((<*)) import Data.Attoparsec.Text (endOfLine) import Data.HashMap.Strict import Data.Monoid ((<>)) import Data.Maybe (isNothing) import Data.OrgMode.Parse import qualified Data.Text as T import Test.Tasty import Test.Tasty.HUnit import Weekdays (weekdays) import Data.OrgMode.Types import Util parserPlanningTests :: TestTree parserPlanningTests = testGroup "Attoparsec Planning" [ testCase "Parse Planning Schedule" $ testPlanning "SCHEDULED: <2004-02-29 Sun>" , testCase "Parse Planning Deadline" $ testPlanning "DEADLINE: <2004-02-29 Sun>" , testCase "Parse Planning Full" $ testPlanning "SCHEDULED: <2004-02-29 Sun +1w>" , testCase "Parse Sample Schedule" $ testPlanningS sExampleStrA sExampleResA ] where testPlanning = testParser parsePlannings testPlanningS t r = expectParse parsePlannings t (Right r) (sExampleStrA, sExampleResA) = ("SCHEDULED: <2004-02-29 Sun 10:20 +1w -2d>" ,fromList [(SCHEDULED, Timestamp (DateTime (YearMonthDay 2004 2 29) (Just "Sun") (Just (10,20)) (Just (Repeater RepeatCumulate 1 UnitWeek)) (Just (Delay DelayAll 2 UnitDay)) ) Active Nothing)]) parserTimestampTests :: TestTree parserTimestampTests = testGroup "Attoparsec Timestamp" [ testCase "Parse Timestamp Appointment" $ testTimestamp "<2004-02-29 Sun>\n" , testCase "Parse Timestamp Recurring" $ testTimestamp "<2004-02-29 Sun +1w>\n" ] where testTimestamp = testParser (parseTimestamp <* endOfLine) parserWeekdayTests :: TestTree parserWeekdayTests = testGroup "Attoparsec Weekday" [testCase ("Parse Weekday in " ++ loc) $ mkTest w | (loc,ws) <- weekdays, w <- ws, isOrgParsable w] where dayChars = "]+0123456789>\r\n -" :: String isOrgParsable w = isNothing (T.find (`elem` dayChars) w) mkTest w = expectParse parseTimestamp str (Right res) where str = "<2004-02-29 " <> w <> " 10:20>" res = Timestamp (DateTime (YearMonthDay 2004 2 29) (Just w) (Just (10,20)) Nothing Nothing) Active Nothing