packages feed

data-forest-0.1.0.12: test/Main.hs

module Main (main) where

import Control.Applicative ((<$>))
import Control.Monad (Functor (fmap))
import Data.Char (Char, toUpper)
import Data.Foldable (Foldable (toList))
import Data.Forest
  ( Forest (..),
    Tree (..),
    foldForest,
    foldTree,
    forest,
    leaf,
    leaves,
    tree,
  )
import Data.Function (($), (&), (.))
import Data.List (intercalate)
import Data.Semigroup (Semigroup ((<>)))
import System.IO (IO)
import Test.Hspec (hspec, shouldBe, specify)

main :: IO ()
main = hspec do
  specify "" do
    let example :: Forest Char
        example =
          forest
            [ tree 'a' $ leaves "bc",
              tree 'd' $
                forest
                  [ leaf 'e',
                    tree 'f' $ leaves "g"
                  ]
            ]
    shouldBe
      (example & foldForest (intercalate ", " . fmap (\(a, b) -> [a] <> " [" <> b <> "]")))
      "a [b [], c []], d [e [], f [g []]]"

  specify "" do
    let example :: Tree Char
        example =
          tree 'a' $
            forest
              [ tree 'b' $ leaves "cd",
                tree 'e' $
                  forest
                    [ leaf 'f',
                      tree 'g' $ leaves "h"
                    ]
              ]
    shouldBe
      (example & foldTree \a bs -> [a] <> " [" <> intercalate ", " bs <> "]")
      "a [b [c [], d []], e [f [], g [h []]]]"

  specify "" do
    let example :: Forest Char
        example =
          forest
            [ tree 'a' $ leaves "bc",
              tree 'd' $
                forest
                  [ leaf 'e',
                    tree 'f' $ leaves "g"
                  ]
            ]
        showCharForest f = intercalate ", " (showCharTree <$> trees f)
          where
            showCharTree t = case trees (subforest t) of
              [] -> [root t]
              [t'] -> [root t] <> ": " <> showCharTree t'
              _ -> [root t] <> ": (" <> showCharForest (subforest t) <> ")"
    shouldBe (example & showCharForest) "a: (b, c), d: (e, f: g)"
    shouldBe (example & fmap toUpper & showCharForest) "A: (B, C), D: (E, F: G)"

  specify "" do
    let example :: Forest Char
        example =
          forest
            [ tree 'a' $ leaves "bc",
              tree 'd' $
                forest
                  [ leaf 'e',
                    tree 'f' $ leaves "g"
                  ]
            ]
    shouldBe (example & toList) "abcdefg"