packages feed

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

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

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

import Data.Tree

import Test.Hspec

import Test.Validity

import Cursor.Simple.Tree hiding (TreeCursor)
import Cursor.Simple.Tree.Gen ()
import Cursor.Tree
  ( CTree(..)
  , TreeAbove(..)
  , TreeCursor(..)
  , closedForest
  , emptyCForest
  , openForest
  )

import Cursor.Simple.Tree.TestUtils

spec :: Spec
spec = do
  functorSpec @PromoteElemResult
  applicativeSpec @PromoteElemResult
  monadSpec @PromoteElemResult
  describe "treeCursorPromoteElem" $ do
    it "produces valids on valids" $ producesValidsOnValids $ 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" $ producesValidsOnValids $ 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