{-|
Module : Spec
Description : The MetaHS EDSL
Copyright : Copyright (C) 2017-2019 S. Kamps
License : -- This file is distributed under the terms of the Apache License 2.0.
For more information, see the file "LICENSE", which is included in the distribution.
Stability : experimental
-}
module Spec where
import Test.HUnit
import MetaHS.DataModel.MetaModel
import MetaHS.EDSL.MetaModel
import MetaHS.Extensions.MacroLevelAggregation.Average
import MetaHS.Extensions.MacroLevelAggregation.Median
import MetaHS.Extensions.MacroLevelAggregation.GiniCoefficient
import MetaHS.Extensions.MacroLevelAggregation.IdealValueDeviation
import MetaHS.Extensions.MacroLevelAggregation.Distribution
import qualified Data.Set as Set
import qualified Data.Map.Strict as Map
-- | Creates a dummy metamodel for one kind of key with Int values. E.g., LCOM
createTestMm :: [Int] -- ^ List with Int values which shall be used for the Element value.
-> RelationKey -- ^ Relation key to be simulated.
-> MetaModel -- ^ Dummy metamodel to run function under test on.
createTestMm xs key = MetaModel msr
where msr = Map.insert key rel Map.empty
rel = Set.fromList ls
ls = zip [createMod k | k <- [1 .. length xs]] [createVal v | v <- xs]
createMod k = Module {name = "mod" ++ show k}
createVal v = IntValue {intValue = v}
-- AVERAGE
testAverage0 = TestCase $ assertEqual "Average_0 [0] == 0" 0 (average "LCOM" $ createTestMm [0] "LCOM")
testAverageRatio = TestCase $ assertEqual "Average_Ratio [1,2] == 1,5" 1.5 (average "LCOM" $ createTestMm [1,2] "LCOM")
testAverageNeg = TestCase $ assertEqual "Average_Neg [-2,1] == -0.5" (-0.5) (average "LCOM" $ createTestMm [-2,1] "LCOM")
testAverageOutlier = TestCase $ assertEqual "Average_Outlier [10,10,10,10,60,60,60,60,60,60,260] == 60" 60 (average "LCOM"
$ createTestMm [10,10,10,10,60,60,60,60,60,60,261] "LCOM")
-- MEDIAN
testMedianEven = TestCase $ assertEqual "Median_Even [2,2] == 2" 2 (median "LCOM" $ createTestMm [2,2] "LCOM")
testMedianOdd = TestCase $ assertEqual "Median_Odd [2,2,2] == 2" 2 (median "LCOM" $ createTestMm [2,2,2] "LCOM")
testMedian0 = TestCase $ assertEqual "Median_0 [0] == 0" 0 (median "LCOM" $ createTestMm [0] "LCOM")
testMedianRatio = TestCase $ assertEqual "Median_Ratio [1,2] == 1,5" 1.5 (median "LCOM" $ createTestMm [1,2] "LCOM")
testMedianNeg = TestCase $ assertEqual "Median_Neg [-2,1] == -0.5" (-0.5) (median "LCOM" $ createTestMm [-2,1] "LCOM")
testMedianOutlier = TestCase $ assertEqual "Median_Outlier [10,10,10,10,60,60,60,60,60,60,260] == 60" 60 (median "LCOM"
$ createTestMm [10,10,10,10,60,60,60,60,60,60,260] "LCOM")
-- GINI
testGini0 = TestCase $ assertEqual "Gini_0 [0] == 0" 0 (giniCoefficient "LCOM" $ createTestMm [0] "LCOM")
testGiniEq = TestCase $ assertEqual "Gini_0 [1,1] == 0" 0 (giniCoefficient "LCOM" $ createTestMm [1,1] "LCOM")
testGiniHalf = TestCase $ assertEqual "Gini_0 [0,0,1,1] == 0.5" 0.5 (giniCoefficient "LCOM" $ createTestMm [0,0,1,1] "LCOM")
testGiniThreeQuart = TestCase $ assertEqual "Gini_0 [0,0,0,1] == 0.75" 0.75 (giniCoefficient "LCOM" $ createTestMm [0,0,0,1] "LCOM")
testGiniOneQuart = TestCase $ assertEqual "Gini_0 [0,1,1,1] == 0.25" 0.25 (giniCoefficient "LCOM" $ createTestMm [0,1,1,1] "LCOM")
testGiniToNeq = TestCase $ assertEqual "Gini_0 [0,0,0,0,1] == 0.8" 0.8 (giniCoefficient "LCOM" $ createTestMm [0,0,0,0,1] "LCOM")
testGiniAproxNeq = TestCase $ assertEqual "Gini_0 [0,0,0,0,0,0,0,0,0,1] == 0.9" 0.9 (giniCoefficient "LCOM" $
createTestMm [0,0,0,0,0,0,0,0,0,1] "LCOM")
-- IVD lower-bound on 4, ideal value on 10, upper-bound on 20
testIvdIdeal = TestCase $ assertEqual "Ivd_Ideal [5,10,15] == 1" 1 (idealValueDeviation "LCOM"
(createTestMm [5,10,15] "LCOM") 4 10 20)
testIvdLowerBound = TestCase $ assertEqual "Ivd_LowerBound [2,6] == 0" 0 (idealValueDeviation "LCOM"
(createTestMm [2,6] "LCOM") 4 10 20)
testIvdUpperBound = TestCase $ assertEqual "Ivd_UpperBound [10,30] == 0" 0 (idealValueDeviation "LCOM"
(createTestMm [10,30] "LCOM") 4 10 20)
testIvdTooLow = TestCase $ assertEqual "Ivd_TooLow [1,2,3] == 0" 0 (idealValueDeviation "LCOM"
(createTestMm [1,2,3] "LCOM") 4 10 20)
testIvdTooHigh = TestCase $ assertEqual "Ivd_TooHigh [21,22,23] == 0" 0 (idealValueDeviation "LCOM"
(createTestMm [21,22,23] "LCOM") 4 10 20)
testIvdLowIdeal = TestCase $ assertEqual "Ivd_LowIdeal [5,4,10,9] == 0.5" 0.5 (idealValueDeviation "LCOM"
(createTestMm [5,4,10,9] "LCOM") 4 10 20)
testIvdIdealHigh = TestCase $ assertEqual "Ivd_IdealHigh [6,11,19,25] == 0.5" 0.5 (idealValueDeviation "LCOM"
(createTestMm [6,11,19,25] "LCOM") 4 10 20)
-- DISTRIBUTION
testDist = TestCase $ assertEqual "Dist [1,2,2,3,3,3] == [(1,1),(2,2),(3,3)]"
(Set.fromList([(1,1),(2,2),(3,3)])) (distribution "LCOM" $
createTestMm [1,2,2,3,3,3] "LCOM")
testlist = TestList [ TestLabel "testAverage_0" testAverage0,
TestLabel "testAverage_ratio" testAverageRatio,
TestLabel "testAverage_neg" testAverageNeg,
TestLabel "testAverage_outlier" testAverageOutlier,
TestLabel "testMedian_0" testMedianEven,
TestLabel "testMedian_1" testMedianOdd,
TestLabel "testMedian_0" testMedian0,
TestLabel "testMedian_ratio" testMedianRatio,
TestLabel "testMedian_neg" testMedianNeg,
TestLabel "testMedian_outlier" testMedianOutlier,
TestLabel "testGini0" testGini0,
TestLabel "testGiniEq" testGiniEq,
TestLabel "testGiniHalf" testGiniHalf,
TestLabel "testGiniThreeQuart" testGiniThreeQuart,
TestLabel "testGiniOneQuart" testGiniOneQuart,
TestLabel "testGiniP5divP4" testGiniToNeq,
TestLabel "testGiniP5divP4"testGiniAproxNeq,
TestLabel "testIvdIdeal" testIvdIdeal,
TestLabel "testIvdLowerBound" testIvdLowerBound,
TestLabel "testIvdUpperBound" testIvdUpperBound,
TestLabel "testIvdTooLow" testIvdTooLow,
TestLabel "testIvdTooHigh" testIvdTooHigh,
TestLabel "testIvdLowIdeal" testIvdLowIdeal,
TestLabel "testIvdIdealHigh"testIvdIdealHigh,
TestLabel "testDist"testDist
]
main :: IO ()
main = do
runTestTT testlist
return ()