aboutsummaryrefslogtreecommitdiff
path: root/specs/Specs/KeySequenceSpec.hs
blob: d09474127a1c40c1b167f6cf2b8459336bc321ba (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
module Specs.KeySequenceSpec where

import Chelleport.KeySequence (findMatchPosition, generateKeyCells, nextChars)
import Test.Hspec

test = do
  describe "#nextChars" $ do
    it "filters key sequence and returns next characters" $ do
      nextChars "AB" [["XYZ", "ABC"], ["AMK", "BBL", "ABD"]]
        `shouldBe` Just "CD"
      nextChars "A" [["XYZ", "ABC"], ["AMK", "BBL", "ABD"]]
        `shouldBe` Just "BM"

    context "when exact match is present" $ do
      it "returns next characters" $ do
        nextChars "ABD" [["XYZ", "ABC"], ["AMK", "BBL", "ABD"]]
          `shouldBe` Just ""

    context "when there are no matches" $ do
      it "returns nothing" $ do
        nextChars "FOO" [["XYZ", "ABC"], ["AMK", "BBL", "ABD"]]
          `shouldBe` Nothing

  describe "#generateKeyCells" $ do
    it "generates grid of key sequences" $ do
      generateKeyCells (4, 4) "ABCDEF"
        `shouldBe` [ ["HKA", "HKB", "LKA", "LKB"],
                     ["HKC", "HKD", "LKC", "LKD"],
                     ["HJA", "HJB", "LJA", "LJB"],
                     ["HJC", "HJD", "LJC", "LJD"]
                   ]
    context "when the the keys set is too short" $ do
      it "cycles back to first character" $ do
        generateKeyCells (4, 4) "AB"
          `shouldBe` [ ["HKA", "HKB", "LKA", "LKB"],
                       ["HKA", "HKB", "LKA", "LKB"],
                       ["HJA", "HJB", "LJA", "LJB"],
                       ["HJA", "HJB", "LJA", "LJB"]
                     ]

  describe "#findMatchPosition" $ do
    it "returns the position of the matching key sequence" $ do
      findMatchPosition "ABD" [["XYZ", "ABC"], ["AMK", "BBL", "ABD"]]
        `shouldBe` Just (1, 2)

    context "when sequence is incomplete" $ do
      it "returns nothing" $ do
        findMatchPosition "AB" [["XYZ", "ABC"], ["AMK", "BBL", "ABD"]]
          `shouldBe` Nothing

    context "when there are no matches" $ do
      it "returns nothing" $ do
        findMatchPosition "FOO" [["XYZ", "ABC"], ["AMK", "BBL", "ABD"]]
          `shouldBe` Nothing