packages feed

recursion-schemes-ext-0.1.0.4: test/Spec.hs

import           Data.Functor.Foldable.Examples (Bert (Add, Bert, Num),
                                                 Ernie (Ernie, Multiply),
                                                 collapseBertSyntaxTree,
                                                 collapseErnieSyntaxTree,
                                                 collapseErnieSyntaxTree')
import           Test.Hspec                     (describe, hspec, it, parallel,
                                                 shouldBe)

bertSum :: Bert
bertSum = Add (Num 2) (Num 3)

ernieMult :: Ernie
ernieMult = Multiply (Ernie bertSum) (Ernie (Num 3))

bertNothing :: Bert
bertNothing = Bert ernieMult

ernieComplex :: Ernie
ernieComplex = Ernie bertNothing

bertComplex :: Bert
bertComplex = Add (Num 3) (Bert ernieMult)

resultErnie :: Ernie
resultErnie = Ernie (Num 15)

main :: IO ()
main = hspec $
    describe "dendro" $ do
        parallel $ it "collapses a simple syntax tree" $
            collapseBertSyntaxTree bertSum `shouldBe` Num 5
        parallel $ it "collapses both parts of a syntax tree" $
            collapseErnieSyntaxTree ernieMult `shouldBe` resultErnie
        parallel $ it "matches solution via catamorphism" $
            collapseErnieSyntaxTree' ernieMult `shouldBe` collapseErnieSyntaxTree ernieMult
        parallel $ it "collapses complex syntax trees" $
            collapseBertSyntaxTree bertComplex `shouldBe` Num 18
        parallel $ it "should work would when triply wrapped" $
            collapseErnieSyntaxTree (Ernie (Bert ernieComplex)) `shouldBe` resultErnie