writeBytes = lwriteBytes,
closeConn = return ()}
where
- lreadBytes count =
- do (s,sw) <- get
- if genericLength s < count
- then fail "EOF in input in readBytes"
- else do let (r, s') = genericSplitAt count s
- put (s', sw)
- return r
+ lreadBytes count
+ | count < 0 = fail "readBytes: negative count"
+ | otherwise =
+ do (s,sw) <- get
+ if genericLength s < count
+ then fail "EOF in input in readBytes"
+ else do let (r, s') = genericSplitAt count s
+ put (s', sw)
+ return r
lreadLine =
do (s, sw) <- get
let (line, remainder) = spanList (\x -> "\r\n" /= take 2 x) s
prop_readLine :: [String] -> Property
prop_readLine s =
- (not (null s)) && (and (map (notElem '\r') s)) ==>
+ (and (map (notElem '\r') s)) ==>
runLinesConnection s readLine @?=
- Right (head s, (expectedString (tail s), []))
+ if null s
+ then Left "EOF in input in readLine"
+ else Right (head s, (expectedString (tail s), []))
-prop_readBytes :: String -> Int -> Property
+prop_readBytes :: String -> Int -> Result
prop_readBytes s l =
- l <= length s && l >= 0 ==>
- runStringConnection s (\c -> readBytes c (fromIntegral l)) ==
- Right (take l s, (drop l s, []))
+ runStringConnection s (\c -> readBytes c (fromIntegral l)) @?=
+ if l < 0
+ then Left "readBytes: negative count"
+ else case compare l (length s) of
+ EQ -> Right (take l s, (drop l s, []))
+ LT -> Right (take l s, (drop l s, []))
+ GT -> Left "EOF in input in readBytes"
q :: Testable a => String -> a -> HU.Test
q = qccheck (defaultConfig {configMaxTest = 250, configMaxFail = 5000})