import Data.Foldable.Functor.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 doubly wrapped" $ collapseErnieSyntaxTree ernieComplex `shouldBe` resultErnie