packages feed

leancheck-instances-0.0.2: test/main.hs

-- Copyright (c) 2015-2018 Rudy Matela.
-- Distributed under the 3-Clause BSD licence (see the file LICENSE).
import System.Exit (exitFailure)
import Data.List (elemIndices)
import qualified Data.Text as T
import qualified Data.ByteString as BS
import qualified Data.ByteString.Lazy as BL
import Data.Set (Set)
import Data.Map (Map)
import Data.Sequence (Seq)
import qualified Data.Set as Set
import qualified Data.Map as Map
import qualified Data.Sequence as Seq
import Numeric.Natural

import Test.LeanCheck
import Test.LeanCheck.Instances

main :: IO ()
main =
  case elemIndices False (tests 1000) of
  [] -> putStrLn "Tests passed!"
  is -> putStrLn ("Failed tests:" ++ show is) >> exitFailure

tests :: Int -> [Bool]
tests n =
  [ True

  , fails n $ \ts -> T.words (T.unwords ts) == ts
  , fails n $ \t ->   T.unwords (T.words t) == t
  , holds n $ \ts ->   T.words (T.unwords (T.words ts)) == T.words ts

  , holds n $ \x y -> x + y == y + (x :: Natural)
  , fails n $ \x y -> x + y == (x :: Natural)

  , fails n $ \bs -> BS.reverse bs == bs
  , holds n $ \bs -> BS.reverse (BS.reverse bs) == bs

  , fails n $ \bs -> BL.reverse bs == bs
  , holds n $ \bs -> BL.reverse (BL.reverse bs) == bs

  , holds n $ \s -> Seq.reverse (Seq.reverse s :: Seq Int) == s
  , fails n $ \s -> Seq.reverse (s :: Seq Int) == s

  , holds n $ \a b -> a `Set.union` b == b `Set.union` (a :: Set Int)
  , fails n $ \a b -> a `Set.union` b == (a :: Set Int)

  , fails n $ \m1 m2 -> m1 `Map.union` m2 == m2 `Map.union` (m1 :: Map Int Int)
  , holds n $ \m1 -> m1 `Map.union` m1 == (m1 :: Map Int Int)
  ]