packages feed

sorted-list-0.3.1.0: tests/Main.hs

module Main (main) where

import Control.Monad (unless)
import Test.QuickCheck (Testable, isSuccess, quickCheckResult)
import System.Exit (exitFailure)
import Data.SortedList (SortedList)
import qualified Data.SortedList as SL
import qualified Data.List as List

-- | Test a property.
quickCheck :: Testable prop => String -> prop -> IO ()
quickCheck n p = do
  putStrLn $ "Testing property: " ++ n
  r <- quickCheckResult p
  unless (isSuccess r) exitFailure

applyAsList :: Ord a => ([a] -> [a]) -> SortedList a -> SortedList a
applyAsList f = SL.toSortedList . f . SL.fromSortedList

main :: IO ()
main = do
  quickCheck "toSortedList . fromSortedList = id" $
    \xs -> applyAsList id xs == (xs :: SortedList Int)
  quickCheck "insert" $
    \x xs -> SL.insert x xs == applyAsList ((:) x) (xs :: SortedList Int)
  quickCheck "delete" $
    \x xs -> let ys :: SortedList Int
                 ys = SL.toSortedList $ x : xs
             in  SL.delete x ys == applyAsList (List.delete x) ys
  quickCheck "deleteAll" $
    \x xs -> SL.deleteAll (x :: Int) xs == SL.filter (/=x) xs
  quickCheck "elemOrd" $
    \x xs -> SL.elemOrd x xs == List.elem (x :: Int) (SL.fromSortedList xs)
  quickCheck "nub" $
    \xs -> SL.nub xs == applyAsList List.nub (xs :: SortedList Int)