packages feed

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")