1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
|
module Yi.CompletionTreeTests (testSuite) where
import Test.Tasty.HUnit
import Test.Tasty.QuickCheck
import Test.Tasty
import Yi.CompletionTree as CT
import qualified Data.Map as M
import Data.List (sort,nub)
testSuite :: TestTree
testSuite = testGroup "CompletionTree" [propertyTests, unitTests]
propertyTests :: TestTree
propertyTests = testGroup "properties"
[ testProperty "CT.toList . CT.fromList == nub . sort" $
\list -> CT.toList (CT.fromList list) == sort (nub (list :: [String]))
, testProperty "update (fromList [a]) a == fromList [mempty] (a is a non-empty string)" $
\string -> null string || CT.update (CT.fromList [string :: String]) string == CT.fromList [mempty]
, testProperty "\"\" `elem` update (fromList [a,...]) a" $
\listOfStrings -> null listOfStrings || null (head listOfStrings) || "" `elem` CT.toList (CT.update (CT.fromList listOfStrings) (head listOfStrings))
, testProperty "complete (fromList [a]) == (a, fromList [\"\"])" $
\string -> CT.complete (CT.fromList [string]) == (string,CT.fromList [""])
]
unitTests :: TestTree
unitTests = testGroup "unit tests"
[ testGroup "fromList"
[ testCase "returns an empty CompletionTree when given an empty list" $
CT.fromList [] @?= (mempty :: CT.CompletionTree String)
, testCase "returns a map with one key when given a list with one item" $
CT.fromList ["a"] @?= CT.CompletionTree (M.fromList [("a",mempty)])
, testCase "groups elements with the same prefix" $
CT.fromList ["aa","ab"] @?= CT.CompletionTree (M.fromList [("a",CT.CompletionTree $ M.fromList [("a",mempty),("b",mempty)])])
]
, testGroup "update"
-- toList is covered by the SmallCheck and QuickCheck
[ testCase "strips its argument from a matching key" $
CT.update (CT.fromList ["abc"]) "a" @?= CT.fromList ["bc"]
, testCase "descends the tree if a substring of its input is found in the CompletionTree" $
CT.update (CT.fromList ["put","putStr"]) "putS" @?= CT.fromList ["tr"]
, testCase "returns an empty list if it can't find a matching key" $
CT.update (CT.fromList ["put"]) "list" @?= CT.fromList []
]
, testGroup "complete"
[ testCase "Returns the common prefix" $
CT.complete (CT.fromList ["put","putStr","putStrLn"]) @?= ("put",CT.fromList ["","Str","StrLn"])
, testCase "Returns an empty string if there's no common prefix" $
CT.complete (CT.fromList ["put","putStr","abc"]) @?= ("",CT.fromList ["put","putStr","abc"])
]
]
|