content: module DupDefSpec (main, spec) where
  
  import           Test.Hspec
  
  import Language.Haskell.Refact.Refactoring.DupDef
  import System.Directory
  
  import TestUtils
  
  -- ---------------------------------------------------------------------
  
  main :: IO ()
  main = do
    hspec spec
  
  spec :: Spec
  spec = do
  
    describe "doDuplicateDef" $ do
      it "checks for a clash of the new name" $ do
       res <- catchException (ct $ duplicateDef defaultTestSettings testOptions "DupDef/Dd1.hs" "c" (4,1))
       -- res <- catchException (ct $ duplicateDef logTestSettings testOptions "DupDef/Dd1.hs" "c" (4,1))
       (show res) `shouldBe` "Just \"The new name'c' will cause name clash/capture or ambiguity problem after duplicating, please select another name!\""
  
      -- ---------------------------------
  
      it "checks for no definition selected" $ do
       -- res <- catchException (ct $ doDuplicateDef ["DupDef/Dd1.hs","c","5","1"])
       res <- catchException (ct $ duplicateDef defaultTestSettings testOptions "DupDef/Dd1.hs" "c" (5,1))
       (show res) `shouldBe` "Just \"Invalid cursor position!\""
  
      -- ---------------------------------
  
      it "checks for invalid new name" $ do
       -- res <- catchException (ct $ doDuplicateDef ["DupDef/Dd1.hs","$c","5","1"])
       res <- catchException (ct $ duplicateDef defaultTestSettings testOptions "DupDef/Dd1.hs" "$c" (5,1))
       (show res) `shouldBe` "Just \"Invalid new function name:$c!\""
  
      -- ---------------------------------
  
      it "notifies if no definition selected" $ do
       res <- catchException (ct $ duplicateDef defaultTestSettings testOptions "DupDef/Dd1.hs" "ccc" (14,13))
       -- res <- catchException (ct $ duplicateDef logTestSettings testOptions "DupDef/Dd1.hs" "ccc" (14,13))
       (show res) `shouldBe` "Just \"The selected identifier is not a function/simple pattern name, or is not defined in this module \""
  
      -- ---------------------------------
  
      it "duplicates a definition at the top level" $ do
       res <- ct $ duplicateDef defaultTestSettings testOptions "DupDef/Dd1.hs" "tl2" (4,1)
       -- res <- ct $ duplicateDef logTestSettings testOptions "DupDef/Dd1.hs" "tl2" (4,1)
       res' <- ct $ mapM makeRelativeToCurrentDirectory res
       (show res') `shouldBe` "[\"DupDef/Dd1.hs\"]"
       diff <- compareFiles "./test/testdata/DupDef/Dd1.refactored.hs"
                            "./test/testdata/DupDef/Dd1.hs.expected"
       diff `shouldBe` []
  
      -- ---------------------------------
  
      it "duplicates a definition in a match" $ do
       res <- ct $ duplicateDef defaultTestSettings testOptions "DupDef/Dd1.hs" "nn" (23,5)
       -- res <- ct $ duplicateDef logTestSettings testOptions "DupDef/Dd1.hs" "nn" (23,5)
       res' <- ct $ mapM makeRelativeToCurrentDirectory res
       (show res') `shouldBe` "[\"DupDef/Dd1.hs\"]"
       diff <- compareFiles "./test/testdata/DupDef/Dd1.refactored.hs"
                            "./test/testdata/DupDef/Dd1.hs.expected.nn"
       diff `shouldBe` []
  
      -- ---------------------------------
  
      it "duplicates a definition in a pattern match" $ do
       res <- ct $ duplicateDef defaultTestSettings testOptions "DupDef/Dd1.hs" "gg" (17,5)
       -- res <- ct $ duplicateDef logTestSettings testOptions "DupDef/Dd1.hs" "gg" (17,5)
       res' <- ct $ mapM makeRelativeToCurrentDirectory res
       (show res') `shouldBe` "[\"DupDef/Dd1.hs\"]"
       diff <- compareFiles "./test/testdata/DupDef/Dd1.refactored.hs"
                            "./test/testdata/DupDef/Dd1.hs.expected.gg"
       diff `shouldBe` []
  
      -- ---------------------------------
  
      it "duplicates a definition in a let expression" $ do
       res <- ct $ duplicateDef defaultTestSettings testOptions "DupDef/Dd1.hs" "lll" (27,5)
       -- res <- ct $ duplicateDef logTestSettings testOptions "DupDef/Dd1.hs" "lll" (27,5)
       res' <- ct $ mapM makeRelativeToCurrentDirectory res
       (show res') `shouldBe` "[\"DupDef/Dd1.hs\"]"
       diff <- compareFiles "./test/testdata/DupDef/Dd1.refactored.hs"
                            "./test/testdata/DupDef/Dd1.hs.expected.ll"
       diff `shouldBe` []
  
      -- ---------------------------------
  
      it "duplicates a definition in a let statement" $ do
       res <- ct $ duplicateDef defaultTestSettings testOptions "DupDef/Dd1.hs" "sss" (31,7)
       -- res <- ct $ duplicateDef logTestSettings testOptions "DupDef/Dd1.hs" "sss" (31,7)
       res' <- ct $ mapM makeRelativeToCurrentDirectory res
       (show res') `shouldBe` "[\"DupDef/Dd1.hs\"]"
       diff <- compareFiles "./test/testdata/DupDef/Dd1.refactored.hs"
                            "./test/testdata/DupDef/Dd1.hs.expected.dd"
       diff `shouldBe` []
  
      -- ---------------------------------
  
      it "hides the new definition if it will cause problems in client mods" $ do
       res <- ct $ duplicateDef defaultTestSettings testOptions "DupDef/Dd1.hs" "mm" (21,1)
       -- res <- ct $ duplicateDef logTestSettings testOptions "DupDef/Dd1.hs" "mm" (21,1)
       r' <- ct $ mapM makeRelativeToCurrentDirectory res
       (show r') `shouldBe` "[\"DupDef/Dd1.hs\",\"DupDef/Dd2.hs\",\"DupDef/Dd3.hs\"]"
       diff <- compareFiles "./test/testdata/DupDef/Dd1.refactored.hs"
                            "./test/testdata/DupDef/Dd1.hs.expected.mm"
       diff `shouldBe` []
       diff2 <- compareFiles "./test/testdata/DupDef/Dd2.refactored.hs"
                             "./test/testdata/DupDef/Dd2.hs.expected"
       diff2 `shouldBe` []
       diff3 <- compareFiles "./test/testdata/DupDef/Dd3.refactored.hs"
                             "./test/testdata/DupDef/Dd3.hs.expected"
       diff3 `shouldBe` []
  
      -- ---------------------------------
  
      it "duplicates a definition and formats properly" $ do
       res <- ct $ duplicateDef defaultTestSettings testOptions "Case/B.hs" "joe" (9,1)
       -- res <- ct $ duplicateDef logTestSettings testOptions "Case/B.hs" "joe" (9,1)
       res' <- ct $ mapM makeRelativeToCurrentDirectory res
       (show res') `shouldBe` "[\"Case/B.hs\"]"
       diff <- compareFiles "./test/testdata/Case/B.refactored.hs"
                            "./test/testdata/Case/B.hs.expected.dd"
       diff `shouldBe` []
  
  -- ---------------------------------------------------------------------
  
  