module Main where
import Control.Applicative
import Control.Monad.Except
import Data.Either
import Data.HashMap.Strict (fromList,union)
import Data.HashMap.Strict (lookupDefault, lookup)
import Debug.Trace
import Prelude hiding (lookup)
import qualified Data.Aeson as A
import qualified Data.Binary as B
import qualified Data.HashMap.Strict as HM
import qualified Data.Serialize as S
import Test.Tasty.HUnit
import Test.Tasty.QuickCheck
import Test.Tasty.TH
import Data.ByteString.Interned
import NLP.Scoring.Unigram
import NLP.Scoring.Unigram.Default
import NLP.Scoring.Unigram.Import
-- | Test aeson conversion. We add random @(key,value)@ pairs in the form
-- of @xs@ to the default scoring. We also randomize the individual scoring
-- constants.
--
-- Testing is done by serialization followed by deserialization and testing
-- for equality.
prop_Aeson ( xs :: [((String,String),Double)]
, smm :: [(String,Double)]
, ( (gl :: Double, go :: Double, ge :: Double)
, (dm :: Double, di :: Double)
, (psl :: Double, pso :: Double, pse :: Double)
)
)
= Just def' == (either error id $ A.eitherDecode (A.encode def'))
where def = clvDefaults
xs' = fromList $ map (\((x,y),s) -> ((ibsFrom x, ibsFrom y),s)) xs
smm' = fromList $ map (\(x,s) -> (ibsFrom x, s)) smm
def' = def { usUnigramMatch = usUnigramMatch def `union` xs'
, usUnigramInsertFstK = usUnigramInsertFstK def `union` smm'
, usUnigramInsertSndL = usUnigramInsertSndL def `union` smm'
, usGapLinear = gl
, usGapOpen = go
, usGapExtension = ge
, usDefaultMatch = dm
, usDefaultMismatch = di
, usPrefixSuffixLinear = psl
, usPrefixSuffixOpen = pso
, usPrefixSuffixExtension = pse
}
-- Everything here should succeed
case_Import_uni01 = do
eu <- runExceptT $ fromFile False "./tests/uni01.score"
assertBool ("uni01 load should succeed but fails with\n" ++ (either errorToString show eu)) $ isRight eu
let Right u = eu
assertEqual "EqualScore Consonant 4 F~f" (Just 4) . lookup (ibsText "F", ibsText "f") $ usUnigramMatch u
assertEqual "GapLinear" (-4) $ usGapLinear u
-- Here we test that the parser should fail on wrong input
case_Import_uni02 = do
eu <- runExceptT $ fromFile False "./tests/uni02.score"
assertBool "uni02 load should fail" $ isLeft eu
main :: IO ()
main = $(defaultMainGenerator)