packages feed

hs2048-0.1.0: test-suite/Hs2048/BoardSpec.hs

module Hs2048.BoardSpec (spec) where

import           Hs2048.Board
import qualified Hs2048.Direction as D
import           Test.Hspec

spec :: Spec
spec = do
    describe "canMove" $ do
        it "returns False for []" $ do
            canMove [] D.West `shouldBe` False

        it "can move West" $ do
            canMove [[Nothing, Just 2]] D.West `shouldBe` True

        it "can move South" $ do
            canMove [[Just 2], [Nothing]] D.South `shouldBe` True

        it "can't move East" $ do
            canMove [[Nothing, Just 2]] D.East `shouldBe` False

        it "can't move North" $ do
            canMove [[Just 2], [Nothing]] D.North `shouldBe` False

    describe "canShift" $ do
        it "returns False for []" $ do
            canShift [] `shouldBe` False

        it "returns True if any of the vectors can be shifted" $ do
            canShift [[Nothing, Nothing], [Nothing, Just 2]] `shouldBe` True

    describe "empty" $ do
        it "returns [] for 0 0" $ do
            empty 0 0 `shouldBe` []

        it "returns [[Nothing], [Nothing]] for 1 2" $ do
            empty 1 2 `shouldBe` [[Nothing], [Nothing]]

    describe "emptyPoints" $ do
        it "returns [] for []" $ do
            emptyPoints [] `shouldBe` []

        it "returns the points without tiles" $ do
            emptyPoints [[Nothing, Just 2], [Just 4, Nothing]] `shouldBe`
                [(0, 0), (1, 1)]

    describe "move" $ do
        it "moves West" $ do
            move [[Nothing, Just 2], [Just 4, Nothing]] D.West `shouldBe`
                [[Just 2, Nothing], [Just 4, Nothing]]

        it "moves South" $ do
            move [[Nothing, Just 2], [Just 4, Nothing]] D.South `shouldBe`
                [[Nothing, Nothing], [Just 4, Just 2]]

        it "moves East" $ do
            move [[Nothing, Just 2], [Just 4, Nothing]] D.East `shouldBe`
                [[Nothing, Just 2], [Nothing, Just 4]]

        it "moves North" $ do
            move [[Nothing, Just 2], [Just 4, Nothing]] D.North `shouldBe`
                [[Just 4, Just 2], [Nothing, Nothing]]

    describe "parse" $ do
        it "returns [] for \"\"" $ do
            parse "" `shouldBe` []

        it "returns [[Nothing, Just 2], [Just 4, Just 8]] for \"- 2\n4 8\n\"" $ do
            parse "- 2\n4 8\n" `shouldBe` [[Nothing, Just 2], [Just 4, Just 8]]

    describe "render" $ do
        it "renders []" $ do
            render [] `shouldBe` ""

        it "renders a board" $ do
            render [[Nothing, Just 2], [Just 4, Just 8]] `shouldBe`
                "- 2\n4 8\n"

    describe "rotate" $ do
        it "returns [] for []" $ do
            rotate [] `shouldBe` []

        it "rotates clockwise" $ do
            rotate [[Nothing, Just 2], [Just 4, Just 8]] `shouldBe`
                [[Just 4, Nothing], [Just 8, Just 2]]

    describe "rotateFrom" $ do
        it "rotates West" $ do
            rotateFrom [[Nothing, Just 2], [Just 4, Just 8]] D.West `shouldBe`
                [[Nothing, Just 2], [Just 4, Just 8]]

        it "rotates South" $ do
            rotateFrom [[Nothing, Just 2], [Just 4, Just 8]] D.South `shouldBe`
                [[Just 2, Just 8], [Nothing, Just 4]]

        it "rotates East" $ do
            rotateFrom [[Nothing, Just 2], [Just 4, Just 8]] D.East `shouldBe`
                [[Just 8, Just 4], [Just 2, Nothing]]

        it "rotates North" $ do
            rotateFrom [[Nothing, Just 2], [Just 4, Just 8]] D.North `shouldBe`
                [[Just 4, Nothing], [Just 8, Just 2]]

    describe "rotateTo" $ do
        it "rotates West" $ do
            rotateTo [[Nothing, Just 2], [Just 4, Just 8]] D.West `shouldBe`
                [[Nothing, Just 2], [Just 4, Just 8]]

        it "rotates South" $ do
            rotateTo [[Nothing, Just 2], [Just 4, Just 8]] D.South `shouldBe`
                [[Just 4, Nothing], [Just 8, Just 2]]

        it "rotates East" $ do
            rotateTo [[Nothing, Just 2], [Just 4, Just 8]] D.East `shouldBe`
                [[Just 8, Just 4], [Just 2, Nothing]]

        it "rotates North" $ do
            rotateTo [[Nothing, Just 2], [Just 4, Just 8]] D.North `shouldBe`
                [[Just 2, Just 8], [Nothing, Just 4]]

    describe "score" $ do
        it "returns 0 for []" $ do
            score [] `shouldBe` 0

        it "returns 20 for [[Nothing, Just 2], [Just 4, Just 8]]" $ do
            score [[Nothing, Just 2], [Just 4, Just 8]] `shouldBe` 20

    describe "set" $ do
        it "sets the tile at the point" $ do
            set [[Nothing, Nothing], [Nothing, Nothing]] (Just 2) (0, 0) `shouldBe`
                [[Just 2, Nothing], [Nothing, Nothing]]

    describe "shift" $ do
        it "returns [] for []" $ do
            shift [] `shouldBe` []

        it "shifts toward the heads" $ do
            shift [[Nothing, Just 2], [Nothing, Just 4]] `shouldBe`
                [[Just 2, Nothing], [Just 4, Nothing]]

        it "combines like tiles" $ do
            shift [[Just 2, Just 2]] `shouldBe` [[Just 4, Nothing]]

        it "only combines pairs" $ do
            shift [[Just 2, Just 2, Just 2, Just 2]] `shouldBe`
                [[Just 4, Just 4, Nothing, Nothing]]