@@ -8,7 +8,7 @@ module Tests.Regressions
88
99import Control.Exception (SomeException, handle)
1010import System.IO
11−import Test.HUnit (assertBool, assertFailure)
11+import Test.HUnit (assertBool, assertEqual, assertFailure)
1212import qualified Data.ByteString as B
1313import Data.ByteString.Char8 ()
1414import qualified Data.ByteString.Lazy as LB
@@ -17,6 +17,7 @@ import qualified Data.Text.Encoding as TE
1717import qualified Data.Text.IO as T
1818import qualified Data.Text.Lazy as LT
1919import qualified Data.Text.Lazy.Encoding as LE
20+import qualified Data.Text.Unsafe as T
2021import qualified Test.Framework as F
2122import qualified Test.Framework.Providers.HUnit as F
2223
@@ -59,10 +60,23 @@ utf8_decode_unsafe = do
5960 let t = TE.decodeUtf8With (\_ _ -> Just '\xdc00') "\x80"
6061 assertBool "broken error recovery shouldn't break us" (t == "\xfffd")
6162
63+-- Reported by Eric Seidel: we mishandled mapping Chars that fit in a
64+-- single Word16 to Chars that require two.
65+mapAccumL_resize :: IO ()
66+mapAccumL_resize = do
67+ let f a _ = (a, '\65536')
68+ count = 5
69+ val = T.mapAccumL f 0 (T.replicate count "a")
70+ assertEqual "mapAccumL should correctly fill buffers for two-word results"
71+ (0, T.replicate count "\65536") val
72+ assertEqual "mapAccumL should correctly size buffers for two-word results"
73+ (count * 2) (T.lengthWord16 (snd val))
74+
6275tests :: F.Test
6376tests = F.testGroup "Regressions"
6477 [ F.testCase "hGetContents_crash" hGetContents_crash
6578 , F.testCase "lazy_encode_crash" lazy_encode_crash
79+ , F.testCase "mapAccumL_resize" mapAccumL_resize
6680 , F.testCase "replicate_crash" replicate_crash
6781 , F.testCase "utf8_decode_unsafe" utf8_decode_unsafe
6882 ]