packages feed

cursor-gen-0.4.0.0: test/Cursor/Simple/Tree/PromoteSpec.hs

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}

module Cursor.Simple.Tree.PromoteSpec
  ( spec,
  )
where

import Cursor.Simple.Tree hiding (TreeCursor)
import Cursor.Simple.Tree.Gen ()
import Cursor.Simple.Tree.TestUtils
import Cursor.Tree
  ( TreeCursor (..),
    closedForest,
    emptyCForest,
    openForest,
  )
import Data.Tree
import Test.Hspec
import Test.Validity

spec :: Spec
spec = do
  functorSpec @PromoteElemResult
  applicativeSpec @PromoteElemResult
  monadSpec @PromoteElemResult
  describe "treeCursorPromoteElem" $ do
    it "produces valids on valids" $ producesValid $ treeCursorPromoteElem @Bool
    it "Works on the example from the docs" $
      let promoteStart =
            TreeCursor
              { treeAbove =
                  Just
                    TreeAbove
                      { treeAboveLefts = [node 'b' [node 'c' []]],
                        treeAboveAbove =
                          Just
                            TreeAbove
                              { treeAboveLefts = [],
                                treeAboveAbove = Nothing,
                                treeAboveNode = 'p',
                                treeAboveRights = [node 'h' []]
                              },
                        treeAboveNode = 'a',
                        treeAboveRights = [node 'f' [node 'g' []]]
                      },
                treeCurrent = 'd',
                treeBelow = closedForest [Node 'e' []]
              }
          promoteEnd =
            TreeCursor
              { treeAbove =
                  Just
                    TreeAbove
                      { treeAboveLefts =
                          [ CNode 'a' $
                              openForest
                                [ CNode 'b' $
                                    openForest [CNode 'c' emptyCForest, CNode 'e' emptyCForest],
                                  CNode 'f' $ closedForest [Node 'g' []]
                                ]
                          ],
                        treeAboveAbove = Nothing,
                        treeAboveNode = 'p',
                        treeAboveRights = [CNode 'h' emptyCForest]
                      },
                treeCurrent = 'd',
                treeBelow = emptyCForest
              }
       in case treeCursorPromoteElem promoteStart of
            PromotedElem tc' -> tc' `treeShouldBe` promoteEnd
            _ -> expectationFailure "treeCursorPromoteElem should not have failed"
    it "promotes the current node to the level of its parent" pending
  functorSpec @PromoteResult
  applicativeSpec @PromoteResult
  monadSpec @PromoteResult
  describe "treeCursorPromoteSubTree" $ do
    it "produces valids on valids" $ producesValid $ treeCursorPromoteSubTree @Bool
    it "Works on the example from the docs" $
      let promoteStart =
            TreeCursor
              { treeAbove =
                  Just
                    TreeAbove
                      { treeAboveLefts = [CNode 'b' $ closedForest [Node 'c' []]],
                        treeAboveAbove =
                          Just
                            TreeAbove
                              { treeAboveLefts = [],
                                treeAboveAbove = Nothing,
                                treeAboveNode = 'p',
                                treeAboveRights = [node 'h' []]
                              },
                        treeAboveNode = 'a',
                        treeAboveRights = [CNode 'f' $ closedForest [Node 'g' []]]
                      },
                treeCurrent = 'd',
                treeBelow = closedForest [Node 'e' []]
              }
          promoteEnd =
            TreeCursor
              { treeAbove =
                  Just
                    TreeAbove
                      { treeAboveLefts =
                          [ CNode 'a' $
                              openForest
                                [ CNode 'b' $ closedForest [Node 'c' []],
                                  CNode 'f' $ closedForest [Node 'g' []]
                                ]
                          ],
                        treeAboveAbove = Nothing,
                        treeAboveNode = 'p',
                        treeAboveRights = [CNode 'h' $ closedForest []]
                      },
                treeCurrent = 'd',
                treeBelow = closedForest [Node 'e' []]
              }
       in case treeCursorPromoteSubTree promoteStart of
            Promoted tc' -> tc' `treeShouldBe` promoteEnd
            _ -> expectationFailure "treeCursorPromoteSubTree should not have failed"
    it "promotes the current subtree to the level of its parent" pending