1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
|
module ResponseFileSpec where
import Test.Hspec (context, describe, it, shouldBe, Spec)
import ResponseFile (escapeArgs, unescapeArgs)
-- The first two elements are
-- 1) a list of 'args' to encode and
-- 2) a single string of the encoded args
-- The 3rd element is just a description for the tests.
testStrs :: [(([String], String), String)]
testStrs =
[ ((["a simple command line"],
"a\\ simple\\ command\\ line\n"),
"the white-space, end with newline")
, ((["arg 'foo' is single quoted"],
"arg\\ \\'foo\\'\\ is\\ single\\ quoted\n"),
"the single quotes as well")
, ((["arg \"bar\" is double quoted"],
"arg\\ \\\"bar\\\"\\ is\\ double\\ quoted\n"),
"the double quotes as well" )
, ((["arg \"foo bar\" has embedded whitespace"],
"arg\\ \\\"foo\\ bar\\\"\\ has\\ embedded\\ whitespace\n"),
"the quote-embedded whitespace")
, ((["arg 'Jack said \\'hi\\'' has single quotes"],
"arg\\ \\'Jack\\ said\\ \\\\\\'hi\\\\\\'\\'\\ has\\ single\\ quotes\n"),
"the escaped single quotes")
, ((["arg 'Jack said \\\"hi\\\"' has double quotes"],
"arg\\ \\'Jack\\ said\\ \\\\\\\"hi\\\\\\\"\\'\\ has\\ double\\ quotes\n"),
"the escaped double quotes")
, ((["arg 'Jack said\\r\\n\\t \\\"hi\\\"' has other whitespace"],
"arg\\ \\'Jack\\ said\\\\r\\\\n\\\\t\\ \\\\\\\"hi\\\\\\\"\\'\\ has\\ \
\other\\ whitespace\n"),
"the other whitespace")
, (([ "--prologue=.\\dist\\.\\haddock-prologue3239114604.txt"
, "--title=HaddockNewline-0.1.0.0: This has a\n\
\newline yo."
, "-BC:\\Program Files\\Haskell Platform\\lib"],
"--prologue=.\\\\dist\\\\.\\\\haddock-prologue3239114604.txt\n\
\--title=HaddockNewline-0.1.0.0:\\ This\\ has\\ a\\\n\
\newline\\ yo.\n\
\-BC:\\\\Program\\ Files\\\\Haskell\\ Platform\\\\lib\n"),
"an actual haddock response file snippet with embedded newlines")
]
spec :: Spec
spec = do
describe "escapeArgs" $ do
mapM_ (\((ss1,s2),des) -> do
context ("given " ++ (show ss1)) $ do
it ("should escape " ++ des) $ do
escapeArgs ss1 `shouldBe` s2
) testStrs
describe "unescapeArgs" $ do
mapM_ (\((ss1,s2),des) -> do
context ("given " ++ (show s2)) $ do
it ("should unescape " ++ des) $ do
unescapeArgs s2 `shouldBe` ss1
) testStrs
describe "unescapeArgs" $ do
context "given unescaped single quotes" $ do
it "should pass-through, without escaping, everything inside" $ do
-- backslash *always* is escaped anywhere it appears
(filter (not . null) $
unescapeArgs "this\\ is\\ 'not escape\\d \"inside\"'\\ yo\n")
`shouldBe`
["this is not escaped \"inside\" yo"]
context "given unescaped double quotes" $ do
it "should pass-through, without escaping, everything inside" $ do
-- backslash *always* is escaped anywhere it appears
(filter (not . null) $
unescapeArgs "this\\ is\\ \"not escape\\d 'inside'\"\\ yo\n")
`shouldBe`
["this is not escaped 'inside' yo"]
|