packages feed

array-list-0.2.0.0: tests/Main.hs

{-# LANGUAGE BlockArguments #-}
{-# LANGUAGE OverloadedLists #-}

import Data.Array
import Data.Array.IsList
import Test.Hspec

main :: IO ()
main = hspec do
  describe "array-list" do
    isListTest
    arrayNestedListTest

isListTest :: SpecWith ()
isListTest = describe "IsList" do
  describe "IsList (Array Int e)" do
    it "[1,2,3]" $
      ([1, 2, 3] :: Array Int Int)
        `shouldBe` array (0, 2) [(0, 1), (1, 2), (2, 3)]
    it "[\"one\",\"two\",\"three\"]" $
      (["one", "two", "three"] :: Array Int String)
        `shouldBe` array (0, 2) [(0, "one"), (1, "two"), (2, "three")]
    it "toList $ fromList [1,2,3]" $
      toList ([1, 2, 3] :: Array Int Int)
        `shouldBe` [1, 2, 3]
    it "toList $ fromList [\"one\",\"two\",\"three\"]" $
      toList (["one", "two", "three"] :: Array Int String)
        `shouldBe` ["one", "two", "three"]
  describe "IsList (Array (Int,Int) e)" do
    it "[[1, 2], [3, 4], [5, 6]]" $
      ( [ [1, 2],
          [3, 4],
          [5, 6]
        ] ::
          Array (Int, Int) Int
      )
        `shouldBe` array
          ((0, 0), (2, 1))
          [ ((0, 0), 1),
            ((0, 1), 2),
            ((1, 0), 3),
            ((1, 1), 4),
            ((2, 0), 5),
            ((2, 1), 6)
          ]
    it "toList . fromList == id" $
      toList
        ( [ [1, 2],
            [3, 4],
            [5, 6]
          ] ::
            Array (Int, Int) Int
        )
        `shouldBe` [[1, 2], [3, 4], [5, 6]]
  describe "IsList (Array (Int,Int,Int) e)" do
    it "3D-array" $
      ( [ [[1, 2, 3], [4, 5, 6]],
          [[7, 8, 9], [10, 11, 12]],
          [[13, 14, 15], [16, 17, 18]]
        ] ::
          Array (Int, Int, Int) Int
      )
        `shouldBe` array
          ((0, 0, 0), (2, 1, 2))
          [ ((0, 0, 0), 1),
            ((0, 0, 1), 2),
            ((0, 0, 2), 3),
            ((0, 1, 0), 4),
            ((0, 1, 1), 5),
            ((0, 1, 2), 6),
            ((1, 0, 0), 7),
            ((1, 0, 1), 8),
            ((1, 0, 2), 9),
            ((1, 1, 0), 10),
            ((1, 1, 1), 11),
            ((1, 1, 2), 12),
            ((2, 0, 0), 13),
            ((2, 0, 1), 14),
            ((2, 0, 2), 15),
            ((2, 1, 0), 16),
            ((2, 1, 1), 17),
            ((2, 1, 2), 18)
          ]
    it "toList . fromList == id" $
      toList
        ( [ [[1, 2, 3], [4, 5, 6]],
            [[7, 8, 9], [10, 11, 12]],
            [[13, 14, 15], [16, 17, 18]]
          ] ::
            Array (Int, Int, Int) Int
        )
        `shouldBe` [ [[1, 2, 3], [4, 5, 6]],
                     [[7, 8, 9], [10, 11, 12]],
                     [[13, 14, 15], [16, 17, 18]]
                   ]
  describe "IsList (Array (Int,Int,Int,Int) e)" do
    it "4D-array" $
      ( [ [ [[0, 1], [2, 3]],
            [[4, 5], [6, 7]]
          ],
          [ [[8, 9], [10, 11]],
            [[12, 13], [14, 15]]
          ]
        ] ::
          Array (Int, Int, Int, Int) Int
      )
        `shouldBe` array
          ((0, 0, 0, 0), (1, 1, 1, 1))
          [ ((0, 0, 0, 0), 0),
            ((0, 0, 0, 1), 1),
            ((0, 0, 1, 0), 2),
            ((0, 0, 1, 1), 3),
            ((0, 1, 0, 0), 4),
            ((0, 1, 0, 1), 5),
            ((0, 1, 1, 0), 6),
            ((0, 1, 1, 1), 7),
            ((1, 0, 0, 0), 8),
            ((1, 0, 0, 1), 9),
            ((1, 0, 1, 0), 10),
            ((1, 0, 1, 1), 11),
            ((1, 1, 0, 0), 12),
            ((1, 1, 0, 1), 13),
            ((1, 1, 1, 0), 14),
            ((1, 1, 1, 1), 15)
          ]
    it "toList . fromList == id" $
      toList
        ( [ [ [[0, 1], [2, 3]],
              [[4, 5], [6, 7]]
            ],
            [ [[8, 9], [10, 11]],
              [[12, 13], [14, 15]]
            ]
          ] ::
            Array (Int, Int, Int, Int) Int
        )
        `shouldBe` [ [ [[0, 1], [2, 3]],
                       [[4, 5], [6, 7]]
                     ],
                     [ [[8, 9], [10, 11]],
                       [[12, 13], [14, 15]]
                     ]
                   ]
  describe "IsList (Array (Int,Int,Int,Int,Int) e)" do
    it "5D-array" $
      ( [ [ [[[0, 1], [2, 3]], [[4, 5], [6, 7]]],
            [[[8, 9], [10, 11]], [[12, 13], [14, 15]]]
          ],
          [ [[[16, 17], [18, 19]], [[20, 21], [22, 23]]],
            [[[24, 25], [26, 27]], [[28, 29], [30, 31]]]
          ]
        ] ::
          Array (Int, Int, Int, Int, Int) Int
      )
        `shouldBe` array
          ((0, 0, 0, 0, 0), (1, 1, 1, 1, 1))
          [ ((0, 0, 0, 0, 0), 0),
            ((0, 0, 0, 0, 1), 1),
            ((0, 0, 0, 1, 0), 2),
            ((0, 0, 0, 1, 1), 3),
            ((0, 0, 1, 0, 0), 4),
            ((0, 0, 1, 0, 1), 5),
            ((0, 0, 1, 1, 0), 6),
            ((0, 0, 1, 1, 1), 7),
            ((0, 1, 0, 0, 0), 8),
            ((0, 1, 0, 0, 1), 9),
            ((0, 1, 0, 1, 0), 10),
            ((0, 1, 0, 1, 1), 11),
            ((0, 1, 1, 0, 0), 12),
            ((0, 1, 1, 0, 1), 13),
            ((0, 1, 1, 1, 0), 14),
            ((0, 1, 1, 1, 1), 15),
            ((1, 0, 0, 0, 0), 16),
            ((1, 0, 0, 0, 1), 17),
            ((1, 0, 0, 1, 0), 18),
            ((1, 0, 0, 1, 1), 19),
            ((1, 0, 1, 0, 0), 20),
            ((1, 0, 1, 0, 1), 21),
            ((1, 0, 1, 1, 0), 22),
            ((1, 0, 1, 1, 1), 23),
            ((1, 1, 0, 0, 0), 24),
            ((1, 1, 0, 0, 1), 25),
            ((1, 1, 0, 1, 0), 26),
            ((1, 1, 0, 1, 1), 27),
            ((1, 1, 1, 0, 0), 28),
            ((1, 1, 1, 0, 1), 29),
            ((1, 1, 1, 1, 0), 30),
            ((1, 1, 1, 1, 1), 31)
          ]
    it "toList . fromList == id" $
      toList
        ( [ [ [[[0, 1], [2, 3]], [[4, 5], [6, 7]]],
              [[[8, 9], [10, 11]], [[12, 13], [14, 15]]]
            ],
            [ [[[16, 17], [18, 19]], [[20, 21], [22, 23]]],
              [[[24, 25], [26, 27]], [[28, 29], [30, 31]]]
            ]
          ] ::
            Array (Int, Int, Int, Int, Int) Int
        )
        `shouldBe` [ [ [[[0, 1], [2, 3]], [[4, 5], [6, 7]]],
                       [[[8, 9], [10, 11]], [[12, 13], [14, 15]]]
                     ],
                     [ [[[16, 17], [18, 19]], [[20, 21], [22, 23]]],
                       [[[24, 25], [26, 27]], [[28, 29], [30, 31]]]
                     ]
                   ]

arrayNestedListTest :: SpecWith ()
arrayNestedListTest = describe "ArrayNestedList" do
  describe "ArrayNestedList (Bool,Bool) e" do
    it "[[1, 2], [3, 4]]" $
      ( arrayNestedList
          ((False, False), (True, True))
          [[1, 2], [3, 4]] ::
          Array (Bool, Bool) Int
      )
        `shouldBe` array
          ((False, False), (True, True))
          [ ((False, False), 1),
            ((False, True), 2),
            ((True, False), 3),
            ((True, True), 4)
          ]
    it "toNestedList . arrayNestedList == id" $
      toNestedList
        ( arrayNestedList
            ((False, False), (True, True))
            [[1, 2], [3, 4]] ::
            Array (Bool, Bool) Int
        )
        `shouldBe` [[1, 2], [3, 4]]
  describe "ArrayNestedList (Bool,Bool,Bool) e" do
    it "3D-array" $
      ( arrayNestedList
          ((False, False, False), (True, True, True))
          [ [[1, 2], [3, 4]],
            [[5, 6], [7, 8]]
          ] ::
          Array (Bool, Bool, Bool) Int
      )
        `shouldBe` array
          ((False, False, False), (True, True, True))
          [ ((False, False, False), 1),
            ((False, False, True), 2),
            ((False, True, False), 3),
            ((False, True, True), 4),
            ((True, False, False), 5),
            ((True, False, True), 6),
            ((True, True, False), 7),
            ((True, True, True), 8)
          ]
    it "toNestedList . arrayNestedList == id" $
      toNestedList
        ( arrayNestedList
            ((False, False, False), (True, True, True))
            [ [[1, 2], [3, 4]],
              [[5, 6], [7, 8]]
            ] ::
            Array (Bool, Bool, Bool) Int
        )
        `shouldBe` [ [[1, 2], [3, 4]],
                     [[5, 6], [7, 8]]
                   ]
  describe "ArrayNestedList (Bool,Bool,Bool,Bool) e" do
    it "4D-array" $
      ( arrayNestedList
          ((False, False, False, False), (True, True, True, True))
          [ [ [[0, 1], [2, 3]],
              [[4, 5], [6, 7]]
            ],
            [ [[8, 9], [10, 11]],
              [[12, 13], [14, 15]]
            ]
          ] ::
          Array (Bool, Bool, Bool, Bool) Int
      )
        `shouldBe` array
          ((False, False, False, False), (True, True, True, True))
          [ ((False, False, False, False), 0),
            ((False, False, False, True), 1),
            ((False, False, True, False), 2),
            ((False, False, True, True), 3),
            ((False, True, False, False), 4),
            ((False, True, False, True), 5),
            ((False, True, True, False), 6),
            ((False, True, True, True), 7),
            ((True, False, False, False), 8),
            ((True, False, False, True), 9),
            ((True, False, True, False), 10),
            ((True, False, True, True), 11),
            ((True, True, False, False), 12),
            ((True, True, False, True), 13),
            ((True, True, True, False), 14),
            ((True, True, True, True), 15)
          ]
    it "toNestedList . arrayNestedList == id" $
      toNestedList
        ( arrayNestedList
            ((False, False, False, False), (True, True, True, True))
            [ [ [[0, 1], [2, 3]],
                [[4, 5], [6, 7]]
              ],
              [ [[8, 9], [10, 11]],
                [[12, 13], [14, 15]]
              ]
            ] ::
            Array (Bool, Bool, Bool, Bool) Int
        )
        `shouldBe` [ [ [[0, 1], [2, 3]],
                       [[4, 5], [6, 7]]
                     ],
                     [ [[8, 9], [10, 11]],
                       [[12, 13], [14, 15]]
                     ]
                   ]
  describe "ArrayNestedList (Bool,Bool,Bool,Bool,Bool) e" do
    it "5D-array" $
      ( arrayNestedList
          ((False, False, False, False, False), (True, True, True, True, True))
          [ [ [[[0, 1], [2, 3]], [[4, 5], [6, 7]]],
              [[[8, 9], [10, 11]], [[12, 13], [14, 15]]]
            ],
            [ [[[16, 17], [18, 19]], [[20, 21], [22, 23]]],
              [[[24, 25], [26, 27]], [[28, 29], [30, 31]]]
            ]
          ] ::
          Array (Bool, Bool, Bool, Bool, Bool) Int
      )
        `shouldBe` array
          ((False, False, False, False, False), (True, True, True, True, True))
          [ ((False, False, False, False, False), 0),
            ((False, False, False, False, True), 1),
            ((False, False, False, True, False), 2),
            ((False, False, False, True, True), 3),
            ((False, False, True, False, False), 4),
            ((False, False, True, False, True), 5),
            ((False, False, True, True, False), 6),
            ((False, False, True, True, True), 7),
            ((False, True, False, False, False), 8),
            ((False, True, False, False, True), 9),
            ((False, True, False, True, False), 10),
            ((False, True, False, True, True), 11),
            ((False, True, True, False, False), 12),
            ((False, True, True, False, True), 13),
            ((False, True, True, True, False), 14),
            ((False, True, True, True, True), 15),
            ((True, False, False, False, False), 16),
            ((True, False, False, False, True), 17),
            ((True, False, False, True, False), 18),
            ((True, False, False, True, True), 19),
            ((True, False, True, False, False), 20),
            ((True, False, True, False, True), 21),
            ((True, False, True, True, False), 22),
            ((True, False, True, True, True), 23),
            ((True, True, False, False, False), 24),
            ((True, True, False, False, True), 25),
            ((True, True, False, True, False), 26),
            ((True, True, False, True, True), 27),
            ((True, True, True, False, False), 28),
            ((True, True, True, False, True), 29),
            ((True, True, True, True, False), 30),
            ((True, True, True, True, True), 31)
          ]
    it "toNestedList . arrayNestedList == id" $
      toNestedList
        ( arrayNestedList
            ((False, False, False, False, False), (True, True, True, True, True))
            [ [ [[[0, 1], [2, 3]], [[4, 5], [6, 7]]],
                [[[8, 9], [10, 11]], [[12, 13], [14, 15]]]
              ],
              [ [[[16, 17], [18, 19]], [[20, 21], [22, 23]]],
                [[[24, 25], [26, 27]], [[28, 29], [30, 31]]]
              ]
            ] ::
            Array (Bool, Bool, Bool, Bool, Bool) Int
        )
        `shouldBe` [ [ [[[0, 1], [2, 3]], [[4, 5], [6, 7]]],
                       [[[8, 9], [10, 11]], [[12, 13], [14, 15]]]
                     ],
                     [ [[[16, 17], [18, 19]], [[20, 21], [22, 23]]],
                       [[[24, 25], [26, 27]], [[28, 29], [30, 31]]]
                     ]
                   ]