diff --git a/tests/integration/tests/6905-invalid-cycle/Main.hs b/tests/integration/tests/6905-invalid-cycle/Main.hs new file mode 100644 index 0000000000..34e3959973 --- /dev/null +++ b/tests/integration/tests/6905-invalid-cycle/Main.hs @@ -0,0 +1,35 @@ +-- | The test's project has project packages A, B, C and D. +-- +-- In terms of main libraries, the dependencies are (->- is 'depends on'): +-- +-- A ->- B and C ->- D, D ->- C (a cycle) +-- +-- In terms of executables (a test suite): +-- +-- B ->- A, B ->- C +-- +-- As, overall, A ->- B and B ->- A, packages A and B cannot be built +-- 'all-in-one'. However, if the test suite of B is not being built, A and B can +-- be built. + +-- The test suite of B cannot be built, because C ->- D and D ->- C. +-- +-- See: https://github.com/commercialhaskell/stack/issues/6905 + +import Control.Monad ( unless ) +import Data.List ( isInfixOf ) +import StackTest + +main :: IO () +main = do + stack ["build", "myPackageA", "myPackageB"] + stackErrStderr ["test", "myPackageB"] (expectMessage dependencyCycleDetected) + +dependencyCycleDetected :: String +dependencyCycleDetected = + "myPackageC dependency cycle detected: myPackageC, myPackageD, myPackageC" + +expectMessage :: String -> String -> IO () +expectMessage msg stderr = + unless (words msg `isInfixOf` words stderr) + (error $ "Expected a warning: \n" ++ show msg) diff --git a/tests/integration/tests/6905-invalid-cycle/files/.gitignore b/tests/integration/tests/6905-invalid-cycle/files/.gitignore new file mode 100644 index 0000000000..5087095541 --- /dev/null +++ b/tests/integration/tests/6905-invalid-cycle/files/.gitignore @@ -0,0 +1,4 @@ +myPackageA.cabal +myPackageB.cabal +myPackageC.cabal +myPackageD.cabal diff --git a/tests/integration/tests/6905-invalid-cycle/files/myPackageA/package.yaml b/tests/integration/tests/6905-invalid-cycle/files/myPackageA/package.yaml new file mode 100644 index 0000000000..bb7167768b --- /dev/null +++ b/tests/integration/tests/6905-invalid-cycle/files/myPackageA/package.yaml @@ -0,0 +1,11 @@ +spec-version: 0.36.0 + +name: myPackageA + +dependencies: +- base + +library: + source-dirs: src + dependencies: + - myPackageB diff --git a/tests/integration/tests/6905-invalid-cycle/files/myPackageA/src/LibA.hs b/tests/integration/tests/6905-invalid-cycle/files/myPackageA/src/LibA.hs new file mode 100644 index 0000000000..743d4bf8d0 --- /dev/null +++ b/tests/integration/tests/6905-invalid-cycle/files/myPackageA/src/LibA.hs @@ -0,0 +1,5 @@ +module LibA + ( funcB + ) where + +import LibB ( funcB ) diff --git a/tests/integration/tests/6905-invalid-cycle/files/myPackageB/package.yaml b/tests/integration/tests/6905-invalid-cycle/files/myPackageB/package.yaml new file mode 100644 index 0000000000..dbdaaca9ee --- /dev/null +++ b/tests/integration/tests/6905-invalid-cycle/files/myPackageB/package.yaml @@ -0,0 +1,17 @@ +spec-version: 0.36.0 + +name: myPackageB + +dependencies: +- base + +library: + source-dirs: src + +tests: + test: + source-dirs: test + main: Main.hs + dependencies: + - myPackageA + - myPackageC diff --git a/tests/integration/tests/6905-invalid-cycle/files/myPackageB/src/LibB.hs b/tests/integration/tests/6905-invalid-cycle/files/myPackageB/src/LibB.hs new file mode 100644 index 0000000000..e714f965fe --- /dev/null +++ b/tests/integration/tests/6905-invalid-cycle/files/myPackageB/src/LibB.hs @@ -0,0 +1,6 @@ +module LibB + ( funcB + ) where + +funcB :: IO () +funcB = pure () diff --git a/tests/integration/tests/6905-invalid-cycle/files/myPackageB/test/Main.hs b/tests/integration/tests/6905-invalid-cycle/files/myPackageB/test/Main.hs new file mode 100644 index 0000000000..4443983c52 --- /dev/null +++ b/tests/integration/tests/6905-invalid-cycle/files/myPackageB/test/Main.hs @@ -0,0 +1,7 @@ +import LibA ( funcB ) +import LibC ( funcC ) + +main :: IO () +main = do + funcB + funcC diff --git a/tests/integration/tests/6905-invalid-cycle/files/myPackageC/package.yaml b/tests/integration/tests/6905-invalid-cycle/files/myPackageC/package.yaml new file mode 100644 index 0000000000..d657e99064 --- /dev/null +++ b/tests/integration/tests/6905-invalid-cycle/files/myPackageC/package.yaml @@ -0,0 +1,11 @@ +spec-version: 0.36.0 + +name: myPackageC + +dependencies: +- base + +library: + source-dirs: src + dependencies: + - myPackageD diff --git a/tests/integration/tests/6905-invalid-cycle/files/myPackageC/src/LibC.hs b/tests/integration/tests/6905-invalid-cycle/files/myPackageC/src/LibC.hs new file mode 100644 index 0000000000..b692cc5dc4 --- /dev/null +++ b/tests/integration/tests/6905-invalid-cycle/files/myPackageC/src/LibC.hs @@ -0,0 +1,8 @@ +module LibC + ( funcC + ) where + +import LibD ( funcD ) + +funcC :: IO () +funcC = funcD diff --git a/tests/integration/tests/6905-invalid-cycle/files/myPackageD/package.yaml b/tests/integration/tests/6905-invalid-cycle/files/myPackageD/package.yaml new file mode 100644 index 0000000000..1d913ac5ef --- /dev/null +++ b/tests/integration/tests/6905-invalid-cycle/files/myPackageD/package.yaml @@ -0,0 +1,11 @@ +spec-version: 0.36.0 + +name: myPackageD + +dependencies: +- base + +library: + source-dirs: src + dependencies: + - myPackageC diff --git a/tests/integration/tests/6905-invalid-cycle/files/myPackageD/src/LibD.hs b/tests/integration/tests/6905-invalid-cycle/files/myPackageD/src/LibD.hs new file mode 100644 index 0000000000..33b5940491 --- /dev/null +++ b/tests/integration/tests/6905-invalid-cycle/files/myPackageD/src/LibD.hs @@ -0,0 +1,8 @@ +module LibD + ( funcD + ) where + +import LibC ( funcC ) + +funcD :: IO () +funcD = funcC diff --git a/tests/integration/tests/6905-invalid-cycle/files/stack.yaml b/tests/integration/tests/6905-invalid-cycle/files/stack.yaml new file mode 100644 index 0000000000..240f775bdc --- /dev/null +++ b/tests/integration/tests/6905-invalid-cycle/files/stack.yaml @@ -0,0 +1,7 @@ +snapshot: ghc-9.10.3 + +packages: +- myPackageA +- myPackageB +- myPackageC +- myPackageD