103 lines
		
	
	
	
		
			4 KiB
		
	
	
	
		
			Haskell
		
	
	
	
	
	
			
		
		
	
	
			103 lines
		
	
	
	
		
			4 KiB
		
	
	
	
		
			Haskell
		
	
	
	
	
	
| --------------------------------------------------------------------------------
 | |
| module Spec where
 | |
| --------------------------------------------------------------------------------
 | |
| import Test.Hspec
 | |
| import Test.QuickCheck
 | |
| import Keyboard (Keyboard(..))
 | |
| import Transforms (Transform(..))
 | |
| import Data.Coerce
 | |
| import Utils
 | |
| 
 | |
| import qualified App
 | |
| import qualified Keyboard
 | |
| import qualified Transforms
 | |
| --------------------------------------------------------------------------------
 | |
| 
 | |
| main :: IO ()
 | |
| main = hspec $ do
 | |
|   describe "Keyboard.print" $ do
 | |
|     it "pretty-prints the keyboard" $ do
 | |
|       show Keyboard.qwerty == "[1][2][3][4][5][6][7][8][9][0]\n[Q][W][E][R][T][Y][U][I][O][P]\n[A][S][D][F][G][H][J][K][L][;]\n[Z][X][C][V][B][N][M][,][.][/]"
 | |
| 
 | |
|   describe "Transforms.fromString" $ do
 | |
|     it "successfully parses a string of commands" $ do
 | |
|       Transforms.fromString "HHVS-12VHVHS3" ==
 | |
|         Just [ HorizontalFlip
 | |
|              , HorizontalFlip
 | |
|              , VerticalFlip
 | |
|              , Shift (-12)
 | |
|              , VerticalFlip
 | |
|              , HorizontalFlip
 | |
|              , VerticalFlip
 | |
|              , HorizontalFlip
 | |
|              , Shift 3
 | |
|              ]
 | |
| 
 | |
|     it "returns Nothing when the input is invalid" $ do
 | |
|       Transforms.fromString "potato" == Nothing
 | |
| 
 | |
|     it "return Nothing when the input is valid except for the end" $ do
 | |
|       Transforms.fromString "HVS10potato" == Nothing
 | |
| 
 | |
|   describe "App.transform" $ do
 | |
|     it "flips any keyboard horizontally" $ do
 | |
|       property $ \first second third fourth ->
 | |
|         App.transform (Keyboard [first, second, third, fourth]) HorizontalFlip == do
 | |
|           Keyboard [ reverse first
 | |
|                    , reverse second
 | |
|                    , reverse third
 | |
|                    , reverse fourth
 | |
|                    ]
 | |
| 
 | |
|     it "flips any keyboard vertically" $ do
 | |
|       property $ \first second third fourth ->
 | |
|         App.transform (Keyboard [first, second, third, fourth]) VerticalFlip == do
 | |
|           Keyboard $ reverse [first, second, third, fourth]
 | |
| 
 | |
|     it "shifts any keyboard" $ do
 | |
|       property $ \first second third fourth n ->
 | |
|         App.transform (Keyboard [first, second, third, fourth]) (Shift n)
 | |
|         |> (coerce :: Keyboard -> [[Char]])
 | |
|         |> concat ==
 | |
|           [first, second, third, fourth]
 | |
|             |> concat
 | |
|             |> Utils.rotate n
 | |
| 
 | |
|     it "flips a QWERTY keyboard horizontally" $ do
 | |
|       App.transform Keyboard.qwerty HorizontalFlip == do
 | |
|         Keyboard [ ['0','9','8','7','6','5','4','3','2','1']
 | |
|                  , ['P','O','I','U','Y','T','R','E','W','Q']
 | |
|                  , [';','L','K','J','H','G','F','D','S','A']
 | |
|                  , ['/','.',',','M','N','B','V','C','X','Z']
 | |
|                  ]
 | |
| 
 | |
|     it "flips a keyboard vertically" $ do
 | |
|       App.transform Keyboard.qwerty VerticalFlip == do
 | |
|         Keyboard [ ['Z','X','C','V','B','N','M',',','.','/']
 | |
|                  , ['A','S','D','F','G','H','J','K','L',';']
 | |
|                  , ['Q','W','E','R','T','Y','U','I','O','P']
 | |
|                  , ['1','2','3','4','5','6','7','8','9','0']
 | |
|                  ]
 | |
| 
 | |
|     it "shifts a keyboard left N times" $ do
 | |
|       App.transform Keyboard.qwerty (Shift 2) == do
 | |
|         Keyboard [ ['3','4','5','6','7','8','9','0','Q','W']
 | |
|                  , ['E','R','T','Y','U','I','O','P','A','S']
 | |
|                  , ['D','F','G','H','J','K','L',';','Z','X']
 | |
|                  , ['C','V','B','N','M',',','.','/','1','2']
 | |
|                  ]
 | |
| 
 | |
|     it "shifts right negative amounts" $ do
 | |
|       App.transform Keyboard.qwerty (Shift (-3)) == do
 | |
|         Keyboard [ [',','.','/','1','2','3','4','5','6','7']
 | |
|                  , ['8','9','0','Q','W','E','R','T','Y','U']
 | |
|                  , ['I','O','P','A','S','D','F','G','H','J']
 | |
|                  , ['K','L',';','Z','X','C','V','B','N','M']
 | |
|                  ]
 | |
| 
 | |
|   describe "Transforms.optimize" $ do
 | |
|     it "removes superfluous horizontal transformations" $ do
 | |
|       Transforms.optimize [HorizontalFlip, HorizontalFlip] == []
 | |
| 
 | |
|     it "removes superfluous vertical transformations" $ do
 | |
|       Transforms.optimize [VerticalFlip, VerticalFlip] == []
 |