import Universum import qualified Data.Text as Text import qualified Test.Tasty import Test.Tasty.Hspec import qualified Require main :: IO () main = do test <- testSpec "require" spec Test.Tasty.defaultMain test spec :: Spec spec = parallel $ do it "transforms the 'require' keyword into a properly qualified import" $ do let input = "require Data.Text" let expected = "import qualified Data.Text as Text" let actual = Require.transform False (Require.FileName "Foo.hs") "" input expected `Text.isInfixOf` actual it "imports the type based on the module" $ do let input = "require Data.Text" let expected = "import Data.Text (Text)" let actual = Require.transform False (Require.FileName "Foo.hs") "" input expected `Text.isInfixOf` actual it "keeps the rest of the content intact" $ do let input = "module Foo where\nrequire Data.Text\nfoo = 42" let expectedStart = "{-# LINE 1" let expectedModule = "module Foo where" let expectedTypeImport = "import Data.Text (Text)" let expectedQualifiedImport = "import qualified Data.Text as Text" let expectedContent = "foo = 42\n" let actual = toString $ Require.transform False (Require.FileName "Foo.hs") "" input actual `shouldStartWith` expectedStart actual `shouldContain` expectedModule actual `shouldContain` expectedTypeImport actual `shouldContain` expectedQualifiedImport actual `shouldEndWith` expectedContent it "aliases the modules properly" $ do let input = "require Data.Text as Foo" let expectedTypeImport = "import Data.Text (Text)" let expectedQualifiedImport = "import qualified Data.Text as Foo" let actual = toString $ Require.transform False (Require.FileName "Foo.hs") "" input actual `shouldContain` expectedTypeImport actual `shouldContain` expectedQualifiedImport it "imports the types properly" $ do let input = "require Data.Text (Foo)" let expectedTypeImport = "import Data.Text (Foo)" let expectedQualifiedImport = "import qualified Data.Text as Text" let actual = toString $ Require.transform False (Require.FileName "Foo.hs") "" input actual `shouldContain` expectedTypeImport actual `shouldContain` expectedQualifiedImport it "imports the types and aliases the modules properly" $ do let input = "require Data.Text as Quux (Foo)" let expectedTypeImport = "import Data.Text (Foo)" let expectedQualifiedImport = "import qualified Data.Text as Quux" let actual = toString $ Require.transform False (Require.FileName "Foo.hs") "" input actual `shouldContain` expectedTypeImport actual `shouldContain` expectedQualifiedImport it "skips comments" $ do let input = "require Data.Text -- test of comments" let expected = "import Data.Text (Text)" let actual = Require.transform False (Require.FileName "Foo.hs") "" input expected `Text.isInfixOf` actual it "allows empty parentheses" $ do let input = "require Data.Text ()" let expected1 = "import Data.Text ()" let expected2 = "import qualified Data.Text as Text" let actual = lines $ Require.transform False (Require.FileName "Foo.hs") "" input actual `shouldSatisfy` elem expected1 actual `shouldSatisfy` elem expected2