hspec-discover 2.4.4 → 2.4.5
raw patch · 4 files changed
+133/−10 lines, 4 filesdep +QuickCheckPVP ok
version bump matches the API change (PVP)
Dependencies added: QuickCheck
API changes (from Hackage documentation)
+ Test.Hspec.Discover.Sort: data NaturalSortKey
+ Test.Hspec.Discover.Sort: instance GHC.Classes.Eq Test.Hspec.Discover.Sort.Chunk
+ Test.Hspec.Discover.Sort: instance GHC.Classes.Eq Test.Hspec.Discover.Sort.NaturalSortKey
+ Test.Hspec.Discover.Sort: instance GHC.Classes.Ord Test.Hspec.Discover.Sort.Chunk
+ Test.Hspec.Discover.Sort: instance GHC.Classes.Ord Test.Hspec.Discover.Sort.NaturalSortKey
+ Test.Hspec.Discover.Sort: naturalSortKey :: String -> NaturalSortKey
+ Test.Hspec.Discover.Sort: sortNaturally :: [String] -> [String]
Files
- hspec-discover.cabal +17/−9
- src/Test/Hspec/Discover/Run.hs +3/−1
- src/Test/Hspec/Discover/Sort.hs +30/−0
- test/Test/Hspec/Discover/SortSpec.hs +83/−0
hspec-discover.cabal view
@@ -1,9 +1,11 @@--- This file has been generated from package.yaml by hpack version 0.18.0.+-- This file has been generated from package.yaml by hpack version 0.21.2. -- -- see: https://github.com/sol/hpack+--+-- hash: c1fbbc7305c5512cef66ad45b78b2a1fb3589239de3ff7fe0cfb89853a969622 name: hspec-discover-version: 2.4.4+version: 2.4.5 license: MIT license-file: LICENSE copyright: (c) 2012-2017 Simon Hengel@@ -36,13 +38,14 @@ src ghc-options: -Wall build-depends:- base == 4.*- , filepath+ base ==4.* , directory+ , filepath exposed: False exposed-modules: Test.Hspec.Discover.Config Test.Hspec.Discover.Run+ Test.Hspec.Discover.Sort other-modules: Paths_hspec_discover default-language: Haskell2010@@ -52,10 +55,12 @@ hs-source-dirs: driver main-is: hspec-discover.hs+ other-modules:+ Paths_hspec_discover build-depends:- base == 4.*- , filepath+ base ==4.* , directory+ , filepath , hspec-discover default-language: Haskell2010 @@ -69,10 +74,13 @@ Helper Test.Hspec.Discover.ConfigSpec Test.Hspec.Discover.RunSpec+ Test.Hspec.Discover.SortSpec+ Paths_hspec_discover build-depends:- base == 4.*- , filepath+ QuickCheck >=2.7+ , base ==4.* , directory+ , filepath , hspec-discover- , hspec-meta >= 2.3.2+ , hspec-meta >=2.3.2 default-language: Haskell2010
src/Test/Hspec/Discover/Run.hs view
@@ -30,6 +30,7 @@ import System.FilePath hiding (combine) import Test.Hspec.Discover.Config+import Test.Hspec.Discover.Sort instance IsString ShowS where fromString = showString@@ -141,7 +142,8 @@ isValidModuleChar c = isAlphaNum c || c == '_' || c == '\'' getFilesRecursive :: FilePath -> IO [FilePath]-getFilesRecursive baseDir = sort <$> go []+getFilesRecursive baseDir = sortNaturally <$> go []+ where go :: FilePath -> IO [FilePath] go dir = do
+ src/Test/Hspec/Discover/Sort.hs view
@@ -0,0 +1,30 @@+module Test.Hspec.Discover.Sort (+ sortNaturally+, NaturalSortKey+, naturalSortKey+) where++import Control.Arrow+import Data.Char+import Data.List+import Data.Ord++sortNaturally :: [String] -> [String]+sortNaturally = sortBy (comparing naturalSortKey)++data NaturalSortKey = NaturalSortKey [Chunk]+ deriving (Eq, Ord)++data Chunk = Numeric Integer Int | Textual [(Char, Char)]+ deriving (Eq, Ord)++naturalSortKey :: String -> NaturalSortKey+naturalSortKey = NaturalSortKey . chunks+ where+ chunks [] = []+ chunks s@(c:_)+ | isDigit c = Numeric (read num) (length num) : chunks afterNum+ | otherwise = Textual (map (toLower &&& id) str) : chunks afterStr+ where+ (num, afterNum) = span isDigit s+ (str, afterStr) = break isDigit s
+ test/Test/Hspec/Discover/SortSpec.hs view
@@ -0,0 +1,83 @@+module Test.Hspec.Discover.SortSpec (main, 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)++spec :: Spec+spec = do+ describe "naturalSortKey" $ do+ it "is injective" $ property $ \ a b -> do+ a /= b ==> naturalSortKey a /= naturalSortKey b++ describe "sortNaturally" $ do+ it "gives shorter strings precedence" $ do+ let expected = [+ ""+ , "a"+ , "aa"+ ]+ shuffleAndSort expected `shouldReturn` expected++ it "gives numbers precedence" $ do+ let expected = [+ "Hello2World"+ , "Hello World"+ ]+ shuffleAndSort expected `shouldReturn` expected++ it "sorts numbers in ascending order" $ do+ let expected = [+ "Spec9.hs"+ , "Spec10.hs"+ ]+ shuffleAndSort expected `shouldReturn` expected++ it "breaks numeric ties by string length" $ do+ let expected = [+ "Hello 2 World"+ , "Hello 02 World"+ ]+ shuffleAndSort expected `shouldReturn` expected++ it "given upper-case letters precedence over lower-case letters" $ do+ let+ expected = [+ "AA.hs"+ , "Aa.hs"+ , "aA.hs"+ , "aa.hs"+ , "B.hs"+ , "b.hs"+ ]+ shuffleAndSort expected `shouldReturn` expected++ it "sorts number separated strings" $ do+ let expected = [+ "Hello2World9"+ , "Hello2World!0"+ ]+ shuffleAndSort expected `shouldReturn` expected++ it "sorts string separated numbers" $ do+ let expected = [+ "3.1.415"+ , "3.14.15"+ ]+ shuffleAndSort expected `shouldReturn` expected++ it "groups common string prefixes together" $ do+ let expected = [+ "SpecFoo.hs"+ , "SpecFoo.lhs"+ , "Specfoo.hs"+ , "Specfoo.lhs"+ ]+ shuffleAndSort expected `shouldReturn` expected