module UnitTests.Distribution.Client.Dependency.Modular.PSQ (
  tests
  ) where

import Distribution.Client.Dependency.Modular.PSQ

import Test.Framework                  as TF (Test)
import Test.Framework.Providers.HUnit  (testCase)
import Test.HUnit                      (Assertion, assertEqual)

tests :: [TF.Test]
tests = [ testCase "splitsAltImplementation" splitsTest
        ]

-- | Original splits implementation
splits' :: PSQ k a -> PSQ k (a, PSQ k a)
splits' xs =
  casePSQ xs
    (PSQ [])
    (\ k v ys -> cons k (v, ys) (fmap (\ (w, zs) -> (w, cons k v zs)) (splits' ys)))

splitsTest :: Assertion
splitsTest = do
  assertEqual "" (splits' psq1) (splits psq1)
  assertEqual "" (splits' psq2) (splits psq2)
  assertEqual "" (splits' psq3) (splits psq3)
  where
    psq1 = PSQ [ (1,2), (3,4), (5,6), (7,8) ] :: PSQ Int Int
    psq2 = PSQ [ (1,2) ] :: PSQ Int Int
    psq3 = PSQ [] :: PSQ Int Int