packages feed

symbolize-0.1.0.2: test/suite/SymbolizeTest.hs

module SymbolizeTest where

-- import qualified System.Mem

import qualified Control.Concurrent.Async
import Control.Monad.IO.Class (liftIO)
import qualified Data.Hashable
import Data.Text (Text)
import Hedgehog
import qualified Hedgehog.Gen as Gen
import qualified Hedgehog.Range as Range
import qualified Symbolize
import qualified System.Mem
import Test.Tasty.HUnit

hprop_symbolTableIsIdempotent :: Property
hprop_symbolTableIsIdempotent = withTests 1000 $ property $ do
  texts <- forAll $ Gen.list (Range.linear 0 200) (Gen.text (Range.linear 0 20) Gen.unicode)
  let !symbols = fmap Symbolize.intern texts
  annotateShow (fmap Data.Hashable.hash symbols)
  let !texts2 = fmap Symbolize.unintern symbols

  texts2 === texts

hprop_concurrentAccessDoesNotCorruptTable :: Property
hprop_concurrentAccessDoesNotCorruptTable = withTests 500 $ property $ do
  let numCores = 8
  texts <- forAll $ Gen.list (Range.linear 0 200) (Gen.text (Range.linear 0 20) Gen.unicode)
  results <- liftIO $ Control.Concurrent.Async.forConcurrently [(1 :: Integer) .. numCores] $ \_ -> do
    let !texts2 = fmap (\val -> Symbolize.unintern $! Symbolize.intern $! val) texts
    pure texts2

  mapM_ (=== texts) results