axel-0.0.13: test/Axel/Test/Utils/MaybeSpec.hs
{- HLINT ignore "Redundant do" -}
module Axel.Test.Utils.MaybeSpec where
import Axel.Prelude
import Axel.Utils.Maybe
import Axel.Utils.Zipper
import Data.Char
import Data.Data
import Data.Generics.Uniplate.Data ()
import Data.Generics.Uniplate.Zipper
import qualified Data.Text as T
import Test.Hspec
data MockAST
= SExp [MockAST]
| Symbol Text
deriving (Data, Eq, Show)
spec_Maybe :: Spec
spec_Maybe = do
describe "foldUntilNothing" $ do
it "works with basic function to be folded" $ do
let modify :: Int -> Int
modify = (+ 2)
let move n =
if n < 5
then Just $ n - 1
else Nothing
foldUntilNothing move modify 0 `shouldBe` 5
it "works as expected with AST-traversing zippers" $ do
let modify z =
replaceHole
(case hole z of
SExp xs -> SExp xs
Symbol x -> Symbol $ T.map toUpper x)
z
in (fromZipper .
foldUntilNothing right modify .
unsafeDown . unsafeRight . unsafeDown . zipper)
(SExp
[Symbol "unchanged", SExp [Symbol "both", Symbol "capitalized"]]) `shouldBe`
SExp [Symbol "unchanged", SExp [Symbol "BOTH", Symbol "CAPITALIZED"]]