hjugement-2.0.1.20190208: test/HUnit/Value.hs
{-# LANGUAGE OverloadedLists #-}
module HUnit.Value where
import Data.Function (($))
import Data.Int (Int)
import Data.Hashable (Hashable)
import Data.Eq (Eq(..))
import Data.Functor ((<$>))
import Data.Ord (Ord(..), Ordering(..))
import Data.Ratio ((%))
import Text.Show (Show(..))
import qualified Data.HashMap.Strict as HM
import Test.Tasty
import Test.Tasty.HUnit
import Majority.Judgment
import HUnit.Merit
import HUnit.Utils
import Types
hunit :: TestTree
hunit = testGroup "Value"
[ testGroup "MajorityValue"
[ testCompareValue
(majorityValue $ Merit [(3,15), (2,7), (1,3), (0::Int,2)])
(majorityValue $ Merit [(3,16), (2,6), (1,2), (0,3)])
]
, testGroup "MajorityRanking"
[ testMajorityValueOfOpinions
[ (The, [No,No,No,No,Yes,Yes]) ]
[ (The, [ Middle (1 % 1) No No
, Middle (2 % 1) No Yes
]) ]
, testMajorityValueOfOpinions
[ (The, [No,No,No,Yes,Yes,Yes]) ]
[ (The, [ Middle (3 % 1) No Yes ]) ]
, testMajorityValueOfOpinions
[ (The, [No,No,No,No,Yes,Yes,Yes]) ]
[ (The, [ Middle (1 % 2) No No
, Middle (3 % 1) No Yes ]) ]
, testMajorityValueOfOpinions
[ (This, [No,No,No,No,Yes,Yes])
, (That, [No,Yes,Yes,Yes,Yes,Yes])
]
[ (This, [ Middle (1 % 1) No No
, Middle (2 % 1) No Yes
])
, (That, [ Middle (2 % 1) Yes Yes
, Middle (1 % 1) No Yes
])
]
, testMajorityValueOfOpinions
[ (This, [No,No,No,No,No,No])
, (That, [No,No,No,Yes,Yes,Yes])
]
[ (This, [Middle (3 % 1) No No])
, (That, [Middle (3 % 1) No Yes])
]
, testMajorityValueOfOpinions
[ (This, [Yes,Yes,Yes,Yes,Yes,Yes])
, (That, [No,No,No,Yes,Yes,Yes])
]
[ (This, [Middle (3 % 1) Yes Yes])
, (That, [Middle (3 % 1) No Yes])
]
, testMajorityValueOfOpinions
[ (This, [No,No,Yes,Yes,Yes,Yes])
, (That, [No,No,No,Yes,Yes,Yes])
]
[ (This, [ Middle (1 % 1) Yes Yes
, Middle (2 % 1) No Yes
])
, (That, [ Middle (3 % 1) No Yes ])
]
, testMajorityValueOfOpinions
[ (1::Int, [Perfect,Perfect,VeryGood,Perfect,Perfect,Perfect])
, (2, [Perfect,VeryGood,VeryGood,VeryGood,Good,VeryGood])
, (3, [Acceptable,Perfect,Good,VeryGood,VeryGood,Perfect])
, (4, [VeryGood,Good,Acceptable,Good,Good,Good])
, (5, [Good,Acceptable,VeryGood,Good,Good,Good])
, (6, [VeryGood,Acceptable,Insufficient,Acceptable,Acceptable,Good])
]
[ (1, [ Middle (2 % 1) Perfect Perfect
, Middle (1 % 1) VeryGood Perfect
])
, (2, [ Middle (2 % 1) VeryGood VeryGood
, Middle (1 % 1) Good Perfect
])
, (3, [ Middle (1 % 1) VeryGood VeryGood
, Middle (1 % 1) Good Perfect
, Middle (1 % 1) Acceptable Perfect
])
, (4, [ Middle (2 % 1) Good Good
, Middle (1 % 1) Acceptable VeryGood
])
, (5, [ Middle (2 % 1) Good Good
, Middle (1 % 1) Acceptable VeryGood
])
, (6, [ Middle (1 % 1) Acceptable Acceptable
, Middle (1 % 1) Acceptable Good
, Middle (1 % 1) Insufficient VeryGood
])
]
]
]
testCompareValue ::
(Ord grade, Show grade) =>
MajorityValue grade -> MajorityValue grade -> TestTree
testCompareValue x y =
testGroup (elide $ show (unMajorityValue x, unMajorityValue y))
[ testCase "x == x" $ x`compare`x @?= EQ
, testCase "y == y" $ y`compare`y @?= EQ
, testCase "x < y" $ x`compare`y @?= LT
, testCase "y > x" $ y`compare`x @?= GT
]
testMajorityRanking ::
(Eq choice, Hashable choice, Ord grade, Show grade, Show choice) =>
[(choice, [grade])] ->
MajorityRanking choice grade -> TestTree
testMajorityRanking os expect =
testCase (elide $ show os) $
majorityRanking (mkMeritByChoice os) @?= expect
testMajorityValueOfOpinions ::
(Show grade, Show choice, Ord grade, Eq choice, Hashable choice) =>
[(choice, [grade])] ->
[(choice, [Middle grade])] -> TestTree
testMajorityValueOfOpinions os expect =
testCase (elide $ show os) $
majorityValueByChoice (mkMeritByChoice os)
@?= (MajorityValue<$>HM.fromList expect)