aboutsummaryrefslogtreecommitdiff
path: root/driver-test/ResponseFileSpec.hs
diff options
context:
space:
mode:
authorBen Gamari <ben@smart-cactus.org>2016-01-06 13:47:17 +0100
committerBen Gamari <ben@smart-cactus.org>2016-01-06 13:47:17 +0100
commit94c127449fd25732ebda04a472cc5d99b4ce6481 (patch)
treefd751b7b5d15a4859d2e90700cce76817af680cd /driver-test/ResponseFileSpec.hs
parent116e56e201e2efb52e9ade07deecbcf5f3106719 (diff)
parentd510c45790432249fe7027b1ed70ce1c06fdd824 (diff)
Merge remote-tracking branch 'randen/bug468'
Diffstat (limited to 'driver-test/ResponseFileSpec.hs')
-rw-r--r--driver-test/ResponseFileSpec.hs80
1 files changed, 80 insertions, 0 deletions
diff --git a/driver-test/ResponseFileSpec.hs b/driver-test/ResponseFileSpec.hs
new file mode 100644
index 00000000..997adac4
--- /dev/null
+++ b/driver-test/ResponseFileSpec.hs
@@ -0,0 +1,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"]