@@ -101,6 +101,9 @@ import qualified Language.LSP.Types as LSP
101
101
import Data.IORef.Extra (atomicModifyIORef_ )
102
102
import qualified Development.IDE.Plugin.HLS.GhcIde as Ghcide
103
103
import Text.Regex.TDFA ((=~) )
104
+ import Development.IDE.Core.FileStore (getModTime )
105
+ import Control.Concurrent (threadDelay )
106
+ import Text.Printf (printf )
104
107
105
108
waitForProgressBegin :: Session ()
106
109
waitForProgressBegin = skipManyTill anyMessage $ satisfyMaybe $ \ case
@@ -5464,8 +5467,23 @@ unitTests = do
5464
5467
actualOrder <- liftIO $ readIORef orderRef
5465
5468
5466
5469
liftIO $ actualOrder @?= reverse [(1 :: Int ).. 20 ]
5470
+ , testCase " timestamps have millisecond resolution" $ do
5471
+ resolution_us <- findResolution_us 1
5472
+ let msg = printf " Timestamps do not have millisecond resolution: %dus" resolution_us
5473
+ assertBool msg (resolution_us <= 1000 )
5467
5474
]
5468
5475
5476
+ findResolution_us :: Int -> IO Int
5477
+ findResolution_us delay_us | delay_us >= 1000000 = error " Unable to compute timestamp resolution"
5478
+ findResolution_us delay_us = withTempFile $ \ f -> withTempFile $ \ f' -> do
5479
+ writeFile f " "
5480
+ threadDelay delay_us
5481
+ writeFile f' " "
5482
+ t <- getModTime f
5483
+ t' <- getModTime f'
5484
+ if t /= t' then return delay_us else findResolution_us (delay_us * 10 )
5485
+
5486
+
5469
5487
testIde :: IDE. Arguments -> Session () -> IO ()
5470
5488
testIde arguments session = do
5471
5489
config <- getConfigFromEnv
0 commit comments