packages feed

tinytools-0.1.0.5: test/Potato/Flow/OwlSpec.hs

module Potato.Flow.OwlSpec (
  spec
) where


import           Relude

import           Test.Hspec

import qualified Data.Sequence            as Seq
import qualified Data.IntSet as IS
import qualified Data.IntMap as IM
import           Potato.Flow.OwlItem
import Potato.Flow.Owl
import           Potato.Flow.Deprecated.TestStates
import           Potato.Flow.Deprecated.State
import Potato.Flow.Types
import Potato.Flow.Serialization.Snake


-- | 'owlTree_toSEltTree' may change SEltFolderEnd name and REltId during reconstruction
-- so we simply filter it out so we can compare the parts that should not have changed
filterFolderEndFn :: (REltId, SEltLabel) -> Bool
filterFolderEndFn (_, SEltLabel _ SEltFolderEnd) = False
filterFolderEndFn _ = True

spec :: Spec
spec = do
  describe "Owl" $ do
    let
      owlTree0 = owlTree_fromOldState (_pFState_directory pfstate_basic2) (_pFState_layers pfstate_basic2)
      owlMapping0 = _owlTree_mapping owlTree0
    describe "OwlMapping" $ do
      it "isDescendentOf" $ do
        isDescendentOf owlMapping0 1 2 `shouldBe` True
        isDescendentOf owlMapping0 0 2 `shouldBe` True
        isDescendentOf owlMapping0 2 1 `shouldBe` False -- 2 is child of 1
        isDescendentOf owlMapping0 1 7 `shouldBe` False -- siblings

    describe "OwlTree" $ do
      let
        sEltTree2 = _sPotatoFlow_sEltTree (pFState_to_sPotatoFlow pfstate_basic2)
      it "owlTree_validate" $ do
        --putTextLn $ show $ owlTree_validate owlTree0
        fst (owlTree_validate owlTree0) `shouldBe` True
      it "owlTree_fromOldState" $ do
        --forM (potatoShow owlTree0) print
        (Seq.length (owlTree_topSuperOwls owlTree0) `shouldBe` 1)
        owlTree_owlCount owlTree0 `shouldBe` 9
      it "owliterateall" $ do
        toList (fmap _superOwl_id (owliterateall owlTree0)) `shouldBe` [0,1,2,3,4,5,7,8,9]
      it "owlTree_toSEltTree" $ do
        filter filterFolderEndFn (owlTree_toSEltTree owlTree0) `shouldBe` filter filterFolderEndFn sEltTree2
      it "owlTree_removeSuperOwl" $ do
        let
          sowl1 = owlTree_mustFindSuperOwl owlTree0 2 -- b1
          sowl2 = owlTree_mustFindSuperOwl owlTree0 1 -- fstart2
          ot1 = owlTree_removeSuperOwl False sowl1 owlTree0
          ot2 = owlTree_removeSuperOwl False sowl2 owlTree0
        owlTree_owlCount ot1 `shouldBe` 8
        owlTree_owlCount ot2 `shouldBe` 4
        fst (owlTree_validate ot1) `shouldBe` True
        fst (owlTree_validate ot2) `shouldBe` True
      it "owlTree_addOwlItem" $ do
        let
          owlSpot1 = OwlSpot (-1) Nothing
          owlItem1 = OwlItem (OwlInfo "💩") OwlSubItemNone
          rid = owlTree_maxId owlTree0 + 1
          owlSpot2 = OwlSpot 7 (Just 9)
          (ot1, _) = owlTree_addOwlItem owlSpot1 rid owlItem1 owlTree0
          (ot2, _) = owlTree_addOwlItem owlSpot2 rid owlItem1 owlTree0
        owlTree_owlCount ot1 `shouldBe` 10
        owlTree_owlCount ot2 `shouldBe` 10
        fst (owlTree_validate ot1) `shouldBe` True
        fst (owlTree_validate ot2) `shouldBe` True
        -- too lazy to write proper test, just print and verify manually
        --putTextLn (potatoShow $ owlTree_addOwlItem owlSpot2 rid owlItem1 owlTree0)
      it "owlTree_moveOwlParliament" $ do
        let
          owlSpot1 = OwlSpot (-1) Nothing
          parliament = OwlParliament $ Seq.fromList [2,3,7]
          (ot1, c1) = owlTree_moveOwlParliament parliament owlSpot1 owlTree0
        owlTree_owlCount ot1 `shouldBe` 9
        -- 5 becaues this includes the 2 children of 7
        length c1 `shouldBe` 5
        fst (owlTree_validate ot1) `shouldBe` True
        -- too lazy to write proper test, just print and verify manually
        --putTextLn (potatoShow . fst $ owlTree_moveOwlParliament parliament owlSpot1 owlTree0)
      it "owlTree_addSEltTree" $ do
        let
          owlSpot1 = OwlSpot (-1) Nothing
          -- current version of owlTree_addSEltTree requires non-colliding REltIds so we reindex here
          seltree1 = fmap (\(rid,seltl) -> (rid+100, seltl)) $ owlTree_toSEltTree owlTree0
          (ot1, c1) = owlTree_addSEltTree owlSpot1 seltree1 owlTree0
        owlTree_owlCount ot1 `shouldBe` 18
        length c1 `shouldBe` 9
        fst (owlTree_validate ot1) `shouldBe` True
      it "owlTree_equivalent" $ do
        owlTree_equivalent owlTree0 owlTree0 `shouldBe` True
      it "owlTree_findSuperOwlAtOwlSpot" $ do
        let
          b2sowl = owlTree_mustFindSuperOwl owlTree0 2
        owlTree_findSuperOwlAtOwlSpot owlTree0 (owlTree_owlItemMeta_toOwlSpot owlTree0 (_superOwl_meta $ b2sowl)) `shouldBe` Just b2sowl

      let
        owlTreeWithAttachments0 = owlTree_fromOldState (_pFState_directory pfstate_attachments1) (_pFState_layers pfstate_attachments1)
        am0 = owlTree_makeAttachmentMap owlTreeWithAttachments0
      it "owlTree_makeAttachmentMap" $ do
        liftIO $ print am0
        IM.lookup 0 am0 `shouldBe` (Just $ IS.fromList [4])
        IM.lookup 2 am0 `shouldBe` (Just $ IS.fromList [4,5])
        IM.lookup 3 am0 `shouldBe` (Just $ IS.fromList [5])
      it "owlTree_hasDanglingAttachments" $ do
        owlTree_hasDanglingAttachments owlTreeWithAttachments0 `shouldBe` False
        owlTree_hasDanglingAttachments (owlTree_reindex 100 owlTreeWithAttachments0) `shouldBe` False
    describe "OwlParliament" $ do
      it "superOwlParliament_isValid" $ do
        --putTextLn (potatoShow owlTree0)
        let
          validParliament = owlParliament_toSuperOwlParliament owlTree0 (OwlParliament $ Seq.fromList [2,3,7])
          invalidParliament = owlParliament_toSuperOwlParliament owlTree0 (OwlParliament $ Seq.fromList [2,3,7,9])
        superOwlParliament_isValid owlTree0 validParliament `shouldBe` True
        superOwlParliament_isValid owlTree0 invalidParliament `shouldBe` False
      it "superOwlParliament_disjointUnionAndCorrect" $ do
        let
          tosop = SuperOwlParliament . Seq.fromList . fmap (owlTree_mustFindSuperOwl owlTree0)
          torids (SuperOwlParliament sop) = toList $ fmap _superOwl_id sop
          sopnil = tosop []
          sop0 = tosop [0]
          sop1 = tosop [1]
          sop2 = tosop [2]
          sop3 = tosop [3]
          sop7 = tosop [7]
          sop8 = tosop [8]
          sop9 = tosop [9]
          sop89 = tosop [8,9]
          sop28 = tosop [2,8]
        torids (superOwlParliament_disjointUnionAndCorrect owlTree0 sopnil sopnil) `shouldBe` []
        torids (superOwlParliament_disjointUnionAndCorrect owlTree0 sopnil sop1) `shouldBe` [1]
        torids (superOwlParliament_disjointUnionAndCorrect owlTree0 sop1 sop1) `shouldBe` []
        torids (superOwlParliament_disjointUnionAndCorrect owlTree0 sop2 sop3) `shouldBe` [2,3]
        torids (superOwlParliament_disjointUnionAndCorrect owlTree0 sop1 sop2) `shouldBe` [3,4,5]
        torids (superOwlParliament_disjointUnionAndCorrect owlTree0 sop1 sop2) `shouldBe` [3,4,5]
        torids (superOwlParliament_disjointUnionAndCorrect owlTree0 sop1 sop28) `shouldBe` [3,4,5,8]
        torids (superOwlParliament_disjointUnionAndCorrect owlTree0 sop0 sop28) `shouldBe` [3,4,5,9]
        torids (superOwlParliament_disjointUnionAndCorrect owlTree0 sop7 sop8) `shouldBe` [9]
        torids (superOwlParliament_disjointUnionAndCorrect owlTree0 sop7 sop9) `shouldBe` [8]
        torids (superOwlParliament_disjointUnionAndCorrect owlTree0 sop89 sop7) `shouldBe` [7]
        torids (superOwlParliament_disjointUnionAndCorrect owlTree0 sop28 sop0) `shouldBe` [0]
      it "owlParliament_convertToMiniOwltree" $ do
        let
          mot = owlParliament_convertToMiniOwltree owlTree0 (OwlParliament (_owlTree_topOwls owlTree0))
        --putTextLn (potatoShow mot)
        -- also tests owlTree_equivalent :D
        owlTree_equivalent mot owlTree0 `shouldBe` True
        owlTree_equivalent owlTree0 mot `shouldBe` True