diff --git a/.circleci/config.yml b/.circleci/config.yml index 69ee88d3..1ed905d1 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -193,6 +193,7 @@ jobs: command: | apt-get install -y ghc-8.2.2 apt-get install -y cabal-install-3.2 + apt-get install libtinfo-dev bash -c "$PACKCHECK $BUILD" - *save cabal-ghc-8_0_2: diff --git a/benchmark/README.md b/benchmark/README.md index 2a9c4053..5b074a9f 100644 --- a/benchmark/README.md +++ b/benchmark/README.md @@ -1,11 +1,77 @@ -## Running Benchmarks +## Building a single benchmark suite + +``` +$ cabal build streamly-benchmarks:Prelude.Serial +``` + +or: + +``` +$ cabal build --enable-benchmarks bench:Prelude.Serial +``` + +## Building all benchmarks suites + +``` +$ cabal build --enable-benchmarks streamly-benchmarks +``` + +or: + +``` +$ cabal build --enable-benchmarks all +``` + +Disable optimization, quick build: + +``` +$ cabal build --flag "-opt" ... +``` + +## Build and run single benchmarks: + +For quick results you may have to use `--quick` and possibly some other +`gauge` options, or better use `bench.sh --quick` as described in the +following sections. + +``` +$ cabal run bench:Prelude.Serial -- --quick +``` + +`cabal bench` can be used but you cannot pass arguments (like --quick): + +``` +$ cabal bench Prelude.Serial +``` + +## Build and run all benchmarks + +Don't try this, it will take too long, use the `bench.sh` method instead. + +``` +$ cabal bench all +``` + +or: + +``` +$ cd benchmark; cabal bench +``` + +or this, note this command does not work from "benchmark" dir: + +``` +$ cabal bench streamly-benchmarks +``` + +## Building and Running Benchmarks with bench.sh `bench.sh` script at the root of the repo is the top level driver for running benchmarks. It runs the requested benchmarks and then creates a report from the results using the `bench-show` package. Try `bench.sh --help` for available options to run it. -## Quick start +## bench.sh: Quick start You must be in the repo root directory to run these commands. diff --git a/benchmark/streamly-benchmarks.cabal b/benchmark/streamly-benchmarks.cabal index 1487dc88..71d616aa 100644 --- a/benchmark/streamly-benchmarks.cabal +++ b/benchmark/streamly-benchmarks.cabal @@ -9,8 +9,8 @@ description: Benchmarks are separated from the main package because we for serial, async, ahead style streams, therefore, we need to use the common code in several benchmarks, just changing the type of the stream. It takes a long time to compile this file and it gets - compiled for each benchmarks once if we do not have a library. Cabal - does no support internal libraries without per-component builds and + compiled for each benchmark once if we do not have a library. Cabal + does not support internal libraries without per-component builds and per-component builds are not supported with Configure, so we are not left with any other choice. @@ -44,6 +44,11 @@ flag no-charts manual: True default: False +flag opt + description: off=-O0 (faster builds), on=-O2 + manual: True + default: True + ------------------------------------------------------------------------------- -- Common stanzas ------------------------------------------------------------------------------- @@ -78,19 +83,16 @@ common compile-options ghc-options: -fno-ignore-asserts common optimization-options - ghc-options: -O2 - -fdicts-strict - -fspec-constr-recursive=16 - -fmax-worker-args=16 - if flag(fusion-plugin) && !impl(ghcjs) && !impl(ghc < 8.6) - ghc-options: -fplugin Fusion.Plugin + if flag(opt) + ghc-options: -O2 + -fdicts-strict + -fspec-constr-recursive=16 + -fmax-worker-args=16 + if flag(fusion-plugin) && !impl(ghcjs) && !impl(ghc < 8.6) + ghc-options: -fplugin Fusion.Plugin + else + ghc-options: -O0 --- We need optimization options here to optimize internal (non-inlined) --- versions of functions. Also, we have some benchmarking inspection tests --- part of the library when built with --benchmarks flag. Thos tests fail --- if we do not use optimization options here. It was observed that due to --- -O2 here some concurrent/nested benchmarks improved and others regressed. --- We can investigate a bit more here why the regression occurred. common lib-options import: compile-options, optimization-options diff --git a/cabal.project b/cabal.project index 782cbfb8..5405519e 100644 --- a/cabal.project +++ b/cabal.project @@ -1,4 +1,5 @@ packages: streamly.cabal - , benchmark/streamly-benchmarks.cabal + , test/streamly-tests.cabal + , benchmark/streamly-benchmarks.cabal diff --git a/cabal.project.coverage b/cabal.project.coverage index 7716fe72..77ef6214 100644 --- a/cabal.project.coverage +++ b/cabal.project.coverage @@ -17,3 +17,6 @@ package streamly package streamly-benchmarks ghc-options: -Werror flags: inspection + +package streamly-tests + ghc-options: -Werror diff --git a/default.nix b/default.nix index a2088907..3f48234c 100644 --- a/default.nix +++ b/default.nix @@ -51,6 +51,9 @@ let haskellPackages = streamly-benchmarks = mkPackage super "streamly-benchmarks" ./benchmark flags inShell; + streamly-tests = + mkPackage super "streamly-tests" + ./test flags inShell; # Example to Use a different version of a package #QuickCheck = self.QuickCheck_2_14; @@ -78,6 +81,7 @@ let haskellPackages = packages = p: [ p.streamly p.streamly-benchmarks + p.streamly-tests ]; # some dependencies of hoogle fail to build with quickcheck-2.14 # We should use hoogle as external tool instead of building it here diff --git a/stack.yaml b/stack.yaml index 1074ec45..e1d3a8c5 100644 --- a/stack.yaml +++ b/stack.yaml @@ -2,6 +2,7 @@ resolver: lts-16.12 packages: - '.' - './benchmark' +- './test' extra-deps: - SDL-0.6.7.0@sha256:9d6ba75c0cab575ec38468c8277803983e985f9622437aeca6a53e6a7337a7d5,2045 - QuickCheck-2.14.1@sha256:01e46d7b0a8d3148288ec977625f62d5516ebb5031a50c63f0453863301b4a79,7736 diff --git a/streamly.cabal b/streamly.cabal index 8958caf4..8bed4c80 100644 --- a/streamly.cabal +++ b/streamly.cabal @@ -157,7 +157,21 @@ extra-source-files: src/Streamly/Internal/FileSystem/Event/Darwin.h src/config.h.in src/inline.hs + test/README.md test/Streamly/Test/Common/Array.hs + test/Streamly/Test/Data/*.hs + test/Streamly/Test/Data/Array/Prim.hs + test/Streamly/Test/Data/Array/Prim/Pinned.hs + test/Streamly/Test/Data/Array/Storable/Foreign.hs + test/Streamly/Test/Data/Parser/ParserD.hs + test/Streamly/Test/FileSystem/Event.hs + test/Streamly/Test/Prelude.hs + test/Streamly/Test/Prelude/*.hs + test/Streamly/Test/Unicode/Stream.hs + test/lib/Streamly/Test/Common.hs + test/lib/Streamly/Test/Prelude/Common.hs + test/streamly-tests.cabal + test/version-bounds.hs stack.yaml extra-tmp-files: @@ -210,6 +224,11 @@ flag use-c-malloc manual: True default: False +flag opt + description: off=GHC default, on=-O2 + manual: True + default: True + ------------------------------------------------------------------------------- -- Common stanzas ------------------------------------------------------------------------------- @@ -296,10 +315,11 @@ common default-extensions -- UnboxedTuples -- interferes with (#.) common optimization-options - ghc-options: -O2 - -fdicts-strict - -fspec-constr-recursive=16 - -fmax-worker-args=16 + if flag(opt) + ghc-options: -O2 + -fdicts-strict + -fspec-constr-recursive=16 + -fmax-worker-args=16 common threading-options ghc-options: -threaded @@ -314,50 +334,6 @@ common threading-options common lib-options import: compile-options, optimization-options, default-extensions -common test-dependencies - build-depends: - streamly - , base >= 4.9 && < 5 - , containers >= 0.5 && < 0.7 - , exceptions >= 0.8 && < 0.11 - , ghc - , hspec >= 2.0 && < 3 - , mtl >= 2.2 && < 3 - , random >= 1.0.0 && < 2 - , transformers >= 0.4 && < 0.6 - , QuickCheck >= 2.13 && < 2.15 - , directory >= 1.2.2 && < 1.4 - , filepath >= 1.4.1 && < 1.5 - , temporary >= 1.3 && < 1.4 - --- Compilation for coverage builds on CI machines takes too long without -O0 --- XXX we should use coverage flag for that, -O0 may take too long to run tests --- in general. -common test-options - import: compile-options, threading-options, default-extensions - ,test-dependencies - - ghc-options: -O0 - -fno-ignore-asserts - include-dirs: test - -- XXX we need -O for plugin to work - -- if flag(fusion-plugin) && !impl(ghcjs) && !impl(ghc < 8.6) - -- ghc-options: -fplugin Fusion.Plugin - -- build-depends: - -- fusion-plugin >= 0.2 && < 0.3 - - hs-source-dirs: test - js-sources: jsbits/clock.js - default-language: Haskell2010 - --- Used by maxrate test, benchmarks and executables -common exe-options - import: compile-options, optimization-options, threading-options - if flag(fusion-plugin) && !impl(ghcjs) && !impl(ghc < 8.6) - ghc-options: -fplugin Fusion.Plugin - build-depends: - fusion-plugin >= 0.2 && < 0.3 - ------------------------------------------------------------------------------- -- Library ------------------------------------------------------------------------------- @@ -558,190 +534,3 @@ library -- tests fail if flag(dev) && flag(inspection) build-depends: inspection-and-dev-flags-cannot-be-used-together - -------------------------------------------------------------------------------- --- Test suites -------------------------------------------------------------------------------- - -test-suite Data.List.Base - import: test-options - type: exitcode-stdio-1.0 - main-is: Streamly/Test/Data/List.hs - -test-suite Data.List - import: test-options - type: exitcode-stdio-1.0 - main-is: Streamly/Test/Data/List.hs - cpp-options: -DUSE_STREAMLY_LIST - -test-suite Prelude - import: test-options - type: exitcode-stdio-1.0 - main-is: Streamly/Test/Prelude.hs - ghc-options: -main-is Streamly.Test.Prelude.main - -test-suite Prelude.Serial - import: test-options - type: exitcode-stdio-1.0 - main-is: Streamly/Test/Prelude/Serial.hs - ghc-options: -main-is Streamly.Test.Prelude.Serial.main - other-modules: Streamly.Test.Common - , Streamly.Test.Prelude.Common - -test-suite Prelude.WSerial - import: test-options - type: exitcode-stdio-1.0 - main-is: Streamly/Test/Prelude/WSerial.hs - ghc-options: -main-is Streamly.Test.Prelude.WSerial.main - other-modules: Streamly.Test.Common - , Streamly.Test.Prelude.Common - -test-suite Prelude.ZipSerial - import: test-options - type: exitcode-stdio-1.0 - main-is: Streamly/Test/Prelude/ZipSerial.hs - ghc-options: -main-is Streamly.Test.Prelude.ZipSerial.main - other-modules: Streamly.Test.Common - , Streamly.Test.Prelude.Common - -test-suite Prelude.ZipAsync - import: test-options - type: exitcode-stdio-1.0 - main-is: Streamly/Test/Prelude/ZipAsync.hs - ghc-options: -main-is Streamly.Test.Prelude.ZipAsync.main - other-modules: Streamly.Test.Common - , Streamly.Test.Prelude.Common - -test-suite Prelude.Ahead - import: test-options - type: exitcode-stdio-1.0 - main-is: Streamly/Test/Prelude/Ahead.hs - ghc-options: -main-is Streamly.Test.Prelude.Ahead.main - other-modules: Streamly.Test.Common - , Streamly.Test.Prelude.Common - -test-suite Prelude.Async - import: test-options - type: exitcode-stdio-1.0 - main-is: Streamly/Test/Prelude/Async.hs - ghc-options: -main-is Streamly.Test.Prelude.Async.main - other-modules: Streamly.Test.Common - , Streamly.Test.Prelude.Common - -test-suite Prelude.WAsync - import: test-options - type: exitcode-stdio-1.0 - main-is: Streamly/Test/Prelude/WAsync.hs - ghc-options: -main-is Streamly.Test.Prelude.WAsync.main - other-modules: Streamly.Test.Common - , Streamly.Test.Prelude.Common - -test-suite Prelude.Parallel - import: test-options - type: exitcode-stdio-1.0 - main-is: Streamly/Test/Prelude/Parallel.hs - ghc-options: -main-is Streamly.Test.Prelude.Parallel.main - other-modules: Streamly.Test.Common - , Streamly.Test.Prelude.Common - -test-suite Prelude.Concurrent - import: test-options - type: exitcode-stdio-1.0 - main-is: Streamly/Test/Prelude/Concurrent.hs - ghc-options: -main-is Streamly.Test.Prelude.Concurrent.main - other-modules: Streamly.Test.Common - , Streamly.Test.Prelude.Common - build-depends: mtl >= 2.2 && < 3 - -test-suite Prelude.Fold - import: test-options - type: exitcode-stdio-1.0 - main-is: Streamly/Test/Prelude/Fold.hs - ghc-options: -main-is Streamly.Test.Prelude.Fold.main - other-modules: Streamly.Test.Common - , Streamly.Test.Prelude.Common - -test-suite Prelude.MaxRate - import: test-options, exe-options - type: exitcode-stdio-1.0 - main-is: Streamly/Test/Prelude/MaxRate.hs - ghc-options: -main-is Streamly.Test.Prelude.MaxRate.main - if flag(dev) - buildable: True - else - buildable: False - -test-suite Data.Array.Storable.Foreign - import: test-options - type: exitcode-stdio-1.0 - main-is: Streamly/Test/Data/Array/Storable/Foreign.hs - ghc-options: -main-is Streamly.Test.Data.Array.Storable.Foreign.main - -test-suite Data.Fold - import: test-options - type: exitcode-stdio-1.0 - main-is: Streamly/Test/Data/Fold.hs - other-modules: Streamly.Test.Common - -test-suite Data.Unfold - import: test-options - type: exitcode-stdio-1.0 - main-is: Streamly/Test/Data/Unfold.hs - hs-source-dirs: test - -test-suite Data.Parser - import: test-options - ghc-options: -O2 - type: exitcode-stdio-1.0 - main-is: Streamly/Test/Data/Parser.hs - other-modules: Streamly.Test.Common - -test-suite Data.Parser.ParserD - import: test-options - type: exitcode-stdio-1.0 - main-is: Streamly/Test/Data/Parser/ParserD.hs - other-modules: Streamly.Test.Common - -test-suite Data.Array - import: test-options - type: exitcode-stdio-1.0 - main-is: Streamly/Test/Data/Array.hs - ghc-options: -main-is Streamly.Test.Data.Array.main - -test-suite Data.SmallArray - import: test-options - type: exitcode-stdio-1.0 - main-is: Streamly/Test/Data/SmallArray.hs - ghc-options: -main-is Streamly.Test.Data.SmallArray.main - -test-suite Data.Array.Prim - import: test-options - type: exitcode-stdio-1.0 - main-is: Streamly/Test/Data/Array/Prim.hs - ghc-options: -main-is Streamly.Test.Data.Array.Prim.main - -test-suite Data.Array.Prim.Pinned - import: test-options - type: exitcode-stdio-1.0 - main-is: Streamly/Test/Data/Array/Prim/Pinned.hs - ghc-options: -main-is Streamly.Test.Data.Array.Prim.Pinned.main - -test-suite Unicode.Stream - import: test-options - type: exitcode-stdio-1.0 - main-is: Streamly/Test/Unicode/Stream.hs - ghc-options: -main-is Streamly.Test.Unicode.Stream.main - -test-suite version-bounds - import: test-options - type: exitcode-stdio-1.0 - main-is: version-bounds.hs - -test-suite FileSystem.Event - import: test-options - type: exitcode-stdio-1.0 - main-is: Streamly/Test/FileSystem/Event.hs - hs-source-dirs: test - default-language: Haskell2010 - if os(darwin) - buildable: False diff --git a/test/README.md b/test/README.md new file mode 100644 index 00000000..12db0671 --- /dev/null +++ b/test/README.md @@ -0,0 +1,80 @@ +## Build a single test + +``` +$ cabal build test:Prelude.Serial +``` + +or: + +``` +$ cd test; cabal build Prelude.Serial +``` + +Build with optimizations: + +``` +$ cabal build --flag opt ... +``` + +## Build all tests + +``` +$ cabal build --enable-tests all +``` + +or: + +``` +$ cd test; cabal build --enable-tests +``` + +Or this, note this command does not work as expected when in the "test" dir: + +``` +$ cabal build --enable-tests streamly-tests +``` + +## Build and run + +Running all test suites, use any of the following: + +``` +$ cabal test all +``` + +or: + +``` +$ cd test; cabal test +``` + +Or this, note this command does not work as expected when in the "test" dir: + +``` +$ cabal test streamly-tests +``` + +## Build and Run a single test suite + +To run `Prelude.Serial` test-suite: + +``` +$ cabal run test:Prelude.Serial +``` + +or: + +``` +$ cd test; cabal run Prelude.Serial +``` + +Note you could use `cabal test Prelude.Serial` but that unfortunately builds +all the test suites before running `Prelude.Serial`. + +## Naming of test modules + +Tests are organized by source modules. For example, for the source +module `Streamly.Data.Array` and `Streamly.Internal.Data.Array` we have +a test module `Data.Array`. For some modules tests for a source module +are broken into multiple modules. For example, for `Streamly.Prelude` we have +`Streamly.Prelude.Serial`, `Streamly.Prelude.Async` etc. diff --git a/test/Streamly/Test/Common.hs b/test/lib/Streamly/Test/Common.hs similarity index 100% rename from test/Streamly/Test/Common.hs rename to test/lib/Streamly/Test/Common.hs diff --git a/test/Streamly/Test/Prelude/Common.hs b/test/lib/Streamly/Test/Prelude/Common.hs similarity index 100% rename from test/Streamly/Test/Prelude/Common.hs rename to test/lib/Streamly/Test/Prelude/Common.hs diff --git a/test/streamly-tests.cabal b/test/streamly-tests.cabal new file mode 100644 index 00000000..948f6281 --- /dev/null +++ b/test/streamly-tests.cabal @@ -0,0 +1,327 @@ +cabal-version: 2.2 +name: streamly-tests +version: 0.0.0 +synopsis: Tests for streamly +description: See streamly-benchmarks for the reason why we use a separate + package for tests. + +flag fusion-plugin + description: Use fusion plugin for benchmarks and executables + manual: True + default: False + +flag dev + description: Development build + manual: True + default: False + +flag has-llvm + description: Use llvm backend for better performance + manual: True + default: False + +flag opt + description: off=-O0 (faster builds), on=-O2 + manual: True + default: True + +------------------------------------------------------------------------------- +-- Common stanzas +------------------------------------------------------------------------------- + +common compile-options + default-language: Haskell2010 + + if os(darwin) + cpp-options: -DCABAL_OS_DARWIN + + if os(linux) + cpp-options: -DCABAL_OS_LINUX + + if os(windows) + cpp-options: -DCABAL_OS_WINDOWS + + if flag(dev) + cpp-options: -DDEVBUILD + + ghc-options: -Wall + -Wcompat + -Wunrecognised-warning-flags + -Widentities + -Wincomplete-record-updates + -Wincomplete-uni-patterns + -Wredundant-constraints + -Wnoncanonical-monad-instances + -Rghc-timing + + if flag(has-llvm) + ghc-options: -fllvm + + if flag(dev) + ghc-options: -Wmissed-specialisations + -Wall-missed-specialisations + + ghc-options: -fno-ignore-asserts + +common default-extensions + default-extensions: + BangPatterns + CApiFFI + CPP + ConstraintKinds + DeriveDataTypeable + DeriveGeneric + DeriveTraversable + ExistentialQuantification + FlexibleContexts + FlexibleInstances + GeneralizedNewtypeDeriving + InstanceSigs + KindSignatures + LambdaCase + MagicHash + MultiParamTypeClasses + PatternSynonyms + RankNTypes + RecordWildCards + ScopedTypeVariables + TupleSections + TypeFamilies + ViewPatterns + + -- MonoLocalBinds, enabled by TypeFamilies, causes performance + -- regressions. Disable it. This must come after TypeFamilies, + -- otherwise TypeFamilies will enable it again. + NoMonoLocalBinds + + -- UndecidableInstances -- Does not show any perf impact + -- UnboxedTuples -- interferes with (#.) + +common threading-options + ghc-options: -threaded + -with-rtsopts=-N + +common optimization-options + if flag(opt) + ghc-options: -O2 + -fdicts-strict + -fmax-worker-args=16 + -fspec-constr-recursive=16 + if flag(fusion-plugin) && !impl(ghcjs) && !impl(ghc < 8.6) + ghc-options: -fplugin Fusion.Plugin + else + ghc-options: -O0 + +common test-dependencies + build-depends: + streamly + , base >= 4.9 && < 5 + , containers >= 0.5 && < 0.7 + , exceptions >= 0.8 && < 0.11 + , ghc + , hspec >= 2.0 && < 3 + , mtl >= 2.2 && < 3 + , random >= 1.0.0 && < 2 + , transformers >= 0.4 && < 0.6 + , QuickCheck >= 2.13 && < 2.15 + , directory >= 1.2.2 && < 1.4 + , filepath >= 1.4.1 && < 1.5 + , temporary >= 1.3 && < 1.4 + + if flag(fusion-plugin) && !impl(ghcjs) && !impl(ghc < 8.6) + build-depends: + fusion-plugin >= 0.2 && < 0.3 + +------------------------------------------------------------------------------- +-- Library +------------------------------------------------------------------------------- + +common lib-options + import: compile-options + , optimization-options + , threading-options + , default-extensions + , test-dependencies + +library + import: lib-options, test-dependencies + hs-source-dirs: lib + exposed-modules: Streamly.Test.Common + , Streamly.Test.Prelude.Common + +------------------------------------------------------------------------------- +-- Test suites +------------------------------------------------------------------------------- + +common test-options + import: lib-options + include-dirs: . + build-depends: streamly-tests + +common always-optimized + import: compile-options + , threading-options + , default-extensions + , test-dependencies + ghc-options: -O2 + -fdicts-strict + -fmax-worker-args=16 + -fspec-constr-recursive=16 + if flag(fusion-plugin) && !impl(ghcjs) && !impl(ghc < 8.6) + ghc-options: -fplugin Fusion.Plugin + +test-suite Data.List.Base + import: test-options + type: exitcode-stdio-1.0 + main-is: Streamly/Test/Data/List.hs + +test-suite Data.List + import: test-options + type: exitcode-stdio-1.0 + main-is: Streamly/Test/Data/List.hs + cpp-options: -DUSE_STREAMLY_LIST + +test-suite Prelude + import: test-options + type: exitcode-stdio-1.0 + main-is: Streamly/Test/Prelude.hs + ghc-options: -main-is Streamly.Test.Prelude.main + +test-suite Prelude.Serial + import: test-options + type: exitcode-stdio-1.0 + main-is: Streamly/Test/Prelude/Serial.hs + ghc-options: -main-is Streamly.Test.Prelude.Serial.main + +test-suite Prelude.WSerial + import: test-options + type: exitcode-stdio-1.0 + main-is: Streamly/Test/Prelude/WSerial.hs + ghc-options: -main-is Streamly.Test.Prelude.WSerial.main + +test-suite Prelude.ZipSerial + import: test-options + type: exitcode-stdio-1.0 + main-is: Streamly/Test/Prelude/ZipSerial.hs + ghc-options: -main-is Streamly.Test.Prelude.ZipSerial.main + +test-suite Prelude.ZipAsync + import: test-options + type: exitcode-stdio-1.0 + main-is: Streamly/Test/Prelude/ZipAsync.hs + ghc-options: -main-is Streamly.Test.Prelude.ZipAsync.main + +test-suite Prelude.Ahead + import: test-options + type: exitcode-stdio-1.0 + main-is: Streamly/Test/Prelude/Ahead.hs + ghc-options: -main-is Streamly.Test.Prelude.Ahead.main + +test-suite Prelude.Async + import: test-options + type: exitcode-stdio-1.0 + main-is: Streamly/Test/Prelude/Async.hs + ghc-options: -main-is Streamly.Test.Prelude.Async.main + +test-suite Prelude.WAsync + import: test-options + type: exitcode-stdio-1.0 + main-is: Streamly/Test/Prelude/WAsync.hs + ghc-options: -main-is Streamly.Test.Prelude.WAsync.main + +test-suite Prelude.Parallel + import: test-options + type: exitcode-stdio-1.0 + main-is: Streamly/Test/Prelude/Parallel.hs + ghc-options: -main-is Streamly.Test.Prelude.Parallel.main + +test-suite Prelude.Concurrent + import: test-options + type: exitcode-stdio-1.0 + main-is: Streamly/Test/Prelude/Concurrent.hs + ghc-options: -main-is Streamly.Test.Prelude.Concurrent.main + +test-suite Prelude.Fold + import: test-options + type: exitcode-stdio-1.0 + main-is: Streamly/Test/Prelude/Fold.hs + ghc-options: -main-is Streamly.Test.Prelude.Fold.main + +test-suite Prelude.MaxRate + import:always-optimized + type: exitcode-stdio-1.0 + main-is: Streamly/Test/Prelude/MaxRate.hs + ghc-options: -main-is Streamly.Test.Prelude.MaxRate.main + if flag(dev) + buildable: True + else + buildable: False + +test-suite Data.Array.Storable.Foreign + import: test-options + type: exitcode-stdio-1.0 + main-is: Streamly/Test/Data/Array/Storable/Foreign.hs + ghc-options: -main-is Streamly.Test.Data.Array.Storable.Foreign.main + +test-suite Data.Fold + import: test-options + type: exitcode-stdio-1.0 + main-is: Streamly/Test/Data/Fold.hs + +test-suite Data.Unfold + import: test-options + type: exitcode-stdio-1.0 + main-is: Streamly/Test/Data/Unfold.hs + +test-suite Data.Parser + import: test-options + ghc-options: -O2 + type: exitcode-stdio-1.0 + main-is: Streamly/Test/Data/Parser.hs + +test-suite Data.Parser.ParserD + import: test-options + type: exitcode-stdio-1.0 + main-is: Streamly/Test/Data/Parser/ParserD.hs + +test-suite Data.Array + import: test-options + type: exitcode-stdio-1.0 + main-is: Streamly/Test/Data/Array.hs + ghc-options: -main-is Streamly.Test.Data.Array.main + +test-suite Data.SmallArray + import: test-options + type: exitcode-stdio-1.0 + main-is: Streamly/Test/Data/SmallArray.hs + ghc-options: -main-is Streamly.Test.Data.SmallArray.main + +test-suite Data.Array.Prim + import: test-options + type: exitcode-stdio-1.0 + main-is: Streamly/Test/Data/Array/Prim.hs + ghc-options: -main-is Streamly.Test.Data.Array.Prim.main + +test-suite Data.Array.Prim.Pinned + import: test-options + type: exitcode-stdio-1.0 + main-is: Streamly/Test/Data/Array/Prim/Pinned.hs + ghc-options: -main-is Streamly.Test.Data.Array.Prim.Pinned.main + +test-suite Unicode.Stream + import: test-options + type: exitcode-stdio-1.0 + main-is: Streamly/Test/Unicode/Stream.hs + ghc-options: -main-is Streamly.Test.Unicode.Stream.main + +test-suite version-bounds + import: test-options + type: exitcode-stdio-1.0 + main-is: version-bounds.hs + +test-suite FileSystem.Event + import: test-options + type: exitcode-stdio-1.0 + main-is: Streamly/Test/FileSystem/Event.hs + if os(darwin) + buildable: False