1{-# LANGUAGE OverloadedStrings #-} 2module Hpack.ModuleSpec (spec) where 3 4import Helper 5 6import Hpack.Module 7 8spec :: Spec 9spec = do 10 describe "getModules" $ around withTempDirectory $ do 11 it "returns Haskell modules in specified source directory" $ \dir -> do 12 touch (dir </> "src/Foo.hs") 13 touch (dir </> "src/Bar/Baz.hs") 14 touch (dir </> "src/Setup.hs") 15 getModules dir "src" >>= (`shouldMatchList` ["Foo", "Bar.Baz", "Setup"]) 16 17 context "when source directory is '.'" $ do 18 it "ignores Setup" $ \dir -> do 19 touch (dir </> "Foo.hs") 20 touch (dir </> "Setup.hs") 21 getModules dir "." `shouldReturn` ["Foo"] 22 23 context "when source directory is './.'" $ do 24 it "ignores Setup" $ \dir -> do 25 touch (dir </> "Foo.hs") 26 touch (dir </> "Setup.hs") 27 getModules dir "./." `shouldReturn` ["Foo"] 28 29 describe "toModule" $ do 30 it "maps a Path to a Module" $ do 31 toModule "Foo/Bar/Baz.hs" `shouldBe` "Foo.Bar.Baz" 32 33 describe "getModuleFilesRecursive" $ do 34 it "gets all Haskell source files from given directory" $ do 35 inTempDirectory $ do 36 touch "foo/Bar.hs" 37 touch "foo/Baz.chs" 38 actual <- getModuleFilesRecursive "foo" 39 actual `shouldMatchList` [ 40 "Bar.hs" 41 , "Baz.chs" 42 ] 43 44 it "ignores other files" $ do 45 inTempDirectory $ do 46 touch "foo/Bar.js" 47 getModuleFilesRecursive "foo" `shouldReturn` [] 48 49 it "descends into subdirectories" $ do 50 inTempDirectory $ do 51 touch "foo/Bar/Baz.hs" 52 getModuleFilesRecursive "foo" `shouldReturn` ["Bar/Baz.hs"] 53 54 context "when a subdirectory is not a valid module name" $ do 55 it "does not descend" $ do 56 inTempDirectory $ do 57 touch "foo/bar/Baz.hs" 58 getModuleFilesRecursive "foo" `shouldReturn` empty 59