content: {-# LANGUAGE TemplateHaskell, OverloadedStrings, TupleSections #-}
  module Tests.Vector
      ( tgroup_Vector
      ) where
  
  import Test.Tasty.TH
  import Test.Tasty.HUnit
  import Test.Tasty.QuickCheck
  import qualified Data.Vector as V
  import System.IO.Unsafe (unsafePerformIO)
  
  import Utils.Vector
  
  tgroup_Vector = $(testGroupGenerator)
  
  -- Pure Validation
  
  case_binarySearch1 = binarySearch (V.fromList [1,2,5]) ( 1 :: Int) @?= 0
  case_binarySearch2 = binarySearch (V.fromList [1,2,5]) ( 2 :: Int) @?= 1
  case_binarySearch3 = binarySearch (V.fromList [1,2,5]) ( 4 :: Int) @?= 2
  case_binarySearch4 = binarySearch (V.fromList [1,2,5]) ( 5 :: Int) @?= 2
  case_binarySearch5 = binarySearch (V.fromList [1,2,5]) ( 5 :: Int) @?= 2
  case_binarySearch6 = binarySearch (V.fromList [1,2,5]) (15 :: Int) @?= 3
  case_binarySearch7 = binarySearch (V.fromList [1,2,5]) (-1 :: Int) @?= 0
  
  isSorted :: [Int] -> Bool
  isSorted [] = True
  isSorted [_] = True
  isSorted (a:b:rs) = a <= b && isSorted (b:rs)
  
  sortList :: [Int] -> [Int]
  sortList vs = unsafePerformIO $ do
          v <- V.unsafeThaw (V.fromList vs)
          sortParallel 4 v
          V.toList <$> V.unsafeFreeze v
  
  newtype BigList = BigList [Int]
      deriving (Eq, Show)
  instance Arbitrary BigList where
      arbitrary = BigList <$> resize (1024*16) arbitrary
  
  prop_sortP (BigList vs) = isSorted (sortList vs)
  
  case_pivot_extreme = assertBool "sort list pivot" (isSorted . sortList $ [10] ++ [0 | _ <- [0 :: Int ..10000]] ++ [1 :: Int])
  
  