{-# LANGUAGE PackageImports #-} {-# LANGUAGE QuasiQuotes #-} module Main (main) where import "hspec" Test.Hspec (hspec, describe, it, shouldBe) import "qm-interpolated-string" Text.InterpolatedString.QM (qm, qn) main :: IO () main = hspec $ do describe "QM" $ do describe "Examples from README" $ do it "First (decorative spacing and escaping space symbol)" $ [qm| hello world, \ what's going on here? |] `shouldBe` "hello world, what's going on here?" it "Second (merging lines without spaces)" $ [qm| it's actual ly ignored |] `shouldBe` "it's actually ignored" it "Third (explicit line-breaks symbols)" $ [qm| \ You could explicitly escape indentation or\n line-breaks when you really need it! \ |] `shouldBe` " You could explicitly escape indentation or\n\ \line-breaks when you really need it! " it "Fourth (escaping interpolation blocks to show them as text)" $ [qm| {1+2} \{3+4} |] `shouldBe` "3 {3+4}" it "Type annotation in interpolation block" $ [qm|{10 :: Float}|] `shouldBe` "10.0" it "Escaping interpolation symbols inside interpolation block" $ do [qm|foo {"b{a{r"} baz|] `shouldBe` "foo b{a{r baz" [qm|foo {"b\}a\}r"} baz|] `shouldBe` "foo b}a}r baz" it "Example from generated docs" $ [qm| foo {'b':'a':'r':""} \ baz |] `shouldBe` "foo bar baz" it "Escaping backslashes" $ do [qm| foo\bar |] `shouldBe` "foo\\bar" [qm| foo\\bar |] `shouldBe` "foo\\bar" [qm| foo\\\bar |] `shouldBe` "foo\\\\bar" [qm| foo\\\\bar |] `shouldBe` "foo\\\\bar" it "Empty string" $ [qm| |] `shouldBe` "" it "Escaping space by slash at EOL after space" $ [qm| foo \ bar |] `shouldBe` "foo bar" it "Escaped spaces at the edges" $ do [qm| foo\ |] `shouldBe` "foo " [qm|\ foo |] `shouldBe` " foo" describe "QN (QM but without interpolation)" $ do describe "Examples from README" $ do it "First (decorative spacing and escaping space symbol)" $ [qn| hello world, \ what's going on here? |] `shouldBe` "hello world, what's going on here?" it "Second (merging lines without spaces)" $ [qn| it's actual ly ignored |] `shouldBe` "it's actually ignored" it "Third (explicit line-breaks symbols)" $ [qn| \ You could explicitly escape indentation or\n line-breaks when you really need it! \ |] `shouldBe` " You could explicitly escape indentation or\n\ \line-breaks when you really need it! " it "Fourth (escaping interpolation blocks to show them as text)" $ [qn| {1+2} \{3+4} |] `shouldBe` "{1+2} \\{3+4}" it "Example of `qn` QuasiQuoter" $ [qn| foo {1+2} |] `shouldBe` "foo {1+2}" it "Type annotation in interpolation block" $ [qn|{10 :: Float}|] `shouldBe` "{10 :: Float}" it "Escaping interpolation symbols inside interpolation block" $ do [qn|foo {"b{a{r"} baz|] `shouldBe` "foo {\"b{a{r\"} baz" [qn|foo {"b\}a\}r"} baz|] `shouldBe` "foo {\"b\\}a\\}r\"} baz" it "Example from generated docs" $ [qn| foo {'b':'a':'r':""} \ baz |] `shouldBe` "foo {'b':'a':'r':\"\"} baz" it "Escaping backslashes" $ do [qn| foo\bar |] `shouldBe` "foo\\bar" [qn| foo\\bar |] `shouldBe` "foo\\bar" [qn| foo\\\bar |] `shouldBe` "foo\\\\bar" [qn| foo\\\\bar |] `shouldBe` "foo\\\\bar" it "Empty string" $ [qn| |] `shouldBe` "" it "Escaping space by slash at EOL after space" $ [qn| foo \ bar |] `shouldBe` "foo bar" it "Escaped spaces at the edges" $ do [qn| foo\ |] `shouldBe` "foo " [qn|\ foo |] `shouldBe` " foo"