From 2dfa8283027a3b02650360a9725382843be76054 Mon Sep 17 00:00:00 2001 From: patritzenfeld Date: Tue, 3 Feb 2026 18:15:07 +0100 Subject: [PATCH 1/5] add flag for inclusion of IOTask helpers --- .../haskell-template-task-embedded.cabal | 3 +- raw/embedded/package.yaml | 3 +- raw/embedded/src/{ => Complete}/TestHelper.hs | 2 +- raw/embedded/src/Minimal/TestHelper.hs | 66 +++++++++++++++++++ raw/haskell-template-task-raw.cabal | 7 ++ raw/package.yaml | 8 +++ raw/src/Haskell/Template/FileContents.hs | 11 +++- 7 files changed, 95 insertions(+), 5 deletions(-) rename raw/embedded/src/{ => Complete}/TestHelper.hs (99%) create mode 100644 raw/embedded/src/Minimal/TestHelper.hs diff --git a/raw/embedded/haskell-template-task-embedded.cabal b/raw/embedded/haskell-template-task-embedded.cabal index 4590edd..840e4c3 100644 --- a/raw/embedded/haskell-template-task-embedded.cabal +++ b/raw/embedded/haskell-template-task-embedded.cabal @@ -13,7 +13,8 @@ build-type: Simple library other-modules: TestHarness - TestHelper + Complete.TestHelper + Minimal.TestHelper hs-source-dirs: src ghc-options: -Wall diff --git a/raw/embedded/package.yaml b/raw/embedded/package.yaml index 95009cf..482efc9 100644 --- a/raw/embedded/package.yaml +++ b/raw/embedded/package.yaml @@ -14,4 +14,5 @@ library: source-dirs: src other-modules: - TestHarness - - TestHelper + - Complete.TestHelper + - Minimal.TestHelper diff --git a/raw/embedded/src/TestHelper.hs b/raw/embedded/src/Complete/TestHelper.hs similarity index 99% rename from raw/embedded/src/TestHelper.hs rename to raw/embedded/src/Complete/TestHelper.hs index 2505e42..935419e 100644 --- a/raw/embedded/src/TestHelper.hs +++ b/raw/embedded/src/Complete/TestHelper.hs @@ -1,5 +1,5 @@ {-# LANGUAGE ScopedTypeVariables #-} -module TestHelper ( +module Complete.TestHelper ( isDefined, isDeeplyDefined, mustFail, qcWithTimeout, qcWithTimeoutAndArgs, qcWithTimeoutAndRuns , qc, qc', qcWithArgs --DEPRECATED diff --git a/raw/embedded/src/Minimal/TestHelper.hs b/raw/embedded/src/Minimal/TestHelper.hs new file mode 100644 index 0000000..e13d9b5 --- /dev/null +++ b/raw/embedded/src/Minimal/TestHelper.hs @@ -0,0 +1,66 @@ +{-# LANGUAGE ScopedTypeVariables #-} +module Minimal.TestHelper ( + isDefined, isDeeplyDefined, mustFail, + qcWithTimeout, qcWithTimeoutAndArgs, qcWithTimeoutAndRuns + , qc, qc', qcWithArgs --DEPRECATED + ) where +import Prelude ( + Bool (..), Either (Left, Right), Int, IO, String, + const, error, return, seq, ($), (++)) + +import Control.Exception + (ErrorCall, SomeException, catch, evaluate, try) +import Test.HUnit (Assertion, assertFailure) +import Test.QuickCheck + (Args, Property, Result (GaveUp, Failure, Success), Testable, + chatty, failingTestCase, maxSuccess, output, + quickCheckWithResult, stdArgs, within) +import Test.QuickCheck.Monadic (monadicIO, run) +import Control.DeepSeq (NFData, deepseq) + +qcWithArgs :: Testable prop => Int -> Args -> prop -> Assertion +qcWithArgs = qcWithTimeoutAndArgs + +qcWithTimeoutAndArgs :: Testable prop => Int -> Args -> prop -> Assertion +qcWithTimeoutAndArgs timeout args prop = do + result <- quickCheckWithResult (args {chatty = False}) (within timeout prop) + assertFailureCustom result + +qc' :: Testable prop => Int -> Int -> prop -> Assertion +qc' = qcWithTimeoutAndRuns + +qcWithTimeoutAndRuns :: Testable prop => Int -> Int -> prop -> Assertion +qcWithTimeoutAndRuns timeout n = qcWithArgs timeout (stdArgs {maxSuccess = n}) + +qc :: Testable prop => Int -> prop -> Assertion +qc = qcWithTimeout + +qcWithTimeout :: Testable prop => Int -> prop -> Assertion +qcWithTimeout timeout = qcWithTimeoutAndRuns timeout 1000 + +assertFailureCustom :: Result -> IO () +assertFailureCustom Success {} = return () +assertFailureCustom GaveUp {} = assertFailure $ + "Gave up on testing. This usually indicates that your code breaks an assumed invariant.\n" + ++ "Perhaps you missed a detail within the task description." +assertFailureCustom Failure { failingTestCase = [t] } = + assertFailure $ "Failing test case:\n" ++ t +assertFailureCustom x = assertFailure $ output x + +mustFail :: a -> String -> Property +mustFail x msg = + monadicIO $ run $ do + resultOrError <- try (evaluate x) + case resultOrError of + Left (_::SomeException) -> return () -- expected failure occured. + Right _ -> error msg + +isDeeplyDefined :: NFData a => a -> IO Bool +isDeeplyDefined x = catch + (deepseq x $ return True) + ((const $ return False) :: ErrorCall -> IO Bool) + +isDefined :: a -> IO Bool +isDefined x = catch + (seq x $ return True) + ((const $ return False) :: ErrorCall -> IO Bool) diff --git a/raw/haskell-template-task-raw.cabal b/raw/haskell-template-task-raw.cabal index 52f45e6..ea311b3 100644 --- a/raw/haskell-template-task-raw.cabal +++ b/raw/haskell-template-task-raw.cabal @@ -8,6 +8,11 @@ name: haskell-template-task-raw version: 0.0.0.1 build-type: Simple +flag iotasks + description: test + manual: True + default: True + library exposed-modules: Haskell.Template.FileContents @@ -22,3 +27,5 @@ library , template-haskell , th-utilities default-language: Haskell2010 + if flag(iotasks) + cpp-options: -DIOTASKS diff --git a/raw/package.yaml b/raw/package.yaml index b0ef3a9..10abc91 100644 --- a/raw/package.yaml +++ b/raw/package.yaml @@ -2,11 +2,19 @@ name: haskell-template-task-raw version: 0.0.0.1 ghc-options: - -Wall +flags: + iotasks: + description: enables test helpers for IOTasks + manual: True + default: True dependencies: - base >= 4.7 && < 5 - filepath - template-haskell - th-utilities +when: + - condition: flag(iotasks) + cpp-options: -DIOTASKS library: source-dirs: src diff --git a/raw/src/Haskell/Template/FileContents.hs b/raw/src/Haskell/Template/FileContents.hs index e204fd0..68d3ba2 100644 --- a/raw/src/Haskell/Template/FileContents.hs +++ b/raw/src/Haskell/Template/FileContents.hs @@ -1,3 +1,4 @@ +{-# LANGUAGE CPP #-} {-# LANGUAGE TemplateHaskell #-} {-# OPTIONS -fforce-recomp #-} module Haskell.Template.FileContents ( @@ -11,8 +12,14 @@ import TH.RelativePaths (pathRelativeToCabalPackage) testHelperContents :: String testHelperContents = - $(do file <- pathRelativeToCabalPackage - $ "embedded" "src" "TestHelper.hs" + $(do let filePath = +#ifdef IOTASKS + "Complete" +#else + "Minimal" +#endif + file <- pathRelativeToCabalPackage + $ "embedded" "src" filePath "TestHelper.hs" contents <- runIO $ readFile file stringE contents) From c04b00d681b4fc364eb073f21c51c2b075fc0065 Mon Sep 17 00:00:00 2001 From: patritzenfeld Date: Tue, 3 Feb 2026 18:27:29 +0100 Subject: [PATCH 2/5] fix module names --- raw/embedded/{src => }/Complete/TestHelper.hs | 2 +- raw/embedded/{src => }/Minimal/TestHelper.hs | 2 +- raw/embedded/haskell-template-task-embedded.cabal | 4 ++-- raw/embedded/package.yaml | 7 ++++--- raw/haskell-template-task-raw.cabal | 2 +- raw/src/Haskell/Template/FileContents.hs | 2 +- 6 files changed, 10 insertions(+), 9 deletions(-) rename raw/embedded/{src => }/Complete/TestHelper.hs (99%) rename raw/embedded/{src => }/Minimal/TestHelper.hs (98%) diff --git a/raw/embedded/src/Complete/TestHelper.hs b/raw/embedded/Complete/TestHelper.hs similarity index 99% rename from raw/embedded/src/Complete/TestHelper.hs rename to raw/embedded/Complete/TestHelper.hs index 935419e..2505e42 100644 --- a/raw/embedded/src/Complete/TestHelper.hs +++ b/raw/embedded/Complete/TestHelper.hs @@ -1,5 +1,5 @@ {-# LANGUAGE ScopedTypeVariables #-} -module Complete.TestHelper ( +module TestHelper ( isDefined, isDeeplyDefined, mustFail, qcWithTimeout, qcWithTimeoutAndArgs, qcWithTimeoutAndRuns , qc, qc', qcWithArgs --DEPRECATED diff --git a/raw/embedded/src/Minimal/TestHelper.hs b/raw/embedded/Minimal/TestHelper.hs similarity index 98% rename from raw/embedded/src/Minimal/TestHelper.hs rename to raw/embedded/Minimal/TestHelper.hs index e13d9b5..0f23167 100644 --- a/raw/embedded/src/Minimal/TestHelper.hs +++ b/raw/embedded/Minimal/TestHelper.hs @@ -1,5 +1,5 @@ {-# LANGUAGE ScopedTypeVariables #-} -module Minimal.TestHelper ( +module TestHelper ( isDefined, isDeeplyDefined, mustFail, qcWithTimeout, qcWithTimeoutAndArgs, qcWithTimeoutAndRuns , qc, qc', qcWithArgs --DEPRECATED diff --git a/raw/embedded/haskell-template-task-embedded.cabal b/raw/embedded/haskell-template-task-embedded.cabal index 840e4c3..6f6e368 100644 --- a/raw/embedded/haskell-template-task-embedded.cabal +++ b/raw/embedded/haskell-template-task-embedded.cabal @@ -13,10 +13,10 @@ build-type: Simple library other-modules: TestHarness - Complete.TestHelper - Minimal.TestHelper + TestHelper hs-source-dirs: src + Complete ghc-options: -Wall build-depends: HUnit diff --git a/raw/embedded/package.yaml b/raw/embedded/package.yaml index 482efc9..62ed6e1 100644 --- a/raw/embedded/package.yaml +++ b/raw/embedded/package.yaml @@ -11,8 +11,9 @@ dependencies: - random - syb library: - source-dirs: src + source-dirs: + - src + - Complete other-modules: - TestHarness - - Complete.TestHelper - - Minimal.TestHelper + - TestHelper diff --git a/raw/haskell-template-task-raw.cabal b/raw/haskell-template-task-raw.cabal index ea311b3..6eb324f 100644 --- a/raw/haskell-template-task-raw.cabal +++ b/raw/haskell-template-task-raw.cabal @@ -9,7 +9,7 @@ version: 0.0.0.1 build-type: Simple flag iotasks - description: test + description: enables test helpers for IOTasks manual: True default: True diff --git a/raw/src/Haskell/Template/FileContents.hs b/raw/src/Haskell/Template/FileContents.hs index 68d3ba2..0975879 100644 --- a/raw/src/Haskell/Template/FileContents.hs +++ b/raw/src/Haskell/Template/FileContents.hs @@ -19,7 +19,7 @@ testHelperContents = "Minimal" #endif file <- pathRelativeToCabalPackage - $ "embedded" "src" filePath "TestHelper.hs" + $ "embedded" filePath "TestHelper.hs" contents <- runIO $ readFile file stringE contents) From 46e08e20208d52d2ecec9cae5815a0885b9c0fd4 Mon Sep 17 00:00:00 2001 From: patritzenfeld Date: Wed, 4 Feb 2026 10:49:50 +0100 Subject: [PATCH 3/5] add flag switch in embedded --- .../haskell-template-task-embedded.cabal | 15 +++++++++++++-- raw/embedded/package.yaml | 17 +++++++++++++++-- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/raw/embedded/haskell-template-task-embedded.cabal b/raw/embedded/haskell-template-task-embedded.cabal index 6f6e368..51a8f7b 100644 --- a/raw/embedded/haskell-template-task-embedded.cabal +++ b/raw/embedded/haskell-template-task-embedded.cabal @@ -10,17 +10,20 @@ name: haskell-template-task-embedded version: 0.0.0 build-type: Simple +flag iotasks + description: enables test helpers for IOTasks + manual: True + default: True + library other-modules: TestHarness TestHelper hs-source-dirs: src - Complete ghc-options: -Wall build-depends: HUnit - , IOTasks , QuickCheck , base , deepseq @@ -28,3 +31,11 @@ library , random , syb default-language: Haskell2010 + if flag(iotasks) + hs-source-dirs: + Complete + build-depends: + IOTasks + else + hs-source-dirs: + Minimal diff --git a/raw/embedded/package.yaml b/raw/embedded/package.yaml index 62ed6e1..3eb777b 100644 --- a/raw/embedded/package.yaml +++ b/raw/embedded/package.yaml @@ -1,19 +1,32 @@ name: haskell-template-task-embedded ghc-options: -Wall +flags: + iotasks: + description: enables test helpers for IOTasks + manual: True + default: True dependencies: - base - deepseq - haskell-src-exts - HUnit - - IOTasks - QuickCheck - random - syb library: source-dirs: - src - - Complete other-modules: - TestHarness - TestHelper +when: + - condition: flag(iotasks) + then: + source-dirs: + - Complete + dependencies: + - IOTasks + else: + source-dirs: + - Minimal From 6c2956b1a34ea5bffc78f13cdaf5294a9d435fbd Mon Sep 17 00:00:00 2001 From: patritzenfeld Date: Wed, 4 Feb 2026 10:52:02 +0100 Subject: [PATCH 4/5] lowercase directory names --- raw/embedded/{Complete => complete}/TestHelper.hs | 0 raw/embedded/haskell-template-task-embedded.cabal | 4 ++-- raw/embedded/{Minimal => minimal}/TestHelper.hs | 0 raw/embedded/package.yaml | 4 ++-- raw/src/Haskell/Template/FileContents.hs | 4 ++-- 5 files changed, 6 insertions(+), 6 deletions(-) rename raw/embedded/{Complete => complete}/TestHelper.hs (100%) rename raw/embedded/{Minimal => minimal}/TestHelper.hs (100%) diff --git a/raw/embedded/Complete/TestHelper.hs b/raw/embedded/complete/TestHelper.hs similarity index 100% rename from raw/embedded/Complete/TestHelper.hs rename to raw/embedded/complete/TestHelper.hs diff --git a/raw/embedded/haskell-template-task-embedded.cabal b/raw/embedded/haskell-template-task-embedded.cabal index 51a8f7b..5c4e6c6 100644 --- a/raw/embedded/haskell-template-task-embedded.cabal +++ b/raw/embedded/haskell-template-task-embedded.cabal @@ -33,9 +33,9 @@ library default-language: Haskell2010 if flag(iotasks) hs-source-dirs: - Complete + complete build-depends: IOTasks else hs-source-dirs: - Minimal + minimal diff --git a/raw/embedded/Minimal/TestHelper.hs b/raw/embedded/minimal/TestHelper.hs similarity index 100% rename from raw/embedded/Minimal/TestHelper.hs rename to raw/embedded/minimal/TestHelper.hs diff --git a/raw/embedded/package.yaml b/raw/embedded/package.yaml index 3eb777b..345290d 100644 --- a/raw/embedded/package.yaml +++ b/raw/embedded/package.yaml @@ -24,9 +24,9 @@ when: - condition: flag(iotasks) then: source-dirs: - - Complete + - complete dependencies: - IOTasks else: source-dirs: - - Minimal + - minimal diff --git a/raw/src/Haskell/Template/FileContents.hs b/raw/src/Haskell/Template/FileContents.hs index 0975879..d807b25 100644 --- a/raw/src/Haskell/Template/FileContents.hs +++ b/raw/src/Haskell/Template/FileContents.hs @@ -14,9 +14,9 @@ testHelperContents :: String testHelperContents = $(do let filePath = #ifdef IOTASKS - "Complete" + "complete" #else - "Minimal" + "minimal" #endif file <- pathRelativeToCabalPackage $ "embedded" filePath "TestHelper.hs" From 39aace0b3a95fe9f703d8ab468546b60cb8239e7 Mon Sep 17 00:00:00 2001 From: patritzenfeld Date: Wed, 4 Feb 2026 14:03:17 +0100 Subject: [PATCH 5/5] invoke cpp from Haskell to get around 'raw file embedding' problem --- .../haskell-template-task-embedded.cabal | 6 +- raw/embedded/minimal/TestHelper.hs | 66 ------------------- raw/embedded/package.yaml | 12 ++-- raw/embedded/{complete => src}/TestHelper.hs | 29 ++++++-- raw/haskell-template-task-raw.cabal | 1 + raw/package.yaml | 1 + raw/src/Haskell/Template/FileContents.hs | 23 +++++-- 7 files changed, 47 insertions(+), 91 deletions(-) delete mode 100644 raw/embedded/minimal/TestHelper.hs rename raw/embedded/{complete => src}/TestHelper.hs (89%) diff --git a/raw/embedded/haskell-template-task-embedded.cabal b/raw/embedded/haskell-template-task-embedded.cabal index 5c4e6c6..05bb2dc 100644 --- a/raw/embedded/haskell-template-task-embedded.cabal +++ b/raw/embedded/haskell-template-task-embedded.cabal @@ -32,10 +32,6 @@ library , syb default-language: Haskell2010 if flag(iotasks) - hs-source-dirs: - complete + cpp-options: -DIOTASKS build-depends: IOTasks - else - hs-source-dirs: - minimal diff --git a/raw/embedded/minimal/TestHelper.hs b/raw/embedded/minimal/TestHelper.hs deleted file mode 100644 index 0f23167..0000000 --- a/raw/embedded/minimal/TestHelper.hs +++ /dev/null @@ -1,66 +0,0 @@ -{-# LANGUAGE ScopedTypeVariables #-} -module TestHelper ( - isDefined, isDeeplyDefined, mustFail, - qcWithTimeout, qcWithTimeoutAndArgs, qcWithTimeoutAndRuns - , qc, qc', qcWithArgs --DEPRECATED - ) where -import Prelude ( - Bool (..), Either (Left, Right), Int, IO, String, - const, error, return, seq, ($), (++)) - -import Control.Exception - (ErrorCall, SomeException, catch, evaluate, try) -import Test.HUnit (Assertion, assertFailure) -import Test.QuickCheck - (Args, Property, Result (GaveUp, Failure, Success), Testable, - chatty, failingTestCase, maxSuccess, output, - quickCheckWithResult, stdArgs, within) -import Test.QuickCheck.Monadic (monadicIO, run) -import Control.DeepSeq (NFData, deepseq) - -qcWithArgs :: Testable prop => Int -> Args -> prop -> Assertion -qcWithArgs = qcWithTimeoutAndArgs - -qcWithTimeoutAndArgs :: Testable prop => Int -> Args -> prop -> Assertion -qcWithTimeoutAndArgs timeout args prop = do - result <- quickCheckWithResult (args {chatty = False}) (within timeout prop) - assertFailureCustom result - -qc' :: Testable prop => Int -> Int -> prop -> Assertion -qc' = qcWithTimeoutAndRuns - -qcWithTimeoutAndRuns :: Testable prop => Int -> Int -> prop -> Assertion -qcWithTimeoutAndRuns timeout n = qcWithArgs timeout (stdArgs {maxSuccess = n}) - -qc :: Testable prop => Int -> prop -> Assertion -qc = qcWithTimeout - -qcWithTimeout :: Testable prop => Int -> prop -> Assertion -qcWithTimeout timeout = qcWithTimeoutAndRuns timeout 1000 - -assertFailureCustom :: Result -> IO () -assertFailureCustom Success {} = return () -assertFailureCustom GaveUp {} = assertFailure $ - "Gave up on testing. This usually indicates that your code breaks an assumed invariant.\n" - ++ "Perhaps you missed a detail within the task description." -assertFailureCustom Failure { failingTestCase = [t] } = - assertFailure $ "Failing test case:\n" ++ t -assertFailureCustom x = assertFailure $ output x - -mustFail :: a -> String -> Property -mustFail x msg = - monadicIO $ run $ do - resultOrError <- try (evaluate x) - case resultOrError of - Left (_::SomeException) -> return () -- expected failure occured. - Right _ -> error msg - -isDeeplyDefined :: NFData a => a -> IO Bool -isDeeplyDefined x = catch - (deepseq x $ return True) - ((const $ return False) :: ErrorCall -> IO Bool) - -isDefined :: a -> IO Bool -isDefined x = catch - (seq x $ return True) - ((const $ return False) :: ErrorCall -> IO Bool) diff --git a/raw/embedded/package.yaml b/raw/embedded/package.yaml index 345290d..2239c13 100644 --- a/raw/embedded/package.yaml +++ b/raw/embedded/package.yaml @@ -22,11 +22,7 @@ library: - TestHelper when: - condition: flag(iotasks) - then: - source-dirs: - - complete - dependencies: - - IOTasks - else: - source-dirs: - - minimal + dependencies: + - IOTasks + cpp-options: -DIOTASKS + diff --git a/raw/embedded/complete/TestHelper.hs b/raw/embedded/src/TestHelper.hs similarity index 89% rename from raw/embedded/complete/TestHelper.hs rename to raw/embedded/src/TestHelper.hs index 2505e42..ab1108d 100644 --- a/raw/embedded/complete/TestHelper.hs +++ b/raw/embedded/src/TestHelper.hs @@ -1,13 +1,25 @@ +{-# LANGUAGE CPP #-} {-# LANGUAGE ScopedTypeVariables #-} module TestHelper ( - isDefined, isDeeplyDefined, mustFail, - qcWithTimeout, qcWithTimeoutAndArgs, qcWithTimeoutAndRuns - , qc, qc', qcWithArgs --DEPRECATED - , tcWithTimeout, tcWithTimeoutAndArgs, tcCustomizedWithTimeoutAndArgs, tcWithInputsOnFailure + isDefined, + isDeeplyDefined, + mustFail, + qcWithTimeout, + qcWithTimeoutAndArgs, + qcWithTimeoutAndRuns, + qc, + qc', + qcWithArgs, --DEPRECATED +#ifdef IOTASKS + tcWithTimeout, + tcWithTimeoutAndArgs, + tcCustomizedWithTimeoutAndArgs, + tcWithInputsOnFailure, +#endif ) where import Prelude ( - Bool (..), Either (Left, Right), Int, IO, String, Maybe (Nothing, Just), - const, error, return, seq, ($), (++), show, (.), id) + Bool (..), Either (Left, Right), Int, IO, String, + const, error, return, seq, ($), (++)) import Control.Exception (ErrorCall, SomeException, catch, evaluate, try) @@ -19,6 +31,7 @@ import Test.QuickCheck import Test.QuickCheck.Monadic (monadicIO, run) import Control.DeepSeq (NFData, deepseq) +#ifdef IOTASKS import Test.IOTasks ( IOrep, Specification, @@ -33,7 +46,9 @@ import qualified Test.IOTasks as IOTasks ( Outcome (..), stdArgs, ) +import Prelude (Maybe(..), (.), id, show) import qualified System.Timeout as System (timeout) +#endif qcWithArgs :: Testable prop => Int -> Args -> prop -> Assertion qcWithArgs = qcWithTimeoutAndArgs @@ -82,6 +97,7 @@ isDefined x = catch (seq x $ return True) ((const $ return False) :: ErrorCall -> IO Bool) +#ifdef IOTASKS -- helper for new IOTasks implementation tcWithTimeout :: Int -> IOrep () -> Specification -> Assertion tcWithTimeout to = tcWithTimeoutAndArgs to IOTasks.stdArgs @@ -109,3 +125,4 @@ tcTimeoutAndArgsHandleFailure to args prog spec withFailure = do Just (IOTasks.Outcome IOTasks.GaveUp _) -> assertFailure "Gave up on testing. This is usually not caused by a fault within your solution. Please contact your lecturers" Just o@(IOTasks.Outcome IOTasks.Failure{} _) -> assertFailure $ withFailure o Nothing -> assertFailure "Failure: Timeout" +#endif diff --git a/raw/haskell-template-task-raw.cabal b/raw/haskell-template-task-raw.cabal index 6eb324f..953302b 100644 --- a/raw/haskell-template-task-raw.cabal +++ b/raw/haskell-template-task-raw.cabal @@ -23,6 +23,7 @@ library ghc-options: -Wall build-depends: base >=4.7 && <5 + , cpphs , filepath , template-haskell , th-utilities diff --git a/raw/package.yaml b/raw/package.yaml index 10abc91..a3a2c82 100644 --- a/raw/package.yaml +++ b/raw/package.yaml @@ -10,6 +10,7 @@ flags: dependencies: - base >= 4.7 && < 5 - filepath + - cpphs - template-haskell - th-utilities when: diff --git a/raw/src/Haskell/Template/FileContents.hs b/raw/src/Haskell/Template/FileContents.hs index d807b25..dd7e1dc 100644 --- a/raw/src/Haskell/Template/FileContents.hs +++ b/raw/src/Haskell/Template/FileContents.hs @@ -6,21 +6,32 @@ module Haskell.Template.FileContents ( testHelperContents, ) where +import Language.Preprocessor.Cpphs ( + BoolOptions(..), + CpphsOptions(..), + defaultBoolOptions, + defaultCpphsOptions, + runCpphs + ) import Language.Haskell.TH (runIO, stringE) import System.FilePath (()) import TH.RelativePaths (pathRelativeToCabalPackage) testHelperContents :: String testHelperContents = - $(do let filePath = + $(do file <- pathRelativeToCabalPackage + $ "embedded" "src" "TestHelper.hs" + contents <- runIO $ readFile file >>= runCpphs defaultCpphsOptions { + defines = [ #ifdef IOTASKS - "complete" + ("IOTASKS", "") #else - "minimal" + #endif - file <- pathRelativeToCabalPackage - $ "embedded" filePath "TestHelper.hs" - contents <- runIO $ readFile file + ], + boolopts = defaultBoolOptions {locations = False} + } + "" stringE contents) testHarnessContents :: String