sized-wrapper-0.1.0.0: test/Data/SizedSpec.hs
{-# LANGUAGE NoOverloadedLists #-}
{-# LANGUAGE NoOverloadedStrings #-}
module Data.SizedSpec
( main,
spec,
)
where
import Data.Proxy
import Data.Sized
import Test.Hspec
main :: IO ()
main = hspec spec
spec :: Spec
spec = do
it "Singleton creation should be equivalent to a single element list" $
singleton (Proxy @[Int]) 42 `shouldBe` trustedSized [42]
describe "sized creation" $ do
describe "Exactly" $ do
it "(Exactly 3) on three items list should be equivalent to the wrapped list" $
sized @(Exactly 3) @[Int] [1, 2, 3] `shouldBe` Just (trustedSized [1, 2, 3])
it "(Exactly 0) on empty list should be equivalent to the wrapped list" $
sized @(Exactly 0) @[Int] [] `shouldBe` Just (trustedSized [])
it "(Exactly 3) on empty list should be Nothing" $
sized @(Exactly 3) @[Int] [] `shouldBe` Nothing
describe "AtLeast" $ do
it "(AtLeast 3) on three items list should be equivalent to the wrapped list" $
sized @(AtLeast 3) @[Int] [1, 2, 3] `shouldBe` Just (trustedSized [1, 2, 3])
it "(AtLeast 0) on empty list should be equivalent to the wrapped list" $
sized @(AtLeast 0) @[Int] [] `shouldBe` Just (trustedSized [])
it "(AtLeast 3) on empty list should be Nothing" $
sized @(AtLeast 3) @[Int] [] `shouldBe` Nothing
describe "AtMost" $ do
it "(AtMost 3) on three items list should be equivalent to the wrapped list" $
sized @(AtMost 3) @[Int] [1, 2, 3] `shouldBe` Just (trustedSized [1, 2, 3])
it "(AtMost 0) on empty list should be equivalent to the wrapped list" $
sized @(AtMost 0) @[Int] [] `shouldBe` Just (trustedSized [])
it "(AtMost 3) on a 4-items list should be Nothing" $
sized @(AtMost 3) @[Int] [1, 2, 3, 4] `shouldBe` Nothing
describe "Between" $ do
it "(Between 3 3) on three items list should be equivalent to the wrapped list" $
sized @(Between 3 3) @[Int] [1, 2, 3] `shouldBe` Just (trustedSized [1, 2, 3])
it "(Between 0 0) on empty list should be equivalent to the wrapped list" $
sized @(Between 0 0) @[Int] [] `shouldBe` Just (trustedSized [])
it "(Between 3 3) on a 4-items list should be Nothing" $
sized @(Between 3 3) @[Int] [1, 2, 3, 4] `shouldBe` Nothing
it "(Between 2 4) on three items list should be equivalent to the wrapped list" $
sized @(Between 2 4) @[Int] [1, 2, 3] `shouldBe` Just (trustedSized [1, 2, 3])
it "(Between 0 4) on empty list should be equivalent to the wrapped list" $
sized @(Between 0 4) @[Int] [] `shouldBe` Just (trustedSized [])
it "(Between 1 3) on a 4-items list should be Nothing" $
sized @(Between 1 3) @[Int] [1, 2, 3, 4] `shouldBe` Nothing
it "(Between 5 7) on a 4-items list should be Nothing" $
sized @(Between 5 7) @[Int] [1, 2, 3, 4] `shouldBe` Nothing
describe "approximate" $ do
describe "Exactly" $ do
it "(Exactly 3) approximates to (Between 3 3)" $
approximate (trustedSized @[Int] @(Exactly 3) [1, 2, 3]) `shouldBe` trustedSized @[Int] @(Between 3 3) [1, 2, 3]
it "(Exactly 3) approximates to (Between 0 3)" $
approximate (trustedSized @[Int] @(Exactly 3) [1, 2, 3]) `shouldBe` trustedSized @[Int] @(Between 0 3) [1, 2, 3]
it "(Exactly 3) approximates to (Between 3 5)" $
approximate (trustedSized @[Int] @(Exactly 3) [1, 2, 3]) `shouldBe` trustedSized @[Int] @(Between 3 5) [1, 2, 3]
it "(Exactly 3) approximates to (AtLeast 3)" $
approximate (trustedSized @[Int] @(Exactly 3) [1, 2, 3]) `shouldBe` trustedSized @[Int] @(AtLeast 3) [1, 2, 3]
it "(Exactly 3) approximates to (AtMost 3)" $
approximate (trustedSized @[Int] @(Exactly 3) [1, 2, 3]) `shouldBe` trustedSized @[Int] @(AtMost 3) [1, 2, 3]
it "(Exactly 3) approximates to (AtLeast 1)" $
approximate (trustedSized @[Int] @(Exactly 3) [1, 2, 3]) `shouldBe` trustedSized @[Int] @(AtLeast 1) [1, 2, 3]
it "(Exactly 3) approximates to (AtMost 5)" $
approximate (trustedSized @[Int] @(Exactly 3) [1, 2, 3]) `shouldBe` trustedSized @[Int] @(AtMost 5) [1, 2, 3]
describe "AtLeast" $ do
it "(AtLeast 3) approximates to (AtLeast 2)" $
approximate (trustedSized @[Int] @(AtLeast 3) [1, 2, 3]) `shouldBe` trustedSized @[Int] @(AtLeast 2) [1, 2, 3]
describe "AtMost" $ do
it "(AtMost 3) approximates to (AtMost 4)" $
approximate (trustedSized @[Int] @(AtMost 3) [1, 2, 3]) `shouldBe` trustedSized @[Int] @(AtMost 4) [1, 2, 3]
describe "Between" $ do
it "(Between 3 3) approximates to (Between 3 3)" $
approximate (trustedSized @[Int] @(Between 3 3) [1, 2, 3]) `shouldBe` trustedSized @[Int] @(Between 3 3) [1, 2, 3]
it "(Between 3 3) approximates to (Between 0 3)" $
approximate (trustedSized @[Int] @(Between 3 3) [1, 2, 3]) `shouldBe` trustedSized @[Int] @(Between 0 3) [1, 2, 3]
it "(Between 3 3) approximates to (Between 3 5)" $
approximate (trustedSized @[Int] @(Between 3 3) [1, 2, 3]) `shouldBe` trustedSized @[Int] @(Between 3 5) [1, 2, 3]
it "(Between 3 3) approximates to (AtLeast 3)" $
approximate (trustedSized @[Int] @(Between 3 3) [1, 2, 3]) `shouldBe` trustedSized @[Int] @(AtLeast 3) [1, 2, 3]
it "(Between 3 3) approximates to (AtMost 3)" $
approximate (trustedSized @[Int] @(Between 3 3) [1, 2, 3]) `shouldBe` trustedSized @[Int] @(AtMost 3) [1, 2, 3]
it "(Between 3 3) approximates to (AtLeast 1)" $
approximate (trustedSized @[Int] @(Between 3 3) [1, 2, 3]) `shouldBe` trustedSized @[Int] @(AtLeast 1) [1, 2, 3]
it "(Between 3 3) approximates to (AtMost 5)" $
approximate (trustedSized @[Int] @(Between 3 3) [1, 2, 3]) `shouldBe` trustedSized @[Int] @(AtMost 5) [1, 2, 3]
-- it "prepend should use semigroup" $
-- singleton (Proxy @[Int]) 1 <| [2] `shouldBe` trustedSized [1, 2]
-- it "append should use semigroup" $
-- [1] |> singleton (Proxy @[Int]) 2 `shouldBe` trustedSized [1, 2]