@@ -5,12 +5,13 @@
55import Test.QuickCheck
66import Text.Show.Functions ()
77
8+import qualified Data.Bits as Bits (shiftL, shiftR)
89import Data.Char (chr, isLower, isSpace, isUpper, ord)
910import Data.Monoid (Monoid(..))
1011import Data.String (fromString)
1112import Debug.Trace (trace)
1213import Control.Arrow ((***), second)
13−import Data.Word (Word8)
14+import Data.Word (Word8, Word16, Word32)
1415import qualified Data.Text as T
1516import qualified Data.Text.Compat as C
1617import qualified Data.Text.Lazy as TL
@@ -20,6 +21,7 @@ import qualified Data.Text.Fusion as S
2021import qualified Data.Text.Fusion.Common as S
2122import qualified Data.Text.Lazy.Encoding as EL
2223import qualified Data.Text.Lazy.Fusion as SL
24+import qualified Data.Text.UnsafeShift as U
2325import qualified Data.List as L
2426import System.IO.Unsafe (unsafePerformIO)
2527import Test.Framework (defaultMain, testGroup)
@@ -465,6 +467,21 @@ sf_zipWith p c s = (L.zipWith c (L.filter p s) . L.filter p) `eqP` (unpackS . S
465467t_zipWith c s = L.zipWith c s `eqP` (unpackS . T.zipWith c (packS s))
466468tl_zipWith c s = L.zipWith c s `eqP` (unpackS . TL.zipWith c (packS s))
467469
470+-- Bit shifts.
471+shiftL w = forAll (choose (0,width-1)) $ \k -> Bits.shiftL w k == U.shiftL w k
472+ where width = round (log (fromIntegral m) / log 2)
473+ (m,_) = (maxBound, m == w)
474+shiftR w = forAll (choose (0,width-1)) $ \k -> Bits.shiftR w k == U.shiftR w k
475+ where width = round (log (fromIntegral m) / log 2)
476+ (m,_) = (maxBound, m == w)
477+
478+shiftL_Int = shiftL :: Int -> Property
479+shiftL_Word16 = shiftL :: Word16 -> Property
480+shiftL_Word32 = shiftL :: Word32 -> Property
481+shiftR_Int = shiftR :: Int -> Property
482+shiftR_Word16 = shiftR :: Word16 -> Property
483+shiftR_Word32 = shiftR :: Word32 -> Property
484+
468485-- Regression tests.
469486s_filter_eq s = S.filter p t == S.streamList (filter p s)
470487 where p = (/= S.last t)
@@ -799,5 +816,14 @@ tests = [
799816
800817 testGroup "regressions" [
801818 testProperty "s_filter_eq" s_filter_eq
819+ ],
820+
821+ testGroup "shifts" [
822+ testProperty "shiftL_Int" shiftL_Int,
823+ testProperty "shiftL_Word16" shiftL_Word16,
824+ testProperty "shiftL_Word32" shiftL_Word32,
825+ testProperty "shiftR_Int" shiftR_Int,
826+ testProperty "shiftR_Word16" shiftR_Word16,
827+ testProperty "shiftR_Word32" shiftR_Word32
802828 ]
803829 ]