From ad4c204a87b2d75abf2702ea45864d11a053cb2f Mon Sep 17 00:00:00 2001 From: Simon Jakobi Date: Thu, 14 May 2026 20:57:02 +0200 Subject: [PATCH] Switch doctests to doctest-parallel (#290) Fixes #290. Assisted-By: Kimi K2.6 --- cabal.project | 1 + .../prettyprinter-ansi-terminal.cabal | 3 +- .../Prettyprinter/Render/Terminal/Internal.hs | 1 + .../test/Doctest/Main.hs | 5 ++-- prettyprinter/prettyprinter.cabal | 3 +- prettyprinter/src/Prettyprinter/Internal.hs | 13 ++------- .../src/Prettyprinter/Internal/Debug.hs | 7 +++++ .../src/Prettyprinter/Render/Text.hs | 1 + .../Render/Tutorials/StackMachineTutorial.hs | 29 ++++++++++--------- .../Render/Tutorials/TreeRenderingTutorial.hs | 7 +++++ .../Render/Util/SimpleDocTree.hs | 1 + .../Prettyprinter/Render/Util/StackMachine.hs | 1 + .../src/Prettyprinter/Symbols/Ascii.hs | 1 + prettyprinter/src/Prettyprinter/Util.hs | 19 ++++++------ prettyprinter/test/Doctest/Main.hs | 9 ++---- 15 files changed, 58 insertions(+), 43 deletions(-) diff --git a/cabal.project b/cabal.project index 2c103018..9ce55649 100644 --- a/cabal.project +++ b/cabal.project @@ -8,3 +8,4 @@ packages: prettyprinter , prettyprinter-compat-annotated-wl-pprint tests: true benchmarks: true +write-ghc-environment-files: always diff --git a/prettyprinter-ansi-terminal/prettyprinter-ansi-terminal.cabal b/prettyprinter-ansi-terminal/prettyprinter-ansi-terminal.cabal index c7e1f4ca..5242be3c 100644 --- a/prettyprinter-ansi-terminal/prettyprinter-ansi-terminal.cabal +++ b/prettyprinter-ansi-terminal/prettyprinter-ansi-terminal.cabal @@ -64,7 +64,8 @@ test-suite doctest main-is: Main.hs build-depends: base >= 4.9 && < 5 - , doctest >= 0.9 + , doctest-parallel >= 0.1 + , prettyprinter-ansi-terminal ghc-options: -Wall -threaded -rtsopts -with-rtsopts=-N default-language: Haskell2010 diff --git a/prettyprinter-ansi-terminal/src/Prettyprinter/Render/Terminal/Internal.hs b/prettyprinter-ansi-terminal/src/Prettyprinter/Render/Terminal/Internal.hs index 16ed6dd2..165a03bf 100644 --- a/prettyprinter-ansi-terminal/src/Prettyprinter/Render/Terminal/Internal.hs +++ b/prettyprinter-ansi-terminal/src/Prettyprinter/Render/Terminal/Internal.hs @@ -63,6 +63,7 @@ import Data.Semigroup (Semigroup(..)) -- >>> :set -XOverloadedStrings -- >>> import qualified Data.Text.Lazy.IO as TL -- >>> import qualified Data.Text.Lazy as TL +-- >>> import Prettyprinter -- >>> import Prettyprinter.Render.Terminal diff --git a/prettyprinter-ansi-terminal/test/Doctest/Main.hs b/prettyprinter-ansi-terminal/test/Doctest/Main.hs index 563a5c63..12e27706 100644 --- a/prettyprinter-ansi-terminal/test/Doctest/Main.hs +++ b/prettyprinter-ansi-terminal/test/Doctest/Main.hs @@ -1,6 +1,7 @@ module Main (main) where -import Test.DocTest +import Test.DocTest (mainFromCabal) +import System.Environment (getArgs) main :: IO () -main = doctest [ "src" , "-Imisc"] +main = mainFromCabal "prettyprinter-ansi-terminal" =<< getArgs diff --git a/prettyprinter/prettyprinter.cabal b/prettyprinter/prettyprinter.cabal index 5b6999d5..a3a7911b 100644 --- a/prettyprinter/prettyprinter.cabal +++ b/prettyprinter/prettyprinter.cabal @@ -20,7 +20,6 @@ source-repository head type: git location: https://github.com/quchen/prettyprinter - library exposed-modules: Prettyprinter @@ -123,7 +122,7 @@ test-suite doctest main-is: Main.hs build-depends: base >= 4.9 && < 5 - , doctest >= 0.9 + , doctest-parallel >= 0.1 , prettyprinter , QuickCheck >= 2.5 ghc-options: -Wall -threaded -rtsopts -with-rtsopts=-N diff --git a/prettyprinter/src/Prettyprinter/Internal.hs b/prettyprinter/src/Prettyprinter/Internal.hs index 6297c4fd..5b45ed93 100755 --- a/prettyprinter/src/Prettyprinter/Internal.hs +++ b/prettyprinter/src/Prettyprinter/Internal.hs @@ -1385,16 +1385,6 @@ spaces n | n == 1 = Char ' ' | otherwise = Text n (textSpaces n) --- $ --- prop> \(NonNegative n) -> length (show (spaces n)) == n --- --- >>> case spaces 1 of Char ' ' -> True; _ -> False --- True --- --- >>> case spaces 0 of Empty -> True; _ -> False --- True --- --- prop> \(Positive n) -> case (spaces (-n)) of Empty -> True; _ -> False @@ -2345,6 +2335,9 @@ textSpaces n = T.replicate n (T.singleton ' ') -- (Definitions for the doctests) -- -- >>> :set -XOverloadedStrings +-- >>> import Data.Functor.Identity +-- >>> import Data.Text (Text) +-- >>> import Data.Void (Void) -- >>> import Prettyprinter.Render.Text -- >>> import Prettyprinter.Symbols.Ascii -- >>> import Prettyprinter.Util as Util diff --git a/prettyprinter/src/Prettyprinter/Internal/Debug.hs b/prettyprinter/src/Prettyprinter/Internal/Debug.hs index ccff9cba..48fc7a86 100644 --- a/prettyprinter/src/Prettyprinter/Internal/Debug.hs +++ b/prettyprinter/src/Prettyprinter/Internal/Debug.hs @@ -28,6 +28,13 @@ import Data.Text (Text) import Prettyprinter.Internal (PageWidth, Doc) import qualified Prettyprinter.Internal as Doc +-- $setup +-- +-- (Definitions for the doctests) +-- +-- >>> :set -XOverloadedStrings +-- >>> import qualified Prettyprinter.Internal as Doc + -- | A variant of 'Doc' for debugging. -- -- Unlike in the 'Doc' type, the 'Column', 'WithPageWidth' and 'Nesting' diff --git a/prettyprinter/src/Prettyprinter/Render/Text.hs b/prettyprinter/src/Prettyprinter/Render/Text.hs index 0d6fbeaf..e97aef30 100644 --- a/prettyprinter/src/Prettyprinter/Render/Text.hs +++ b/prettyprinter/src/Prettyprinter/Render/Text.hs @@ -33,6 +33,7 @@ import Prettyprinter.Render.Util.Panic -- (Definitions for the doctests) -- -- >>> :set -XOverloadedStrings +-- >>> import Prettyprinter -- >>> import qualified Data.Text.IO as T -- >>> import qualified Data.Text.Lazy.IO as TL diff --git a/prettyprinter/src/Prettyprinter/Render/Tutorials/StackMachineTutorial.hs b/prettyprinter/src/Prettyprinter/Render/Tutorials/StackMachineTutorial.hs index b470b87b..c275efed 100644 --- a/prettyprinter/src/Prettyprinter/Render/Tutorials/StackMachineTutorial.hs +++ b/prettyprinter/src/Prettyprinter/Render/Tutorials/StackMachineTutorial.hs @@ -139,16 +139,19 @@ render doc -- -- We can now render an example document using our definitions: -- --- >>> :set -XOverloadedStrings --- >>> import qualified Data.Text.Lazy.IO as TL --- >>> :{ --- >>> let go = TL.putStrLn . render . layoutPretty defaultLayoutOptions --- >>> in go (vsep --- >>> [ headline "Example document" --- >>> , paragraph ("This is a" <+> color Red "paragraph" <> comma) --- >>> , paragraph ("and" <+> bold "this text is bold.") --- >>> ]) --- >>> :} ---

Example document

---

This is a paragraph,

---

and this text is bold.

+-- > :set -XOverloadedStrings +-- > import qualified Data.Text.Lazy.IO as TL +-- > :{ +-- > let go = TL.putStrLn . render . layoutPretty defaultLayoutOptions +-- > in go (vsep +-- > [ headline "Example document" +-- > , paragraph ("This is a" <+> color Red "paragraph" <> comma) +-- > , paragraph ("and" <+> bold "this text is bold.") +-- > ]) +-- > :} +-- +-- Result: +-- +-- >

Example document

+-- >

This is a paragraph,

+-- >

and this text is bold.

diff --git a/prettyprinter/src/Prettyprinter/Render/Tutorials/TreeRenderingTutorial.hs b/prettyprinter/src/Prettyprinter/Render/Tutorials/TreeRenderingTutorial.hs index 5b81339a..022c7c54 100644 --- a/prettyprinter/src/Prettyprinter/Render/Tutorials/TreeRenderingTutorial.hs +++ b/prettyprinter/src/Prettyprinter/Render/Tutorials/TreeRenderingTutorial.hs @@ -25,6 +25,13 @@ import Prettyprinter.Render.Util.SimpleDocTree #if !(FOLDABLE_TRAVERSABLE_IN_PRELUDE) import Data.Foldable (foldMap) #endif + +-- $setup +-- +-- (Definitions for the doctests) +-- +-- >>> :set -XOverloadedStrings +-- >>> import Prettyprinter #if !(SEMIGROUP_MONOID_SUPERCLASS) import Data.Semigroup #endif diff --git a/prettyprinter/src/Prettyprinter/Render/Util/SimpleDocTree.hs b/prettyprinter/src/Prettyprinter/Render/Util/SimpleDocTree.hs index 444d5506..cff767e0 100644 --- a/prettyprinter/src/Prettyprinter/Render/Util/SimpleDocTree.hs +++ b/prettyprinter/src/Prettyprinter/Render/Util/SimpleDocTree.hs @@ -43,6 +43,7 @@ import Data.Traversable (Traversable (..)) -- -- (Definitions for the doctests) -- +-- >>> :set -XOverloadedStrings -- >>> import Prettyprinter hiding ((<>)) -- >>> import qualified Data.Text.IO as T diff --git a/prettyprinter/src/Prettyprinter/Render/Util/StackMachine.hs b/prettyprinter/src/Prettyprinter/Render/Util/StackMachine.hs index cb55f603..d58b1607 100644 --- a/prettyprinter/src/Prettyprinter/Render/Util/StackMachine.hs +++ b/prettyprinter/src/Prettyprinter/Render/Util/StackMachine.hs @@ -50,6 +50,7 @@ import Control.Applicative (liftA2) -- -- (Definitions for the doctests) -- +-- >>> :set -XOverloadedStrings -- >>> import Prettyprinter hiding ((<>)) -- >>> import qualified Data.Text.IO as T diff --git a/prettyprinter/src/Prettyprinter/Symbols/Ascii.hs b/prettyprinter/src/Prettyprinter/Symbols/Ascii.hs index 195f3aed..bb1568d3 100644 --- a/prettyprinter/src/Prettyprinter/Symbols/Ascii.hs +++ b/prettyprinter/src/Prettyprinter/Symbols/Ascii.hs @@ -150,5 +150,6 @@ pipe = Char '|' -- -- >>> :set -XOverloadedStrings -- >>> import Data.Semigroup +-- >>> import Prettyprinter -- >>> import Prettyprinter.Render.Text -- >>> import Prettyprinter.Util diff --git a/prettyprinter/src/Prettyprinter/Util.hs b/prettyprinter/src/Prettyprinter/Util.hs index 0dc16d39..035248ec 100644 --- a/prettyprinter/src/Prettyprinter/Util.hs +++ b/prettyprinter/src/Prettyprinter/Util.hs @@ -15,10 +15,19 @@ import Prettyprinter +-- $setup +-- +-- (Definitions for the doctests) +-- +-- >>> :set -XOverloadedStrings +-- >>> import Prelude hiding (words) + -- | Split an input into word-sized 'Doc's. -- --- >>> putDoc (tupled (words "Lorem ipsum dolor")) +-- @ +-- putDoc (tupled (words "Lorem ipsum dolor")) -- (Lorem, ipsum, dolor) +-- @ words :: Text -> [Doc ann] words = map pretty . T.words @@ -55,11 +64,3 @@ putDocW :: Int -> Doc ann -> IO () putDocW w doc = renderIO System.IO.stdout (layoutPretty layoutOptions (unAnnotate doc)) where layoutOptions = LayoutOptions { layoutPageWidth = AvailablePerLine w 1 } - - - --- $setup --- --- (Definitions for the doctests) --- --- >>> :set -XOverloadedStrings diff --git a/prettyprinter/test/Doctest/Main.hs b/prettyprinter/test/Doctest/Main.hs index cf69622d..b598077f 100644 --- a/prettyprinter/test/Doctest/Main.hs +++ b/prettyprinter/test/Doctest/Main.hs @@ -1,10 +1,7 @@ module Main (main) where -import Test.DocTest - --- Silence -Wunused-packages: -import Prettyprinter () -import Test.QuickCheck () +import Test.DocTest (mainFromCabal) +import System.Environment (getArgs) main :: IO () -main = doctest [ "src" , "-Imisc"] +main = mainFromCabal "prettyprinter" =<< getArgs