module AddRmParamSpec (main, spec) where import Test.Hspec import Language.Haskell.Refact.Refactoring.AddRmParam import TestUtils import System.Directory -- --------------------------------------------------------------------- main :: IO () main = do hspec spec spec :: Spec spec = do describe "Adding" $ do it "addOneParameter in D3 A3" $ do r <- ct $ addOneParameter defaultTestSettings testOptions "./AddOneParameter/D3.hs" "y" (7,1) -- r <- ct $ addOneParameter logTestSettings testOptions "./AddOneParameter/D3.hs" "y" (7,1) r' <- ct $ mapM makeRelativeToCurrentDirectory r r' `shouldBe` [ "AddOneParameter/D3.hs" , "AddOneParameter/A3.hs" ] diffD <- ct $ compareFiles "./AddOneParameter/D3.expected.hs" "./AddOneParameter/D3.refactored.hs" diffD `shouldBe` [] diffA <- ct $ compareFiles "./AddOneParameter/A3.expected.hs" "./AddOneParameter/A3.refactored.hs" diffA `shouldBe` [] -- ------------------- it "addOneParameter in D1 B1 C1 A1" $ do r <- ct $ addOneParameter defaultTestSettings testOptions "./AddOneParameter/D1.hs" "f" (10,1) -- r <- ct $ addOneParameter logTestSettings testOptions "./AddOneParameter/D1.hs" "f" (10,1) r' <- ct $ mapM makeRelativeToCurrentDirectory r r' `shouldBe` [ "AddOneParameter/D1.hs" , "AddOneParameter/A1.hs" , "AddOneParameter/C1.hs" ] diffD <- ct $ compareFiles "./AddOneParameter/D1.expected.hs" "./AddOneParameter/D1.refactored.hs" diffD `shouldBe` [] diffC <- ct $ compareFiles "./AddOneParameter/C1.expected.hs" "./AddOneParameter/C1.refactored.hs" diffC `shouldBe` [] diffA <- ct $ compareFiles "./AddOneParameter/A1.expected.hs" "./AddOneParameter/A1.refactored.hs" diffA `shouldBe` [] -- ------------------- it "addOneParameter in D2 B2 C2 A2" $ do r <- ct $ addOneParameter defaultTestSettings testOptions "./AddOneParameter/D2.hs" "f" (11,1) -- r <- ct $ addOneParameter logTestSettings testOptions "./AddOneParameter/D2.hs" "f" (11,1) r' <- ct $ mapM makeRelativeToCurrentDirectory r r' `shouldBe` [ "AddOneParameter/D2.hs" , "AddOneParameter/A2.hs" , "AddOneParameter/C2.hs" ] diffD <- ct $ compareFiles "./AddOneParameter/D2.expected.hs" "./AddOneParameter/D2.refactored.hs" diffD `shouldBe` [] diffC <- ct $ compareFiles "./AddOneParameter/C2.expected.hs" "./AddOneParameter/C2.refactored.hs" diffC `shouldBe` [] diffA <- ct $ compareFiles "./AddOneParameter/A2.expected.hs" "./AddOneParameter/A2.refactored.hs" diffA `shouldBe` [] -- ------------------- it "addOneParameter in PatIn1" $ do r <- ct $ addOneParameter defaultTestSettings testOptions "./AddOneParameter/PatIn1.hs" "x" (7,1) -- r <- ct $ addOneParameter logTestSettings testOptions "./AddOneParameter/PatIn1.hs" "x" (7,1) r' <- ct $ mapM makeRelativeToCurrentDirectory r r' `shouldBe` [ "AddOneParameter/PatIn1.hs" ] diffD <- ct $ compareFiles "./AddOneParameter/PatIn1.expected.hs" "./AddOneParameter/PatIn1.refactored.hs" diffD `shouldBe` [] -- ------------------- it "addOneParameter in FunIn1" $ do -- (["FunIn1.hs"],["y","7","1"]), r <- ct $ addOneParameter defaultTestSettings testOptions "./AddOneParameter/FunIn1.hs" "y" (7,1) -- r <- ct $ addOneParameter logTestSettings testOptions "./AddOneParameter/FunIn1.hs" "y" (7,1) r' <- ct $ mapM makeRelativeToCurrentDirectory r r' `shouldBe` [ "AddOneParameter/FunIn1.hs" ] diffD <- ct $ compareFiles "./AddOneParameter/FunIn1.expected.hs" "./AddOneParameter/FunIn1.refactored.hs" diffD `shouldBe` [] -- ------------------- it "addOneParameter in FunIn2" $ do -- (["FunIn2.hs"],["y","10","18"]), r <- ct $ addOneParameter defaultTestSettings testOptions "./AddOneParameter/FunIn2.hs" "y" (10,18) -- r <- ct $ addOneParameter logTestSettings testOptions "./AddOneParameter/FunIn2.hs" "y" (10,18) r' <- ct $ mapM makeRelativeToCurrentDirectory r r' `shouldBe` [ "AddOneParameter/FunIn2.hs" ] diffD <- ct $ compareFiles "./AddOneParameter/FunIn2.expected.hs" "./AddOneParameter/FunIn2.refactored.hs" diffD `shouldBe` [] -- ------------------- it "addOneParameter in FunIn3" $ do -- (["FunIn3.hs"],["y","9","11"]), r <- ct $ addOneParameter defaultTestSettings testOptions "./AddOneParameter/FunIn3.hs" "y" (9,11) -- r <- ct $ addOneParameter logTestSettings testOptions "./AddOneParameter/FunIn3.hs" "y" (9,11) r' <- ct $ mapM makeRelativeToCurrentDirectory r r' `shouldBe` [ "AddOneParameter/FunIn3.hs" ] diffD <- ct $ compareFiles "./AddOneParameter/FunIn3.expected.hs" "./AddOneParameter/FunIn3.refactored.hs" diffD `shouldBe` [] -- ------------------- it "addOneParameter in FunIn4" $ do -- (["FunIn4.hs"],["y","8","22"])], r <- ct $ addOneParameter defaultTestSettings testOptions "./AddOneParameter/FunIn4.hs" "y" (8,22) -- r <- ct $ addOneParameter logTestSettings testOptions "./AddOneParameter/FunIn4.hs" "y" (8,22) r' <- ct $ mapM makeRelativeToCurrentDirectory r r' `shouldBe` [ "AddOneParameter/FunIn4.hs" ] diffD <- ct $ compareFiles "./AddOneParameter/FunIn4.expected.hs" "./AddOneParameter/FunIn4.refactored.hs" diffD `shouldBe` [] -- ------------------- it "addOneParameter in FunIn6" $ do -- (["FunIn6.hs"],["y","8","22"])], r <- ct $ addOneParameter defaultTestSettings testOptions "./AddOneParameter/FunIn6.hs" "y" (9,7) -- r <- ct $ addOneParameter logTestSettings testOptions "./AddOneParameter/FunIn6.hs" "y" (9,7) r' <- ct $ mapM makeRelativeToCurrentDirectory r r' `shouldBe` [ "AddOneParameter/FunIn6.hs" ] diffD <- ct $ compareFiles "./AddOneParameter/FunIn6.expected.hs" "./AddOneParameter/FunIn6.refactored.hs" diffD `shouldBe` [] -- ------------------- it "addOneParameter in Nested" $ do r <- ct $ addOneParameter defaultTestSettings testOptions "./AddOneParameter/Nested.hs" "y" (8,1) -- r <- ct $ addOneParameter logTestSettings testOptions "./AddOneParameter/Nested.hs" "y" (8,1) r' <- ct $ mapM makeRelativeToCurrentDirectory r r' `shouldBe` [ "AddOneParameter/Nested.hs" ] diffD <- ct $ compareFiles "./AddOneParameter/Nested.expected.hs" "./AddOneParameter/Nested.refactored.hs" diffD `shouldBe` [] -- ------------------- it "addOneParameter in MultiFun1" $ do r <- ct $ addOneParameter defaultTestSettings testOptions "./AddOneParameter/MultiFun1.hs" "x" (9,1) -- r <- ct $ addOneParameter logTestSettings testOptions "./AddOneParameter/MultiFun1.hs" "x" (9,1) r' <- ct $ mapM makeRelativeToCurrentDirectory r r' `shouldBe` [ "AddOneParameter/MultiFun1.hs" ] diffD <- ct $ compareFiles "./AddOneParameter/MultiFun1.expected.hs" "./AddOneParameter/MultiFun1.refactored.hs" diffD `shouldBe` [] -- --------------------------------- -- Negative tests -- --------------------------------- it "fails complex pat binding PatIn2" $ do -- [(["PatIn2.hs"],["x","7","20"]), res <- catchException (ct $ addOneParameter defaultTestSettings testOptions "./AddOneParameter/PatIn2.hs" "x" (7,20)) (show res) `shouldBe` "Just \"Parameter can not be added to complex pattern binding\"" -- ------------------- it "fails name clash FunIn5" $ do -- (["FunIn5.hs"],["h","8","1"])] res <- catchException (ct $ addOneParameter defaultTestSettings testOptions "./AddOneParameter/FunIn5.hs" "h" (8,1)) (show res) `shouldBe` "Just \"The new parameter name will cause name clash or semantics change, please choose another name!\"" -- ------------------- {- TestCases{refactorCmd="addOneParameter", positive=[(["D3.hs","A3.hs"],["y","7","1"]), (["D1.hs","C1.hs","A1.hs"],["f","10","1"]), (["D2.hs","C2.hs","A2.hs"],["f","11","1"]), (["PatIn1.hs"],["x","7","1"]), (["FunIn1.hs"],["y","7","1"]), (["FunIn2.hs"],["y","10","18"]), (["FunIn3.hs"],["y","9","11"]), (["FunIn4.hs"],["y","8","22"])], negative=[(["PatIn2.hs"],["x","7","20"]), (["FunIn5.hs"],["h","8","1"])] -} -- --------------------------------- describe "Removing" $ do it "rmOneParameter in D1 A1" $ do -- (["D1.hs","A1.hs"],["6","19"]), r <- ct $ rmOneParameter defaultTestSettings testOptions "./RmOneParameter/D1.hs" (6,19) -- r <- ct $ rmOneParameter logTestSettings testOptions "./RmOneParameter/D1.hs" (6,19) r' <- ct $ mapM makeRelativeToCurrentDirectory r r' `shouldBe` [ "RmOneParameter/D1.hs" , "RmOneParameter/A1.hs" ] diffD <- ct $ compareFiles "./RmOneParameter/D1.expected.hs" "./RmOneParameter/D1.refactored.hs" diffD `shouldBe` [] diffA <- ct $ compareFiles "./RmOneParameter/A1.expected.hs" "./RmOneParameter/A1.refactored.hs" diffA `shouldBe` [] -- ------------------- it "rmOneParameter in D2 A2" $ do -- (["D2.hs","A2.hs"],["7","19"]), r <- ct $ rmOneParameter defaultTestSettings testOptions "./RmOneParameter/D2.hs" (7,19) -- r <- ct $ rmOneParameter logTestSettings testOptions "./RmOneParameter/D2.hs" (7,19) r' <- ct $ mapM makeRelativeToCurrentDirectory r r' `shouldBe` [ "RmOneParameter/D2.hs" , "RmOneParameter/A2.hs" ] diffD <- ct $ compareFiles "./RmOneParameter/D2.expected.hs" "./RmOneParameter/D2.refactored.hs" diffD `shouldBe` [] diffA <- ct $ compareFiles "./RmOneParameter/A2.expected.hs" "./RmOneParameter/A2.refactored.hs" diffA `shouldBe` [] -- ------------------- it "rmOneParameter in FunIn1" $ do -- (["FunIn1.hs"],["8","5"]), r <- ct $ rmOneParameter defaultTestSettings testOptions "./RmOneParameter/FunIn1.hs" (8,5) -- r <- ct $ rmOneParameter logTestSettings testOptions "./RmOneParameter/FunIn1.hs" (8,5) r' <- ct $ mapM makeRelativeToCurrentDirectory r r' `shouldBe` [ "RmOneParameter/FunIn1.hs" ] diffD <- ct $ compareFiles "./RmOneParameter/FunIn1.expected.hs" "./RmOneParameter/FunIn1.refactored.hs" diffD `shouldBe` [] -- ------------------- it "rmOneParameter in FunIn2" $ do -- (["FunIn2.hs"],["8","5"]), r <- ct $ rmOneParameter defaultTestSettings testOptions "./RmOneParameter/FunIn2.hs" (8,5) -- r <- ct $ rmOneParameter logTestSettings testOptions "./RmOneParameter/FunIn2.hs" (8,5) r' <- ct $ mapM makeRelativeToCurrentDirectory r r' `shouldBe` [ "RmOneParameter/FunIn2.hs" ] diffD <- ct $ compareFiles "./RmOneParameter/FunIn2.expected.hs" "./RmOneParameter/FunIn2.refactored.hs" diffD `shouldBe` [] -- ------------------- it "rmOneParameter in FunIn2a" $ do -- (["FunIn2.hs"],["8","5"]), r <- ct $ rmOneParameter defaultTestSettings testOptions "./RmOneParameter/FunIn2a.hs" (8,5) -- r <- ct $ rmOneParameter logTestSettings testOptions "./RmOneParameter/FunIn2a.hs" (8,5) r' <- ct $ mapM makeRelativeToCurrentDirectory r r' `shouldBe` [ "RmOneParameter/FunIn2a.hs" ] diffD <- ct $ compareFiles "./RmOneParameter/FunIn2a.expected.hs" "./RmOneParameter/FunIn2a.refactored.hs" diffD `shouldBe` [] -- ------------------- it "rmOneParameter in FunIn3" $ do -- (["FunIn3.hs"],["7","5"]), r <- ct $ rmOneParameter defaultTestSettings testOptions "./RmOneParameter/FunIn3.hs" (7,5) -- r <- ct $ rmOneParameter logTestSettings testOptions "./RmOneParameter/FunIn3.hs" (7,5) r' <- ct $ mapM makeRelativeToCurrentDirectory r r' `shouldBe` [ "RmOneParameter/FunIn3.hs" ] diffD <- ct $ compareFiles "./RmOneParameter/FunIn3.expected.hs" "./RmOneParameter/FunIn3.refactored.hs" diffD `shouldBe` [] -- ------------------- it "rmOneParameter in FunIn5" $ do -- (["FunIn5.hs"],["7","6"]), r <- ct $ rmOneParameter defaultTestSettings testOptions "./RmOneParameter/FunIn5.hs" (7,6) -- r <- ct $ rmOneParameter logTestSettings testOptions "./RmOneParameter/FunIn5.hs" (7,6) r' <- ct $ mapM makeRelativeToCurrentDirectory r r' `shouldBe` [ "RmOneParameter/FunIn5.hs" ] diffD <- ct $ compareFiles "./RmOneParameter/FunIn5.expected.hs" "./RmOneParameter/FunIn5.refactored.hs" diffD `shouldBe` [] -- ------------------- it "rmOneParameter in FunIn6" $ do -- (["FunIn6.hs"],["7","5"]), r <- ct $ rmOneParameter defaultTestSettings testOptions "./RmOneParameter/FunIn6.hs" (7,5) -- r <- ct $ rmOneParameter logTestSettings testOptions "./RmOneParameter/FunIn6.hs" (7,5) r' <- ct $ mapM makeRelativeToCurrentDirectory r r' `shouldBe` [ "RmOneParameter/FunIn6.hs" ] diffD <- ct $ compareFiles "./RmOneParameter/FunIn6.expected.hs" "./RmOneParameter/FunIn6.refactored.hs" diffD `shouldBe` [] -- ------------------- it "rmOneParameter in FunIn0" $ do -- (["FunIn0.hs"],["10","7"])], r <- ct $ rmOneParameter defaultTestSettings testOptions "./RmOneParameter/FunIn0.hs" (10,7) -- r <- ct $ rmOneParameter logTestSettings testOptions "./RmOneParameter/FunIn0.hs" (10,7) r' <- ct $ mapM makeRelativeToCurrentDirectory r r' `shouldBe` [ "RmOneParameter/FunIn0.hs" ] diffD <- ct $ compareFiles "./RmOneParameter/FunIn0.expected.hs" "./RmOneParameter/FunIn0.refactored.hs" diffD `shouldBe` [] -- ------------------- it "rmOneParameter in SubFun1" $ do r <- ct $ rmOneParameter defaultTestSettings testOptions "./RmOneParameter/SubFun1.hs" (10,9) -- r <- ct $ rmOneParameter logTestSettings testOptions "./RmOneParameter/SubFun1.hs" (10,9) r' <- ct $ mapM makeRelativeToCurrentDirectory r r' `shouldBe` [ "RmOneParameter/SubFun1.hs" ] diffD <- ct $ compareFiles "./RmOneParameter/SubFun1.expected.hs" "./RmOneParameter/SubFun1.refactored.hs" diffD `shouldBe` [] -- ------------------- it "rmOneParameter in SubFun2" $ do r <- ct $ rmOneParameter defaultTestSettings testOptions "./RmOneParameter/SubFun2.hs" (10,9) -- r <- ct $ rmOneParameter logTestSettings testOptions "./RmOneParameter/SubFun2.hs" (10,9) r' <- ct $ mapM makeRelativeToCurrentDirectory r r' `shouldBe` [ "RmOneParameter/SubFun2.hs" ] diffD <- ct $ compareFiles "./RmOneParameter/SubFun2.expected.hs" "./RmOneParameter/SubFun2.refactored.hs" diffD `shouldBe` [] -- ------------------- it "rmOneParameter in SubFun3" $ do r <- ct $ rmOneParameter defaultTestSettings testOptions "./RmOneParameter/SubFun3.hs" (10,9) -- r <- ct $ rmOneParameter logTestSettings testOptions "./RmOneParameter/SubFun3.hs" (10,9) r' <- ct $ mapM makeRelativeToCurrentDirectory r r' `shouldBe` [ "RmOneParameter/SubFun3.hs" ] diffD <- ct $ compareFiles "./RmOneParameter/SubFun3.expected.hs" "./RmOneParameter/SubFun3.refactored.hs" diffD `shouldBe` [] -- ------------------- it "rmOneParameter in MultiFun1" $ do r <- ct $ rmOneParameter defaultTestSettings testOptions "./RmOneParameter/MultiFun1.hs" (10,8) -- r <- ct $ rmOneParameter logTestSettings testOptions "./RmOneParameter/MultiFun1.hs" (10,8) r' <- ct $ mapM makeRelativeToCurrentDirectory r r' `shouldBe` [ "RmOneParameter/MultiFun1.hs" ] diffD <- ct $ compareFiles "./RmOneParameter/MultiFun1.expected.hs" "./RmOneParameter/MultiFun1.refactored.hs" diffD `shouldBe` [] -- --------------------------------- -- Negative tests -- --------------------------------- it "fails FunIn4" $ do -- (["FunIn4.hs"],["7","6"]), res <- catchException (ct $ rmOneParameter defaultTestSettings testOptions "./RmOneParameter/FunIn4.hs" (7,6)) -- ct $ rmOneParameter logTestSettings testOptions "./RmOneParameter/FunIn4.hs" (7,6) (show res) `shouldBe` "Just \"This parameter can not be removed, as it is used!\"" -- ------------------- it "fails FunIn7" $ do -- (["FunIn7.hs"],["10","4"])] res <- catchException (ct $ rmOneParameter defaultTestSettings testOptions "./RmOneParameter/FunIn7.hs" (10,4)) (show res) `shouldBe` "Just \"Invalid cursor position!\"" -- ------------------- {- TestCases{refactorCmd="rmOneParameter", positive=[ (["D1.hs","A1.hs"],["6","19"]), (["D2.hs","A2.hs"],["7","19"]), (["FunIn1.hs"],["8","5"]), (["FunIn2.hs"],["8","5"]), (["FunIn3.hs"],["7","5"]), (["FunIn5.hs"],["7","6"]), (["FunIn6.hs"],["7","5"]), (["FunIn0.hs"],["10","7"])], negative=[(["FunIn4.hs"],["7","6"]), (["FunIn7.hs"],["10","4"])] } TODO: Add a test for a PatBind too -}