{-# LANGUAGE OverloadedStrings #-}
module DRcon.EvalParserSpec (
spec
) where
import Test.Hspec
import DRcon.EvalParser
import DarkPlaces.Rcon
import DarkPlaces.Text (DecodeType(..))
import qualified Data.Text as T
import Data.Char (isSpace)
spec :: Spec
spec = do
describe "parseCommand" $ do
it "check simple rcon commands" $ do
"status" `cmdShouldBe` RconCommand "status"
"sv_cmd lsmaps" `cmdShouldBe` RconCommand "sv_cmd lsmaps"
"ls *.bsp" `cmdShouldBe` RconCommand "ls *.bsp"
it "check empty input" $ do
"" `cmdShouldBe` Empty
-- input string with spaces
" " `cmdShouldBe` Empty
" " `cmdShouldBe` Empty
"\n " `cmdShouldBe` Empty
"\n \t" `cmdShouldBe` Empty
it "check :quit internal command" $ do
":q" `cmdShouldBe` Quit
":qu" `cmdShouldBe` Quit
":qui" `cmdShouldBe` Quit
":quit" `cmdShouldBe` Quit
-- quit accept any arguments
":q some vals" `cmdShouldBe` Quit
it "check :help internal command" $ do
":?" `cmdShouldBe` Help
":h" `cmdShouldBe` Help
":he" `cmdShouldBe` Help
":help" `cmdShouldBe` Help
-- help takes no argumens
":help haha" `cmdShouldErr` (CommandTakesNoArgumens ":help" "haha")
it "check : internal command" $ do
":" `cmdShouldBe` RepeatLast
": " `cmdShouldBe` RepeatLast
" : " `cmdShouldBe` RepeatLast
"\t :" `cmdShouldBe` RepeatLast
-- : takes no argumens
": help" `cmdShouldErr` (CommandTakesNoArgumens ":" "help")
it "check :login internal command" $ do
":login" `cmdShouldBe` Login
" :l" `cmdShouldBe` Login
":lo" `cmdShouldBe` Login
" :log " `cmdShouldBe` Login
":l ogin" `cmdShouldErr` (CommandTakesNoArgumens ":login" "ogin")
it "check :version internal command" $ do
":version" `cmdShouldBe` Version
it "check :history internal command" $ do
":hi" `cmdShouldBe` (History Nothing)
":his" `cmdShouldBe` (History Nothing)
":history" `cmdShouldBe` (History Nothing)
":his 10" `cmdShouldBe` (History $ Just 10)
":history 12 " `cmdShouldBe` (History $ Just 12)
":history -2 " `cmdShouldErr` (WrongArgumentType ":history" "-2")
":history 2 4 " `cmdShouldErr` (WrongArgumentType ":history" "2 4")
":history 2.4 " `cmdShouldErr` (WrongArgumentType ":history" "2.4")
":history test " `cmdShouldErr` (WrongArgumentType ":history" "test")
it "check :set internal command" $ do
":set" `cmdShouldBe` ListVars
":s" `cmdShouldBe` ListVars
":set mode" `cmdShouldBe` (Show Mode)
":set mode 2" `cmdShouldBe` (Set $ SetMode ChallangeSecureRcon)
":set mode 1" `cmdShouldBe` (Set $ SetMode TimeSecureRcon)
":set mode 0" `cmdShouldBe` (Set $ SetMode NonSecureRcon)
":set color no" `cmdShouldBe` (Set $ SetColor False)
":set color 0" `cmdShouldBe` (Set $ SetColor False)
":set color n" `cmdShouldBe` (Set $ SetColor False)
":s color false" `cmdShouldBe` (Set $ SetColor False)
":se color yes" `cmdShouldBe` (Set $ SetColor True)
":set encoding nexuiz" `cmdShouldBe` (Set $ SetEncoding NexuizDecode)
describe "internalAutoComplete" $ do
it "check autocomplete of base commands" $ do
":he" `shouldComplete` [":help"]
":h" `shouldComplete` [":history", ":help"]
":q" `shouldComplete` [":quit"]
":qu" `shouldComplete` [":quit"]
":lo" `shouldComplete` [":login"]
":s" `shouldComplete` [":set"]
it "check autocomplete for :set options" $ do
":s mo" `shouldComplete` ["mode"]
":se mo" `shouldComplete` ["mode"]
":set mo" `shouldComplete` ["mode"]
":set co" `shouldComplete` ["color"]
":set prompt" `shouldComplete` ["prompt"]
it "check autocomplete for :set option values" $ do
":s color " `shouldComplete` ["yes", "no"]
":s color y" `shouldComplete` ["yes"]
":s encoding n" `shouldComplete` ["nexuiz"]
where
cmdShouldBe cmd_str cmd_res = parseCommand cmd_str `shouldBe` (Right cmd_res)
cmdShouldErr cmd_str cmd_res = parseCommand cmd_str `shouldBe` (Left cmd_res)
shouldComplete text res = internalAutoComplete rprev cmd `shouldMatchList` res
where
rtext = T.reverse $ T.stripStart text
(rcmd, rprev) = T.break isSpace rtext
cmd = T.reverse rcmd