Skip to content

Commit

Permalink
Add NeedleHaystack
Browse files Browse the repository at this point in the history
- Add expectNeedleInHaystack field to NeedleHaystack
- Remove 3 assert*Contains functions
- Add TxContains record
- Apply the txBwd transformations before display
- Add displayHaystack field
- Switch to using <EOL> as the marker
- Sort language pragmas
- Use ++ rather than cons with reversals
- Rerun ParseErrorProvenance test
- Add doctests for single line strings
- Read exected multiline string from file
- Use lineBreaksToSpaces
- Add module Test.Cabal.NeedleHaystack
- Redo ConditionalAndImport with multiline expectations
- Add test of string expectation start and end marking
- Rename encodeLf and decodeLfMarkLines
- Rename original concatOutput to lineBreaksToSpaces
- Add assertOutputContainsWrapped
- Use multiline and wrapped assertions
- Satisfy fix-whitespace
- DedupUsingConfigFromComplex multiline assertion
- Remove redundant tests that fail on Windows
- Use normalizeWindowsOutput in ConditionalAndImport
- Forward conversion applied twice by mistake
- Easier diff when assertOn follows assertOutputContains
  • Loading branch information
philderbeast committed Jan 1, 2025
1 parent 8a5a5b4 commit d2c6a43
Show file tree
Hide file tree
Showing 13 changed files with 280 additions and 187 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,4 @@ main = setupAndCabalTest . withPackageDb $ do
assertEqual
("executable should have linked with the internal library")
("foo foo myLibFunc internal")
(concatOutput (resultOutput r))
(lineBreaksToSpaces $ resultOutput r)
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,4 @@ main = setupAndCabalTest . withPackageDb $ do
assertEqual
("executable should have linked with the internal library")
("foo foo myLibFunc internal")
(concatOutput (resultOutput r))
(lineBreaksToSpaces $ resultOutput r)
8 changes: 6 additions & 2 deletions cabal-testsuite/PackageTests/CheckSetup/setup.test.hs
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,12 @@ main = cabalTest $ do
"The dependency 'setup-depends: 'base' does not specify "
++ "an upper bound on the version number"

-- Replace line breaks with spaces in the haystack so that we can search
-- for a string that wraps lines.
let lineBreakBlind = needleHaystack{txHaystack = txContainsId{txFwd = lineBreaksToSpaces}}

-- Asserts for the desired check messages after configure.
assertOutputContains libError1 checkResult
assertOutputContains libError2 checkResult
assertOn lineBreakBlind libError1 checkResult
assertOn lineBreakBlind libError2 checkResult

return ()
192 changes: 87 additions & 105 deletions cabal-testsuite/PackageTests/ConditionalAndImport/cabal.test.hs
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
import Test.Cabal.Prelude
import Test.Cabal.OutputNormalizer
import Data.Function ((&))

main = cabalTest . withRepo "repo" . recordMode RecordMarked $ do
let log = recordHeader . pure
Expand Down Expand Up @@ -108,89 +110,65 @@ main = cabalTest . withRepo "repo" . recordMode RecordMarked $ do
-- +-- hops/hops-9.config (no further imports so not cyclical)
log "checking that imports work skipping into a subfolder and then back out again and again"
hopping <- cabal' "v2-build" [ "--project-file=hops-0.project" ]
assertOutputContains "Configuration is affected by the following files" hopping
assertOutputContains "- hops-0.project" hopping

assertOutputContains
(normalizeWindowsOutput "- hops-2.config \
\ imported by: hops/hops-1.config \
\ imported by: hops-0.project")
hopping

assertOutputContains
(normalizeWindowsOutput "- hops-4.config \
\ imported by: hops/hops-3.config \
\ imported by: hops-2.config \
\ imported by: hops/hops-1.config \
\ imported by: hops-0.project")
hopping

assertOutputContains
(normalizeWindowsOutput "- hops-6.config \
\ imported by: hops/hops-5.config \
\ imported by: hops-4.config \
\ imported by: hops/hops-3.config \
\ imported by: hops-2.config \
\ imported by: hops/hops-1.config \
\ imported by: hops-0.project")
hopping

assertOutputContains
(normalizeWindowsOutput "- hops-8.config \
\ imported by: hops/hops-7.config \
\ imported by: hops-6.config \
\ imported by: hops/hops-5.config \
\ imported by: hops-4.config \
\ imported by: hops/hops-3.config \
\ imported by: hops-2.config \
\ imported by: hops/hops-1.config \
\ imported by: hops-0.project")
hopping

