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