Commits

Bryan O'Sullivan  committed 120837e

Add QuickCheck properties.

  • Participants
  • Parent commits 959bf5e

Comments (0)

Files changed (2)

File blaze-textual.cabal

     cpp-options: -DINTEGER_GMP
     build-depends: integer >= 0.1 && < 0.2
 
+test-suite tests
+  type:           exitcode-stdio-1.0
+  hs-source-dirs: tests
+  main-is:        QC.hs
+  ghc-options:    -Wall -threaded -rtsopts
+  build-depends:
+    QuickCheck >= 2.4.0.1,
+    base,
+    blaze-builder,
+    blaze-textual,
+    bytestring,
+    double-conversion,
+    test-framework >= 0.3.3 && < 0.5,
+    test-framework-quickcheck2 >= 0.2.9 && < 0.3
+
 source-repository head
   type:     git
   location: http://github.com/mailrank/blaze-textual
+module Main (main) where
+
+import Blaze.ByteString.Builder (Builder, toByteString)
+import Blaze.Text (double, float, integral)
+import Data.Int (Int8, Int16, Int32, Int64)
+import Data.Word (Word, Word8, Word16, Word32, Word64)
+import Test.Framework (Test, defaultMain, testGroup)
+import Test.Framework.Providers.QuickCheck2 (testProperty)
+import qualified Data.ByteString.Char8 as B
+
+-- Integral values should be rendered exactly as Haskell does.
+t_integral :: Integral a => a -> a -> Bool
+t_integral _ i = toByteString (integral i) == B.pack (show i)
+
+-- This package doesn't render floating point numbers exactly as
+-- Haskell does, but the numbers it renders should read back exactly.
+-- So that's the property we check.
+t_real :: (RealFloat a, Read a) => (a -> Builder) -> a -> a -> Bool
+t_real f i j =
+    case read (B.unpack . toByteString . f $ ij) of
+      r | isNaN r      -> isNaN ij
+        | isInfinite r -> isInfinite ij && signum r == signum ij
+        | otherwise    -> r == ij
+  where ij = i / j
+
+main :: IO ()
+main = defaultMain tests
+
+tests :: [Test]
+tests = [
+    testGroup "int" [ testProperty "Integer" $ t_integral (undefined::Integer)
+                    , testProperty "Int" $ t_integral (undefined::Int)
+                    , testProperty "Int8" $ t_integral (undefined::Int8)
+                    , testProperty "Int16" $ t_integral (undefined::Int16)
+                    , testProperty "Int32" $ t_integral (undefined::Int32)
+                    , testProperty "Int64" $ t_integral (undefined::Int64)
+                    ]
+  , testGroup "word" [ testProperty "Word" $ t_integral (undefined::Word)
+                     , testProperty "Word8" $ t_integral (undefined::Word8)
+                     , testProperty "Word16" $ t_integral (undefined::Word16)
+                     , testProperty "Word32" $ t_integral (undefined::Word32)
+                     , testProperty "Word64" $ t_integral (undefined::Word64)
+                     ]
+  , testProperty "Double" $ t_real double
+  , testProperty "Float" $ t_real float
+  ]