assertOutputContains
(normalizeWindowsOutput "- hops/hops-1.config \
\ imported by: hops-0.project")
hopping

assertOutputContains
(normalizeWindowsOutput "- hops/hops-3.config \
\ imported by: hops-2.config \
\ imported by: hops/hops-1.config \
\ imported by: hops-0.project")
hopping

assertOutputContains
(normalizeWindowsOutput "- hops/hops-5.config \
\ imported by: hops-4.config \
\ imported by: hops/hops-3.config \
\ imported by: hops-2.config \
\ imported by: hops/hops-1.config \
\ imported by: hops-0.project")
hopping

assertOutputContains
(normalizeWindowsOutput "- hops/hops-7.config \
\ imported by: hops-6.config \
\ imported by: hops/hops-5.config \
\ imported by: hops-4.config \
\ imported by: hops/hops-3.config \
\ imported by: hops-2.config \
\ imported by: hops/hops-1.config \
\ imported by: hops-0.project")
hopping

assertOutputContains
(normalizeWindowsOutput "- hops/hops-9.config \
\ imported by: hops-8.config \
\ imported by: hops/hops-7.config \
\ imported by: hops-6.config \
\ imported by: hops/hops-5.config \
\ imported by: hops-4.config \
\ imported by: hops/hops-3.config \
\ imported by: hops-2.config \
\ imported by: hops/hops-1.config \
\ imported by: hops-0.project")
hopping
"Configuration is affected by the following files:\n\
\- hops-0.project\n\
\- hops-2.config\n\
\ imported by: hops/hops-1.config\n\
\ imported by: hops-0.project\n\
\- hops-4.config\n\
\ imported by: hops/hops-3.config\n\
\ imported by: hops-2.config\n\
\ imported by: hops/hops-1.config\n\
\ imported by: hops-0.project\n\
\- hops-6.config\n\
\ imported by: hops/hops-5.config\n\
\ imported by: hops-4.config\n\
\ imported by: hops/hops-3.config\n\
\ imported by: hops-2.config\n\
\ imported by: hops/hops-1.config\n\
\ imported by: hops-0.project\n\
\- hops-8.config\n\
\ imported by: hops/hops-7.config\n\
\ imported by: hops-6.config\n\
\ imported by: hops/hops-5.config\n\
\ imported by: hops-4.config\n\
\ imported by: hops/hops-3.config\n\
\ imported by: hops-2.config\n\
\ imported by: hops/hops-1.config\n\
\ imported by: hops-0.project\n\
\- hops/hops-1.config\n\
\ imported by: hops-0.project\n\
\- hops/hops-3.config\n\
\ imported by: hops-2.config\n\
\ imported by: hops/hops-1.config\n\
\ imported by: hops-0.project\n\
\- hops/hops-5.config\n\
\ imported by: hops-4.config\n\
\ imported by: hops/hops-3.config\n\
\ imported by: hops-2.config\n\
\ imported by: hops/hops-1.config\n\
\ imported by: hops-0.project\n\
\- hops/hops-7.config\n\
\ imported by: hops-6.config\n\
\ imported by: hops/hops-5.config\n\
\ imported by: hops-4.config\n\
\ imported by: hops/hops-3.config\n\
\ imported by: hops-2.config\n\
\ imported by: hops/hops-1.config\n\
\ imported by: hops-0.project\n\
\- hops/hops-9.config\n\
\ imported by: hops-8.config\n\
\ imported by: hops/hops-7.config\n\
\ imported by: hops-6.config\n\
\ imported by: hops/hops-5.config\n\
\ imported by: hops-4.config\n\
\ imported by: hops/hops-3.config\n\
\ imported by: hops-2.config\n\
\ imported by: hops/hops-1.config\n\
\ imported by: hops-0.project"
& normalizeWindowsOutput
& flip (assertOn multilineNeedleHaystack) hopping

-- The project is named oops as it is like hops but has conflicting constraints.
-- +-- oops-0.project
Expand All @@ -205,22 +183,25 @@ main = cabalTest . withRepo "repo" . recordMode RecordMarked $ do
-- +-- oops/oops-9.config (has conflicting constraints)
log "checking conflicting constraints skipping into a subfolder and then back out again and again"
oopsing <- fails $ cabal' "v2-build" [ "all", "--project-file=oops-0.project" ]
assertOutputContains "rejecting: hashable-1.4.2.0" oopsing
assertOutputContains "rejecting: hashable-1.4.3.0" oopsing
assertOutputContains "(constraint from oops-0.project requires ==1.4.3.0)" oopsing

