graphql-api-0.1.1: tests/OrderedMapTests.hs
module OrderedMapTests (tests) where
import Protolude
import Test.Hspec.QuickCheck (prop)
import Test.QuickCheck (Gen, arbitrary, forAll)
import Test.Tasty (TestTree)
import Test.Tasty.Hspec (testSpec, describe, it, shouldBe)
import qualified Data.Map as Map
import GraphQL.Internal.OrderedMap (OrderedMap)
import qualified GraphQL.Internal.OrderedMap as OrderedMap
orderedMaps :: Gen (OrderedMap Int Int)
orderedMaps = arbitrary
tests :: IO TestTree
tests = testSpec "OrderedMap" $ do
describe "Integrity" $ do
prop "fromList . toList == id" $ do
forAll orderedMaps (\x -> OrderedMap.orderedMap (OrderedMap.toList x) == Just x)
prop "keys == Map.keys . toMap" $ do
forAll orderedMaps (\x -> sort (OrderedMap.keys x) == sort (Map.keys (OrderedMap.toMap x)))
prop "keys == map fst . Map.toList" $ do
forAll orderedMaps (\x -> OrderedMap.keys x == map fst (OrderedMap.toList x))
prop "has unique keys" $ do
forAll orderedMaps (\x -> let ks = OrderedMap.keys x in ks == ordNub ks)
prop "all keys can be looked up" $ do
forAll orderedMaps (\x -> let keys = OrderedMap.keys x
values = OrderedMap.values x
in mapMaybe (flip OrderedMap.lookup x) keys == values)
it "empty is orderedMap []" $ do
Just (OrderedMap.empty @Int @Int) `shouldBe` OrderedMap.orderedMap []
prop "singleton x is orderedMap [x]" $ do
\x y -> Just (OrderedMap.singleton @Int @Int x y) == OrderedMap.orderedMap [(x, y)]
it "preserves insertion order" $ do
let items1 = [("foo", 2), ("bar", 1)]
let Just x = OrderedMap.orderedMap items1
OrderedMap.toList @Text @Int x `shouldBe` items1
let items2 = [("bar", 1), ("foo", 2)]
let Just y = OrderedMap.orderedMap items2
OrderedMap.toList @Text @Int y `shouldBe` items2