[commit: packages/time] format-widths, master, tasty: add clockResolution (d7969bd)

git at git.haskell.org git at git.haskell.org
Mon Feb 20 21:19:32 UTC 2017


Repository : ssh://git@git.haskell.org/time

On branches: format-widths,master,tasty
Link       : http://git.haskell.org/packages/time.git/commitdiff/d7969bd44e2947f7d1ef8e6db0c0ae35436580f4

>---------------------------------------------------------------

commit d7969bd44e2947f7d1ef8e6db0c0ae35436580f4
Author: Ashley Yakeley <ashley at yakeley.org>
Date:   Wed Dec 14 00:10:03 2016 -0800

    add clockResolution


>---------------------------------------------------------------

d7969bd44e2947f7d1ef8e6db0c0ae35436580f4
 lib/Data/Time/Clock.hs         |  4 +++-
 lib/Data/Time/Clock/GetTime.hs | 13 ++++++++++++-
 test/Test/Resolution.hs        | 29 +++++++++++++++++++++++++++++
 test/Test/TestUtil.hs          |  7 +++++--
 test/Test/Tests.hs             |  2 ++
 time.cabal                     |  1 +
 6 files changed, 52 insertions(+), 4 deletions(-)

diff --git a/lib/Data/Time/Clock.hs b/lib/Data/Time/Clock.hs
index b03e272..7b38c5a 100644
--- a/lib/Data/Time/Clock.hs
+++ b/lib/Data/Time/Clock.hs
@@ -4,10 +4,12 @@ module Data.Time.Clock
     module Data.Time.Clock.Scale,
     module Data.Time.Clock.UTC,
     module Data.Time.Clock.UTCDiff,
-    getCurrentTime
+    getCurrentTime,
+    clockResolution
 ) where
 
 import Data.Time.Clock.Scale
+import Data.Time.Clock.GetTime
 import Data.Time.Clock.UTCDiff
 import Data.Time.Clock.UTC
 import Data.Time.Clock.POSIX
diff --git a/lib/Data/Time/Clock/GetTime.hs b/lib/Data/Time/Clock/GetTime.hs
index 0d453eb..6cb50af 100644
--- a/lib/Data/Time/Clock/GetTime.hs
+++ b/lib/Data/Time/Clock/GetTime.hs
@@ -1,8 +1,10 @@
+{-# LANGUAGE Trustworthy #-}
 module Data.Time.Clock.GetTime where
 
 import Data.Int (Int64)
 import Data.Word
 import Control.DeepSeq
+import Data.Time.Clock.Scale
 
 #include "HsTimeConfig.h"
 
@@ -44,7 +46,9 @@ instance Real POSIXTime where
     toRational (POSIXTime xs xn) = toRational xs + (toRational xn) / 1000000000
 
 instance Fractional POSIXTime where
-    fromRational r = makePOSIXTime 0 $ floor $ r * 1000000000
+    fromRational r = let
+        (s,ns) = divMod (floor $ r * 1000000000)  1000000000
+        in POSIXTime (fromInteger s) (fromInteger ns)
     recip = error "undefined POSIXTime function"
     (/) = error "undefined POSIXTime function"
 #endif
@@ -52,7 +56,10 @@ instance Fractional POSIXTime where
 instance NFData POSIXTime where
     rnf a = a `seq` ()
 
+
 getPOSIXTime :: IO POSIXTime
+clockResolution :: DiffTime
+
 #ifdef mingw32_HOST_OS
 -- On Windows, the equlvalent of POSIX time is "file time", defined as
 -- the number of 100-nanosecond intervals that have elapsed since
@@ -66,6 +73,7 @@ getPOSIXTime = do
   where
     win32_epoch_adjust :: Word64
     win32_epoch_adjust = 116444736000000000
+clockResolution = 1E-6 -- microsecond
 
 #elif HAVE_CLOCK_GETTIME
 -- Use hi-res clock_gettime
@@ -73,11 +81,14 @@ getPOSIXTime = do
 getPOSIXTime = do
     MkCTimespec (CTime s) (CLong ns) <- clockGetTime clock_REALTIME
     return (POSIXTime (fromIntegral s) (fromIntegral ns))
+clockResolution = case realtimeRes of
+    MkCTimespec (CTime s) ns -> (fromIntegral s) + (fromIntegral ns) * 1E-9
 
 #else
 -- Use gettimeofday
 getPOSIXTime = do
     MkCTimeval (CLong s) (CLong us) <- getCTimeval
     return (POSIXTime (fromIntegral s) (fromIntegral us * 1000))
+clockResolution = 1E-6 -- microsecond
 
 #endif
diff --git a/test/Test/Resolution.hs b/test/Test/Resolution.hs
new file mode 100644
index 0000000..579e14f
--- /dev/null
+++ b/test/Test/Resolution.hs
@@ -0,0 +1,29 @@
+module Test.Resolution(testResolution) where
+
+import Data.Fixed
+import Data.Time.Clock
+import Test.TestUtil
+
+repeatN :: Monad m => Int -> m a -> m [a]
+repeatN 0 _ = return []
+repeatN n ma = do
+    a <- ma
+    aa <- repeatN (n - 1) ma
+    return $ a:aa
+
+gcd' :: Real a => a -> a -> a
+gcd' a 0 = a
+gcd' a b = gcd' b (mod' a b)
+
+gcdAll :: Real a => [a] -> a
+gcdAll = foldr gcd' 0
+
+testClockResolution = ioTest "getCurrentTime" $ do
+    times <- repeatN 100 getCurrentTime
+    return $ assertionResult $ assertEqual "resolution" clockResolution $ gcdAll (fmap utctDayTime times)
+
+testResolution :: Test
+testResolution = testGroup "resolution"
+    [
+    testClockResolution
+    ]
diff --git a/test/Test/TestUtil.hs b/test/Test/TestUtil.hs
index cef8763..6b31273 100644
--- a/test/Test/TestUtil.hs
+++ b/test/Test/TestUtil.hs
@@ -43,9 +43,12 @@ diff expected found = Fail ("expected " ++ (show expected) ++ " but found " ++ (
 type TestTree = Test
 type Assertion = Either String ()
 
+assertionResult :: Assertion -> Result
+assertionResult (Right ()) = Pass
+assertionResult (Left s) = Fail s
+
 testCase :: String -> Assertion -> Test
-testCase name (Right ()) = pureTest name Pass
-testCase name (Left s) = pureTest name (Fail s)
+testCase name ass = pureTest name $ assertionResult ass
 
 assertFailure :: String -> Either String a
 assertFailure = Left
diff --git a/test/Test/Tests.hs b/test/Test/Tests.hs
index d241204..d971887 100644
--- a/test/Test/Tests.hs
+++ b/test/Test/Tests.hs
@@ -6,6 +6,7 @@ import Test.AddDays
 import Test.ClipDates
 import Test.ConvertBack
 import Test.LongWeekYears
+import Test.Resolution
 import Test.TestCalendars
 import Test.TestEaster
 import Test.TestFormat
@@ -21,6 +22,7 @@ tests = [ addDaysTest
         , clipDates
         , convertBack
         , longWeekYears
+        , testResolution
         , testCalendars
         , testEaster
         , testFormat
diff --git a/time.cabal b/time.cabal
index e2dfa2c..84f60ed 100644
--- a/time.cabal
+++ b/time.cabal
@@ -144,6 +144,7 @@ test-suite tests
         Test.TestTAI
         Test.TestTimeZone
         Test.TestValid
+        Test.Resolution
         Test.LongWeekYears
         Test.LongWeekYearsRef
         Test.ConvertBack



More information about the ghc-commits mailing list