assertOutputContains
(normalizeWindowsOutput " (constraint from oops/oops-9.config requires ==1.4.2.0) \
\ imported by: oops-8.config \
\ imported by: oops/oops-7.config \
\ imported by: oops-6.config \
\ imported by: oops/oops-5.config \
\ imported by: oops-4.config \
\ imported by: oops/oops-3.config \
\ imported by: oops-2.config \
\ imported by: oops/oops-1.config \
\ imported by: oops-0.project")
oopsing
"Could not resolve dependencies:\n\
\[__0] trying: oops-0.1 (user goal)\n\
\[__1] next goal: hashable (dependency of oops)\n\
\[__1] rejecting: hashable-1.4.3.0\n\
\ (constraint from oops/oops-9.config requires ==1.4.2.0)\n\
\ imported by: oops-8.config\n\
\ imported by: oops/oops-7.config\n\
\ imported by: oops-6.config\n\
\ imported by: oops/oops-5.config\n\
\ imported by: oops-4.config\n\
\ imported by: oops/oops-3.config\n\
\ imported by: oops-2.config\n\
\ imported by: oops/oops-1.config\n\
\ imported by: oops-0.project\n\
\[__1] rejecting: hashable-1.4.2.0\n\
\ (constraint from oops-0.project requires ==1.4.3.0)"
& normalizeWindowsOutput
& flip (assertOn multilineNeedleHaystack) oopsing

-- The project is named yops as it is like hops but with y's for forks.
-- +-- yops-0.project
Expand Down Expand Up @@ -261,13 +242,14 @@ main = cabalTest . withRepo "repo" . recordMode RecordMarked $ do

log "checking that missing package message lists configuration provenance"
missing <- fails $ cabal' "v2-build" [ "--project-file=cabal-missing-package.project" ]
assertOutputContains
(normalizeWindowsOutput "When using configuration from: \
\ - cabal-missing-package.project \
\ - missing/pkgs.config \
\ - missing/pkgs/default.config \
\The following errors occurred: \
\ - The package location 'pkg-doesnt-exist' does not exist.")
missing

"When using configuration from:\n\
\ - cabal-missing-package.project\n\
\ - missing/pkgs.config\n\
\ - missing/pkgs/default.config\n\
\The following errors occurred:\n\
\ - The package location 'pkg-doesnt-exist' does not exist."
& normalizeWindowsOutput
& flip (assertOn multilineNeedleHaystack) missing

return ()
10 changes: 5 additions & 5 deletions cabal-testsuite/PackageTests/NewBuild/T4288/cabal.test.hs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import Test.Cabal.Prelude
import Data.Function ((&))

-- This test is similar to the simplified example in issue #4288. The package's
-- setup script only depends on base and setup-helper. setup-helper exposes a
Expand All @@ -10,8 +11,7 @@ main = cabalTest $ do
skipUnless "no v2-build compatible boot-Cabal" =<< hasNewBuildCompatBootCabal
r <- recordMode DoNotRecord $ cabal' "v2-build" ["T4288"]
assertOutputContains "This is setup-helper-1.0." r
assertOutputContains
("In order, the following will be built: "
++ " - setup-helper-1.0 (lib:setup-helper) (first run) "
++ " - T4288-1.0 (lib:T4288) (first run)")
r
"In order, the following will be built:\n\
\ - setup-helper-1.0 (lib:setup-helper) (first run)\n\
\ - T4288-1.0 (lib:T4288) (first run)"
& flip (assertOn multilineNeedleHaystack) r
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import Test.Cabal.Prelude
import Data.Function ((&))

main = cabalTest . recordMode RecordMarked $ do
let log = recordHeader . pure
Expand Down Expand Up @@ -31,12 +32,12 @@ main = cabalTest . recordMode RecordMarked $ do
out

log "checking that package directories and locations are reported in order"
assertOutputContains
"The following errors occurred: \
\ - The package directory 'no-pkg-1' does not contain any .cabal file. \
\ - The package location 'no-pkg-2-dir' does not exist. \
\ - The package directory 'no-pkg-3' does not contain any .cabal file. \
\ - The package location 'no-pkg-4-dir' does not exist."
out

