packages feed

nova-cache-0.2.2.0: test/CompressionTest.hs

module Main (main) where

import qualified Data.ByteString as BS
import qualified NovaCache.Compression as Compression
import System.Exit (exitFailure, exitSuccess)
import System.IO (hFlush, stdout)

-- | Run a named test, short-circuit on first failure.
test :: String -> IO Bool -> IO Bool
test name action = do
  putStr ("  " ++ name ++ "... ")
  hFlush stdout
  result <- action
  if result
    then do
      putStrLn "OK"
      pure True
    else do
      putStrLn "FAILED"
      pure False

-- | Assert equality.
assertEqual :: (Eq a, Show a) => String -> a -> a -> IO Bool
assertEqual label expected actual
  | expected == actual = pure True
  | otherwise = do
      putStrLn ""
      putStrLn ("    " ++ label)
      putStrLn ("    expected: " ++ show expected)
      putStrLn ("    actual:   " ++ show actual)
      pure False

-- | Assert a Bool is True.
assertTrue :: String -> Bool -> IO Bool
assertTrue _ True = pure True
assertTrue label False = do
  putStrLn ""
  putStrLn ("    " ++ label ++ ": expected True")
  pure False

main :: IO ()
main = do
  putStrLn "nova-cache compression tests"
  putStrLn "=============================="
  putStrLn ""
  putStrLn "Compression:"
  ok1 <-
    test "compress/decompress roundtrip" $
      let input = BS.pack [72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100]
          compressed = Compression.compressXz input
          decompressed = Compression.decompressXz compressed
       in assertEqual "roundtrip" input decompressed
  ok2 <-
    test "compress/decompress roundtrip (empty)" $
      let compressed = Compression.compressXz BS.empty
          decompressed = Compression.decompressXz compressed
       in assertEqual "roundtrip empty" BS.empty decompressed
  ok3 <-
    test "compressed is smaller for repetitive data" $
      let input = BS.replicate 10000 0x42
          compressed = Compression.compressXz input
       in assertTrue "smaller" (BS.length compressed < BS.length input)
  putStrLn ""
  if ok1 && ok2 && ok3
    then putStrLn "All compression tests passed." >> exitSuccess
    else putStrLn "Some compression tests failed." >> exitFailure