From 28ff390ba3ac67199a16b86346bf933ff6efeeb8 Mon Sep 17 00:00:00 2001 From: Phil de Joux Date: Fri, 30 Oct 2026 12:49:34 -0400 Subject: [PATCH 1/5] Add TestFileKind and use isSuffixOf matching --- cabal-testsuite/README.md | 4 +++- cabal-testsuite/main/cabal-tests.hs | 9 ++++----- cabal-testsuite/src/Test/Cabal/Monad.hs | 23 +++++++++++++++++------ 3 files changed, 24 insertions(+), 12 deletions(-) diff --git a/cabal-testsuite/README.md b/cabal-testsuite/README.md index fb641cad995..b43243e16a3 100644 --- a/cabal-testsuite/README.md +++ b/cabal-testsuite/README.md @@ -125,7 +125,9 @@ Otherwise, here is a walkthrough: with the exception of one test stored in `tests`.) 2. Create one or more `.test.hs` scripts in your directory, using - the template: + the template below. The name may contain further dots, as in + `cabal.no-project.test.hs`; the part before `.test.hs` names the + test's `.out` and `.dist` files. ```haskell import Test.Cabal.Prelude main = setupAndCabalTest $ do diff --git a/cabal-testsuite/main/cabal-tests.hs b/cabal-testsuite/main/cabal-tests.hs index 22657d26ad2..e82e445aab4 100644 --- a/cabal-testsuite/main/cabal-tests.hs +++ b/cabal-testsuite/main/cabal-tests.hs @@ -417,11 +417,10 @@ partitionTests testPattern paths = go ts ms [] = (keepPatternMatches ts, keepPatternMatches ms) go ts ms (f:fs) = - -- NB: Keep this synchronized with isTestFile - case takeExtensions f of - ".test.hs" -> go (f:ts) ms fs - ".multitest.hs" -> go ts (f:ms) fs - _ -> go ts ms fs + case testFileKind f of + Just SingleTest -> go (f:ts) ms fs + Just MultiTest -> go ts (f:ms) fs + Nothing -> go ts ms fs outputThread :: Verbosity -> Chan ServerLogMsg -> Handle -> IO () outputThread verbosity chan log_handle = go "" diff --git a/cabal-testsuite/src/Test/Cabal/Monad.hs b/cabal-testsuite/src/Test/Cabal/Monad.hs index 39f3a983ea9..f49ab9e54c6 100644 --- a/cabal-testsuite/src/Test/Cabal/Monad.hs +++ b/cabal-testsuite/src/Test/Cabal/Monad.hs @@ -13,6 +13,10 @@ module Test.Cabal.Monad , TestM , runTestM + -- * Test scripts + , TestFileKind (..) + , testFileKind + -- * Helper functions , programPathM , requireProgramM @@ -593,13 +597,20 @@ withSourceCopy m = do else copyFile (curdir f) (dest f) m --- NB: Keep this synchronized with partitionTests +-- | How the harness treats a file, judged by its name alone. +data TestFileKind = SingleTest | MultiTest + +-- | A test script is any file ending in @.test.hs@ or @.multitest.hs@. The +-- name may contain further dots, e.g. @cabal.no-project.test.hs@; the part +-- before the suffix names the test's @.out@ and @.dist@ files. +testFileKind :: FilePath -> Maybe TestFileKind +testFileKind f + | ".multitest.hs" `isSuffixOf` f = Just MultiTest + | ".test.hs" `isSuffixOf` f = Just SingleTest + | otherwise = Nothing + isTestFile :: FilePath -> Bool -isTestFile f = - case takeExtensions f of - ".test.hs" -> True - ".multitest.hs" -> True - _ -> False +isTestFile = isJust . testFileKind initWorkDir :: TestM () initWorkDir = do From 3717d717d4f8f3795605181363494b0f62d6ce3f Mon Sep 17 00:00:00 2001 From: Phil de Joux Date: Tue, 10 Nov 2026 20:01:19 -0500 Subject: [PATCH 2/5] Use isExtensionOf - When isExtensionOf ext = isSuffixOf ext . takeExtensions --- cabal-testsuite/src/Test/Cabal/Monad.hs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cabal-testsuite/src/Test/Cabal/Monad.hs b/cabal-testsuite/src/Test/Cabal/Monad.hs index f49ab9e54c6..c12c8a4f090 100644 --- a/cabal-testsuite/src/Test/Cabal/Monad.hs +++ b/cabal-testsuite/src/Test/Cabal/Monad.hs @@ -605,8 +605,8 @@ data TestFileKind = SingleTest | MultiTest -- before the suffix names the test's @.out@ and @.dist@ files. testFileKind :: FilePath -> Maybe TestFileKind testFileKind f - | ".multitest.hs" `isSuffixOf` f = Just MultiTest - | ".test.hs" `isSuffixOf` f = Just SingleTest + | ".multitest.hs" `isExtensionOf` f = Just MultiTest + | ".test.hs" `isExtensionOf` f = Just SingleTest | otherwise = Nothing isTestFile :: FilePath -> Bool From ac46df328e98f533141387401f1b76f89519ea77 Mon Sep 17 00:00:00 2001 From: Phil de Joux Date: Fri, 30 Oct 2026 14:32:30 -0400 Subject: [PATCH 3/5] Add expectBroken 12501 --- .../Projects-Default-No/cabal.dot-uv.test.hs | 2 +- .../Projects-Default-No/cabal.ignore-project.test.hs | 2 +- .../Projects-Default-No/cabal.no-project.test.hs | 2 +- .../Projects-Default-No/cabal.sub-pq.test.hs | 2 +- .../Projects-Default-No/cabal.sub-rs.test.hs | 2 +- .../Projects-Default-Yes/cabal.dot-uv.test.hs | 2 +- .../Projects-Default-Yes/cabal.ignore-project.test.hs | 2 +- .../Projects-Default-Yes/cabal.no-project.test.hs | 2 +- .../Projects-Default-Yes/cabal.project.test.hs | 2 +- .../Projects-Default-Yes/cabal.sub-pq.test.hs | 2 +- .../Projects-Default-Yes/cabal.sub-rs.test.hs | 2 +- .../SDist/Respect-Project-File/cabal.ignore-project.test.hs | 2 +- .../SDist/Respect-Project-File/cabal.ignore-project.v2.test.hs | 2 +- .../SDist/Respect-Project-File/cabal.no-project.test.hs | 2 +- 14 files changed, 14 insertions(+), 14 deletions(-) diff --git a/cabal-testsuite/PackageTests/SDist/Respect-Project-File/Projects-Default-No/cabal.dot-uv.test.hs b/cabal-testsuite/PackageTests/SDist/Respect-Project-File/Projects-Default-No/cabal.dot-uv.test.hs index f45ed508b31..1a332eded1e 100644 --- a/cabal-testsuite/PackageTests/SDist/Respect-Project-File/Projects-Default-No/cabal.dot-uv.test.hs +++ b/cabal-testsuite/PackageTests/SDist/Respect-Project-File/Projects-Default-No/cabal.dot-uv.test.hs @@ -8,5 +8,5 @@ import Test.Cabal.Prelude -- -- TODO: Fix this behaviour and apply the patch cabal.dot-uv.patch to update the -- expected output to what we'd expect if "cabal sdist" respected the project. -main = cabalTest . withProjectFile "cabal.dot-uv.project" $ do +main = cabalTest . withProjectFile "cabal.dot-uv.project" $ expectBroken 12501 $ do cabal "sdist" ["all"] diff --git a/cabal-testsuite/PackageTests/SDist/Respect-Project-File/Projects-Default-No/cabal.ignore-project.test.hs b/cabal-testsuite/PackageTests/SDist/Respect-Project-File/Projects-Default-No/cabal.ignore-project.test.hs index 90432e4fbb8..ae533c91c4d 100755 --- a/cabal-testsuite/PackageTests/SDist/Respect-Project-File/Projects-Default-No/cabal.ignore-project.test.hs +++ b/cabal-testsuite/PackageTests/SDist/Respect-Project-File/Projects-Default-No/cabal.ignore-project.test.hs @@ -1,5 +1,5 @@ import Test.Cabal.Prelude -- This test correctly writes sdist/uv-0.1.tar.gz for the uv.cabal package. -main = cabalTest $ do +main = cabalTest $ expectBroken 12501 $ do cabal "sdist" ["all", "--ignore-project"] diff --git a/cabal-testsuite/PackageTests/SDist/Respect-Project-File/Projects-Default-No/cabal.no-project.test.hs b/cabal-testsuite/PackageTests/SDist/Respect-Project-File/Projects-Default-No/cabal.no-project.test.hs index 49bd8ecf713..8ce5a935e20 100755 --- a/cabal-testsuite/PackageTests/SDist/Respect-Project-File/Projects-Default-No/cabal.no-project.test.hs +++ b/cabal-testsuite/PackageTests/SDist/Respect-Project-File/Projects-Default-No/cabal.no-project.test.hs @@ -5,5 +5,5 @@ import Test.Cabal.Prelude -- alternative and reasonable expectation (but not the behaviour seen) is that -- project probing would not occur and "cabal sdist" would work on the local -- uv.cabal package. -main = cabalTest $ do +main = cabalTest $ expectBroken 12501 $ do cabal "sdist" ["all"] diff --git a/cabal-testsuite/PackageTests/SDist/Respect-Project-File/Projects-Default-No/cabal.sub-pq.test.hs b/cabal-testsuite/PackageTests/SDist/Respect-Project-File/Projects-Default-No/cabal.sub-pq.test.hs index 8ad8bbd1233..7df09696b80 100644 --- a/cabal-testsuite/PackageTests/SDist/Respect-Project-File/Projects-Default-No/cabal.sub-pq.test.hs +++ b/cabal-testsuite/PackageTests/SDist/Respect-Project-File/Projects-Default-No/cabal.sub-pq.test.hs @@ -8,5 +8,5 @@ import Test.Cabal.Prelude -- -- TODO: Fix this behaviour and apply the patch cabal.sub-pq.patch to update the -- expected output to what we'd expect if "cabal sdist" respected the project. -main = cabalTest . withProjectFile "cabal.sub-pq.project" $ do +main = cabalTest . withProjectFile "cabal.sub-pq.project" $ expectBroken 12501 $ do cabal "sdist" ["all"] diff --git a/cabal-testsuite/PackageTests/SDist/Respect-Project-File/Projects-Default-No/cabal.sub-rs.test.hs b/cabal-testsuite/PackageTests/SDist/Respect-Project-File/Projects-Default-No/cabal.sub-rs.test.hs index d6ecf063192..a67ccdb4bbe 100644 --- a/cabal-testsuite/PackageTests/SDist/Respect-Project-File/Projects-Default-No/cabal.sub-rs.test.hs +++ b/cabal-testsuite/PackageTests/SDist/Respect-Project-File/Projects-Default-No/cabal.sub-rs.test.hs @@ -8,5 +8,5 @@ import Test.Cabal.Prelude -- -- TODO: Fix this behaviour and apply the patch cabal.sub-rs.patch to update the -- expected output to what we'd expect if "cabal sdist" respected the project. -main = cabalTest . withProjectFile "cabal.sub-rs.project" $ do +main = cabalTest . withProjectFile "cabal.sub-rs.project" $ expectBroken 12501 $ do cabal "sdist" ["all"] diff --git a/cabal-testsuite/PackageTests/SDist/Respect-Project-File/Projects-Default-Yes/cabal.dot-uv.test.hs b/cabal-testsuite/PackageTests/SDist/Respect-Project-File/Projects-Default-Yes/cabal.dot-uv.test.hs index 3c0f776a70c..528f869b9ef 100644 --- a/cabal-testsuite/PackageTests/SDist/Respect-Project-File/Projects-Default-Yes/cabal.dot-uv.test.hs +++ b/cabal-testsuite/PackageTests/SDist/Respect-Project-File/Projects-Default-Yes/cabal.dot-uv.test.hs @@ -8,5 +8,5 @@ import Test.Cabal.Prelude -- -- TODO: Fix this behaviour and apply the patch cabal.dot-uv.patch to update the -- expected output to what we'd expect if "cabal sdist" respected the project. -main = cabalTest . withProjectFile "cabal.dot-uv.project" $ do +main = cabalTest . withProjectFile "cabal.dot-uv.project" $ expectBroken 12501 $ do cabal "sdist" ["all"] diff --git a/cabal-testsuite/PackageTests/SDist/Respect-Project-File/Projects-Default-Yes/cabal.ignore-project.test.hs b/cabal-testsuite/PackageTests/SDist/Respect-Project-File/Projects-Default-Yes/cabal.ignore-project.test.hs index 90432e4fbb8..ae533c91c4d 100755 --- a/cabal-testsuite/PackageTests/SDist/Respect-Project-File/Projects-Default-Yes/cabal.ignore-project.test.hs +++ b/cabal-testsuite/PackageTests/SDist/Respect-Project-File/Projects-Default-Yes/cabal.ignore-project.test.hs @@ -1,5 +1,5 @@ import Test.Cabal.Prelude -- This test correctly writes sdist/uv-0.1.tar.gz for the uv.cabal package. -main = cabalTest $ do +main = cabalTest $ expectBroken 12501 $ do cabal "sdist" ["all", "--ignore-project"] diff --git a/cabal-testsuite/PackageTests/SDist/Respect-Project-File/Projects-Default-Yes/cabal.no-project.test.hs b/cabal-testsuite/PackageTests/SDist/Respect-Project-File/Projects-Default-Yes/cabal.no-project.test.hs index b25efe2a0d9..e4dfa6fd4a6 100755 --- a/cabal-testsuite/PackageTests/SDist/Respect-Project-File/Projects-Default-Yes/cabal.no-project.test.hs +++ b/cabal-testsuite/PackageTests/SDist/Respect-Project-File/Projects-Default-Yes/cabal.no-project.test.hs @@ -6,5 +6,5 @@ import Test.Cabal.Prelude -- -- TODO: Check that the code is behaving the same as it would have if -- "--project-file=cabal.project" was given or if it is using project probing. -main = cabalTest $ do +main = cabalTest $ expectBroken 12501 $ do cabal "sdist" ["all"] diff --git a/cabal-testsuite/PackageTests/SDist/Respect-Project-File/Projects-Default-Yes/cabal.project.test.hs b/cabal-testsuite/PackageTests/SDist/Respect-Project-File/Projects-Default-Yes/cabal.project.test.hs index 81b6cc511b1..a71860c5827 100644 --- a/cabal-testsuite/PackageTests/SDist/Respect-Project-File/Projects-Default-Yes/cabal.project.test.hs +++ b/cabal-testsuite/PackageTests/SDist/Respect-Project-File/Projects-Default-Yes/cabal.project.test.hs @@ -3,5 +3,5 @@ import Test.Cabal.Prelude -- The given cabal.project has has "packages: p/ q/" and "cabal sdist" writes -- sdist/p-0.1.tar.gz and sdist/q-0.1.tar.gz. This is correct but likely -- accidental as the default cabal.project has the same packages. -main = cabalTest . withProjectFile "cabal.project" $ do +main = cabalTest . withProjectFile "cabal.project" $ expectBroken 12501 $ do cabal "sdist" ["all"] diff --git a/cabal-testsuite/PackageTests/SDist/Respect-Project-File/Projects-Default-Yes/cabal.sub-pq.test.hs b/cabal-testsuite/PackageTests/SDist/Respect-Project-File/Projects-Default-Yes/cabal.sub-pq.test.hs index 63803ba8851..846aef0ccc9 100644 --- a/cabal-testsuite/PackageTests/SDist/Respect-Project-File/Projects-Default-Yes/cabal.sub-pq.test.hs +++ b/cabal-testsuite/PackageTests/SDist/Respect-Project-File/Projects-Default-Yes/cabal.sub-pq.test.hs @@ -2,5 +2,5 @@ import Test.Cabal.Prelude -- cabal.sub-pq.project has "packages: p/ q/" and "cabal sdist" writes -- sdist/p-0.1.tar.gz and sdist/q-0.1.tar.gz. This is correct. -main = cabalTest . withProjectFile "cabal.sub-pq.project" $ do +main = cabalTest . withProjectFile "cabal.sub-pq.project" $ expectBroken 12501 $ do cabal "sdist" ["all"] diff --git a/cabal-testsuite/PackageTests/SDist/Respect-Project-File/Projects-Default-Yes/cabal.sub-rs.test.hs b/cabal-testsuite/PackageTests/SDist/Respect-Project-File/Projects-Default-Yes/cabal.sub-rs.test.hs index e8977aa1770..ce78433ef7b 100644 --- a/cabal-testsuite/PackageTests/SDist/Respect-Project-File/Projects-Default-Yes/cabal.sub-rs.test.hs +++ b/cabal-testsuite/PackageTests/SDist/Respect-Project-File/Projects-Default-Yes/cabal.sub-rs.test.hs @@ -8,5 +8,5 @@ import Test.Cabal.Prelude -- -- TODO: Fix this behaviour and apply the patch cabal.sub-rs.patch to update the -- expected output to what we'd expect if "cabal sdist" respected the project. -main = cabalTest . withProjectFile "cabal.sub-rs.project" $ do +main = cabalTest . withProjectFile "cabal.sub-rs.project" $ expectBroken 12501 $ do cabal "sdist" ["all"] diff --git a/cabal-testsuite/PackageTests/SDist/Respect-Project-File/cabal.ignore-project.test.hs b/cabal-testsuite/PackageTests/SDist/Respect-Project-File/cabal.ignore-project.test.hs index 3145737a646..9fd178e0025 100755 --- a/cabal-testsuite/PackageTests/SDist/Respect-Project-File/cabal.ignore-project.test.hs +++ b/cabal-testsuite/PackageTests/SDist/Respect-Project-File/cabal.ignore-project.test.hs @@ -1,5 +1,5 @@ import Test.Cabal.Prelude -- This test correctly writes sdist/z-0.1.tar.gz for the z.cabal package. -main = cabalTest $ do +main = cabalTest $ expectBroken 12501 $ do cabal "sdist" ["all", "--ignore-project"] diff --git a/cabal-testsuite/PackageTests/SDist/Respect-Project-File/cabal.ignore-project.v2.test.hs b/cabal-testsuite/PackageTests/SDist/Respect-Project-File/cabal.ignore-project.v2.test.hs index 3145737a646..9fd178e0025 100755 --- a/cabal-testsuite/PackageTests/SDist/Respect-Project-File/cabal.ignore-project.v2.test.hs +++ b/cabal-testsuite/PackageTests/SDist/Respect-Project-File/cabal.ignore-project.v2.test.hs @@ -1,5 +1,5 @@ import Test.Cabal.Prelude -- This test correctly writes sdist/z-0.1.tar.gz for the z.cabal package. -main = cabalTest $ do +main = cabalTest $ expectBroken 12501 $ do cabal "sdist" ["all", "--ignore-project"] diff --git a/cabal-testsuite/PackageTests/SDist/Respect-Project-File/cabal.no-project.test.hs b/cabal-testsuite/PackageTests/SDist/Respect-Project-File/cabal.no-project.test.hs index 8f440b78ca6..67d938947b3 100755 --- a/cabal-testsuite/PackageTests/SDist/Respect-Project-File/cabal.no-project.test.hs +++ b/cabal-testsuite/PackageTests/SDist/Respect-Project-File/cabal.no-project.test.hs @@ -3,5 +3,5 @@ import Test.Cabal.Prelude -- When no project is given, "cabal sdist" finds a default cabal.project that -- has "packages: Projects-Default-No/p" and writes sdist/p-0.1.tar.gz. This is -- correct. -main = cabalTest $ do +main = cabalTest $ expectBroken 12501 $ do cabal "sdist" ["all"] From 758940f4454b55630f7a8739b8e00420cb23184e Mon Sep 17 00:00:00 2001 From: Phil de Joux Date: Fri, 30 Oct 2026 14:40:23 -0400 Subject: [PATCH 4/5] Update expected output of --ignore-project test --- .../Projects-Default-Yes/cabal.ignore-project.v2.out | 3 +-- .../Projects-Default-Yes/cabal.ignore-project.v2.patch | 0 .../Projects-Default-Yes/cabal.ignore-project.v2.test.hs | 6 +++--- 3 files changed, 4 insertions(+), 5 deletions(-) delete mode 100644 cabal-testsuite/PackageTests/SDist/Respect-Project-File/Projects-Default-Yes/cabal.ignore-project.v2.patch diff --git a/cabal-testsuite/PackageTests/SDist/Respect-Project-File/Projects-Default-Yes/cabal.ignore-project.v2.out b/cabal-testsuite/PackageTests/SDist/Respect-Project-File/Projects-Default-Yes/cabal.ignore-project.v2.out index f44e24e9567..67bd3824161 100644 --- a/cabal-testsuite/PackageTests/SDist/Respect-Project-File/Projects-Default-Yes/cabal.ignore-project.v2.out +++ b/cabal-testsuite/PackageTests/SDist/Respect-Project-File/Projects-Default-Yes/cabal.ignore-project.v2.out @@ -1,3 +1,2 @@ # cabal v2-sdist -Wrote tarball sdist to /dist-newstyle/sdist/p-0.1.tar.gz -Wrote tarball sdist to /dist-newstyle/sdist/q-0.1.tar.gz +Wrote tarball sdist to /dist-newstyle/sdist/uv-0.1.tar.gz diff --git a/cabal-testsuite/PackageTests/SDist/Respect-Project-File/Projects-Default-Yes/cabal.ignore-project.v2.patch b/cabal-testsuite/PackageTests/SDist/Respect-Project-File/Projects-Default-Yes/cabal.ignore-project.v2.patch deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/cabal-testsuite/PackageTests/SDist/Respect-Project-File/Projects-Default-Yes/cabal.ignore-project.v2.test.hs b/cabal-testsuite/PackageTests/SDist/Respect-Project-File/Projects-Default-Yes/cabal.ignore-project.v2.test.hs index d017d47317a..d4f29cc7a76 100755 --- a/cabal-testsuite/PackageTests/SDist/Respect-Project-File/Projects-Default-Yes/cabal.ignore-project.v2.test.hs +++ b/cabal-testsuite/PackageTests/SDist/Respect-Project-File/Projects-Default-Yes/cabal.ignore-project.v2.test.hs @@ -1,7 +1,7 @@ import Test.Cabal.Prelude --- This test doesn't ignore the project. It should have written --- sdist/uv-0.1.tar.gz for the uv.cabal package but instead it wrote --- sdist/p-0.1.tar.gz and sdist/q-0.1.tar.gz. +-- With "--ignore-project", "cabal v2-sdist" ignores the default cabal.project +-- that has "packages: p/ q/" and writes sdist/uv-0.1.tar.gz for the uv.cabal +-- package in the current directory. This is correct. main = cabalTest $ do cabal "v2-sdist" ["all", "--ignore-project"] From d53c4a9e13c294ad790a15640ab3ef4feb191e89 Mon Sep 17 00:00:00 2001 From: Phil de Joux Date: Fri, 30 Oct 2026 14:53:25 -0400 Subject: [PATCH 5/5] Remove unneeded .patch --- .../Projects-Default-Yes/cabal.no-project.v2.patch | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 cabal-testsuite/PackageTests/SDist/Respect-Project-File/Projects-Default-Yes/cabal.no-project.v2.patch diff --git a/cabal-testsuite/PackageTests/SDist/Respect-Project-File/Projects-Default-Yes/cabal.no-project.v2.patch b/cabal-testsuite/PackageTests/SDist/Respect-Project-File/Projects-Default-Yes/cabal.no-project.v2.patch deleted file mode 100644 index e69de29bb2d..00000000000