{- 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 Abacus.App.Widgets.InternalSpec (spec) where import Lens.Micro.Platform ((^.), (&), (.~)) import Test.Hspec (Spec, describe, context, it, shouldBe) import Abacus.App.Types import Abacus.App.Widgets.Internal import Abacus.Internal spec :: Spec spec = describe "Internal" $ do abacusLeftSpec beadsSpec abacusRightSpec abacusLeftSpec :: Spec abacusLeftSpec = describe "abacusLeft" $ mapM_ ( \(desc, state, expected) -> context desc $ it ("should be " ++ show expected) $ abacusLeft state `shouldBe` expected ) [ ( "initial state", initialState, initStr ) , ( "rung 5", r5State, r5Str ) , ( "negative", negState, nStr ) ] where initStr = [ " " , ">0" , " 1" , " 2" , " 3" , " 4" , " 5" , " 6" , " 7" , " 8" , " 9" , " " ] r5Str = [ " " , " 0" , " 1" , " 2" , " 3" , " 4" , ">5" , " 6" , " 7" , " 8" , " 9" , " " ] nStr = [ " " , " 0" , " 1" , " 2" , " 3" , " 4" , " 5" , " 6" , " 7" , " 8" , " 9" , " " ] r5State = initialState & rungNum .~ 5 negState = initialState & rungNum .~ (-1) beadsSpec :: Spec beadsSpec = describe "beads" $ mapM_ ( \(desc, a, expected) -> context desc $ it ("should be " ++ show expected) $ beads a `shouldBe` expected ) [ ( "initial state", initAb, initRes ) , ( "1-10", countAb, countRes ) ] where initAb = initialState^.abacus countAb = Abacus 10 [1..10] initRes = replicate 10 ("OOOOOOOOOO", "") countRes = [ ( "OOOOOOOOO", "O" ) , ( "OOOOOOOO", "OO" ) , ( "OOOOOOO", "OOO" ) , ( "OOOOOO", "OOOO" ) , ( "OOOOO", "OOOOO" ) , ( "OOOO", "OOOOOO" ) , ( "OOO", "OOOOOOO" ) , ( "OO", "OOOOOOOO" ) , ( "O", "OOOOOOOOO" ) , ( "", "OOOOOOOOOO" ) ] abacusRightSpec :: Spec abacusRightSpec = describe "abacusRight" $ return () --jl