packages feed

pretty-relative-time-0.0.0.0: test/Text/Time/PrettySpec.hs

{-# 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"