diff --git a/tests/UnitTests.hs b/tests/UnitTests.hs index 4e625e0..ee2c975 100644 --- a/tests/UnitTests.hs +++ b/tests/UnitTests.hs @@ -21,6 +21,7 @@ import qualified Data.Text as T import qualified Data.Text.Lazy as LT import qualified Data.Vector as V import qualified Data.Foldable as F +import Data.List (isPrefixOf) import Data.Word import Numeric.Natural import GHC.Generics (Generic) @@ -56,6 +57,14 @@ assertResult input expected res = case res of " input: " ++ show (BL8.unpack input) ++ "\n" ++ "parse error: " ++ err +decodeFailsWith :: BL.ByteString -> String -> Assertion +decodeFailsWith input expected = case decode NoHeader input of + Right r -> assertFailure $ "input: " ++ show (BL8.unpack input) ++ "\n" ++ + "retuned: " ++ show (r :: (V.Vector (V.Vector B.ByteString))) ++ "\n" ++ + "whereas should have failed with " <> expected + Left err -> assertBool ("got " <> err <> "\ninstead of " <> expected) + $ ("parse error ("++expected++")") `isPrefixOf` err + encodesAs :: [[B.ByteString]] -> BL.ByteString -> Assertion encodesAs input expected = encode (map V.fromList input) @?= expected @@ -166,6 +175,7 @@ positionalTests = [ testGroup "decode" $ map streamingDecodeTest decodeTests , testGroup "decodeWith" $ map streamingDecodeWithTest decodeWithTests ] + , testGroup "escaped" escapedTests ] where rfc4180Input = BL8.pack $ @@ -210,6 +220,15 @@ positionalTests = defEncAllEnq = defaultEncodeOptions { encQuoting = QuoteAll } defDec = defaultDecodeOptions + escapedTests = [ + testCase "escaped" $ + "\"x,y\",z\nbaz,\"bar\nfoo,\"" `decodesAs` [["x,y", "z"], ["baz", "bar\nfoo,"]], + testCase "escapedMalformed1" $ + "\"x,\"y" `decodeFailsWith` "endOfInput", + testCase "escapedMalformed0" $ + "baz,\"" `decodeFailsWith` "endOfInput" + ] + nameBasedTests :: [TF.Test] nameBasedTests = [ testGroup "encode" $ map encodeTest