import Test.Cabal.Prelude
import Control.Monad.IO.Class
import Data.Char
import System.Directory

-- Test that 'cabal v2-freeze' freezes flag choices. my-local-package depends
-- on my-library-dep. my-library-dep has a flag, my-flag, which defaults to
-- true.
main = cabalTest $ withSourceCopy $
  withRepo "repo" $ do
    cabal' "v2-build" ["--dry-run"] >>= assertDependencyFlagChoice True

    cabal "v2-freeze" ["--constraint=my-library-dep -my-flag"]

    cwd <- fmap testCurrentDir getTestEnv
    let freezeFile = cwd </> "cabal.project.freeze"

    -- The freeze file should constrain the version and the flag.
    -- TODO: The flag constraint should be qualified. See
    -- https://github.com/haskell/cabal/issues/5134.
    assertFileDoesContain freezeFile "any.my-library-dep ==1.0"
    assertFileDoesContain freezeFile "my-library-dep -my-flag"

    -- cabal should be able to find an install plan that fits the constraints
    -- from the freeze file.
    cabal' "v2-build" ["--dry-run"] >>= assertDependencyFlagChoice False
  where
    -- my-library-dep's flag controls whether it depends on true-dep or
    -- false-dep, so this function uses the dependency to infer the flag choice.
    assertDependencyFlagChoice True out = do
        assertOutputContains "true-dep-1.0 (lib)" out
        assertOutputDoesNotContain "false-dep" out
    assertDependencyFlagChoice False out = do
        assertOutputContains "false-dep-1.0 (lib)" out
        assertOutputDoesNotContain "true-dep" out
