packages feed

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

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

import Test.HUnit      ( (@=?), Assertion )
import Test.Framework ( testGroup, Test )
import Test.Framework.Providers.HUnit (testCase)
import Test.QuickCheck.Instances ()
import Test.Framework.Providers.QuickCheck2 (testProperty)

import Data.Map (Map)
import qualified Data.Map as Map
import Data.Text (Text)

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")]) (Just mamalTagger)

mamalTagger :: POSTagger
mamalTagger = LT.mkTagger (Map.fromList [("cat", Tag "NN"), ("dog", Tag "NN")]) 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)