packages feed

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

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

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

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

spec :: Spec
spec = do
  describe "treeCursorDeleteSubTreeAndSelectPrevious" $ do
    it "produces valids on valids" $
      producesValid $
        treeCursorDeleteSubTreeAndSelectPrevious @Bool
    it "deletes the current subtree selects the previous subtree" pending
  describe "treeCursorDeleteSubTreeAndSelectNext" $ do
    it "produces valids on valids" $
      producesValid $
        treeCursorDeleteSubTreeAndSelectNext @Bool
    it "deletes the current subtree selects the next subtree" pending
  describe "treeCursorDeleteSubTreeAndSelectAbove" $ do
    it "produces valids on valids" $
      producesValid $
        treeCursorDeleteSubTreeAndSelectAbove @Bool
    it "deletes the current subtree selects the above node" pending
  describe "treeCursorRemoveSubTree" $ do
    it "produces valids on valids" $ producesValid $ treeCursorRemoveSubTree @Bool
    it "removes the current subtree" pending
  describe "treeCursorDeleteSubTree" $ do
    it "produces valids on valids" $ producesValid $ treeCursorDeleteSubTree @Bool
    it "deletes the current subtree" pending
  describe "treeCursorDeleteElemAndSelectPrevious" $ do
    it "produces valids on valids" $
      producesValid $
        treeCursorDeleteElemAndSelectPrevious @Bool
    it "works for this simple example" $
      forAllValid $
        \fs ->
          let simpleDeleteElemStart =
                TreeCursor
                  { treeAbove = Nothing,
                    treeCurrent = 1 :: Int,
                    treeBelow = closedForest [Node 2 fs]
                  }
           in case treeCursorDeleteElemAndSelectPrevious simpleDeleteElemStart of
                Nothing -> pure ()
                Just Deleted ->
                  expectationFailure
                    "treeCursorDeleteElemAndSelectPrevious should not have deleted the entire example tree."
                Just (Updated _) ->
                  expectationFailure
                    "treeCursorDeleteElemAndSelectPrevious should not have updated the example tree, but failed instead."
    it "deletes the current element and selects the previous element" pending
  describe "treeCursorDeleteElemAndSelectNext" $ do
    it "produces valids on valids" $
      producesValid $
        treeCursorDeleteElemAndSelectNext @Bool
    it "works for this simple example" $
      forAllValid $
        \fs ->
          let simpleDeleteElemStart =
                TreeCursor {treeAbove = Nothing, treeCurrent = 1, treeBelow = openForest [CNode 2 fs]}
              simpleDeleteElemExpected =
                TreeCursor {treeAbove = Nothing, treeCurrent = 2 :: Int, treeBelow = fs}
           in case treeCursorDeleteElemAndSelectNext simpleDeleteElemStart of
                Nothing ->
                  expectationFailure "treeCursorDeleteElemAndSelectNext should not have failed."
                Just Deleted ->
                  expectationFailure
                    "treeCursorDeleteElemAndSelectNext should not have deleted the entire example tree."
                Just (Updated f) -> f `treeShouldBe` simpleDeleteElemExpected
    it "deletes the current element and selects the next element" pending
  describe "treeCursorDeleteElemAndSelectAbove" $ do
    it "produces valids on valids" $
      producesValid $
        treeCursorDeleteElemAndSelectAbove @Bool
    it "works for this simple example" $
      forAllValid $ \fs ->
        let simpleDeleteElemStart =
              TreeCursor
                { treeAbove = Nothing,
                  treeCurrent = 1 :: Int,
                  treeBelow = closedForest [Node 2 fs]
                }
         in case treeCursorDeleteElemAndSelectAbove simpleDeleteElemStart of
              Nothing -> pure ()
              Just Deleted ->
                expectationFailure
                  "treeCursorDeleteElemAndSelectAbove should not have deleted the entire example tree."
              Just (Updated _) ->
                expectationFailure
                  "treeCursorDeleteElemAndSelectAbove should not have updated the example tree, but failed instead."
    it "deletes the current element and selects the above element" pending
  describe "treeCursorRemoveElem" $ do
    it "produces valids on valids" $ producesValid $ treeCursorRemoveElem @Bool
    it "removes the current element" pending
  describe "treeCursorDeleteElem" $ do
    it "produces valids on valids" $ producesValid $ treeCursorDeleteElem @Bool
    it "deletes the current element" pending