packages feed

chatter-0.2.0.0: tests/src/NLP/POSTests.hs

{-# LANGUAGE OverloadedStrings #-}
module NLP.POSTests where

import Test.Framework ( testGroup, Test )
import Test.QuickCheck.Instances ()
import Test.Framework.Providers.QuickCheck2 (testProperty)

import qualified Data.Map as Map

import NLP.Types
import NLP.POS
import qualified NLP.POS.LiteralTagger as LT

import TestUtils

tests :: Test
tests = testGroup "NLP.POS"
        [ testGroup "Evaluation" $ map (genTestF $ eval mamalTagger)
             [ ("Half", [ [ ("the", Tag "DT"), ("cat", Tag "NN")]
                        , [ ("the", Tag "DT"), ("dog", Tag "NN")] ], 0.5)
             , ("All ", [ [ ("dog", Tag "NN"), ("cat", Tag "NN")] ], 1.0)
             , ("None", [ [ ("the", Tag "DT"), ("couch", Tag "NN")] ], 0)
             ]
        , testGroup "Serialization"
             [ testProperty "1 LiteralTagger" (prop_taggersRoundTrip mamalTagger)
             , testProperty "2 LiteralTaggers" (prop_taggersRoundTrip animalTagger)
             ]
        ]

animalTagger :: POSTagger
animalTagger = LT.mkTagger (Map.fromList [("owl", Tag "NN"), ("flea", Tag "NN")]) LT.Sensitive (Just mamalTagger)

mamalTagger :: POSTagger
mamalTagger = LT.mkTagger (Map.fromList [("cat", Tag "NN"), ("dog", Tag "NN")]) LT.Sensitive Nothing

-- TODO need to make random taggers to really test this...
prop_taggersRoundTrip :: POSTagger -> String -> Bool
prop_taggersRoundTrip tgr input =
  let Right roundTripped = deserialize taggerTable $ serialize tgr
  in tagStr tgr ("cat owl " ++ input) == tagStr roundTripped ("cat owl " ++ input)