packages feed

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