{-# LANGUAGE TypeApplications #-} {-# OPTIONS_GHC -fno-warn-orphans #-} module Text.Time.PrettySpec ( spec ) where import Data.GenValidity.Time () import Test.Hspec import Test.QuickCheck import Test.Validity import Text.Time.Pretty instance GenUnchecked TimeAgo instance GenValid TimeAgo where genValid = do sign <- genValid case sign of EQ -> pure $ TimeAgo EQ 0 0 0 0 0 _ -> (TimeAgo sign <$> choose (0, picoSecondsPerSecond) <*> choose (0, secondsPerMinute) <*> choose (0, minutesPerHour) <*> choose (0, hoursPerDay) <*> (abs <$> genValid)) `suchThat` isValid spec :: Spec spec = do eqSpec @TimeAgo genValidSpec @TimeAgo describe "timeAgo" $ do it "produces valid TimeAgo's" $ producesValidsOnValids timeAgo it "is the inverse of timeAgoToDiffTime" $ inverseFunctionsOnValid timeAgo timeAgoToDiffTime describe "timeAgoToDiffTime" $ do it "produces valid DiffTime's" $ producesValidsOnValids timeAgo it "is the inverse of timeAgo for just picoseconds" $ inverseFunctionsOnGen timeAgoToDiffTime timeAgo ((TimeAgo GT 0 0 0 0 <$> genValid) `suchThat` isValid) (const []) it "is the inverse of timeAgo" $ inverseFunctionsOnValid timeAgoToDiffTime timeAgo describe "renderTimeAgoAuto" $ do it "produces valid Strings's" $ producesValidsOnValids renderTimeAgoAuto it "renders these simple examples well" $ do renderTimeAgoAuto (TimeAgo GT 5 0 0 0 0) `shouldBe` "5 days ago" renderTimeAgoAuto (TimeAgo GT 0 6 0 0 0) `shouldBe` "6 hours ago" renderTimeAgoAuto (TimeAgo GT 0 0 7 0 0) `shouldBe` "7 minutes ago" renderTimeAgoAuto (TimeAgo GT 0 0 0 8 0) `shouldBe` "8 seconds ago" renderTimeAgoAuto (TimeAgo GT 0 0 0 0 9) `shouldBe` "just now" renderTimeAgoAuto (TimeAgo EQ 0 0 0 0 0) `shouldBe` "just now" renderTimeAgoAuto (TimeAgo LT 5 0 0 0 0) `shouldBe` "in 5 days" renderTimeAgoAuto (TimeAgo LT 0 6 0 0 0) `shouldBe` "in 6 hours" renderTimeAgoAuto (TimeAgo LT 0 0 7 0 0) `shouldBe` "in 7 minutes" renderTimeAgoAuto (TimeAgo LT 0 0 0 8 0) `shouldBe` "in 8 seconds" renderTimeAgoAuto (TimeAgo LT 0 0 0 0 9) `shouldBe` "just now" it "handles singular nouns well" $ do renderTimeAgoAuto (TimeAgo GT 1 0 0 0 0) `shouldBe` "1 day ago" renderTimeAgoAuto (TimeAgo GT 0 1 0 0 0) `shouldBe` "1 hour ago" renderTimeAgoAuto (TimeAgo GT 0 0 1 0 0) `shouldBe` "1 minute ago" renderTimeAgoAuto (TimeAgo GT 0 0 0 1 0) `shouldBe` "1 second ago" renderTimeAgoAuto (TimeAgo GT 0 0 0 0 1) `shouldBe` "just now" renderTimeAgoAuto (TimeAgo EQ 0 0 0 0 0) `shouldBe` "just now" renderTimeAgoAuto (TimeAgo LT 1 0 0 0 0) `shouldBe` "in 1 day" renderTimeAgoAuto (TimeAgo LT 0 1 0 0 0) `shouldBe` "in 1 hour" renderTimeAgoAuto (TimeAgo LT 0 0 1 0 0) `shouldBe` "in 1 minute" renderTimeAgoAuto (TimeAgo LT 0 0 0 1 0) `shouldBe` "in 1 second" renderTimeAgoAuto (TimeAgo LT 0 0 0 0 1) `shouldBe` "just now"