packages feed

nri-prelude-0.1.0.0: tests/DictSpec.hs

module DictSpec (tests) where

import Basics
import qualified Dict
import qualified Expect
import qualified List
import Maybe (Maybe (Just, Nothing))
import Test (Test, describe, test)
import Text (Text)

tests :: Test
tests =
  let buildTests =
        describe
          "build Tests"
          [ test "empty" <| \() -> Expect.equal (Dict.fromList []) (Dict.empty :: Dict.Dict () ()),
            test "singleton" <| \() -> Expect.equal (Dict.fromList [(k, v)]) (Dict.singleton k v),
            test "insert" <| \() -> Expect.equal (Dict.fromList [(k, v)]) (Dict.insert k v Dict.empty),
            test "insert replace" <| \() -> Expect.equal (Dict.fromList [(k, vv)]) (Dict.insert k vv (Dict.singleton k v)),
            test "update" <| \() -> Expect.equal (Dict.fromList [(k, vv)]) (Dict.update k (\_v -> Just vv) (Dict.singleton k v)),
            test "update Nothing" <| \() -> Expect.equal Dict.empty (Dict.update k (always Nothing) (Dict.singleton k v)),
            test "remove" <| \() -> Expect.equal Dict.empty (Dict.remove k (Dict.singleton k v)),
            test "remove not found" <| \() -> Expect.equal (Dict.singleton k v) (Dict.remove kk (Dict.singleton k v))
          ]
      queryTests =
        describe
          "query Tests"
          [ test "member 1" <| \() -> Expect.equal True (Dict.member tom animals),
            test "member 2" <| \() -> Expect.equal False (Dict.member spike animals),
            test "get 1" <| \() -> Expect.equal (Just cat) (Dict.get tom animals),
            test "get 2" <| \() -> Expect.equal Nothing (Dict.get spike animals),
            test "size of empty dictionary" <| \() -> Expect.equal 0 (Dict.size Dict.empty),
            test "size of example dictionary" <| \() -> Expect.equal 2 (Dict.size animals)
          ]
      combineTests =
        describe
          "combine Tests"
          [ test "union" <| \() -> Expect.equal animals (Dict.union (Dict.singleton jerry mouse) (Dict.singleton "Tom" "cat")),
            test "union collison" <| \() -> Expect.equal (Dict.singleton tom cat) (Dict.union (Dict.singleton "Tom" "cat") (Dict.singleton "Tom" "mouse")),
            test "intersect" <| \() -> Expect.equal (Dict.singleton tom cat) (Dict.intersect animals (Dict.singleton "Tom" "cat")),
            test "diff" <| \() -> Expect.equal (Dict.singleton jerry mouse) (Dict.diff animals (Dict.singleton tom cat))
          ]
      transformTests =
        describe
          "transform Tests"
          [ test "filter" <| \() -> Expect.equal (Dict.singleton tom cat) (Dict.filter (\key _v -> key == "Tom") animals),
            test "partition" <| \() -> Expect.equal (Dict.singleton tom cat, Dict.singleton "Jerry" "mouse") (Dict.partition (\key _v -> key == "Tom") animals)
          ]
      mergeTests =
        let insertBoth key leftVal rightVal =
              Dict.insert key (leftVal ++ rightVal)
            s1 =
              Dict.empty |> Dict.insert u1 [1]
            s2 =
              Dict.empty |> Dict.insert u2 [2]
            s23 =
              Dict.empty |> Dict.insert u2 [3]
            b1 =
              List.map (\i -> (i, [i])) (List.range 1 10) |> Dict.fromList
            b2 =
              List.map (\i -> (i, [i])) (List.range 5 15) |> Dict.fromList
            bExpected =
              [(1, [1]), (2, [2]), (3, [3]), (4, [4]), (5, [5, 5]), (6, [6, 6]), (7, [7, 7]), (8, [8, 8]), (9, [9, 9]), (10, [10, 10]), (11, [11]), (12, [12]), (13, [13]), (14, [14]), (15, [15])]
         in describe
              "merge Tests"
              [ test "merge empties" <| \() ->
                  Expect.equal
                    (Dict.empty :: Dict.Dict Text [Int])
                    (Dict.merge Dict.insert insertBoth Dict.insert Dict.empty Dict.empty Dict.empty),
                test "merge singletons in order" <| \() ->
                  Expect.equal
                    [(u1, [1 :: Int]), (u2, [2])]
                    (Dict.toList (Dict.merge Dict.insert insertBoth Dict.insert s1 s2 Dict.empty)),
                test "merge singletons out of order" <| \() ->
                  Expect.equal
                    [(u1, [1]), (u2, [2])]
                    (Dict.toList (Dict.merge Dict.insert insertBoth Dict.insert s2 s1 Dict.empty)),
                test "merge with duplicate key" <| \() ->
                  Expect.equal
                    [(u2, [2, 3])]
                    (Dict.toList (Dict.merge Dict.insert insertBoth Dict.insert s2 s23 Dict.empty)),
                test "partially overlapping" <| \() ->
                  Expect.equal
                    bExpected
                    (Dict.toList (Dict.merge Dict.insert insertBoth Dict.insert b1 b2 Dict.empty))
              ]
   in describe
        "Dict Tests"
        [ buildTests,
          queryTests,
          combineTests,
          transformTests,
          mergeTests
        ]

-- Most of the names below exist because Haskell can't figure out the string
-- type to use, so we must annotate the type. They're here rather than in the
-- tests above because it gets noisy with all the annotations in-line. The
-- original Elm tests did not have this problem.
--
k :: Text
k = "k"

kk :: Text
kk = "kk"

v :: Text
v = "v"

vv :: Text
vv = "vv"

animals :: Dict.Dict Text Text
animals =
  Dict.fromList [("Tom", "cat"), ("Jerry", "mouse")]

tom :: Text
tom = "Tom"

spike :: Text
spike = "Spike"

jerry :: Text
jerry = "Jerry"

cat :: Text
cat = "cat"

mouse :: Text
mouse = "mouse"

u1 :: Text
u1 = "u1"

u2 :: Text
u2 = "u2"