kmonad-0.4.4: test/KMonad/KeycodeSpec.hs
module KMonad.KeycodeSpec (spec) where
import KMonad.Keyboard.Keycode
import KMonad.Util.MultiMap as Q
import KMonad.Prelude
import RIO.List (sort)
import qualified KMonad.Keyboard.IO.Mac.Types as Mac (kcMapRaw)
import qualified KMonad.Keyboard.IO.Windows.Types as Win (winCodeKeyCodeMapping)
import qualified RIO.NonEmpty as N
import Test.Hspec
spec :: Spec
spec = do
it "No duplicate keycode names" $
dupsWith snd (keyNames ^.. Q.itemed) `shouldBe` []
describe "MacOS keycodes" $ checkOsMapping Mac.kcMapRaw
describe "Windows keycodes" $ checkOsMapping Win.winCodeKeyCodeMapping
checkOsMapping :: (Show a, Ord a) => [(a, Keycode)] -> Spec
checkOsMapping m = do
-- To check for typos, ...
let difference = filter (uncurry (/=)) $ zip <*> sort $ m
let m' = fst <$> difference
let sortedM' = snd <$> difference
it "Raw list is sorted" $
m' `shouldBe` sortedM' -- Only shows unsorted indexes when failing
dupsWith :: Ord b => (a -> b) -> [a] -> [NonEmpty a]
dupsWith f = filter (not . null . N.tail) . N.groupAllWith f