Add Test Suite and Library (#30)

* added library and test scaffoding

* Add bin/test

* Update comments

Co-authored-by: Sridhar Ratnakumar <srid@srid.ca>
This commit is contained in:
EvanPiro 2022-08-06 18:45:22 -04:00 committed by GitHub
parent 7cc65c200d
commit c78eaf81c4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 67 additions and 36 deletions

1
.ghcid
View file

@ -1 +0,0 @@
--warnings -T ":main"

View file

@ -6,7 +6,7 @@ Get a Haskell development environment up and running quickly, as long as Nix is
This repository is a Haskell project template that is optimized for a fully reproducible and friendly development environment. It is based on: This repository is a Haskell project template that is optimized for a fully reproducible and friendly development environment. It is based on:
- [Nix](http://www.srid.ca/haskell-nix) + [Flakes](https://serokell.io/blog/practical-nix-flakes) (via [`github:srid/haskell-flake`](https://github.com/srid/haskell-flake)) + GHC 9 - [Nix](https://srid.ca/haskell-nix) + [Flakes](https://serokell.io/blog/practical-nix-flakes) (via [`github:srid/haskell-flake`](https://github.com/srid/haskell-flake)) + GHC 9
- VSCode + [HLS](https://github.com/haskell/haskell-language-server) - VSCode + [HLS](https://github.com/haskell/haskell-language-server)
- [fourmolu](https://github.com/fourmolu/fourmolu) autoformatting - [fourmolu](https://github.com/fourmolu/fourmolu) autoformatting
- [Relude](https://github.com/kowainik/relude#relude) as Prelude. - [Relude](https://github.com/kowainik/relude#relude) as Prelude.
@ -49,6 +49,7 @@ git add . && git commit -m rename
- Run `nix flake update` to update all flake inputs. - Run `nix flake update` to update all flake inputs.
- Run `treefmt` in nix shell to autoformat the project. This uses [treefmt](https://github.com/numtide/treefmt), which uses `./treefmt.toml` (where fourmolu and nixpkgs-fmt are specified). - Run `treefmt` in nix shell to autoformat the project. This uses [treefmt](https://github.com/numtide/treefmt), which uses `./treefmt.toml` (where fourmolu and nixpkgs-fmt are specified).
- Run `bin/hoogle` to start Hoogle with packages in your cabal file. - Run `bin/hoogle` to start Hoogle with packages in your cabal file.
- Run `bin/test` to run the test suite.
- Run the application without installing: `nix run github:srid/haskell-template` (or `nix run .` from checkout) - Run the application without installing: `nix run github:srid/haskell-template` (or `nix run .` from checkout)
## Alternatives ## Alternatives

View file

@ -1,8 +1,4 @@
#!/usr/bin/env bash #!/usr/bin/env bash
set -xe set -xe
# This will run ghcid, which uses `./.ghcid` to invoke your program main entry exec nix develop -c ghcid -c "cabal repl exe:haskell-template" --warnings -T :main
# point, with the specified args.
#
# If you change ./.ghcid, ghcid will automatically reload.
exec nix develop -c ghcid

4
bin/test Executable file
View file

@ -0,0 +1,4 @@
#!/usr/bin/env bash
set -xe
exec nix develop -c ghcid -c "cabal repl test:tests"

View file

@ -21,35 +21,17 @@ extra-source-files:
LICENSE LICENSE
README.md README.md
executable haskell-template common shared
build-depends: ghc-options:
, aeson -Wall -Wincomplete-record-updates -Wincomplete-uni-patterns
, async -Wmissing-deriving-strategies -Wunused-foralls -Wunused-foralls
, base >=4.13.0.0 && <=4.18.0.0 -fprint-explicit-foralls -fprint-explicit-kinds
, bytestring
, containers
, data-default
, directory
, filepath
, mtl
, optics-core
, profunctors
, relude
, shower
, text
, time
, with-utf8
mixins: mixins:
base hiding (Prelude), base hiding (Prelude),
relude (Relude as Prelude, Relude.Container.One), relude (Relude as Prelude, Relude.Container.One),
relude relude
ghc-options:
-Wall -Wincomplete-record-updates -Wincomplete-uni-patterns
-Wmissing-deriving-strategies -Wunused-foralls -Wunused-foralls
-fprint-explicit-foralls -fprint-explicit-kinds
default-extensions: default-extensions:
NoStarIsType NoStarIsType
BangPatterns BangPatterns
@ -91,6 +73,41 @@ executable haskell-template
TypeOperators TypeOperators
ViewPatterns ViewPatterns
main-is: Main.hs build-depends:
hs-source-dirs: src , aeson
default-language: Haskell2010 , async
, base >=4.13.0.0 && <=4.18.0.0
, bytestring
, containers
, data-default
, directory
, filepath
, mtl
, optics-core
, profunctors
, relude
, shower
, text
, time
, with-utf8
executable haskell-template
import: shared
main-is: Main.hs
hs-source-dirs: src
default-language: Haskell2010
other-modules: Lib
library
import: shared
exposed-modules: Lib
hs-source-dirs: src
test-suite tests
import: shared
main-is: Main.hs
type: exitcode-stdio-1.0
hs-source-dirs: tests
build-depends:
, haskell-template
, hspec

4
src/Lib.hs Normal file
View file

@ -0,0 +1,4 @@
module Lib (hello) where
hello :: Text
hello = "Hello 🌎"

View file

@ -1,15 +1,15 @@
module Main where module Main where
import Lib qualified
import Main.Utf8 qualified as Utf8 import Main.Utf8 qualified as Utf8
{- | {- |
Main entry point. Main entry point.
The `bin/run` script will invoke this function. See `.ghcid` file to change The `bin/run` script will invoke this function.
that.
-} -}
main :: IO () main :: IO ()
main = do main = do
-- For withUtf8, see https://serokell.io/blog/haskell-with-utf8 -- For withUtf8, see https://serokell.io/blog/haskell-with-utf8
Utf8.withUtf8 $ do Utf8.withUtf8 $ do
putStrLn "Hello 🌎" putTextLn Lib.hello

10
tests/Main.hs Normal file
View file

@ -0,0 +1,10 @@
module Main where
import Lib qualified
import Test.Hspec (describe, hspec, it, shouldContain)
main :: IO ()
main = hspec $ do
describe "Lib.hello" $ do
it "contains the world emoji" $ do
toString Lib.hello `shouldContain` "🌎"