From f43eb607ff61b4cfe2b97b12a178d9cc0de2d152 Mon Sep 17 00:00:00 2001 From: Jonathan Lamothe Date: Tue, 20 Aug 2024 20:09:03 -0400 Subject: [PATCH] implemented newAbacus --- abacus.cabal | 1 + src/Abacus.hs | 11 +++++++---- test/AbacusSpec.hs | 45 +++++++++++++++++++++++++++++++++++++++++++++ test/Spec.hs | 5 ++++- 4 files changed, 57 insertions(+), 5 deletions(-) create mode 100644 test/AbacusSpec.hs diff --git a/abacus.cabal b/abacus.cabal index b73a745..b699cbd 100644 --- a/abacus.cabal +++ b/abacus.cabal @@ -50,6 +50,7 @@ test-suite abacus-test type: exitcode-stdio-1.0 main-is: Spec.hs other-modules: + AbacusSpec Paths_abacus autogen-modules: Paths_abacus diff --git a/src/Abacus.hs b/src/Abacus.hs index a374afb..c530d00 100644 --- a/src/Abacus.hs +++ b/src/Abacus.hs @@ -28,13 +28,16 @@ module Abacus (Abacus, newAbacus) where import Abacus.Internal --- | Constructs the initial state of a new "Abacus" +-- | Constructs the initial state of a new "Abacus"; will return +-- "Nothing" if the input paramebers are invalid. newAbacus :: Int - -- ^ The number of beads on each rung + -- ^ The number of beads on each rung (must be at least one) -> Int - -- ^ The number of rungs + -- ^ The number of rungs (must be at least one) -> Maybe Abacus -newAbacus = undefined +newAbacus beads rungs = if beads < 1 || rungs < 1 + then Nothing + else Just $ Abacus beads $ replicate rungs 0 --jl diff --git a/test/AbacusSpec.hs b/test/AbacusSpec.hs new file mode 100644 index 0000000..b416b0c --- /dev/null +++ b/test/AbacusSpec.hs @@ -0,0 +1,45 @@ +{- + +abacus +Copyright (C) Jonathan Lamothe + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public +License along with this program. If not, see +. + +-} + +module AbacusSpec (spec) where + +import Test.Hspec (Spec, context, describe, it, shouldBe) + +import Abacus +import Abacus.Internal + +spec :: Spec +spec = describe "Abacus" + newAbacusSpec + +newAbacusSpec :: Spec +newAbacusSpec = describe "newAbacusSpec" $ mapM_ + ( \(desc, beads, rungs, expected) -> context desc $ let + actual = newAbacus beads rungs + in it ("should be " ++ show expected) $ + actual `shouldBe` expected + ) + [ ( "valid", 10, 3, Just $ Abacus 10 [0, 0, 0] ) + , ( "no beads", 0, 3, Nothing ) + , ( "no rungs", 10, 0, Nothing ) + ] + +--jl diff --git a/test/Spec.hs b/test/Spec.hs index 1f71f27..97490f3 100644 --- a/test/Spec.hs +++ b/test/Spec.hs @@ -21,7 +21,10 @@ License along with this program. If not, see import Test.Hspec (hspec) +import qualified AbacusSpec as Abacus + main :: IO () -main = hspec $ return () +main = hspec + Abacus.spec -- jl