on master help sign in
add instances/tests for TimeOfDay, make test for LocalTime actually arbitrary
commit67214ddc33b36f47673de5b17e3e7da3b6ec33ec authorBen Weitzman <benjamin.weitzman@tufts.edu> dateWed 7 Oct 2015, 00:46 (11 years ago) parent0b98185
3 files changed+21−5
Data/Aeson/Types/Instances.hs+8−1 tests/Instances.hs+11−3 tests/Properties.hs+2−1
Data/Aeson/Types/Instances.hs+8−1
@@ -72,7 +72,7 @@ import Data.Monoid (Dual(..), First(..), Last(..))
7272import Data.Ratio (Ratio, (%), numerator, denominator)
7373import Data.Scientific (Scientific)
7474import Data.Text (Text, pack, unpack)
75−import Data.Time (Day, LocalTime, NominalDiffTime, UTCTime, ZonedTime)
75+import Data.Time (Day, LocalTime, NominalDiffTime, UTCTime, ZonedTime, TimeOfDay)
7676import Data.Time.Format (FormatTime, formatTime, parseTime)
7777import Data.Traversable as Tr (sequence, traverse)
7878import Data.Vector (Vector)
@@ -718,6 +718,13 @@ instance ToJSON Day where
718718instance FromJSON Day where
719719 parseJSON = withText "Day" (Time.run Time.day)
720720
721+instance ToJSON TimeOfDay where
722+ toJSON = stringEncoding
723+ toEncoding z = Encoding (E.quote $ E.timeOfDay z)
724+
725+instance FromJSON TimeOfDay where
726+ parseJSON = withText "TimeOfDay" (Time.run Time.timeOfDay)
727+
721728instance ToJSON LocalTime where
722729 toJSON = stringEncoding
723730 toEncoding z = Encoding (E.quote $ E.localTime z)
tests/Instances.hs+11−3
@@ -6,15 +6,16 @@ module Instances where
66import Types
77import Data.Function (on)
88import Control.Monad
9−import Test.QuickCheck (Arbitrary(..), Gen, choose, oneof, elements)
9+import Test.QuickCheck (Arbitrary(..), Gen, choose, oneof, elements, Positive(..))
1010import Data.Time.Clock (DiffTime, UTCTime(..), picosecondsToDiffTime)
1111import Data.Fixed (Pico)
1212import Data.Time (ZonedTime(..), LocalTime(..), TimeZone(..),
1313 hoursToTimeZone, Day(..), TimeOfDay(..),
14− NominalDiffTime)
14+ NominalDiffTime, makeTimeOfDayValid)
1515import qualified Data.Text as T
1616import qualified Data.Map as Map
1717import Data.Text (Text)
18+import Data.Maybe
1819import Data.Aeson.Types
1920import Control.Applicative
2021import Functions
@@ -27,8 +28,15 @@ instance Arbitrary Text where
2728instance (Ord k, Arbitrary k, Arbitrary v) => Arbitrary (Map.Map k v) where
2829 arbitrary = Map.fromList <$> arbitrary
2930
31+instance Arbitrary TimeOfDay where
32+ arbitrary = do
33+ Positive h <- arbitrary
34+ Positive m <- arbitrary
35+ Positive s <- arbitrary
36+ return $ fromMaybe (TimeOfDay 0 0 0 ) (makeTimeOfDayValid h m s)
37+
3038instance Arbitrary LocalTime where
31− arbitrary = return $ LocalTime (ModifiedJulianDay 1) (TimeOfDay 1 2 3)
39+ arbitrary = LocalTime <$> arbitrary <*> arbitrary
3240
3341instance Arbitrary TimeZone where
3442 arbitrary = do
tests/Properties.hs+2−1
@@ -9,7 +9,7 @@ import Data.Aeson.Parser (value)
99import Data.Aeson.Types
1010import Data.ByteString.Builder (toLazyByteString)
1111import Data.Int (Int8)
12−import Data.Time (Day, LocalTime, NominalDiffTime, UTCTime, ZonedTime)
12+import Data.Time (Day, LocalTime, NominalDiffTime, UTCTime, ZonedTime, TimeOfDay)
1313import Encoders
1414import Instances ()
1515import Test.Framework (Test, testGroup)
@@ -129,6 +129,7 @@ tests = testGroup "properties" [
129129 , testProperty "Day" $ roundTripEq (undefined :: Day)
130130 , testProperty "DotNetTime" $ roundTripEq (undefined :: DotNetTime)
131131 , testProperty "LocalTime" $ roundTripEq (undefined :: LocalTime)
132+ , testProperty "TimeOfDay" $ roundTripEq (undefined :: TimeOfDay)
132133 , testProperty "UTCTime" $ roundTripEq (undefined :: UTCTime)
133134 , testProperty "ZonedTime" $ roundTripEq (undefined :: ZonedTime)
134135 , testProperty "NominalDiffTime" $ roundTripEq (undefined :: NominalDiffTime)