aboutsummaryrefslogtreecommitdiff
path: root/specs/Specs/ViewSpec.hs
blob: 39e7fea1f387ba83be66e5b9089f65825d4c28c6 (plain) (blame)
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
module Specs.ViewSpec where

import Chelleport.Config
import Chelleport.Types
import Chelleport.View
import Test.Hspec
import TestUtils

test :: SpecWith ()
test = do
  let defaultState = defaultAppState {stateGrid = [["ABC", "DEF"], ["DJK", "JKL"]]}
  let drawTextCalls = filter (\case Mock_drawText {} -> True; _ -> False) . calls

  describe "#render" $ do
    context "when key sequence is empty" $ do
      let currentState = defaultState {stateKeySequence = ""}

      it "draws matching text labels" $ do
        (_, mock) <- runWithMocks $ render currentState
        drawTextCalls mock
          `shouldBe` [ Mock_drawText (460, 10) colorWhite "ABC",
                       Mock_drawText (1420, 10) colorWhite "DEF",
                       Mock_drawText (460, 550) colorWhite "DJK",
                       Mock_drawText (1420, 550) colorWhite "JKL"
                     ]

    context "when there is a partial match" $ do
      let currentState = defaultState {stateKeySequence = "D"}

      it "draws matching text labels" $ do
        (_, mock) <- runWithMocks $ render currentState
        drawTextCalls mock
          `shouldBe` [ Mock_drawText (1420, 10) colorLightGray "D",
                       Mock_drawText (1430, 10) colorAccent "EF",
                       Mock_drawText (460, 550) colorLightGray "D",
                       Mock_drawText (470, 550) colorAccent "JK"
                     ]

    context "when key sequence is complete match" $ do
      let currentState = defaultState {stateKeySequence = "DEF"}

      it "draws only the matching label" $ do
        (_, mock) <- runWithMocks $ render currentState
        drawTextCalls mock `shouldBe` [Mock_drawText (1420, 10) colorLightGray "DEF"]

  describe "#renderKeySequence" $ do
    context "when there is a partial match" $ do
      it "draws the matched section and highlights the remaining characters" $ do
        (_, mock) <- runWithMocks $ renderKeySequence "ABC" "ABCDE" (0, 0)
        calls mock
          `shouldBe` [Mock_drawText (0, 0) colorLightGray "ABC", Mock_drawText (3 * 10, 0) colorAccent "DE"]

      it "return true as the text is visible" $ do
        (isVisible, _) <- runWithMocks $ renderKeySequence "ABC" "ABCDE" (0, 0)
        isVisible `shouldBe` True

    context "when there is no input key sequence" $ do
      it "draws text as a single chunk" $ do
        (_, mock) <- runWithMocks $ renderKeySequence "" "ABCD" (0, 0)
        calls mock `shouldBe` [Mock_drawText (0, 0) colorWhite "ABCD"]

      it "return true as the text is visible" $ do
        (isVisible, _) <- runWithMocks $ renderKeySequence "" "ABCD" (0, 0)
        isVisible `shouldBe` True

    context "when key sequence does not match" $ do
      it "does not draw text" $ do
        (_, mock) <- runWithMocks $ renderKeySequence "AXY" "ABCD" (0, 0)
        calls mock `shouldBe` []

      it "return false as the text is not visible" $ do
        (isVisible, _) <- runWithMocks $ renderKeySequence "AXY" "ABCD" (0, 0)
        isVisible `shouldBe` False