{-# LANGUAGE ExtendedDefaultRules #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE CPP #-}
import Test.Hspec
import Data.Conduit.Shell hiding (ignore) -- https://github.com/fpco/stackage/issues/2355#issue-212177275
import Data.Conduit.Shell.PATH (true, false)
import Data.Conduit.Shell.Segments (strings, ignore)
import qualified Data.Conduit.List as CL
import qualified Data.Conduit.Binary as CB
import qualified Data.ByteString.Char8 as S8
import Control.Applicative
import Data.ByteString
import Data.Char (toUpper)
import Data.Either (isRight, isLeft)
import Control.Exception (try)
main :: IO ()
main =
hspec $
do describe "SHELL path functions" $
do it "false" $
do val <- run $ strings (false <|> echo "failed")
val `shouldBe` ["failed"]
it "true" $
do val <- run $ strings (true <|> echo "passed")
val `shouldBe` []
describe "ls" $
do it "home directory check" $
do val <- run $ strings (ls "/")
val `shouldContain` ["home"]
it "long option" $
do val <- run $ strings (ls "-a" ["/"])
val `shouldContain` ["home"]
describe "multiple string usage" $
do it "make two directory" $
do val <-
run $
do ignore $ mkdir "-p" "mtest1" "mtest2" "mtest3"
strings $ ls "."
run $ rmdir ["mtest1", "mtest2", "mtest3"]
val `shouldContain` ["mtest1", "mtest2", "mtest3"]
describe "list usage in variadic" $
do it "two directory" $
do val <-
run $
do ignore $ mkdir "-p" ["test1", "test2"]
strings $ ls "."
run $ rmdir ["test1", "test2"]
val `shouldContain` ["test1", "test2"]
describe "shell calls" $
do it "shell ls" $
do val <- run $ do strings $ shell "ls /"
val `shouldContain` ["home"]
describe "ordering of arguments" $
do it "echo -e" $
do val <- run $ do strings $ echo "-e" "hello\n" "haskell"
#ifdef darwin_HOST_OS
val `shouldBe` ["-e hello", " haskell"]
#else
val `shouldBe` ["hello", " haskell"]
#endif
it "mixed variant" $
do val <- run $ strings $ echo "-e" ["hello\n", "haskell"]
#ifdef darwin_HOST_OS
val `shouldBe` ["-e hello", " haskell"]
#else
val `shouldBe` ["hello", " haskell"]
#endif
it "list variant" $
do val <- run $ strings $ echo ["-e", "hello\n", "haskell"]
#ifdef darwin_HOST_OS
val `shouldBe` ["-e hello", " haskell"]
#else
val `shouldBe` ["hello", " haskell"]
#endif
it "list mixed variant - 1" $
do val <- run $ strings $ echo "-e" ["hello\n", "haskell"]
#ifdef darwin_HOST_OS
val `shouldBe` ["-e hello", " haskell"]
#else
val `shouldBe` ["hello", " haskell"]
#endif
it "list mixed variant - 2" $
do val <- run $ strings $ echo "-e" ["hello\n", "haskell\n"] "world"
#ifdef darwin_HOST_OS
val `shouldBe` ["-e hello", " haskell", " world"]
#else
val `shouldBe` ["hello", " haskell", " world"]
#endif
it "list mixed variant - 3" $
do val <- run $ strings $ echo "-e" ["hello\n", "haskell\n"] "world\n" ["planet"]
#ifdef darwin_HOST_OS
val `shouldBe` ["-e hello", " haskell", " world", " planet"]
#else
val `shouldBe` ["hello", " haskell", " world", " planet"]
#endif
describe "cd" $
do it "cd /" $
do val <-
run $
do ignore $ cd "/"
strings pwd
val `shouldBe` ["/"]
it "cd /home" $
do val <-
run $
do ignore $ cd ["/home", undefined]
strings pwd
val `shouldBe` ["/home"]
describe "Piping" $
do it "basic piping" $
do (val :: [String]) <-
run $ strings (echo "hello" $| conduit (CL.map (S8.map toUpper)))
val `shouldBe` ["HELLO"]
it "piping of commands - example 1" $
do val <- run $ strings (ls "/" $| grep "etc")
val `shouldBe` ["etc"]
it "piping of commands - example 2" $
do val <- run $ strings (echo "hello" $| tr "[a-z]" "[A-Z]")
val `shouldBe` ["HELLO"]
describe "Exception" $
do it "Basic exception handling - success" $
do (val :: Either ProcessException () ) <- try $ run (ls "/bin")
val `shouldSatisfy` isRight
it "Basic exception handling - failure" $
do (val :: Either ProcessException () ) <- try $ run (ls "/non_existent_directory")
val `shouldSatisfy` isLeft
it "Basic exception handling with <|> - success" $
do (val :: Either ProcessException () ) <- try $ run (ls "/non_existent_directory" <|> ls "/bin")
val `shouldSatisfy` isRight
it "Basic exception handling with <|> - failure" $
do (val :: Either ProcessException () ) <- try $ run (ls "/non_existent_directory" <|> ls "/non_existent_directory")
val `shouldSatisfy` isLeft
it "Basic exception handling with <|> - first success" $
do (val :: Either ProcessException () ) <- try $ run (ls "/bin" <|> ls "/non_existent_directory")
val `shouldSatisfy` isRight