packages feed

fb-util-0.1.0.1: tests/OptParseTest.hs

{-
  Copyright (c) Meta Platforms, Inc. and affiliates.
  All rights reserved.

  This source code is licensed under the BSD-style license found in the
  LICENSE file in the root directory of this source tree.
-}

module OptParseTest where

import Test.HUnit
import TestRunner

import Data.Text (Text)
import Facebook.Init
import Options.Applicative
import Util.OptParse

data Options = Options
  { foo :: Text
  , bar :: Int
  }

optionsParser :: Parser Options
optionsParser = Options
  <$> textOption
    ( long "foo" <> metavar "FOO" <> help "foo" )
  <*> intOption
    ( long "bar" <> value 42 <>  metavar "BAR" <> help "bar" )

optsInfo :: ParserInfo Options
optsInfo = info (helper <*> optionsParser) fullDesc

partialTest :: Test
partialTest = TestLabel "partial" $ TestCase $ do
  doTest -- only defined flags
    [ "--foo=foo", "--bar=7" ]
    []

  doTest -- start with an unknown
    [ "--baz=5", "--foo=foo", "--bar=7" ]
    [ "--baz=5" ]

  doTest -- unknown in the middle
    [ "--foo=foo", "--baz=5", "--bar=7" ]
    [ "--baz=5" ]

  doTest -- end with an unknown
    [ "--foo=foo", "--bar=7", "--baz=5" ]
    [ "--baz=5" ]

  doTest -- intercalate known and unknown
    [ "--snert=4", "--foo=foo", "--quux=wat", "--bar=7", "--baz=5" ]
    [ "--snert=4", "--quux=wat", "--baz=5"]

  doTest -- `--`
    [ "--foo=foo", "--baz=5", "--", "--bar=7", "--" ]
    [ "--baz=5", "--bar=7", "--" ]

  where
    doTest inp ex = do
      (_, args) <- partialParse defaultPrefs optsInfo inp
      assertEqual (show inp) ex args


main :: IO ()
main = withFacebookUnitTest $
  testRunner $ TestList
    [ partialTest
    ]