packages feed

streamly-0.10.0: test/Streamly/Test/Data/Ring/Unboxed.hs

-- |
-- Module      : Streamly.Test.Data.Ring.Unboxed
-- Copyright   : (c) 2022 Composewell Technologies
-- License     : BSD-3-Clause
-- Maintainer  : streamly@composewell.com
-- Stability   : experimental
-- Portability : GHC

module Streamly.Test.Data.Ring.Unboxed (main) where

import Control.Monad (void)

import qualified Streamly.Internal.Data.Array as Array
import qualified Streamly.Internal.Data.Ring as Ring

import Prelude as P
import qualified Data.Foldable as P

import Test.Hspec as H

unsafeEqArrayN :: [Int] -> [Int] -> Int -> Int -> Bool -> IO ()
unsafeEqArrayN lstArr lstRing startR nelem expected = do
    let arr = Array.fromList lstArr
    (ring, rh) <- Ring.new (length lstRing)
    void $ P.foldlM (Ring.unsafeInsert ring) rh lstRing
    Ring.unsafeEqArrayN ring (Ring.moveBy startR ring rh) arr nelem
        `shouldBe` expected

unsafeEqArray :: [Int] -> [Int] -> Int -> Bool -> IO ()
unsafeEqArray lstArr lstRing startR expected = do
    let arr = Array.fromList lstArr
    (ring, rh) <- Ring.new (length lstRing)
    void $ P.foldlM (Ring.unsafeInsert ring) rh lstRing
    Ring.unsafeEqArray ring (Ring.moveBy startR ring rh) arr
        `shouldBe` expected

moduleName :: String
moduleName = "Data.Ring.Unboxed"

main :: IO ()
main = hspec $ do
    describe moduleName $ do
        describe "Eq" $ do
            let lstArr = [0..99]
                lstRing = [50..99] ++ [0..49]
            it "unsafeEqArrayN True (n < len)"
                   $ unsafeEqArrayN lstArr lstRing 50 75 True
            it "unsafeEqArrayN True (n > len)"
                   $ unsafeEqArrayN lstArr lstRing 50 200 True
            it "unsafeEqArrayN False"
                   $ unsafeEqArrayN lstArr lstRing 10 75 False
            it "unsafeEqArray True" $ unsafeEqArray lstArr lstRing 50 True
            it "unsafeEqArray False" $ unsafeEqArray lstArr lstRing 20 False