module Main where
import Test.Tasty
import Test.Tasty.HUnit
import Control.Monad.State
import Control.Applicative ((<$>))
import qualified Data.LinkedHashMap.Seq as LM1
import qualified Data.LinkedHashMap.IntMap as LM2
test0_1 = LM1.fromList [(1 :: Int,"A"), (5, "B"), (7, "C"), (-6, "C")]
test0_2 = LM2.fromList [(1 :: Int,"A"), (5, "B"), (7, "C"), (-6, "C")]
test1_1 = LM1.insert 3 "ZZ" test0_1
test1_2 = LM2.insert 3 "ZZ" test0_2
test2_1 = LM1.insert (-10) "AA" $ LM1.insert 3 "ZZ" test0_1
test2_2 = LM2.insert (-10) "AA" $ LM2.insert 3 "ZZ" test0_2
test3_1 = LM1.delete 5 $ LM1.insert (-10) "AA" $ LM1.insert 3 "ZZ" test0_1
test3_2 = LM2.delete 5 $ LM2.insert (-10) "AA" $ LM2.insert 3 "ZZ" test0_2
test4_1 = LM1.delete 3 $ LM1.delete 5 $ LM1.insert (-10) "AA" $ LM1.insert 3 "ZZ" test0_1
test4_2 = LM2.delete 3 $ LM2.delete 5 $ LM2.insert (-10) "AA" $ LM2.insert 3 "ZZ" test0_2
test5_1 = LM1.delete 3 $ LM1.insert 3 "AA" $ LM1.insert 3 "ZZ" test0_1
test5_2 = LM2.delete 3 $ LM2.insert 3 "AA" $ LM2.insert 3 "ZZ" test0_2
test6_1 = LM1.fromList [(1 :: Int,"A"), (5, "B"), (7, "C"), (-6, "D"), (1 :: Int,"AAAAA")]
test6_2 = LM2.fromList [(1 :: Int,"A"), (5, "B"), (7, "C"), (-6, "D"), (1 :: Int,"AAAAA")]
test7_1 = LM1.fromList [(1 :: Int,"A"), (5, "B"), (7, "C"), (-6, "D"), (1,"AA"), (5,"BB"), (7,"CC"),(7,"CCC")]
test7_2 = LM2.fromList [(1 :: Int,"A"), (5, "B"), (7, "C"), (-6, "D"), (1,"AA"), (5,"BB"), (7,"CC"),(7,"CCC")]
test8_1 = LM1.fromList [(1 :: Int,"A"), (1, "B"), (1, "C"), (1, "D")]
test8_2 = LM2.fromList [(1 :: Int,"A"), (1, "B"), (1, "C"), (1, "D")]
test9_1 = LM1.fromList ([] :: [(Int, String)])
test9_2 = LM2.fromList ([] :: [(Int, String)])
test10_1 = LM1.insertWith (++) 5 "ZZZ_" test0_1
test10_2 = LM2.insertWith (++) 5 "ZZZ_" test0_2
test10_3 = LM1.insertWith (++) 11 "ZZZ_" test0_1
test10_4 = LM2.insertWith (++) 11 "ZZZ_" test0_2
test11_1 = LM1.adjust (\v0 -> v0 ++ "_adjusted") 5 test0_1
test11_2 = LM2.adjust (\v0 -> v0 ++ "_adjusted") 5 test0_2
test11_3 = LM1.adjust (\v0 -> v0 ++ "_adjusted") 123 test0_1
test11_4 = LM2.adjust (\v0 -> v0 ++ "_adjusted") 123 test0_2
t0_1 = LM1.fromList [(1 :: Int,"A"), (5, "B"), (7, "C"), (-6, "D")]
t1_1 = LM1.fromList [(2 :: Int,"2A"), (3, "2B"), (7, "2C"), (-6, "2D")]
t2_1 = LM1.fromList [(0 :: Int,"3A"), (5, "3B"), (17, "3C"), (-6, "3D")]
t0_2 = LM2.fromList [(1 :: Int,"A"), (5, "B"), (7, "C"), (-6, "D")]
t1_2 = LM2.fromList [(2 :: Int,"2A"), (3, "2B"), (7, "2C"), (-6, "2D")]
t2_2 = LM2.fromList [(0 :: Int,"3A"), (5, "3B"), (17, "3C"), (-6, "3D")]
test12_1 = LM1.union t0_1 t1_1
test12_2 = LM2.union t0_2 t1_2
test12_3 = LM1.union t1_1 t2_1
test12_4 = LM2.union t1_2 t2_2
test12_5 = LM1.unionWith (++) t0_1 t1_1
test12_6 = LM2.unionWith (++) t0_2 t1_2
test12_7 = LM1.unions [t0_1, t1_1, t2_1]
test12_8 = LM2.unions [t0_2, t1_2, t2_2]
joinPrev :: Int -> String -> State String String
joinPrev _ v = do
prev <- get
put v
return $ v ++ ":" ++ prev
test13_1 = m where (m, _) = runState (LM1.traverseWithKey joinPrev test0_1) "0"
test13_2 = m where (m, _) = runState (LM2.traverseWithKey joinPrev test0_2) "0"
test14_1 = LM1.difference test6_1 (LM1.delete 1 $ LM1.delete 7 $ test0_1)
test14_2 = LM2.difference test6_2 (LM2.delete 1 $ LM2.delete 7 $ test0_2)
test15_1 = LM1.intersection test6_1 (LM1.delete 1 $ LM1.delete 7 $ test0_1)
test15_2 = LM2.intersection test6_2 (LM2.delete 1 $ LM2.delete 7 $ test0_2)
test16_1 = LM1.intersectionWith (\v1 v2 -> v1 ++ v2) test6_1 (LM1.delete 1 $ LM1.delete 7 $ test0_1)
test16_2 = LM2.intersectionWith (\v1 v2 -> v1 ++ v2) test6_2 (LM2.delete 1 $ LM2.delete 7 $ test0_2)
test17_1 = LM1.foldr (++) "" test6_1
test17_2 = LM2.foldr (++) "" test6_2
test18_1 = LM1.foldl' (++) "" test6_1
test18_2 = LM2.foldl' (++) "" test6_2
test19_1 = LM1.foldlWithKey' (\a k v -> a ++ (show k) ++ "=" ++ v ++ ",") "" test6_1
test19_2 = LM2.foldlWithKey' (\a k v -> a ++ (show k) ++ "=" ++ v ++ ",") "" test6_2
test20_1 = LM1.foldrWithKey (\k v a -> a ++ (show k) ++ "=" ++ v ++ ",") "" test6_1
test20_2 = LM2.foldrWithKey (\k v a -> a ++ (show k) ++ "=" ++ v ++ ",") "" test6_2
test21_1 = LM1.filter (\v -> v == "B" || v == "C") test0_1
test21_2 = LM2.filter (\v -> v == "B" || v == "C") test0_2
test22_1 = LM1.filterWithKey (\k v -> v == "B" || k == -6) test0_1
test22_2 = LM2.filterWithKey (\k v -> v == "B" || k == -6) test0_2
test23_1 = LM1.fromListWith (\v1 v2 -> v2 ++ v1) [(1 :: Int,"A"), (5, "B"), (7, "C"), (-6, "D"), (1 :: Int,"ZZZ")]
test23_2 = LM2.fromListWith (\v1 v2 -> v2 ++ v1) [(1 :: Int,"A"), (5, "B"), (7, "C"), (-6, "D"), (1 :: Int,"ZZZ")]
test24_1 = LM1.insert 5 "D" test0_1
test24_2 = LM2.insert 5 "D" test0_2
unitTests :: TestTree
unitTests = testGroup "Unit tests"
[ testCase "test0" $ LM1.toList test0_1 @?= LM2.toList test0_2,
testCase "test1" $ LM1.toList test1_1 @?= LM2.toList test1_2,
testCase "test2" $ LM1.toList test2_1 @?= LM2.toList test2_2,
testCase "test3" $ LM1.toList test3_1 @?= LM2.toList test3_2,
testCase "test4" $ LM1.toList test4_1 @?= LM2.toList test4_2,
testCase "test5" $ LM1.toList test5_1 @?= LM2.toList test5_2,
testCase "test6" $ LM1.toList test6_1 @?= LM2.toList test6_2,
testCase "test7_1" $ LM1.toList test7_1 @?= LM2.toList test7_2,
testCase "test7_2" $ LM1.toList test7_1 @?= [(1,"AA"),(5,"BB"),(7,"CCC"),(-6,"D")],
testCase "test8_1" $ LM1.toList test8_1 @?= LM2.toList test8_2,
testCase "test8_2" $ LM1.toList test8_1 @?= [(1::Int, "D")],
testCase "test9" $ LM1.toList test9_1 @?= LM2.toList test9_2,
testCase "test10_1" $ LM1.toList test10_1 @?= LM2.toList test10_2,
testCase "test10_2" $ LM1.toList test10_3 @?= LM2.toList test10_4,
testCase "test11_1" $ LM1.toList test11_1 @?= LM2.toList test11_2,
testCase "test11_2" $ LM1.toList test11_3 @?= LM2.toList test11_4,
testCase "test12_1" $ LM1.toList test12_1 @?= LM2.toList test12_2,
testCase "test12_1" $ LM1.toList test12_3 @?= LM2.toList test12_4,
testCase "test12_2" $ LM1.toList test12_5 @?= LM2.toList test12_6,
testCase "test12_3" $ LM1.toList test12_7 @?= LM2.toList test12_8,
testCase "test13" $ LM1.toList test13_1 @?= LM2.toList test13_2,
testCase "test14" $ LM1.toList test14_1 @?= LM2.toList test14_2,
testCase "test15" $ LM1.toList test15_1 @?= LM2.toList test15_2,
testCase "test16" $ LM1.toList test16_1 @?= LM2.toList test16_2,
testCase "test17" $ test17_1 @?= test17_2,
testCase "test18" $ test18_1 @?= test18_2,
testCase "test19" $ test19_1 @?= test19_2,
testCase "test20" $ test20_1 @?= test20_2,
testCase "test21" $ LM1.toList test21_1 @?= LM2.toList test21_2,
testCase "test22" $ LM1.toList test22_1 @?= LM2.toList test22_2,
testCase "test23" $ LM1.toList test23_1 @?= LM2.toList test23_2,
testCase "test24_1" $ LM1.toList test24_1 @?= LM2.toList test24_2,
testCase "test24_2" $ LM1.toList test24_1 @?= [(1,"A"),(5,"D"),(7,"C"),(-6,"C")]
]
main :: IO ()
main = defaultMain unitTests