content: module Tests.Extra.Tree where
  
  import AtCoder.Extra.Graph qualified as Gr
  import AtCoder.Extra.Tree qualified as Tree
  import Data.Bit (Bit (..))
  import Data.Ord (Down (..), comparing)
  import Data.Semigroup (Sum (..))
  import Data.Vector.Unboxed qualified as VU
  import Test.Tasty
  import Test.Tasty.HUnit
  
  unit_one :: TestTree
  unit_one = testCase "one" $ do
    let n = 1
    let !t = Gr.build @Int n VU.empty
    Tree.diameter n (Gr.adjW t) (-1) @?= ((0, 0), 0)
    Tree.diameterPath 1 (Gr.adjW t) (-1) @?= (VU.singleton 0, 0)
    Tree.mst n (VU.singleton (0, 0, 100)) @?= (0, VU.singleton (Bit False), t)
    Tree.mstBy (comparing Down) 1 (VU.singleton (0, 0, 100)) @?= (0, VU.singleton (Bit False), t)
    Tree.fold (Gr.adjW t) (const (Sum (10 :: Int))) (\(Sum a) (!_, !dw) -> Sum (a + dw)) (<>) 0 @?= 10
    Tree.scan n (Gr.adjW t) (const (Sum (10 :: Int))) (\(Sum a) (!_, !dw) -> Sum (a + dw)) (<>) 0 @?= VU.singleton 10
    Tree.foldReroot n (Gr.adjW t) (const (Sum (10 :: Int))) (\(Sum a) (!_, !dw) -> Sum (a + dw)) (<>) @?= VU.singleton 10
  
  tests :: [TestTree]
  tests =
    [ unit_one
    ]
  