packages feed

hspec-discover 2.7.10 → 2.11.17

raw patch · 12 files changed

Files

LICENSE view
@@ -1,4 +1,4 @@-Copyright (c) 2012-2021 Simon Hengel <sol@typeful.net>+Copyright (c) 2012-2026 Simon Hengel <sol@typeful.net>  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal
hspec-discover.cabal view
@@ -1,31 +1,27 @@ cabal-version: 1.12 --- This file has been generated from package.yaml by hpack version 0.34.4.+-- This file has been generated from package.yaml by hpack version 0.39.1. -- -- see: https://github.com/sol/hpack  name:             hspec-discover-version:          2.7.10+version:          2.11.17 license:          MIT license-file:     LICENSE-copyright:        (c) 2012-2021 Simon Hengel+copyright:        (c) 2012-2026 Simon Hengel author:           Simon Hengel <sol@typeful.net> maintainer:       Simon Hengel <sol@typeful.net> build-type:       Simple category:         Testing stability:        experimental bug-reports:      https://github.com/hspec/hspec/issues-homepage:         http://hspec.github.io/+homepage:         https://hspec.github.io/ synopsis:         Automatically discover and run Hspec tests description:      Automatically discover and run Hspec tests                   .-                  <http://hspec.github.io/hspec-discover.html>+                  <https://hspec.github.io/hspec-discover.html> extra-source-files:     version.yaml-    test-data/nested-spec/Foo/Bar/BazSpec.hs-    test-data/nested-spec/Foo/BarSpec.hs-    test-data/nested-spec/FooSpec.hs-    test-data/empty-dir/Foo/Bar/Baz/.placeholder  source-repository head   type: git@@ -35,9 +31,9 @@ library   hs-source-dirs:       src-  ghc-options: -Wall+  ghc-options: -Wall -fno-warn-incomplete-uni-patterns   build-depends:-      base ==4.*+      base >=4.5.0.0 && <5     , directory     , filepath   exposed: False@@ -50,12 +46,12 @@   default-language: Haskell2010  executable hspec-discover-  ghc-options: -Wall+  ghc-options: -Wall -fno-warn-incomplete-uni-patterns   hs-source-dirs:       driver   main-is: hspec-discover.hs   build-depends:-      base ==4.*+      base >=4.5.0.0 && <5     , directory     , filepath     , hspec-discover@@ -65,7 +61,7 @@  test-suite spec   type: exitcode-stdio-1.0-  ghc-options: -Wall+  ghc-options: -Wall -fno-warn-incomplete-uni-patterns   hs-source-dirs:       test   main-is: Spec.hs@@ -77,11 +73,12 @@       Paths_hspec_discover   build-depends:       QuickCheck >=2.7-    , base ==4.*+    , base >=4.5.0.0 && <5     , directory     , filepath     , hspec-discover-    , hspec-meta ==2.7.8+    , hspec-meta ==2.11.17+    , mockery >=0.3.5   build-tool-depends:       hspec-meta:hspec-meta-discover   default-language: Haskell2010
src/Test/Hspec/Discover/Config.hs view
@@ -1,6 +1,6 @@ -- | -- /NOTE:/ This module is not meant for public consumption.  For user--- documentation look at http://hspec.github.io/hspec-discover.html.+-- documentation look at https://hspec.github.io/hspec-discover.html. module Test.Hspec.Discover.Config (   Config (..) , defaultConfig@@ -35,9 +35,9 @@ parseConfig :: String -> [String] -> Either String Config parseConfig prog args = case getOpt Permute options args of     (opts, [], []) -> let-        c = (foldl (flip id) defaultConfig opts)+        c = foldl (flip id) defaultConfig opts       in-        if (configNoMain c && isJust (configFormatter c))+        if configNoMain c && isJust (configFormatter c)            then              formatError "option `--formatter=<fmt>' does not make sense with `--no-main'\n"            else
src/Test/Hspec/Discover/Run.hs view
@@ -1,21 +1,22 @@-{-# LANGUAGE TypeSynonymInstances, FlexibleInstances, OverloadedStrings #-}+{-# LANGUAGE FlexibleInstances, OverloadedStrings #-} {-# OPTIONS_GHC -fno-warn-orphans #-} -- | A preprocessor that finds and combines specs. -- -- /NOTE:/ This module is not meant for public consumption.  For user--- documentation look at http://hspec.github.io/hspec-discover.html.+-- documentation look at https://hspec.github.io/hspec-discover.html. module Test.Hspec.Discover.Run (   run  -- exported for testing , Spec(..) , importList-, fileToSpec-, findSpecs-, getFilesRecursive , driverWithFormatter , moduleNameFromId , pathToModule+, Tree(..)+, Forest(..)+, Hook(..)+, discover ) where import           Control.Monad import           Control.Applicative@@ -35,10 +36,8 @@ instance IsString ShowS where   fromString = showString -data Spec = Spec {-  specFile :: FilePath-, specModule :: String-} deriving (Eq, Show)+data Spec = Spec String | Hook String [Spec]+  deriving (Eq, Show)  run :: [String] -> IO () run args_ = do@@ -49,18 +48,21 @@         hPutStrLn stderr err         exitFailure       Right conf -> do-        when (configNested conf) (hPutStrLn stderr "hspec-discover: WARNING - The `--nested' option is deprecated and will be removed in a future release!")+        when (configNested conf)             (hPutStrLn stderr "hspec-discover: WARNING - The `--nested' option is deprecated and will be removed in a future release!")+        when (configNoMain conf)             (hPutStrLn stderr "hspec-discover: WARNING - The `--no-main' option is deprecated and will be removed in a future release!")+        when (isJust $ configFormatter conf) (hPutStrLn stderr "hspec-discover: WARNING - The `--formatter' option is deprecated and will be removed in a future release!")         specs <- findSpecs src         writeFile dst (mkSpecModule src conf specs)     _ -> do       hPutStrLn stderr (usage name)       exitFailure -mkSpecModule :: FilePath -> Config -> [Spec] -> String+mkSpecModule :: FilePath -> Config -> Maybe [Spec] -> String mkSpecModule src conf nodes =   ( "{-# LINE 1 " . shows src . " #-}\n"-  . showString "{-# OPTIONS_GHC -fno-warn-warnings-deprecations #-}\n"-  . showString ("module " ++ moduleName src conf ++" where\n")+  . showString "{-# LANGUAGE NoImplicitPrelude #-}\n"+  . showString "{-# OPTIONS_GHC -w -Wall -fno-warn-warnings-deprecations #-}\n"+  . showString ("module " ++ moduleName src conf ++ " where\n")   . importList nodes   . showString "import Test.Hspec.Discover\n"   . maybe driver driverWithFormatter (configFormatter conf)@@ -84,7 +86,7 @@ pathToModule f = toUpper m:ms   where     fileName = last $ splitDirectories f-    m:ms = takeWhile (/='.') fileName+    m:ms = takeWhile (/= '.') fileName  driverWithFormatter :: String -> ShowS driverWithFormatter f =@@ -97,43 +99,57 @@ moduleNameFromId = reverse . dropWhile (== '.') . dropWhile (/= '.') . reverse  -- | Generate imports for a list of specs.-importList :: [Spec] -> ShowS-importList = foldr (.) "" . map f+importList :: Maybe [Spec] -> ShowS+importList = foldr (.) "" . map f . maybe [] moduleNames   where-    f :: Spec -> ShowS-    f spec = "import qualified " . showString (specModule spec) . "Spec\n"+    f :: String -> ShowS+    f spec = "import qualified " . showString spec . "\n" +moduleNames :: [Spec] -> [String]+moduleNames = fromForest+  where+    fromForest :: [Spec] -> [String]+    fromForest = concatMap fromTree++    fromTree :: Spec -> [String]+    fromTree tree = case tree of+      Spec name -> [name ++ "Spec"]+      Hook name forest -> name : fromForest forest+ -- | Combine a list of strings with (>>). sequenceS :: [ShowS] -> ShowS sequenceS = foldr (.) "" . intersperse " >> " --- | Convert a list of specs to code.-formatSpecs :: [Spec] -> ShowS-formatSpecs xs-  | null xs   = "return ()"-  | otherwise = sequenceS (map formatSpec xs)+formatSpecs :: Maybe [Spec] -> ShowS+formatSpecs = maybe "return ()" fromForest+  where+    fromForest :: [Spec] -> ShowS+    fromForest = sequenceS . map fromTree --- | Convert a spec to code.-formatSpec :: Spec -> ShowS-formatSpec (Spec file name) = "postProcessSpec " . shows file . " (describe " . shows name . " " . showString name . "Spec.spec)"+    fromTree :: Spec -> ShowS+    fromTree tree = case tree of+      Spec name -> "describe " . shows name . " " . showString name . "Spec.spec"+      Hook name forest -> "(" . showString name . ".hook $ " . fromForest forest . ")" -findSpecs :: FilePath -> IO [Spec]-findSpecs src = do-  let (dir, file) = splitFileName src-  mapMaybe (fileToSpec dir) . filter (/= file) <$> getFilesRecursive dir+findSpecs :: FilePath -> IO (Maybe [Spec])+findSpecs = fmap (fmap toSpecs) . discover -fileToSpec :: FilePath -> FilePath -> Maybe Spec-fileToSpec dir file = case reverse $ splitDirectories file of-  x:xs -> case stripSuffix "Spec.hs" x <|> stripSuffix "Spec.lhs" x of-    Just name | isValidModuleName name && all isValidModuleName xs ->-      Just . Spec (dir </> file) $ (intercalate "." . reverse) (name : xs)-    _ -> Nothing-  _ -> Nothing+toSpecs :: Forest -> [Spec]+toSpecs = fromForest []   where-    stripSuffix :: Eq a => [a] -> [a] -> Maybe [a]-    stripSuffix suffix str = reverse <$> stripPrefix (reverse suffix) (reverse str)+    fromForest :: [String] -> Forest -> [Spec]+    fromForest names (Forest WithHook xs) = [Hook (mkModule ("SpecHook" : names)) $ concatMap (fromTree names) xs]+    fromForest names (Forest WithoutHook xs) = concatMap (fromTree names) xs --- See `Cabal.Distribution.ModuleName` (http://git.io/bj34)+    fromTree :: [String] -> Tree -> [Spec]+    fromTree names spec = case spec of+      Leaf name -> [Spec $ mkModule (name : names )]+      Node name forest -> fromForest (name : names) forest++    mkModule :: [String] -> String+    mkModule = intercalate "." . reverse++-- See `Cabal.Distribution.ModuleName` (https://git.io/bj34) isValidModuleName :: String -> Bool isValidModuleName [] = False isValidModuleName (c:cs) = isUpper c && all isValidModuleChar cs@@ -141,13 +157,71 @@ isValidModuleChar :: Char -> Bool isValidModuleChar c = isAlphaNum c || c == '_' || c == '\'' -getFilesRecursive :: FilePath -> IO [FilePath]-getFilesRecursive baseDir = sortNaturally <$> go []+data Tree = Leaf String | Node String Forest+  deriving (Eq, Show) +data Forest = Forest Hook [Tree]+  deriving (Eq, Show)++data Hook = WithHook | WithoutHook+  deriving (Eq, Show)++sortKey :: Tree -> (String, Int)+sortKey tree = case tree of+  Leaf name -> (name, 0)+  Node name _ -> (name, 1)++discover :: FilePath -> IO (Maybe Forest)+discover src = (>>= filterSrc) <$> specForest dir   where-    go :: FilePath -> IO [FilePath]-    go dir = do-      c <- map (dir </>) . filter (`notElem` [".", ".."]) <$> getDirectoryContents (baseDir </> dir)-      dirs <- filterM (doesDirectoryExist . (baseDir </>)) c >>= mapM go-      files <- filterM (doesFileExist . (baseDir </>)) c-      return (files ++ concat dirs)+    filterSrc :: Forest -> Maybe Forest+    filterSrc (Forest hook xs) = ensureForest hook $ maybe id (filter . (/=)) (toSpec file) xs++    (dir, file) = splitFileName src++specForest :: FilePath -> IO (Maybe Forest)+specForest dir = do+  files <- listDirectory dir+  hook <- mkHook dir files+  ensureForest hook . sortNaturallyBy sortKey . catMaybes <$> mapM toSpecTree files+  where+    toSpecTree :: FilePath -> IO (Maybe Tree)+    toSpecTree name+      | isValidModuleName name = do+          doesDirectoryExist (dir </> name) `fallback` Nothing $ do+            xs <- specForest (dir </> name)+            return $ Node name <$> xs+      | otherwise = do+          doesFileExist (dir </> name) `fallback` Nothing $ do+            return $ toSpec name++mkHook :: FilePath -> [FilePath] -> IO Hook+mkHook dir files+  | "SpecHook.hs" `elem` files = do+    doesFileExist (dir </> "SpecHook.hs") `fallback` WithoutHook $ do+      return WithHook+  | otherwise = return WithoutHook++fallback :: IO Bool -> a -> IO a -> IO a+fallback p def action = do+  bool <- p+  if bool then action else return def++toSpec :: FilePath -> Maybe Tree+toSpec file = Leaf <$> (spec >>= ensure isValidModuleName)+  where+    spec :: Maybe String+    spec = stripSuffix "Spec.hs" file <|> stripSuffix "Spec.lhs" file++    stripSuffix :: Eq a => [a] -> [a] -> Maybe [a]+    stripSuffix suffix str = reverse <$> stripPrefix (reverse suffix) (reverse str)++ensure :: (a -> Bool) -> a -> Maybe a+ensure p a = guard (p a) >> Just a++ensureForest :: Hook -> [Tree] -> Maybe Forest+ensureForest hook = fmap (Forest hook) . ensure (not . null)++listDirectory :: FilePath -> IO [FilePath]+listDirectory path = filter f <$> getDirectoryContents path+  where f filename = filename /= "." && filename /= ".."
src/Test/Hspec/Discover/Sort.hs view
@@ -1,5 +1,8 @@+-- |+-- /NOTE:/ This module is not meant for public consumption.  For user+-- documentation look at https://hspec.github.io/hspec-discover.html. module Test.Hspec.Discover.Sort (-  sortNaturally+  sortNaturallyBy , NaturalSortKey , naturalSortKey ) where@@ -9,10 +12,10 @@ import           Data.List import           Data.Ord -sortNaturally :: [String] -> [String]-sortNaturally = sortBy (comparing naturalSortKey)+sortNaturallyBy :: (a -> (String, Int)) -> [a] -> [a]+sortNaturallyBy f = sortBy (comparing ((\ (k, t) -> (naturalSortKey k, t)) . f)) -data NaturalSortKey = NaturalSortKey [Chunk]+newtype NaturalSortKey = NaturalSortKey [Chunk]   deriving (Eq, Ord)  data Chunk = Numeric Integer Int | Textual [(Char, Char)]
− test-data/empty-dir/Foo/Bar/Baz/.placeholder
− test-data/nested-spec/Foo/Bar/BazSpec.hs
− test-data/nested-spec/Foo/BarSpec.hs
− test-data/nested-spec/FooSpec.hs
test/Test/Hspec/Discover/RunSpec.hs view
@@ -1,54 +1,95 @@-module Test.Hspec.Discover.RunSpec (main, spec) where+module Test.Hspec.Discover.RunSpec (spec) where  import           Helper--import           System.IO-import           System.Directory-import           System.FilePath-import           Data.List (sort)+import           Test.Mockery.Directory  import           Test.Hspec.Discover.Run hiding (Spec)-import qualified Test.Hspec.Discover.Run--main :: IO ()-main = hspec spec--withTempFile :: (FilePath -> IO a) -> IO a-withTempFile action = do-  dir <- getTemporaryDirectory-  (file, h) <- openTempFile dir ""-  hClose h-  action file <* removeFile file-+import qualified Test.Hspec.Discover.Run as Run  spec :: Spec spec = do-  describe "run" $ do-    it "generates test driver" $ withTempFile $ \f -> do-      run ["test-data/nested-spec/Spec.hs", "", f]-      readFile f `shouldReturn` unlines [-          "{-# LINE 1 \"test-data/nested-spec/Spec.hs\" #-}"-        , "{-# OPTIONS_GHC -fno-warn-warnings-deprecations #-}"+  describe "run" $ around_ inTempDirectory $ do+    it "generates a test driver" $ do+      touch "test/FooSpec.hs"+      touch "test/Foo/Bar/BazSpec.hs"+      touch "test/Foo/BarSpec.hs"+      run ["test/Spec.hs", "", "out"]+      readFile "out" `shouldReturn` unlines [+          "{-# LINE 1 \"test/Spec.hs\" #-}"+        , "{-# LANGUAGE NoImplicitPrelude #-}"+        , "{-# OPTIONS_GHC -w -Wall -fno-warn-warnings-deprecations #-}"         , "module Main where"+        , "import qualified FooSpec"+        , "import qualified Foo.BarSpec"         , "import qualified Foo.Bar.BazSpec"+        , "import Test.Hspec.Discover"+        , "main :: IO ()"+        , "main = hspec spec"+        , "spec :: Spec"+        , "spec = " ++ unwords [+               "describe \"Foo\" FooSpec.spec"+          , ">> describe \"Foo.Bar\" Foo.BarSpec.spec"+          , ">> describe \"Foo.Bar.Baz\" Foo.Bar.BazSpec.spec"+          ]+        ]++    it "generates a test driver with no Main/main" $ do+      touch "test/FooSpec.hs"+      touch "test/Foo/Bar/BazSpec.hs"+      touch "test/Foo/BarSpec.hs"+      run ["test/Spec.hs", "", "out", "--no-main"]+      readFile "out" `shouldReturn` unlines [+          "{-# LINE 1 \"test/Spec.hs\" #-}"+        , "{-# LANGUAGE NoImplicitPrelude #-}"+        , "{-# OPTIONS_GHC -w -Wall -fno-warn-warnings-deprecations #-}"+        , "module Spec where"+        , "import qualified FooSpec"         , "import qualified Foo.BarSpec"+        , "import qualified Foo.Bar.BazSpec"+        , "import Test.Hspec.Discover"+        , "spec :: Spec"+        , "spec = " ++ unwords [+               "describe \"Foo\" FooSpec.spec"+          , ">> describe \"Foo.Bar\" Foo.BarSpec.spec"+          , ">> describe \"Foo.Bar.Baz\" Foo.Bar.BazSpec.spec"+          ]+        ]++    it "generates a test driver with hooks" $ do+      touch "test/FooSpec.hs"+      touch "test/Foo/Bar/BazSpec.hs"+      touch "test/Foo/BarSpec.hs"+      touch "test/Foo/SpecHook.hs"+      touch "test/SpecHook.hs"+      run ["test/Spec.hs", "", "out"]+      readFile "out" `shouldReturn` unlines [+          "{-# LINE 1 \"test/Spec.hs\" #-}"+        , "{-# LANGUAGE NoImplicitPrelude #-}"+        , "{-# OPTIONS_GHC -w -Wall -fno-warn-warnings-deprecations #-}"+        , "module Main where"+        , "import qualified SpecHook"         , "import qualified FooSpec"+        , "import qualified Foo.SpecHook"+        , "import qualified Foo.BarSpec"+        , "import qualified Foo.Bar.BazSpec"         , "import Test.Hspec.Discover"         , "main :: IO ()"         , "main = hspec spec"         , "spec :: Spec"         , "spec = " ++ unwords [-               "postProcessSpec \"test-data/nested-spec/Foo/Bar/BazSpec.hs\" (describe \"Foo.Bar.Baz\" Foo.Bar.BazSpec.spec)"-          , ">> postProcessSpec \"test-data/nested-spec/Foo/BarSpec.hs\" (describe \"Foo.Bar\" Foo.BarSpec.spec)"-          , ">> postProcessSpec \"test-data/nested-spec/FooSpec.hs\" (describe \"Foo\" FooSpec.spec)"+               "(SpecHook.hook $ describe \"Foo\" FooSpec.spec"+          , ">> (Foo.SpecHook.hook $ describe \"Foo.Bar\" Foo.BarSpec.spec"+          , ">> describe \"Foo.Bar.Baz\" Foo.Bar.BazSpec.spec))"           ]         ] -    it "generates test driver for an empty directory" $ withTempFile $ \f -> do-      run ["test-data/empty-dir/Spec.hs", "", f]-      readFile f `shouldReturn` unlines [-          "{-# LINE 1 \"test-data/empty-dir/Spec.hs\" #-}"-        , "{-# OPTIONS_GHC -fno-warn-warnings-deprecations #-}"+    it "generates a test driver for an empty directory" $ do+      touch "test/Foo/Bar/Baz/.placeholder"+      run ["test/Spec.hs", "", "out"]+      readFile "out" `shouldReturn` unlines [+          "{-# LINE 1 \"test/Spec.hs\" #-}"+        , "{-# LANGUAGE NoImplicitPrelude #-}"+        , "{-# OPTIONS_GHC -w -Wall -fno-warn-warnings-deprecations #-}"         , "module Main where"         , "import Test.Hspec.Discover"         , "main :: IO ()"@@ -61,49 +102,6 @@     it "derives module name from a given path" $ do       pathToModule "test/Spec.hs" `shouldBe` "Spec" -  describe "getFilesRecursive" $ do-    it "recursively returns all file entries of a given directory" $ do-      getFilesRecursive "test-data" `shouldReturn` sort [-          "empty-dir/Foo/Bar/Baz/.placeholder"-        , "nested-spec/Foo/Bar/BazSpec.hs"-        , "nested-spec/Foo/BarSpec.hs"-        , "nested-spec/FooSpec.hs"-        ]--  describe "fileToSpec" $ do-    it "converts path to spec name" $ do-      fileToSpec "" "FooSpec.hs" `shouldBe` Just (spec_ "FooSpec.hs" "Foo")--    it "rejects spec with empty name" $ do-      fileToSpec "" "Spec.hs" `shouldBe` Nothing--    it "works for lhs files" $ do-      fileToSpec "" "FooSpec.lhs" `shouldBe` Just (spec_ "FooSpec.lhs" "Foo")--    it "returns Nothing for invalid spec name" $ do-      fileToSpec "" "foo" `shouldBe` Nothing--    context "when spec does not have a valid module name" $ do-      it "returns Nothing" $ do-        fileToSpec "" "flycheck_Spec.hs" `shouldBe` Nothing--    context "when any component of a hierarchical module name is not valid"$ do-      it "returns Nothing" $ do-        fileToSpec "" ("Valid" </> "invalid"  </>"MiddleNamesSpec.hs") `shouldBe` Nothing--    context "when path has directory component" $ do-      it "converts path to spec name" $ do-        let file = "Foo" </> "Bar" </> "BazSpec.hs"-        fileToSpec "" file `shouldBe` Just (spec_ file "Foo.Bar.Baz")--      it "rejects spec with empty name" $ do-        fileToSpec "" ("Foo" </> "Bar" </> "Spec.hs") `shouldBe` Nothing--  describe "findSpecs" $ do-    it "finds specs" $ do-      let dir = "test-data/nested-spec"-      findSpecs (dir </> "Spec.hs") `shouldReturn` [spec_ (dir </> "Foo/Bar/BazSpec.hs") "Foo.Bar.Baz", spec_ (dir </> "Foo/BarSpec.hs") "Foo.Bar", spec_ (dir </> "FooSpec.hs") "Foo"]-   describe "driverWithFormatter" $ do     it "generates a test driver that uses a custom formatter" $ do       driverWithFormatter "Some.Module.formatter" "" `shouldBe` unlines [@@ -118,9 +116,56 @@    describe "importList" $ do     it "generates imports for a list of specs" $ do-      importList [spec_ "FooSpec.hs" "Foo", spec_ "BarSpec.hs" "Bar"] "" `shouldBe` unlines [+      importList (Just [Run.Spec "Foo", Run.Spec "Bar"]) "" `shouldBe` unlines [           "import qualified FooSpec"         , "import qualified BarSpec"         ]-  where-    spec_ = Test.Hspec.Discover.Run.Spec++  describe "discover" $ do+    it "discovers spec files" $ do+      inTempDirectory $ do+        touch "test/Spec.hs"+        touch "test/FooSpec.hs"+        touch "test/BarSpec.hs"+        discover "test/Spec.hs" `shouldReturn` Just (Forest WithoutHook [Leaf "Bar", Leaf "Foo"])++    it "discovers nested spec files" $ do+      inTempDirectory $ do+        touch "test/Spec.hs"+        touch "test/Foo/BarSpec.hs"+        touch "test/Foo/BazSpec.hs"+        discover "test/Spec.hs" `shouldReturn` Just (Forest WithoutHook [Node "Foo" (Forest WithoutHook [Leaf "Bar", Leaf "Baz"])])++    it "discovers hooks" $ do+      inTempDirectory $ do+        touch "test/Spec.hs"+        touch "test/FooSpec.hs"+        touch "test/BarSpec.hs"+        touch "test/SpecHook.hs"+        discover "test/Spec.hs" `shouldReturn` Just (Forest WithHook [Leaf "Bar", Leaf "Foo"])++    it "discovers nested hooks" $ do+      inTempDirectory $ do+        touch "test/Spec.hs"+        touch "test/Foo/BarSpec.hs"+        touch "test/Foo/BazSpec.hs"+        touch "test/Foo/SpecHook.hs"+        discover "test/Spec.hs" `shouldReturn` Just (Forest WithoutHook [Node "Foo" (Forest WithHook [Leaf "Bar", Leaf "Baz"])])++    it "ignores invalid module names" $ do+      inTempDirectory $ do+        touch "test/Spec.hs"+        touch "test/barSpec.hs"+        discover "test/Spec.hs" `shouldReturn` Nothing++    it "ignores empty directories" $ do+      inTempDirectory $ do+        touch "test/Spec.hs"+        touch "test/Foo/.keep"+        discover "test/Spec.hs" `shouldReturn` Nothing++    it "ignores directories with extension" $ do+      inTempDirectory $ do+        touch "test/Spec.hs"+        touch "test/Foo.hs/BarSpec.hs"+        discover "test/Spec.hs" `shouldReturn` Nothing
test/Test/Hspec/Discover/SortSpec.hs view
@@ -1,15 +1,15 @@-module Test.Hspec.Discover.SortSpec (main, spec) where+module Test.Hspec.Discover.SortSpec (spec) where  import           Helper import           Test.QuickCheck  import           Test.Hspec.Discover.Sort -main :: IO ()-main = hspec spec- shuffleAndSort :: [String] -> IO [String] shuffleAndSort xs = sortNaturally <$> generate (shuffle xs)++sortNaturally :: [String] -> [String]+sortNaturally = sortNaturallyBy $ \ name -> (name, 0)  spec :: Spec spec = do
version.yaml view
@@ -1,1 +1,7 @@-&version 2.7.10+version: &version 2.11.17+synopsis: A Testing Framework for Haskell+author: Simon Hengel <sol@typeful.net>+maintainer: Simon Hengel <sol@typeful.net>+category: Testing+stability: experimental+homepage: https://hspec.github.io/