@@ -123,22 +123,38 @@ data Badness = Solo | Leading | Trailing
123
123
instance Arbitrary Badness where
124
124
arbitrary = elements [Solo , Leading , Trailing ]
125
125
126
- t_utf8_err :: Badness -> DecodeErr -> Property
127
- t_utf8_err bad de = do
126
+ t_utf8_err :: Badness -> Maybe DecodeErr -> Property
127
+ t_utf8_err bad mde = do
128
128
let gen = case bad of
129
129
Solo -> genInvalidUTF8
130
130
Leading -> B. append <$> genInvalidUTF8 <*> genUTF8
131
131
Trailing -> B. append <$> genUTF8 <*> genInvalidUTF8
132
132
genUTF8 = E. encodeUtf8 <$> genUnicode
133
- forAll gen $ \ bs -> MkProperty $ do
134
- onErr <- genDecodeErr de
135
- unProperty . monadicIO $ do
136
- l <- run $ let len = T. length (E. decodeUtf8With onErr bs)
137
- in (len `seq` return (Right len)) `Exception.catch`
138
- (\ (e:: UnicodeException ) -> return (Left e))
139
- assert $ case l of
140
- Left err -> length (show err) >= 0
141
- Right _ -> de /= Strict
133
+ forAll gen $ \ bs -> MkProperty $
134
+ case mde of
135
+ -- generate an invalid character
136
+ Nothing -> do
137
+ c <- choose (' \x10000 ' , maxBound )
138
+ let onErr _ _ = Just c
139
+ unProperty . monadicIO $ do
140
+ l <- run $ let len = T. length (E. decodeUtf8With onErr bs)
141
+ in (len `seq` return (Right len)) `Exception.catch`
142
+ (\ (e:: Exception. SomeException ) -> return (Left e))
143
+ assert $ case l of
144
+ Left err ->
145
+ " non-BMP replacement characters not supported" `T.isInfixOf` T. pack (show err)
146
+ Right _ -> False
147
+
148
+ -- generate a valid onErr
149
+ Just de -> do
150
+ onErr <- genDecodeErr de
151
+ unProperty . monadicIO $ do
152
+ l <- run $ let len = T. length (E. decodeUtf8With onErr bs)
153
+ in (len `seq` return (Right len)) `Exception.catch`
154
+ (\ (e:: UnicodeException ) -> return (Left e))
155
+ assert $ case l of
156
+ Left err -> length (show err) >= 0
157
+ Right _ -> de /= Strict
142
158
143
159
t_utf8_err' :: B. ByteString -> Property
144
160
t_utf8_err' bs = monadicIO . assert $ case E. decodeUtf8' bs of
@@ -204,9 +220,10 @@ t_decode_with_error4' =
204
220
case E. streamDecodeUtf8With (\ _ _ -> Just ' x' ) (B. pack [0xC2 , 97 , 97 , 97 ]) of
205
221
E. Some x _ _ -> x === " xaaa"
206
222
207
- t_infix_concat bs1 text bs2 rep =
223
+ t_infix_concat bs1 text bs2 =
224
+ forAll (genDecodeErr Replace ) $ \ onErr ->
208
225
text `T.isInfixOf`
209
- E. decodeUtf8With ( \ _ _ -> rep) (B. concat [bs1, E. encodeUtf8 text, bs2])
226
+ E. decodeUtf8With onErr (B. concat [bs1, E. encodeUtf8 text, bs2])
210
227
211
228
s_Eq s = (s== ) `eq` ((S. streamList s== ) . S. streamList)
212
229
where _types = s :: String
0 commit comments