registry-options-0.1.0.0: test/Test/Data/Registry/Options/LexemesSpec.hs
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE PartialTypeSignatures #-}
module Test.Data.Registry.Options.LexemesSpec where
import Data.MultiMap qualified as M
import Data.Registry.Options.Lexemes
import Protolude
import Test.Tasty.Hedgehogx
test_lexed = test "lex the command line" $ do
mkLexemes ["a"] === argLexemes "a"
mkLexemes ["a", "b"] === argsLexemes ["a", "b"]
mkLexemes ["-o"] === flagLexemes "o"
mkLexemes ["-opq"] === flagsLexemes ["o", "p", "q"]
mkLexemes ["--o"] === flagLexemes "o"
mkLexemes ["-o=v"] === optionLexemes "o" "v"
mkLexemes ["--option=value"] === optionLexemes "option" "value"
mkLexemes ["-o1=v1", "-o2", "v2"] === optionLexemes "o1" "v1" <> ambiguousLexemes "o2" ["v2"]
mkLexemes ["--o", "v"] === ambiguousLexemes "o" ["v"]
mkLexemes ["--o", "v1", "v2"] === ambiguousLexemes "o" ["v1", "v2"]
mkLexemes ["-o", "--o", "v"] === flagsLexemes ["o"] <> ambiguousLexemes "o" ["v"]
mkLexemes ["v1", "v2", "v3"] === argsLexemes ["v1", "v2", "v3"]
mkLexemes ["--o1", "v1", "--o2", "v2"] === optionLexemes "o1" "v1" <> ambiguousLexemes "o2" ["v2"]
test_pop = test "pop a multimap value" $ do
pop "k" (M.fromList [("k", "v1"), ("k", "v2")]) === M.fromList [("k", "v2")]
pop "k" (pop "k" (M.fromList [("k", "v1"), ("k", "v2")])) === M.empty
test_override = test "override lexemes" $ do
-- options
optionLexemes "o1" "v1" `override` optionLexemes "o1" "v2" === optionLexemes "o1" "v2"
optionsLexemes "o1" ["v1"] `override` optionsLexemes "o1" ["v2"] === optionsLexemes "o1" ["v2"]
-- flags can be present several times in one source but we don't deduplicate across sources
flagsLexemes ["o1", "o2"] `override` flagsLexemes ["o3"] === flagsLexemes ["o1", "o2", "o3"]
flagsLexemes ["o1", "o2"] `override` flagsLexemes ["o1", "o3"] === flagsLexemes ["o1", "o2", "o3"]
flagsLexemes ["o1", "o2", "o1"] `override` flagsLexemes ["o1", "o3"] === flagsLexemes ["o1", "o1", "o2", "o3"]
flagsLexemes ["o1", "o2"] `override` flagsLexemes ["o1", "o3", "o1"] === flagsLexemes ["o1", "o1", "o2", "o3"]
-- ambiguous values
ambiguousLexemes "o1" ["v1"] `override` optionLexemes "o1" "v2" === optionLexemes "o1" "v2"
optionLexemes "o1" "v2" `override` ambiguousLexemes "o1" ["v1"] === optionLexemes "o1" "v1"
ambiguousLexemes "o1" ["v1"] `override` ambiguousLexemes "o1" ["v2"] === ambiguousLexemes "o1" ["v2"]
((optionLexemes "o1" "v1" <> ambiguousLexemes "o2" ["v2"]) `override` (optionLexemes "o1" "v3" <> ambiguousLexemes "o3" ["v4"]))
=== (optionLexemes "o1" "v3" <> ambiguousLexemes "o3" ["v4"])
((optionLexemes "o1" "v1" <> ambiguousLexemes "o2" ["v2"]) `override` optionLexemes "o2" "v3")
=== (optionLexemes "o1" "v1" <> optionLexemes "o2" "v3")
(optionLexemes "o1" "v1" `override` (optionLexemes "o2" "v3" <> ambiguousLexemes "o1" ["v2"]))
=== (optionLexemes "o1" "v2" <> optionLexemes "o2" "v3")