packages feed

freq-0.1.0.0: test/Main.hs

{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE OverloadedStrings #-}

module Main (main) where

import Control.Monad (forever)
import Data.ByteString (ByteString)
import Data.Char (ord)
import Data.Word (Word8)
import Freq
import Hedgehog
import qualified Data.ByteString as B
import qualified Hedgehog.Gen as Gen
import qualified Hedgehog.Range as Range
import qualified Data.List as List

main :: IO Bool
main = do
  !freak <- trainWithMany trainTexts
  let !freakTable = tabulate freak
  Prelude.putStrLn "done loading frequencies"
  Prelude.putStrLn "now testing with Hedgehog"
  checkParallel $ Group "Freak Equality"
    [ ("Freak Equality", prop_Equal freak freakTable)
    ]

trainTexts :: [FilePath]
trainTexts
  = fmap (\x -> "txtdocs/" ++ x ++ ".txt")
      [ "2000010"
      , "2city10"
      , "80day10"
      , "alcott-little-261"
      , "byron-don-315"
      , "carol10"
      , "center_earth"
      , "defoe-robinson-103"
      , "dracula"
      , "freck10"
      , "invisman"
      , "kipling-jungle-148"
      , "lesms10"
      , "london-call-203"
      , "london-sea-206"
      , "longfellow-paul-210"
      , "madambov"
      , "monroe-d"
      , "moon10"
      , "ozland10"
      , "plgrm10"
      , "sawy210"
      , "speckldb"
      , "swift-modest-171"
      , "time_machine"
      , "top-1m" 
      , "war_peace"
      , "white_fang"
      , "zenda10"
      ]

sizedByteString :: Range.Size -> Gen ByteString
sizedByteString (Range.Size n) = do
  m <- Gen.enum 0 n
  fmap B.pack $ Gen.list (Range.constant 0 m) (randWord8)
    where
      randWord8 :: Gen Word8
      randWord8 = Gen.word8 Range.constantBounded

prop_Equal :: FreqTrain -> Freq -> Property
prop_Equal f ft =
  property $ do
    b <- forAll $ Gen.sized sizedByteString 
    measure f b === measure ft b