1
- {-# OPTIONS_GHC -Wno-x-partial #-}
2
1
{-# LANGUAGE NoImplicitPrelude #-}
2
+ {-# LANGUAGE OverloadedLists #-}
3
3
4
4
-- | Args parser test suite.
5
5
@@ -13,8 +13,8 @@ module Stack.ArgsSpec
13
13
import Data.Attoparsec.Args ( EscapingMode (.. ), parseArgsFromString )
14
14
import Data.Attoparsec.Interpreter ( interpreterArgsParser )
15
15
import qualified Data.Attoparsec.Text as P
16
+ import qualified Data.List.NonEmpty as NE
16
17
import Data.Text ( pack )
17
- import Prelude ( head )
18
18
import Stack.Constants ( stackProgName )
19
19
import Stack.Prelude
20
20
import Test.Hspec ( Spec , describe , it )
@@ -76,10 +76,10 @@ interpreterArgsSpec =
76
76
describe " Failure cases" $ do
77
77
checkFailures
78
78
describe " Bare directives in literate files" $ do
79
- forM_ (interpreterGenValid lineComment [] ) $
80
- testAndCheck (acceptFailure True ) []
81
- forM_ (interpreterGenValid blockComment [] ) $
82
- testAndCheck (acceptFailure True ) []
79
+ forM_ (interpreterGenValid lineComment " " ) $
80
+ testAndCheck (acceptFailure True ) " "
81
+ forM_ (interpreterGenValid blockComment " " ) $
82
+ testAndCheck (acceptFailure True ) " "
83
83
where
84
84
parse isLiterate s =
85
85
P. parseOnly (interpreterArgsParser isLiterate stackProgName) (pack s)
@@ -116,60 +116,82 @@ interpreterArgsSpec =
116
116
(testAndCheck (acceptFailure False ) " unused" )
117
117
118
118
-- Generate a set of acceptable inputs for given format and args
119
+ interpreterGenValid ::
120
+ (String -> NonEmpty String )
121
+ -> String
122
+ -> NonEmpty String
119
123
interpreterGenValid fmt args = shebang <++> newLine <++> fmt args
120
124
121
- interpreterGenInvalid :: [ String ]
125
+ interpreterGenInvalid :: NonEmpty String
122
126
-- Generate a set of Invalid inputs
123
127
interpreterGenInvalid =
124
128
[" -stack\n " ] -- random input
125
129
-- just the shebang
126
- <| > shebang <++> [" \n " ]
130
+ <> shebang <++> [" \n " ]
127
131
-- invalid shebang
128
- <| > blockSpace <++> [head (interpreterGenValid lineComment args)]
132
+ <> blockSpace <++> [NE. head (interpreterGenValid lineComment args)]
129
133
-- something between shebang and Stack comment
130
- <| > shebang
134
+ <> shebang
131
135
<++> newLine
132
136
<++> blockSpace
133
- <++> ([head (lineComment args)] <| > [head (blockComment args)])
137
+ <++> ([NE. head (lineComment args)] <> [NE. head (blockComment args)])
134
138
-- unterminated block comment
135
139
-- just chop the closing chars from a valid block comment
136
- <| > shebang
140
+ <> shebang
137
141
<++> [" \n " ]
138
- <++> let c = head (blockComment args)
142
+ <++> let c = NE. head (blockComment args)
139
143
l = length c - 2
140
144
in [assert (drop l c == " -}" ) (take l c)]
141
145
-- nested block comment
142
- <| > shebang
146
+ <> shebang
143
147
<++> [" \n " ]
144
- <++> [head (blockComment " --x {- nested -} --y" )]
148
+ <++> [NE. head (blockComment " --x {- nested -} --y" )]
145
149
where
146
150
args = " --x --y"
147
- (<++>) = liftA2 (++ )
151
+ (<++>) = liftA2 (<> )
148
152
149
153
-- Generative grammar for the interpreter comments
154
+ shebang :: NonEmpty String
150
155
shebang = [" #!/usr/bin/env stack" ]
151
- newLine = [" \n " ] <|> [" \r\n " ]
156
+
157
+ newLine :: NonEmpty String
158
+ newLine = [" \n " ] <> [" \r\n " ]
152
159
153
160
-- A comment may be the last line or followed by something else
154
- postComment = [" " ] <|> newLine
161
+ postComment :: NonEmpty String
162
+ postComment = [" " ] <> newLine
155
163
156
164
-- A command starts with zero or more whitespace followed by "stack"
165
+ makeComment ::
166
+ (String -> String )
167
+ -> NonEmpty String
168
+ -> String
169
+ -> NonEmpty String
157
170
makeComment maker space args =
158
- let makePrefix s = (s <|> [" " ]) <++> [stackProgName]
159
- in (maker <$> (makePrefix space <++> [args])) <++> postComment
171
+ let makePrefix :: NonEmpty String -> NonEmpty String
172
+ makePrefix s = (s <> [" " ]) <++> [stackProgName]
173
+ in (maker <$> (makePrefix space <&> (++ args))) <++> postComment
174
+
175
+ lineSpace :: NonEmpty String
176
+ lineSpace = [" " ] <> [" \t " ]
160
177
161
- lineSpace = [ " " ] <|> [ " \t " ]
178
+ lineComment :: String -> NonEmpty String
162
179
lineComment = makeComment makeLine lineSpace
163
180
where
164
181
makeLine s = " --" ++ s
165
182
183
+ literateLineComment :: String -> NonEmpty String
166
184
literateLineComment = makeComment (" > --" ++ ) lineSpace
167
185
168
- blockSpace = lineSpace <|> newLine
186
+ blockSpace :: NonEmpty String
187
+ blockSpace = lineSpace <> newLine
188
+
189
+ blockComment :: String -> NonEmpty String
169
190
blockComment = makeComment makeBlock blockSpace
170
191
where
171
192
makeBlock s = " {-" ++ s ++ " -}"
172
193
194
+ literateBlockComment :: String -> NonEmpty String
173
195
literateBlockComment = makeComment
174
196
(\ s -> " > {-" ++ s ++ " -}" )
175
- (lineSpace <|> map (++ " >" ) newLine)
197
+ (lineSpace <> NE. map (++ " >" ) newLine)
0 commit comments