on master help sign in
warp/test/readInt.hs : Update tests to add readDecimal_ from bytestring-lexing.
commitfefaec89502d2a57bb30d780568ea8393196efa1 authorErik de Castro Lopo <erikd@mega-nerd.com> dateWed 8 Feb 2012, 20:05 (15 years ago) parentc82e85d
1 file changed+21−23
warp/test/readInt.hs+21−23
warp/test/readInt.hs+21−23
@@ -19,10 +19,7 @@ import qualified Data.ByteString.Char8 as B
1919import qualified Data.Char as C
2020import qualified Numeric as N
2121import qualified Test.QuickCheck as QC
22−
23−-- ReadInt is a module internal to Warp.
24−import qualified ReadInt as RI
25−
22+import qualified Data.ByteString.Lex.Integral as LI
2623
2724import GHC.Prim
2825import GHC.Types
@@ -55,21 +52,17 @@ readIntRaw =
5552 B.foldl' (\i c -> i * 10 + C.digitToInt c) 0
5653
5754
58−-- The best solution.
59−readIntTC :: Integral a => ByteString -> a
60−readIntTC bs = fromIntegral
61− $ B.foldl' (\i c -> i * 10 + C.digitToInt c) 0 $ B.takeWhile C.isDigit bs
62−
55+-- The first good solution.
56+readInt64 :: ByteString -> Int64
57+readInt64 bs =
58+ B.foldl' (\i c -> i * 10 + fromIntegral (C.digitToInt c)) (0::Int64)
59+ $ B.takeWhile C.isDigit bs
6360
64−-- Three specialisations of readIntTC.
6561readInt :: ByteString -> Int
66−readInt = readIntTC
67−
68−readInt64 :: ByteString -> Int64
69−readInt64 = readIntTC
62+readInt bs = fromIntegral $ readInt64 bs
7063
7164readInteger :: ByteString -> Integer
72−readInteger = readIntTC
65+readInteger bs = fromIntegral $ readInt64 bs
7366
7467
7568-- MagicHash version suggested by Vincent Hanquez.
@@ -90,7 +83,7 @@ readIntegerMH = readIntMH
9083data Table = Table !Addr#
9184
9285mhDigitToInt :: Char -> Int
93−mhDigitToInt (C# i) = I# (word2Int# $ indexWord8OffAddr# addr (ord# i))
86+mhDigitToInt (C# i) = I# (word2Int# (indexWord8OffAddr# addr (ord# i)))
9487 where
9588 !(Table addr) = table
9689 table :: Table
@@ -113,9 +106,11 @@ mhDigitToInt (C# i) = I# (word2Int# $ indexWord8OffAddr# addr (ord# i))
113106 \\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#
114107
115108
116−-- This is the one Warp actually uses.
117−readIntWarp :: ByteString -> Integer
118−readIntWarp s = fromIntegral $ RI.readInt64 s
109+readIntBSL :: ByteString -> Int
110+readIntBSL = LI.readDecimal_
111+
112+readInt64BSL :: ByteString -> Int64
113+readInt64BSL = LI.readDecimal_
119114
120115
121116-- A QuickCheck property. Test that for a number >= 0, converting it to
@@ -124,7 +119,7 @@ readIntWarp s = fromIntegral $ RI.readInt64 s
124119-- The functions under test only work on Natural numbers (the Conent-Length
125120-- field in a HTTP header is always >= 0) so we check the absolute value of
126121-- the value that QuickCheck generates for us.
127−prop_read_show_idempotent :: Integral a => (ByteString -> a) -> a -> Bool
122+prop_read_show_idempotent :: (Integral a, Show a) => (ByteString -> a) -> a -> Bool
128123prop_read_show_idempotent freader x =
129124 let px = abs x
130125 in px == freader (B.pack $ show px)
@@ -137,8 +132,8 @@ runQuickCheckTests = do
137132 QC.quickCheck (prop_read_show_idempotent readInteger)
138133 QC.quickCheck (prop_read_show_idempotent readInt64MH)
139134 QC.quickCheck (prop_read_show_idempotent readIntegerMH)
140− QC.quickCheck (prop_read_show_idempotent readIntWarp)
141−
135+ QC.quickCheck (prop_read_show_idempotent readIntBSL)
136+ QC.quickCheck (prop_read_show_idempotent readInt64BSL)
142137
143138runCriterionTests :: ByteString -> IO ()
144139runCriterionTests number =
@@ -152,7 +147,10 @@ runCriterionTests number =
152147 , bench "readInteger" $ nf readInteger number
153148 , bench "readInt64MH" $ nf readInt64MH number
154149 , bench "readIntegerMH" $ nf readIntegerMH number
155− , bench "readIntWarp" $ nf readIntWarp number
150+
151+ -- Current best.
152+ , bench "readIntBSL" $ nf readIntBSL number
153+ , bench "readInt64BSL" $ nf readInt64BSL number
156154 ]
157155
158156main :: IO ()