hscuid-1.1.0: test/Test.hs
module Main where
import Control.Monad (foldM, when)
import Data.Set (empty, insert, size)
import System.Exit (ExitCode(..), exitWith)
import Web.Cuid (Cuid, newCuid, newSlug)
main :: IO ()
main = do
nCuid <- runCollisionTest newCuid 1200000
nSlug <- runCollisionTest newSlug 1200000
case (nCuid, nSlug) of
(0, 0) -> exitWith ExitSuccess
_otherwise -> do
when (nCuid /= 0) $ print ("cuid collisions: " ++ show nCuid)
when (nSlug /= 0) $ print ("slug collisions: " ++ show nSlug)
exitWith (ExitFailure 1)
runCollisionTest :: IO Cuid -> Int -> IO Int
runCollisionTest action numberOfCuids = do
let accumulate set _i = do
cuid <- action
return $! insert cuid set
-- Generate a set containing a bunch of generated CUIDs.
set <- foldM accumulate empty [0 .. numberOfCuids - 1]
-- If every element was unique, the set will have the same size as the input.
return (numberOfCuids - size set)