packages feed

hgeometry-0.7.0.0: test/Data/OrdSeqSpec.hs

{-# LANGUAGE ScopedTypeVariables #-}
module Data.OrdSeqSpec where

import qualified Data.Foldable as F
import qualified Data.List as List
import           Data.OrdSeq (OrdSeq)
import qualified Data.OrdSeq as OrdSeq
import           Data.Semigroup
import           Test.QuickCheck.HGeometryInstances
import           Test.Hspec
import           Test.QuickCheck

spec :: Spec
spec = do
  describe "OrdSeq tests" $ do
    it "fromListBy" $
      property $ \(xs :: [Int]) ->
          F.toList (OrdSeq.fromListBy compare xs) `shouldBe` List.sort xs
    it "splitOn, <" $
      property $ \x (xs :: OrdSeq Int) ->
          let (l,_,_) = OrdSeq.splitOn id x xs
          in all (< x) l
    it "splitOn, ==" $
      property $ \x (xs :: OrdSeq Int) ->
          let (_,m,_) = OrdSeq.splitOn id x xs
          in all (== x) m
    it "splitOn, >=" $
      property $ \x (xs :: OrdSeq Int) ->
          let (_,_,r) = OrdSeq.splitOn id x xs
          in all (> x) r
    it "join" $
      property $ \x (xs :: [Int]) -> let (ys,zs) = List.partition (<= x) $ xs in
          (F.toList $ OrdSeq.fromListByOrd ys <> OrdSeq.fromListByOrd zs)
          `shouldBe`
          List.sort (ys <> zs)
    it "positive member" $
      property $ \(xs :: OrdSeq Int) ->
         all (\x -> OrdSeq.memberBy compare x xs) xs
    it "member" $
      property $ \x (xs :: OrdSeq Int) ->
         OrdSeq.memberBy compare x xs
         `shouldBe`
         F.elem x (F.toList xs)
    it "lookupMin" $
       property $ \(xs :: OrdSeq Int) ->
         OrdSeq.lookupMin xs
         `shouldBe`
         (safe minimum $ F.toList xs)
    it "lookupMax" $
       property $ \(xs :: OrdSeq Int) ->
         OrdSeq.lookupMax xs
         `shouldBe`
         (safe maximum $ F.toList xs)


safe      :: ([t] -> a) -> [t] -> Maybe a
safe _ [] = Nothing
safe f xs = Just . f $ xs