"The following errors occurred:\n\
\ - The package directory 'no-pkg-1' does not contain any .cabal file.\n\
\ - The package location 'no-pkg-2-dir' does not exist.\n\
\ - The package directory 'no-pkg-3' does not contain any .cabal file.\n\
\ - The package location 'no-pkg-4-dir' does not exist."
& flip (assertOn multilineNeedleHaystack) out

return ()
Original file line number Diff line number Diff line change
@@ -1,2 +1,10 @@
# cabal v2-build
Warning: <ROOT>/else.project, else.project: Unrecognized section '_' on line 3
# Multiline string marking:
# ^When using configuration from:$
# ^ - else.project$
# ^ - dir-else/else.config$
# ^The following errors occurred:$
# ^ - The package location 'no-pkg-here' does not exist.$
# Pseudo multiline string marking:
# ^When using configuration from: - else.project - dir-else/else.config The following errors occurred: - The package location 'no-pkg-here' does not exist.$
Original file line number Diff line number Diff line change
@@ -1,15 +1,28 @@
import Test.Cabal.Prelude
import System.Directory

main = cabalTest . recordMode RecordMarked $ do
let log = recordHeader . pure
cwd <- liftIO getCurrentDirectory
env <- getTestEnv
let testDir = testCurrentDir env
liftIO . putStrLn $ "Current working directory: " ++ cwd
msg <- liftIO . readFile $ testDir </> "msg.txt"

outElse <- fails $ cabal' "v2-build" [ "all", "--dry-run", "--project-file=else.project" ]
assertOutputContainsOn unConcatOutput unConcatOutput concatOutput
(concatOutput "When using configuration from:\n\
\ - else.project\n\
\ - dir-else/else.config\n\
\The following errors occurred:\n\
\ - The package location 'no-pkg-here' does not exist.")
outElse

let msgSingle = lineBreaksToSpaces msg

log "Multiline string marking:"
mapM_ log (lines . decodeLfMarkLines $ encodeLf msg)

log "Pseudo multiline string marking:"
mapM_ log (lines . decodeLfMarkLines $ encodeLf msgSingle)

assertOn multilineNeedleHaystack msg outElse
assertOn multilineNeedleHaystack{expectNeedleInHaystack = False} msgSingle outElse

assertOutputDoesNotContain msg outElse
assertOutputDoesNotContain msgSingle outElse

return ()
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
When using configuration from:
- else.project
- dir-else/else.config
The following errors occurred:
- The package location 'no-pkg-here' does not exist.
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import Test.Cabal.Prelude
import Data.Function ((&))

-- The local package, pkg-1.0, depends on build-tool-pkg-1 as a library and
-- build-tool-pkg-2 as a build-tool. This test checks that cabal uses the
Expand All @@ -16,16 +17,13 @@ main = cabalTest $ withShorterPathForNewBuildStore $ do
r1 <- recordMode DoNotRecord $
cabal' "v2-build" ["pkg:my-exe"]

let msg = concat
[ "In order, the following will be built:"
, " - build-tool-pkg-1 (lib) (requires build)"
, " - build-tool-pkg-2 (lib) (requires build)"
, " - build-tool-pkg-2 (exe:build-tool-exe) (requires build)"
, " - pkg-1.0 (exe:my-exe) (first run)"
]
"In order, the following will be built:\n\
\ - build-tool-pkg-1 (lib) (requires build)\n\
\ - build-tool-pkg-2 (lib) (requires build)\n\
\ - build-tool-pkg-2 (exe:build-tool-exe) (requires build)\n\
\ - pkg-1.0 (exe:my-exe) (first run)"
& flip (assertOn multilineNeedleHaystack) r1

assertOutputContains msg r1
withPlan $ do
r2 <- runPlanExe' "pkg" "my-exe" []
assertOutputContains
"build-tool library version: 1, build-tool exe version: 2" r2
assertOn multilineNeedleHaystack "build-tool library version: 1,\nbuild-tool exe version: 2" r2
1 change: 1 addition & 0 deletions cabal-testsuite/cabal-testsuite.cabal
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ library
Test.Cabal.CheckArMetadata
Test.Cabal.DecodeShowBuildInfo
Test.Cabal.Monad
Test.Cabal.NeedleHaystack
Test.Cabal.OutputNormalizer
Test.Cabal.Plan
Test.Cabal.Prelude
Expand Down
Loading

0 comments on commit d2c6a43

Please sign in to comment.