packages feed

opt-env-conf-test-0.0.0.2: test/OptEnvConf/CompleterSpec.hs

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE OverloadedStrings #-}

module OptEnvConf.CompleterSpec (spec) where

import GHC.Stack (HasCallStack, withFrozenCallStack)
import OptEnvConf.Completer
import Path
import Path.IO
import Test.Syd

spec :: Spec
spec = do
  let setupExampleDir tdir = do
        -- File
        exampleFile1 <- resolveFile tdir "foo.txt"
        writeFile (fromAbsFile exampleFile1) ""
        -- Dir here
        exampleDir <- resolveDir tdir "bar"
        createDir exampleDir
        -- File in dir
        exampleFile2 <- resolveFile exampleDir "quux.txt"
        writeFile (fromAbsFile exampleFile2) ""
        -- Dir in dir
        deeperDir <- resolveDir exampleDir "deep"
        createDir deeperDir
        -- File in dir in dir
        exampleFile3 <- resolveFile deeperDir "gold.txt"
        writeFile (fromAbsFile exampleFile3) ""
        -- Hidden file
        hiddenFile <- resolveFile tdir ".hidden.txt"
        writeFile (fromAbsFile hiddenFile) ""
        -- Hidden dir
        hiddenDir <- resolveDir tdir ".hidden"
        createDir hiddenDir

  -- These are read-only tests so we only need one dir for all of them
  sequential . doNotRandomiseExecutionOrder
    $ aroundAll
      ( \func -> withSystemTempDir "opt-env-conf-test" $ \tdir -> do
          setupExampleDir tdir
          func tdir
      )
    $ do
      describe "filePath" $ do
        let c :: (HasCallStack) => String -> [String] -> TestDef '[Path Abs Dir] ()
            c s l =
              withFrozenCallStack $
                itWithOuter (unwords ["can complete", show s, "to", show l]) $ \tdir ->
                  withCurrentDir tdir $
                    unCompleter filePath s `shouldReturn` l

        c "" ["foo.txt", "bar/"]
        c "f" ["foo.txt"]
        c "b" ["bar/"]
        c "bar" ["bar/quux.txt", "bar/", "bar/deep/"]
        c "q" []
        c "." [".hidden.txt", ".hidden/"]
        c "./" ["./foo.txt", "./bar/"]
        c "././" ["././foo.txt", "././bar/"]
        c "./." ["./.hidden.txt", "./.hidden/"]
        c "./bar" ["./bar/quux.txt", "./bar/", "./bar/deep/"]

      describe "directoryPath" $ do
        let c :: (HasCallStack) => String -> [String] -> TestDef '[Path Abs Dir] ()
            c s l = withFrozenCallStack $
              itWithOuter (unwords ["can complete", show s, "to", show l]) $ \tdir ->
                withCurrentDir tdir $
                  unCompleter directoryPath s `shouldReturn` l

        c "" ["bar/"]
        c "b" ["bar/"]
        c "f" []
        c "." [".hidden/"]
        c "./" ["./bar/"]
        c "./." ["./.hidden/"]
        c "././" ["././bar/"]
        c "./." ["./.hidden/"]
        c "./bar" ["./bar/", "./bar/deep/"]