content: module Test.Language.Spectacle.Interaction.Paths
    ( tests,
    )
  where
  
  import Data.Foldable (find, for_)
  import Lens.Micro.Extras (view)
  
  import Hedgehog (Property, evalMaybe, forAll, property)
  import Test.Tasty (TestTree, testGroup)
  import Test.Tasty.Hedgehog (testProperty)
  
  import Data.World (World (World))
  import Language.Spectacle.Interaction.Paths as Paths (toPointSet)
  import Language.Spectacle.Interaction.Point (label)
  
  import qualified Test.Gen as Gen
  
  -- ---------------------------------------------------------------------------------------------------------------------
  
  tests :: TestTree
  tests =
    testGroup
      "Paths"
      [ testProperty "Paths.toPointSet is nondestructive" flattenNondestruct
      ]
  
  -- | Paths.flatten does not destroy or add information.
  flattenNondestruct :: Property
  flattenNondestruct = property do
    -- tree size is adjusted by hedgehog's size parameter.
    tree <- forAll (Gen.tree Gen.emptyWorld)
    let set = Paths.toPointSet tree
  
    for_ tree \(World hash _) ->
      evalMaybe $ find (look hash) set
    where
      -- ensure membership for each element of the original tree and the flattened as 'Paths' by it's hash.
      look hash1 world = hash1 == view label world
  