@@ -2,10 +2,12 @@ module Test.Spago.Glob where
2
2
3
3
import Test.Prelude
4
4
5
+ import Data.Array as Array
5
6
import Data.Foldable (intercalate )
6
7
import Data.String.Gen (genAlphaLowercaseString )
7
8
import Effect.Aff as Aff
8
9
import Node.Path as Path
10
+ import Node.Process as Process
9
11
import Spago.FS as FS
10
12
import Spago.Glob as Glob
11
13
import Test.QuickCheck.Gen (randomSample' , resize )
@@ -29,10 +31,10 @@ globTmpDir m = Aff.bracket make cleanup m
29
31
base
30
32
dir
31
33
" fruits"
32
- [ touch " apple "
33
- , touch " orange "
34
- , touch " banana "
35
- , dir " special "
34
+ [ dir " left "
35
+ [ touch " apple "
36
+ ]
37
+ , dir " right "
36
38
[ touch " apple"
37
39
]
38
40
]
@@ -48,36 +50,55 @@ globTmpDir m = Aff.bracket make cleanup m
48
50
spec :: Spec Unit
49
51
spec = Spec .around globTmpDir do
50
52
Spec .describe " glob" do
53
+ Spec .describe " glob behavior" do
54
+ Spec .it " '**/..' matches 0 or more directories" \p -> do
55
+ a <- Glob .gitignoringGlob (Path .concat [p, " fruits/left" ]) [" **/apple" ]
56
+ b <- Glob .gitignoringGlob (Path .concat [p, " fruits" ]) [" **/apple" ]
57
+ Array .sort a `Assert.shouldEqual` [" apple" ]
58
+ Array .sort b `Assert.shouldEqual` [" left/apple" , " right/apple" ]
59
+
60
+ Spec .it " '../**/..' matches 0 or more directories" \p -> do
61
+ a <- Glob .gitignoringGlob p [" fruits/**/apple" ]
62
+ Array .sort a `Assert.shouldEqual` [" fruits/left/apple" , " fruits/right/apple" ]
63
+
64
+ Spec .it " '../**' matches 0 or more directories" \p -> do
65
+ a <- Glob .gitignoringGlob p [" fruits/left/**" ]
66
+ Array .sort a `Assert.shouldEqual` [" fruits/left" , " fruits/left/apple" ]
67
+
51
68
Spec .describe " gitignoringGlob" do
52
69
Spec .it " when no .gitignore, yields all matches" \p -> do
53
70
a <- Glob .gitignoringGlob p [" **/apple" ]
54
- a `Assert.shouldEqual` [" fruits/apple" , " fruits/special /apple" , " src/fruits/apple" ]
71
+ Array .sort a `Assert.shouldEqual` [" fruits/left/ apple" , " fruits/right /apple" , " src/fruits/apple" ]
55
72
56
73
Spec .it " respects a .gitignore pattern that doesn't conflict with search" \p -> do
57
- FS .writeTextFile (Path .concat [p, " .gitignore" ]) " /fruits"
58
- a <- Glob .gitignoringGlob p [" **/apple" ]
59
- a `Assert.shouldEqual` [" src/fruits/apple" ]
74
+ FS .writeTextFile (Path .concat [p, " .gitignore" ]) " fruits/right"
75
+ a <- Glob .gitignoringGlob p [" fruits/**/apple" ]
76
+ Array .sort a `Assert.shouldEqual` [" fruits/left/apple" ]
77
+
78
+ Spec .it " respects some .gitignore patterns" \p -> do
79
+ FS .writeTextFile (Path .concat [p, " .gitignore" ]) " fruits\n fruits/right"
80
+ a <- Glob .gitignoringGlob p [" fruits/**/apple" ]
81
+ Array .sort a `Assert.shouldEqual` [" fruits/left/apple" ]
60
82
61
83
Spec .it " respects a negated .gitignore pattern" \p -> do
62
- FS .writeTextFile (Path .concat [p, " .gitignore" ]) " !/fruits/special /apple\n /fruits/apple"
84
+ FS .writeTextFile (Path .concat [p, " .gitignore" ]) " !/fruits/left /apple\n /fruits/** /apple"
63
85
a <- Glob .gitignoringGlob p [" **/apple" ]
64
- a `Assert.shouldEqual` [" fruits/special /apple" , " src/fruits/apple" ]
86
+ Array .sort a `Assert.shouldEqual` [" fruits/left /apple" , " src/fruits/apple" ]
65
87
66
88
for_ [" /fruits" , " fruits" , " fruits/" , " **/fruits" , " fruits/**" , " **/fruits/**" ] \gitignore -> do
67
- Spec .focus $ Spec . it
89
+ Spec .it
68
90
(" does not respect a .gitignore pattern that conflicts with search: " <> gitignore)
69
91
\p -> do
70
92
FS .writeTextFile (Path .concat [p, " .gitignore" ]) gitignore
71
- a <- Glob .gitignoringGlob p [" fruits/apple/**" ]
72
- a `Assert.shouldEqual` [" fruits/apple" ]
73
-
74
- Spec .it " respects some .gitignore patterns" \p -> do
75
- FS .writeTextFile (Path .concat [p, " .gitignore" ]) """ /fruits\n/src"""
76
- a <- Glob .gitignoringGlob p [" fruits/apple/**" ]
77
- a `Assert.shouldEqual` [" fruits/apple" ]
93
+ a <- Glob .gitignoringGlob p [" fruits/**/apple" ]
94
+ Array .sort a `Assert.shouldEqual` [" fruits/left/apple" , " fruits/right/apple" ]
78
95
79
96
Spec .it " is stacksafe" \p -> do
80
- hugeGitignore <- liftEffect $ intercalate " \n " <$> randomSample' 10000 (resize 4 $ genAlphaLowercaseString)
97
+ let
98
+ chars = [" a" , " b" , " c" , " d" , " e" , " f" , " g" , " h" , " i" , " j" , " k" ]
99
+ -- 10,000-line gitignore
100
+ words = [\a b c d -> a <> b <> c <> d] <*> chars <*> chars <*> chars <*> chars
101
+ hugeGitignore = intercalate " \n " words
81
102
FS .writeTextFile (Path .concat [p, " .gitignore" ]) hugeGitignore
82
- a <- Glob .gitignoringGlob p [" fruits/apple/** " ]
83
- a `Assert.shouldEqual` [" fruits/apple" ]
103
+ a <- Glob .gitignoringGlob p [" fruits/**/apple " ]
104
+ Array .sort a `Assert.shouldEqual` [" fruits/left/apple " , " fruits/right /apple" ]
0 commit comments