packages feed

apply-merge-0.1.0.0: test/Test/Data/PQueue/Prio/Min/Mutable.hs

-- SPDX-FileCopyrightText: Copyright Preetham Gujjula
-- SPDX-License-Identifier: BSD-3-Clause

module Test.Data.PQueue.Prio.Min.Mutable (tests) where

import Control.Monad (forM_, replicateM)
import Control.Monad.ST (runST)
import Data.List (sort)
import Data.Maybe (catMaybes)
import Data.PQueue.Prio.Min.Mutable
import Test.Falsify.Generator (int, list)
import Test.Falsify.Predicate (eq, (.$))
import Test.Falsify.Property (Property, assert, gen, info)
import Test.Falsify.Range (between)
import Test.Tasty (TestTree, testGroup)
import Test.Tasty.Falsify (testProperty)

tests :: TestTree
tests =
  testGroup
    "Data.PQueue.Prio.Min.Mutable"
    [ testProperty "priority queue sorts a list" prop_sorts_list
    ]

prop_sorts_list :: Property ()
prop_sorts_list = do
  xs <- gen $ list (between (1, 20)) (int (between (0, 100)))
  info ("xs == " ++ show xs)
  let actual = pqueueSort xs
  let expected = sort xs
  assert (eq .$ ("expected", expected) .$ ("actual", actual))

pqueueSort :: (Ord a) => [a] -> [a]
pqueueSort xs = runST $ do
  queue <- empty
  forM_ xs $ \x -> insert x () queue
  map fst . catMaybes <$> replicateM (length xs) (deleteMin queue)