packages feed

options-1.2.1.2: tests/OptionsTests/Api.hs

-- Copyright (C) 2014 John Millikin <jmillikin@gmail.com>
--
-- See license.txt for details
module OptionsTests.Api (suite_Api) where

import Chell (nothing)
import Options
import Test.Hspec (Spec, context, shouldBe, specify)

suite_Api :: Spec
suite_Api = context "api" do
  test_RepeatedFlags
  test_CompatibleDuplicateFlags
  test_ConflictingDuplicateFlags

data RepeatedStringOpts = RepeatedStringOpts [String]
  deriving (Eq, Show)

repeatedStringList :: OptionType [String]
repeatedStringList =
  (optionType "repeated-string-list" [] (\x -> Right [x]) show)
    { optionTypeMerge = Just concat
    }

instance Options RepeatedStringOpts where
  defineOptions =
    pure RepeatedStringOpts
      <*> defineOption
        repeatedStringList
        ( \o ->
            o
              { optionShortFlags = ['s']
              }
        )

test_RepeatedFlags :: Spec
test_RepeatedFlags = specify "repeated-flags" do
  let parsed = parseOptions ["-sfoo", "-sbar", "-sbaz"]
  nothing (parsedError parsed)
  shouldBe (parsedOptions parsed) (Just (RepeatedStringOpts ["foo", "bar", "baz"]))

data CompatibleDuplicateOpts = CompatibleDuplicateOpts SubOpts1 SubOpts1
  deriving (Eq, Show)

instance Options CompatibleDuplicateOpts where
  defineOptions =
    pure CompatibleDuplicateOpts
      <*> defineOptions
      <*> defineOptions

data ConflictingDuplicateOpts = ConflictingDuplicateOpts SubOpts1 SubOpts2
  deriving (Eq, Show)

instance Options ConflictingDuplicateOpts where
  defineOptions =
    pure ConflictingDuplicateOpts
      <*> defineOptions
      <*> defineOptions

data SubOpts1 = SubOpts1 Integer
  deriving (Eq, Show)

data SubOpts2 = SubOpts2 Integer
  deriving (Eq, Show)

instance Options SubOpts1 where
  defineOptions =
    pure SubOpts1
      <*> simpleOption "int" 0 ""

instance Options SubOpts2 where
  defineOptions =
    pure SubOpts2
      <*> simpleOption "int" 1 ""

test_CompatibleDuplicateFlags :: Spec
test_CompatibleDuplicateFlags = specify "compatible-duplicate-flags" do
  let parsed = parseOptions ["--int=10"]
  nothing (parsedError parsed)
  shouldBe (parsedOptions parsed) (Just (CompatibleDuplicateOpts (SubOpts1 10) (SubOpts1 10)))

test_ConflictingDuplicateFlags :: Spec
test_ConflictingDuplicateFlags = specify "conflicting-duplicate-flags" do
  let parsed = parseOptions ["-sfoo", "-sbar", "-sbaz"]
  shouldBe (parsedError parsed) (Just "Duplicate option flag \"--int\".")
  nothing (parsedOptions parsed :: Maybe ConflictingDuplicateOpts)