on master help sign in
Factor out duplicate code to common function
d21c0b7Ranjeet Ranjan
src/Streamly/Internal/FileSystem/Event/Linux.hs+1
@@ -175,6 +175,7 @@ import Streamly.Internal.Data.Array.Storable.Foreign.Types (Array(..))
175import System.IO (Handle, hClose, IOMode(ReadMode))
175import System.IO (Handle, hClose, IOMode(ReadMode))
176#if !MIN_VERSION_base(4,10,0)
176#if !MIN_VERSION_base(4,10,0)
177import Control.Concurrent.MVar (readMVar)
177import Control.Concurrent.MVar (readMVar)
178+import Data.Semigroup (<>)
178import Data.Typeable (cast)
179import Data.Typeable (cast)
179import GHC.IO.Exception (IOException(..), IOErrorType(..), ioException)
180import GHC.IO.Exception (IOException(..), IOErrorType(..), ioException)
180import GHC.IO.FD (FD)
181import GHC.IO.FD (FD)
test/Streamly/Test/FileSystem/Event.hs+109−221
@@ -165,7 +165,8 @@ renameFileNestedDirEvents =
165
165
166-- | Convert an 'Event' record to a short representation for unit test.
166-- | Convert an 'Event' record to a short representation for unit test.
167showEventShort :: Event.Event -> String
167showEventShort :: Event.Event -> String
168+showEventShort ev@Event.Event{..} =
168−showEventShort ev@Event.Event{..} = Event.getRelPath ev ++ "_" ++ show eventFlags
169+ Event.getRelPath ev ++ "_" ++ show eventFlags
169
170
170#else
171#else
171
172
@@ -297,127 +298,99 @@ checkEvents rootPath m matchList = do
297-------------------------------------------------------------------------------
298-------------------------------------------------------------------------------
298-- FS Event Generators
299-- FS Event Generators
299-------------------------------------------------------------------------------
300-------------------------------------------------------------------------------
301+fsOpsPreTask :: FilePath -> MVar () -> String -> IO ()
302+fsOpsPreTask fp m msg = do
303+ takeMVar m
304+ putStrLn (msg ++ fp)
305+ threadDelay 200000
306+
307+fsOpsPostTask :: FilePath -> IO ()
308+fsOpsPostTask fp =
309+ threadDelay 200000 >> createDirectoryIfMissing True (fp </> "EOTask")
300
310
301-- XXX Factor out common code from all these functions. The specific operation
311-- XXX Factor out common code from all these functions. The specific operation
302-- can be passed to a common function.
312-- can be passed to a common function.
303
313
304fsOpsCreateSingleDir :: FilePath -> MVar () -> IO ()
314fsOpsCreateSingleDir :: FilePath -> MVar () -> IO ()
305fsOpsCreateSingleDir fp m = do
315fsOpsCreateSingleDir fp m = do
306− takeMVar m
307− putStrLn ("Create Single Directory !!!!!!! on " ++ fp)
316+ fsOpsPreTask fp m "Create a Single Dir on : "
308− threadDelay 200000
309 >> createDirectoryIfMissing True (fp </> "dir1Single")
317 >> createDirectoryIfMissing True (fp </> "dir1Single")
310− >> threadDelay 200000
318+ >> fsOpsPostTask fp
311− >> createDirectoryIfMissing True (fp </> "EOTask")
312
319
313fsOpsRemoveSingleDir :: FilePath -> MVar () -> IO ()
320fsOpsRemoveSingleDir :: FilePath -> MVar () -> IO ()
314fsOpsRemoveSingleDir fp m = do
321fsOpsRemoveSingleDir fp m = do
315− takeMVar m
316− putStrLn ("Remove Single Directory !!!!!!! on " ++ fp)
322+ fsOpsPreTask fp m "Remove Single Directory on : "
317− threadDelay 200000
318 >> removeDirectory (fp </> "dir1Single")
323 >> removeDirectory (fp </> "dir1Single")
319− >> threadDelay 200000
324+ >> fsOpsPostTask fp
320− >> createDirectoryIfMissing True (fp </> "EOTask")
321
325
322fsOpsRenameSingleDir :: FilePath -> MVar () -> IO ()
326fsOpsRenameSingleDir :: FilePath -> MVar () -> IO ()
323fsOpsRenameSingleDir fp m = do
327fsOpsRenameSingleDir fp m = do
324− takeMVar m
325− putStrLn ("Rename a Single Directory !!!!!!! on " ++ fp)
328+ fsOpsPreTask fp m "Rename a Single Directory on : "
326− threadDelay 200000
327 >> renameDirectory (fp </> "dir1Single") (fp </> "dir1SingleRenamed")
329 >> renameDirectory (fp </> "dir1Single") (fp </> "dir1SingleRenamed")
328− >> threadDelay 200000
330+ >> fsOpsPostTask fp
329− >> createDirectoryIfMissing True (fp </> "EOTask")
330
331
331fsOpsCreateNestedDir :: FilePath -> MVar () -> IO ()
332fsOpsCreateNestedDir :: FilePath -> MVar () -> IO ()
332fsOpsCreateNestedDir fp m = do
333fsOpsCreateNestedDir fp m = do
333− takeMVar m
334− putStrLn ("Create Nested Directory !!!!!!!!!!!!! on " ++ fp)
334+ fsOpsPreTask fp m "Create Nested Directory on : "
335− threadDelay 200000
336 >> createDirectoryIfMissing True (fp </> "dir1" </> "dir2" </> "dir3")
335 >> createDirectoryIfMissing True (fp </> "dir1" </> "dir2" </> "dir3")
337− >> threadDelay 200000
336+ >> fsOpsPostTask fp
338− >> createDirectoryIfMissing True (fp </> "EOTask")
339
337
340fsOpsRemoveNestedDir :: FilePath -> MVar () -> IO ()
338fsOpsRemoveNestedDir :: FilePath -> MVar () -> IO ()
341fsOpsRemoveNestedDir fp m = do
339fsOpsRemoveNestedDir fp m = do
342− takeMVar m
343− putStrLn ("Remove Nested Directory !!!!!!!!!!!!! on " ++ fp)
340+ fsOpsPreTask fp m "Remove Nested Directory on : "
344− threadDelay 200000
345 >> removePathForcibly (fp </> "dir1")
341 >> removePathForcibly (fp </> "dir1")
346− >> threadDelay 200000
342+ >> fsOpsPostTask fp
347− >> createDirectoryIfMissing True (fp </> "EOTask")
348
343
349fsOpsRenameNestedDir :: FilePath -> MVar () -> IO ()
344fsOpsRenameNestedDir :: FilePath -> MVar () -> IO ()
350fsOpsRenameNestedDir fp m = do
345fsOpsRenameNestedDir fp m = do
351− takeMVar m
352− putStrLn ("Rename Nested Directory !!!!!!!!!!!!! on " ++ fp)
346+ fsOpsPreTask fp m "Rename Nested Directory on : "
353− threadDelay 200000
354 >> renameDirectory
347 >> renameDirectory
355 (fp </> "dir1" </> "dir2" </> "dir3")
348 (fp </> "dir1" </> "dir2" </> "dir3")
356 (fp </> "dir1" </> "dir2" </> "dir3Renamed")
349 (fp </> "dir1" </> "dir2" </> "dir3Renamed")
357− >> threadDelay 200000
350+ >> fsOpsPostTask fp
358− >> createDirectoryIfMissing True (fp </> "EOTask")
359
351
360fsOpsCreateFileInRootDir :: FilePath -> MVar () -> IO ()
352fsOpsCreateFileInRootDir :: FilePath -> MVar () -> IO ()
361fsOpsCreateFileInRootDir fp m = do
353fsOpsCreateFileInRootDir fp m = do
362− takeMVar m
354+ fsOpsPreTask fp m "Create a File on : "
363− let tpath = (fp </> "FileCreated.txt")
364− putStrLn ("create a File on " ++ fp)
365− threadDelay 200000
366− >> writeFile tpath "Test Data"
355+ >> writeFile (fp </> "FileCreated.txt") "Test Data"
367− >> threadDelay 200000
356+ >> fsOpsPostTask fp
368− >> createDirectoryIfMissing True (fp </> "EOTask")
369
357
370fsOpsRemoveFileInRootDir :: FilePath -> MVar () -> IO ()
358fsOpsRemoveFileInRootDir :: FilePath -> MVar () -> IO ()
371fsOpsRemoveFileInRootDir fp m = do
359fsOpsRemoveFileInRootDir fp m = do
372− takeMVar m
373 let tpath = (fp </> "FileCreated.txt")
360 let tpath = (fp </> "FileCreated.txt")
374− putStrLn ("Remove a File on " ++ fp)
361+ fsOpsPreTask fp m "Remove a File on : "
375− threadDelay 200000
376 >> removeFile tpath
362 >> removeFile tpath
377− >> threadDelay 200000
363+ >> fsOpsPostTask fp
378− >> createDirectoryIfMissing True (fp </> "EOTask")
379
364
380fsOpsRenameFileInRootDir :: FilePath -> MVar () -> IO ()
365fsOpsRenameFileInRootDir :: FilePath -> MVar () -> IO ()
381fsOpsRenameFileInRootDir fp m = do
366fsOpsRenameFileInRootDir fp m = do
382− takeMVar m
383 let spath = (fp </> "FileCreated.txt")
367 let spath = (fp </> "FileCreated.txt")
384 tpath = (fp </> "FileRenamed.txt")
368 tpath = (fp </> "FileRenamed.txt")
385− putStrLn ("Rename a File on " ++ fp)
369+ fsOpsPreTask fp m "Rename a File on : "
386− threadDelay 200000
387 >> renamePath spath tpath
370 >> renamePath spath tpath
388− >> threadDelay 200000
371+ >> fsOpsPostTask fp
389− >> createDirectoryIfMissing True (fp </> "EOTask")
390
372
391fsOpsCreateFileInNestedDir :: FilePath -> MVar () -> IO ()
373fsOpsCreateFileInNestedDir :: FilePath -> MVar () -> IO ()
392fsOpsCreateFileInNestedDir fp m = do
374fsOpsCreateFileInNestedDir fp m = do
393− takeMVar m
394 let tpath = (fp </> "dir1" </> "dir2" </> "dir3" </> "FileCreated.txt")
375 let tpath = (fp </> "dir1" </> "dir2" </> "dir3" </> "FileCreated.txt")
395− putStrLn ("create a File on nested dir " ++ fp)
376+ fsOpsPreTask fp m "create a File in nested dir on : "
396− threadDelay 200000
397 >> writeFile tpath "Test Data"
377 >> writeFile tpath "Test Data"
398− >> threadDelay 200000
378+ >> fsOpsPostTask fp
399− >> createDirectoryIfMissing True (fp </> "EOTask")
400
379
401fsOpsRemoveFileInNestedDir :: FilePath -> MVar () -> IO ()
380fsOpsRemoveFileInNestedDir :: FilePath -> MVar () -> IO ()
402fsOpsRemoveFileInNestedDir fp m = do
381fsOpsRemoveFileInNestedDir fp m = do
403− takeMVar m
404 let tpath = (fp </> "dir1" </> "dir2" </> "dir3" </> "FileCreated.txt")
382 let tpath = (fp </> "dir1" </> "dir2" </> "dir3" </> "FileCreated.txt")
405− putStrLn ("Remove a File on nested dir " ++ fp)
383+ fsOpsPreTask fp m "Remove a File in nested dir on : "
406− threadDelay 200000
407− >> threadDelay 200000 >> removeFile tpath
384+ >> removeFile tpath
408− >> threadDelay 200000
385+ >> fsOpsPostTask fp
409− >> createDirectoryIfMissing True (fp </> "EOTask")
410
386
411fsOpsRenameFileInNestedDir :: FilePath -> MVar () -> IO ()
387fsOpsRenameFileInNestedDir :: FilePath -> MVar () -> IO ()
412fsOpsRenameFileInNestedDir fp m = do
388fsOpsRenameFileInNestedDir fp m = do
413− takeMVar m
414 let spath = (fp </> "dir1" </> "dir2" </> "dir3" </> "FileCreated.txt")
389 let spath = (fp </> "dir1" </> "dir2" </> "dir3" </> "FileCreated.txt")
415 tpath = (fp </> "dir1" </> "dir2" </> "dir3" </> "FileRenamed.txt")
390 tpath = (fp </> "dir1" </> "dir2" </> "dir3" </> "FileRenamed.txt")
416− putStrLn ("Rename a File on nested dir " ++ fp)
391+ fsOpsPreTask fp m "Rename a File in nested on : "
417− threadDelay 200000
418 >> renamePath spath tpath
392 >> renamePath spath tpath
419− >> threadDelay 200000
393+ >> fsOpsPostTask fp
420− >> createDirectoryIfMissing True (fp </> "EOTask")
421
394
422checker :: S.IsStream t =>
395checker :: S.IsStream t =>
423 FilePath -> MVar () -> [String] -> t IO String
396 FilePath -> MVar () -> [String] -> t IO String
@@ -439,215 +412,118 @@ driverInit = do
439-- XXX Factor out common code from all these. Pass a specific fsops function to
412-- XXX Factor out common code from all these. Pass a specific fsops function to
440-- a common functions.
413-- a common functions.
441
414
415+eventProcessor
416+ :: FilePath
417+ -> MVar ()
418+ -> [String]
419+ -> (FilePath -> MVar () -> IO ())
420+ -> IO String
421+eventProcessor fp sync evts func = do
422+ res <- S.head
423+ $ (checker fp sync evts)
424+ `S.parallelFst`
425+ S.yieldM -- ^ this message should follow checker
426+ (func fp sync
427+ >> threadDelay 10000000
428+ >> return "fOps Done")
429+ return $ fromJust res
430+
442driverCreateSingleDir :: IO String
431driverCreateSingleDir :: IO String
443driverCreateSingleDir = do
432driverCreateSingleDir = do
444 sync <- driverInit
433 sync <- driverInit
445− withSystemTempDirectory fseventDir $ \fp -> do
434+ withSystemTempDirectory fseventDir $ \fp ->
446− res <- S.head
435+ eventProcessor
447− $ (checker fp sync singleDirCreateEvents)
436+ fp sync singleDirCreateEvents fsOpsCreateSingleDir
448− `S.parallelFst`
449− S.yieldM -- ^ this message should follow checker
450− (fsOpsCreateSingleDir fp sync
451− >> threadDelay 10000000
452− >> return "fOps Done")
453− return $ fromJust res
454
437
455driverRemoveSingleDir :: IO String
438driverRemoveSingleDir :: IO String
456driverRemoveSingleDir = do
439driverRemoveSingleDir = do
457 sync <- driverInit
440 sync <- driverInit
458 withSystemTempDirectory fseventDir $ \fp -> do
441 withSystemTempDirectory fseventDir $ \fp -> do
459 createDirectoryIfMissing True (fp </> "dir1Single")
442 createDirectoryIfMissing True (fp </> "dir1Single")
460− res <- S.head
443+ eventProcessor
461− $ (checker fp sync singleDirRemoveEvents)
444+ fp sync singleDirRemoveEvents fsOpsRemoveSingleDir
462− `S.parallelFst`
463− S.yieldM -- ^ this message should follow checker
464− (fsOpsRemoveSingleDir fp sync
465− >> threadDelay 10000000
466− >> return "fOps Done")
467− return $ fromJust res
468
445
469driverRenameSingleDir :: IO String
446driverRenameSingleDir :: IO String
470driverRenameSingleDir = do
447driverRenameSingleDir = do
471 sync <- driverInit
448 sync <- driverInit
472 withSystemTempDirectory fseventDir $ \fp -> do
449 withSystemTempDirectory fseventDir $ \fp -> do
473 createDirectoryIfMissing True (fp </> "dir1Single")
450 createDirectoryIfMissing True (fp </> "dir1Single")
474− res <- S.head
451+ eventProcessor
475− $ (checker fp sync singleDirRenameEvents)
452+ fp sync singleDirRenameEvents fsOpsRenameSingleDir
476− `S.parallelFst`
477− S.yieldM -- ^ this message should follow checker
478− (fsOpsRenameSingleDir fp sync
479− >> threadDelay 10000000
480− >> return "fOps Done")
481− return $ fromJust res
482
453
483driverCreateNestedDir :: IO String
454driverCreateNestedDir :: IO String
484driverCreateNestedDir = do
455driverCreateNestedDir = do
485 sync <- driverInit
456 sync <- driverInit
486− withSystemTempDirectory fseventDir $ \fp -> do
457+ withSystemTempDirectory fseventDir $ \fp ->
487− res <- S.head
458+ eventProcessor
488− $ (checker fp sync nestedDirCreateEvents)
459+ fp sync nestedDirCreateEvents fsOpsCreateNestedDir
489− `S.parallelFst`
490− S.yieldM
491− (fsOpsCreateNestedDir fp sync
492− >> threadDelay 10000000
493− >> return "fOps Done")
494− return $ fromJust res
495
460
496driverRemoveNestedDir :: IO String
461driverRemoveNestedDir :: IO String
497driverRemoveNestedDir = do
462driverRemoveNestedDir = do
498 sync <- driverInit
463 sync <- driverInit
499 withSystemTempDirectory fseventDir $ \fp -> do
464 withSystemTempDirectory fseventDir $ \fp -> do
500 createDirectoryIfMissing True (fp </> "dir1" </> "dir2" </> "dir3")
465 createDirectoryIfMissing True (fp </> "dir1" </> "dir2" </> "dir3")
501− res <- S.head
466+ eventProcessor
502− $ (checker fp sync nestedDirRemoveEvents)
467+ fp sync nestedDirRemoveEvents fsOpsRemoveNestedDir
503− `S.parallelFst`
504− S.yieldM
505− (fsOpsRemoveNestedDir fp sync
506− >> threadDelay 10000000
507− >> return "fOps Done")
508− return $ fromJust res
509
468
510driverRenameNestedDir :: IO String
469driverRenameNestedDir :: IO String
511driverRenameNestedDir = do
470driverRenameNestedDir = do
512 sync <- driverInit
471 sync <- driverInit
513 withSystemTempDirectory fseventDir $ \fp -> do
472 withSystemTempDirectory fseventDir $ \fp -> do
514 createDirectoryIfMissing True (fp </> "dir1" </> "dir2" </> "dir3")
473 createDirectoryIfMissing True (fp </> "dir1" </> "dir2" </> "dir3")
515− res <- S.head
474+ eventProcessor
516− $ (checker fp sync nestedDirRenameEvents)
475+ fp sync nestedDirRenameEvents fsOpsRenameNestedDir
517− `S.parallelFst`
518− S.yieldM
519− (fsOpsRenameNestedDir fp sync
520− >> threadDelay 10000000
521− >> return "fOps Done")
522− return $ fromJust res
523
476
524driverCreateFileInRootDir :: IO String
477driverCreateFileInRootDir :: IO String
525driverCreateFileInRootDir = do
478driverCreateFileInRootDir = do
526 sync <- driverInit
479 sync <- driverInit
527 withSystemTempDirectory fseventDir $ \fp -> do
480 withSystemTempDirectory fseventDir $ \fp -> do
528− res <- S.head
481+ eventProcessor
529− $ (checker fp sync createFileRootDirEvents)
482+ fp sync createFileRootDirEvents fsOpsCreateFileInRootDir
530− `S.parallelFst`
531− S.yieldM
532− (fsOpsCreateFileInRootDir fp sync
533− >> threadDelay 10000000
534− >> return "fOps Done")
535− return $ fromJust res
536
483
537driverRemoveFileInRootDir :: IO String
484driverRemoveFileInRootDir :: IO String
538driverRemoveFileInRootDir = do
485driverRemoveFileInRootDir = do
539 sync <- driverInit
486 sync <- driverInit
540 withSystemTempDirectory fseventDir $ \fp -> do
487 withSystemTempDirectory fseventDir $ \fp -> do
541 writeFile (fp </> "FileCreated.txt") "Test Data"
488 writeFile (fp </> "FileCreated.txt") "Test Data"
542− res <- S.head
489+ eventProcessor
543− $ (checker fp sync removeFileRootDirEvents)
490+ fp sync removeFileRootDirEvents fsOpsRemoveFileInRootDir
544− `S.parallelFst`
545− S.yieldM
546− (fsOpsRemoveFileInRootDir fp sync
547− >> threadDelay 10000000
548− >> return "fOps Done")
549− return $ fromJust res
550
491
551driverRenameFileInRootDir :: IO String
492driverRenameFileInRootDir :: IO String
552driverRenameFileInRootDir = do
493driverRenameFileInRootDir = do
553 sync <- driverInit
494 sync <- driverInit
554 withSystemTempDirectory fseventDir $ \fp -> do
495 withSystemTempDirectory fseventDir $ \fp -> do
555 writeFile (fp </> "FileCreated.txt") "Test Data"
496 writeFile (fp </> "FileCreated.txt") "Test Data"
556− res <- S.head
497+ eventProcessor
557− $ (checker fp sync renameFileRootDirEvents)
498+ fp sync renameFileRootDirEvents fsOpsRenameFileInRootDir
558− `S.parallelFst`
559− S.yieldM
560− (fsOpsRenameFileInRootDir fp sync
561− >> threadDelay 10000000
562− >> return "fOps Done")
563− return $ fromJust res
564
499
565driverCreateFileInNestedDir :: IO String
500driverCreateFileInNestedDir :: IO String
566driverCreateFileInNestedDir = do
501driverCreateFileInNestedDir = do
567 sync <- driverInit
502 sync <- driverInit
568 withSystemTempDirectory fseventDir $ \fp -> do
503 withSystemTempDirectory fseventDir $ \fp -> do
569 createDirectoryIfMissing True (fp </> "dir1" </> "dir2" </> "dir3")
504 createDirectoryIfMissing True (fp </> "dir1" </> "dir2" </> "dir3")
570− res <- S.head
505+ eventProcessor
571− $ (checker fp sync createFileNestedDirEvents)
506+ fp sync createFileNestedDirEvents fsOpsCreateFileInNestedDir
572− `S.parallelFst`
573− S.yieldM
574− (fsOpsCreateFileInNestedDir fp sync
575− >> threadDelay 10000000
576− >> return "fOps Done")
577− return $ fromJust res
578
507
579driverRemoveFileInNestedDir :: IO String
508driverRemoveFileInNestedDir :: IO String
580driverRemoveFileInNestedDir = do
509driverRemoveFileInNestedDir = do
581 sync <- driverInit
510 sync <- driverInit
582 withSystemTempDirectory fseventDir $ \fp -> do
511 withSystemTempDirectory fseventDir $ \fp -> do
512+ let nestedDir = fp </> "dir1" </> "dir2" </> "dir3"
513+ fpath = nestedDir </> "FileCreated.txt"
583− createDirectoryIfMissing True (fp </> "dir1" </> "dir2" </> "dir3")
514+ createDirectoryIfMissing True nestedDir >> writeFile fpath "Test Data"
584− >> writeFile (fp </> "dir1" </> "dir2" </> "dir3" </> "FileCreated.txt") "Test Data"
515+ eventProcessor
585− res <- S.head
586− $ (checker fp sync removeFileNestedDirEvents)
516+ fp sync removeFileNestedDirEvents fsOpsRemoveFileInNestedDir
587− `S.parallelFst`
588− S.yieldM
589− (fsOpsRemoveFileInNestedDir fp sync
590− >> threadDelay 10000000
591− >> return "fOps Done")
592− return $ fromJust res
593
517
594driverRenameFileInNestedDir :: IO String
518driverRenameFileInNestedDir :: IO String
595driverRenameFileInNestedDir = do
519driverRenameFileInNestedDir = do
596 sync <- driverInit
520 sync <- driverInit
597 withSystemTempDirectory fseventDir $ \fp -> do
521 withSystemTempDirectory fseventDir $ \fp -> do
522+ let nestedDir = fp </> "dir1" </> "dir2" </> "dir3"
523+ fpath = nestedDir </> "FileCreated.txt"
598− createDirectoryIfMissing True (fp </> "dir1" </> "dir2" </> "dir3")
524+ createDirectoryIfMissing True nestedDir >> writeFile fpath "Test Data"
599− >> writeFile (fp </> "dir1" </> "dir2" </> "dir3" </> "FileCreated.txt") "Test Data"
525+ eventProcessor
600− res <- S.head
601− $ (checker fp sync renameFileNestedDirEvents)
526+ fp sync renameFileNestedDirEvents fsOpsRenameFileInNestedDir
602− `S.parallelFst`
603− S.yieldM
604− (fsOpsRenameFileInNestedDir fp sync
605− >> threadDelay 10000000
606− >> return "fOps Done")
607− return $ fromJust res
608−
609−-------------------------------------------------------------------------------
610−-- Test Cases
611−-------------------------------------------------------------------------------
612−
613−-- XXX These can either be directly inlined instead of creating a wrapper
614−-- function or the wrapper could be common passing the function being checked.
615−
616−testCreateSingleDir :: Expectation
617−testCreateSingleDir = driverCreateSingleDir `shouldReturn` "PASS"
618−
619−testRemoveSingleDir :: Expectation
620−testRemoveSingleDir = driverRemoveSingleDir `shouldReturn` "PASS"
621−
622−testRenameSingleDir :: Expectation
623−testRenameSingleDir = driverRenameSingleDir `shouldReturn` "PASS"
624−
625−testCreateNestedDir :: Expectation
626−testCreateNestedDir = driverCreateNestedDir `shouldReturn` "PASS"
627−
628−testRemoveNestedDir :: Expectation
629−testRemoveNestedDir = driverRemoveNestedDir `shouldReturn` "PASS"
630−
631−testRenameNestedDir :: Expectation
632−testRenameNestedDir = driverRenameNestedDir `shouldReturn` "PASS"
633−
634−testCreateFileInRootDir :: Expectation
635−testCreateFileInRootDir = driverCreateFileInRootDir `shouldReturn` "PASS"
636−
637−testRemoveFileInRootDir :: Expectation
638−testRemoveFileInRootDir = driverRemoveFileInRootDir `shouldReturn` "PASS"
639−
640−testRenameFileInRootDir :: Expectation
641−testRenameFileInRootDir = driverRenameFileInRootDir `shouldReturn` "PASS"
642−
643−testCreateFileInNestedDir :: Expectation
644−testCreateFileInNestedDir = driverCreateFileInNestedDir `shouldReturn` "PASS"
645−
646−testRemoveFileInNestedDir :: Expectation
647−testRemoveFileInNestedDir = driverRemoveFileInNestedDir `shouldReturn` "PASS"
648−
649−testRenameFileInNestedDir :: Expectation
650−testRenameFileInNestedDir = driverRenameFileInNestedDir `shouldReturn` "PASS"
651
527
652-------------------------------------------------------------------------------
528-------------------------------------------------------------------------------
653-- Main
529-- Main
@@ -655,15 +531,27 @@ testRenameFileInNestedDir = driverRenameFileInNestedDir `shouldReturn` "PASS"
655
531
656main :: IO ()
532main :: IO ()
657main = hspec $ do
533main = hspec $ do
658− prop "Create a single directory" testCreateSingleDir
534+ prop "Create a single directory"
535+ $ driverCreateSingleDir `shouldReturn` "PASS"
659− prop "Remove a single directory" testRemoveSingleDir
536+ prop "Remove a single directory"
537+ $ driverRemoveSingleDir `shouldReturn` "PASS"
660− prop "Rename a single directory" testRenameSingleDir
538+ prop "Rename a single directory"
539+ $ driverRenameSingleDir `shouldReturn` "PASS"
661− prop "Create a nested directory" testCreateNestedDir
540+ prop "Create a nested directory"
541+ $ driverCreateNestedDir `shouldReturn` "PASS"
662− prop "Remove a nested directory" testRemoveNestedDir
542+ prop "Remove a nested directory"
543+ $ driverRemoveNestedDir `shouldReturn` "PASS"
663− prop "Rename a nested directory" testRenameNestedDir
544+ prop "Rename a nested directory"
545+ $ driverRenameNestedDir `shouldReturn` "PASS"
664− prop "Create a file in root Dir" testCreateFileInRootDir
546+ prop "Create a file in root Dir"
547+ $ driverCreateFileInRootDir `shouldReturn` "PASS"
665− prop "Remove a file in root Dir" testRemoveFileInRootDir
548+ prop "Remove a file in root Dir"
549+ $ driverRemoveFileInRootDir `shouldReturn` "PASS"
666− prop "Rename a file in root Dir" testRenameFileInRootDir
550+ prop "Rename a file in root Dir"
551+ $ driverRenameFileInRootDir `shouldReturn` "PASS"
667− prop "Create a file in a nested Dir" testCreateFileInNestedDir
552+ prop "Create a file in a nested Dir"
553+ $ driverCreateFileInNestedDir `shouldReturn` "PASS"
668− prop "Remove a file in a nested Dir" testRemoveFileInNestedDir
554+ prop "Remove a file in a nested Dir"
555+ $ driverRemoveFileInNestedDir `shouldReturn` "PASS"
669− prop "Rename a file in a nested Dir" testRenameFileInNestedDir
556+ prop "Rename a file in a nested Dir"
557+ $ driverRenameFileInNestedDir `shouldReturn` "PASS"