stylish-haskell 0.12.0.0 → 0.12.1.0
raw patch · 6 files changed
+865/−892 lines, 6 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
Files
- CHANGELOG +4/−0
- README.markdown +5/−1
- lib/Language/Haskell/Stylish/Module.hs +6/−3
- lib/Language/Haskell/Stylish/Util.hs +6/−6
- stylish-haskell.cabal +9/−3
- tests/Language/Haskell/Stylish/Step/Imports/Tests.hs +835/−879
CHANGELOG view
@@ -1,5 +1,9 @@ # CHANGELOG +- 0.12.1.0 (2020-10-05)+ * Bump Cabal-version to 2.4 (by Łukasz Gołębiewski)+ * Fix "group" import sort with multi-line imports (by Maxim Koltsov)+ - 0.12.0.0 (2020-10-02) * Use ghc-lib-parser rather than haskell-src-exts
README.markdown view
@@ -2,7 +2,7 @@ <img src="./assets/Logo/SVG/RoundedLogo.svg" width="100px"> -[](https://circleci.com/gh/jaspervdj/stylish-haskell)+ ## Introduction @@ -235,3 +235,7 @@ - Leonid Onokhov - Michael Snoyman - Mikhail Glushenkov+- Beatrice Vergani+- Paweł Szulc+- Łukasz Gołębiewski+- Felix Mulder
lib/Language/Haskell/Stylish/Module.hs view
@@ -201,10 +201,13 @@ -> [NonEmpty (Located Import)] go acc _ [] = ne acc go acc mbCurrentLine (imp : impRest) =- let l2 = getStartLineUnsafe imp in+ let+ lStart = getStartLineUnsafe imp+ lEnd = getEndLineUnsafe imp in case mbCurrentLine of- Just l1 | l1 + 1 < l2 -> ne acc ++ go [imp] (Just l2) impRest- _ -> go (acc ++ [imp]) (Just l2) impRest+ Just lPrevEnd | lPrevEnd + 1 < lStart+ -> ne acc ++ go [imp] (Just lEnd) impRest+ _ -> go (acc ++ [imp]) (Just lEnd) impRest ne [] = [] ne (x : xs) = [x :| xs]
lib/Language/Haskell/Stylish/Util.hs view
@@ -22,8 +22,8 @@ , toRealSrcSpan - , traceOutputtable- , traceOutputtableM+ , traceOutputable+ , traceOutputableM , unguardedRhsBody , rhsBody@@ -213,14 +213,14 @@ ---------------------------------------------------------------------------------traceOutputtable :: Outputable.Outputable a => String -> a -> b -> b-traceOutputtable title x =+traceOutputable :: Outputable.Outputable a => String -> a -> b -> b+traceOutputable title x = trace (title ++ ": " ++ (Outputable.showSDocUnsafe $ Outputable.ppr x)) ---------------------------------------------------------------------------------traceOutputtableM :: (Outputable.Outputable a, Monad m) => String -> a -> m ()-traceOutputtableM title x = traceOutputtable title x $ pure ()+traceOutputableM :: (Outputable.Outputable a, Monad m) => String -> a -> m ()+traceOutputableM title x = traceOutputable title x $ pure () --------------------------------------------------------------------------------
stylish-haskell.cabal view
@@ -1,15 +1,15 @@+Cabal-version: 2.4 Name: stylish-haskell-Version: 0.12.0.0+Version: 0.12.1.0 Synopsis: Haskell code prettifier Homepage: https://github.com/jaspervdj/stylish-haskell-License: BSD3+License: BSD-3-Clause License-file: LICENSE Author: Jasper Van der Jeugt <m@jaspervdj.be> Maintainer: Jasper Van der Jeugt <m@jaspervdj.be> Copyright: 2012 Jasper Van der Jeugt Category: Language Build-type: Simple-Cabal-version: >= 1.10 Description: A Haskell code prettifier. For more information, see:@@ -57,6 +57,9 @@ Language.Haskell.Stylish.Verbose Paths_stylish_haskell + Autogen-modules:+ Paths_stylish_haskell+ Build-depends: aeson >= 0.6 && < 1.6, base >= 4.8 && < 5,@@ -148,6 +151,9 @@ Language.Haskell.Stylish.Tests.Util Language.Haskell.Stylish.Util Language.Haskell.Stylish.Verbose+ Paths_stylish_haskell++ Autogen-modules: Paths_stylish_haskell Build-depends:
tests/Language/Haskell/Stylish/Step/Imports/Tests.hs view
@@ -1,880 +1,836 @@ ---------------------------------------------------------------------------------module Language.Haskell.Stylish.Step.Imports.Tests- ( tests- ) where------------------------------------------------------------------------------------import Test.Framework (Test, testGroup)-import Test.Framework.Providers.HUnit (testCase)-import Test.HUnit (Assertion, (@=?))------------------------------------------------------------------------------------import Language.Haskell.Stylish.Step.Imports-import Language.Haskell.Stylish.Tests.Util------------------------------------------------------------------------------------fromImportAlign :: ImportAlign -> Options-fromImportAlign align = defaultOptions { importAlign = align }------------------------------------------------------------------------------------tests :: Test-tests = testGroup "Language.Haskell.Stylish.Step.Imports.Tests"- [ testCase "case 01" case01- , testCase "case 02" case02- , testCase "case 03" case03- , testCase "case 04" case04- , testCase "case 05" case05- , testCase "case 06" case06- , testCase "case 07" case07- , testCase "case 08" case08- , testCase "case 08b" case08b- , testCase "case 09" case09- , testCase "case 10" case10- , testCase "case 11" case11- , testCase "case 11b" case11b- , testCase "case 12" case12- , testCase "case 12b" case12b- , testCase "case 13" case13- , testCase "case 13b" case13b- , testCase "case 14" case14- , testCase "case 15" case15- , testCase "case 16" case16- , testCase "case 17" case17- , testCase "case 18" case18- , testCase "case 19" case19- , testCase "case 19b" case19b- , testCase "case 19d" case19c- , testCase "case 19d" case19d- , testCase "case 20" case20- , testCase "case 21" case21- , testCase "case 22" case22- , testCase "case 23" case23- , testCase "case 23b" case23b- , testCase "case 24" case24- , testCase "case 25" case25- , testCase "case 26 (issue 185)" case26- , testCase "case 27" case27- ]------------------------------------------------------------------------------------input :: Snippet-input = Snippet- [ "module Herp where"- , ""- , "import qualified Data.Map as M"- , "import Control.Monad"- , "import Only.Instances()"- , "import Data.Map (lookup, (!), insert, Map)"- , "import Data.List as List (concat, foldl, foldr, head, init, last,\- \ length, map, null, reverse, tail, (++))"- , ""- , "import Herp.Derp.Internals hiding (foo)"- , "import Foo (Bar (..))"- , ""- , "herp = putStrLn \"import Hello world\""- ]------------------------------------------------------------------------------------case01 :: Assertion-case01 = expected @=? testSnippet (step (Just 80) $ fromImportAlign Global) input- where- expected = Snippet- [ "module Herp where"- , ""- , "import Control.Monad"- , "import Data.List as List (concat, foldl, foldr, head, init,"- , " last, length, map, null, reverse,"- , " tail, (++))"- , "import Data.Map (Map, insert, lookup, (!))"- , "import qualified Data.Map as M"- , "import Only.Instances ()"- , ""- , "import Foo (Bar (..))"- , "import Herp.Derp.Internals hiding (foo)"- , ""- , "herp = putStrLn \"import Hello world\""- ]------------------------------------------------------------------------------------case02 :: Assertion-case02 = expected @=? testSnippet (step (Just 80) $ fromImportAlign Group) input- where- expected = Snippet- [ "module Herp where"- , ""- , "import Control.Monad"- , "import Data.List as List (concat, foldl, foldr, head, init, last,"- , " length, map, null, reverse, tail, (++))"- , "import Data.Map (Map, insert, lookup, (!))"- , "import qualified Data.Map as M"- , "import Only.Instances ()"- , ""- , "import Foo (Bar (..))"- , "import Herp.Derp.Internals hiding (foo)"- , ""- , "herp = putStrLn \"import Hello world\""- ]------------------------------------------------------------------------------------case03 :: Assertion-case03 = expected @=? testSnippet (step (Just 80) $ fromImportAlign None) input- where- expected = Snippet- [ "module Herp where"- , ""- , "import Control.Monad"- , "import Data.List as List (concat, foldl, foldr, head, init, last, length, map,"- , " null, reverse, tail, (++))"- , "import Data.Map (Map, insert, lookup, (!))"- , "import qualified Data.Map as M"- , "import Only.Instances ()"- , ""- , "import Foo (Bar (..))"- , "import Herp.Derp.Internals hiding (foo)"- , ""- , "herp = putStrLn \"import Hello world\""- ]------------------------------------------------------------------------------------case04 :: Assertion-case04 = expected @=? testSnippet (step (Just 80) $ fromImportAlign Global) input'- where- input' = Snippet $ pure $- "import Data.Aeson.Types (object, typeMismatch, FromJSON(..)," ++- "ToJSON(..), Value(..), parseEither, (.!=), (.:), (.:?), (.=))"-- expected = Snippet- [ "import Data.Aeson.Types (FromJSON (..), ToJSON (..), Value (..),"- , " object, parseEither, typeMismatch, (.!=),"- , " (.:), (.:?), (.=))"- ]------------------------------------------------------------------------------------case05 :: Assertion-case05 = input' @=? testSnippet (step (Just 80) $ fromImportAlign Group) input'- where- -- Putting this on a different line shouldn't really help.- input' = Snippet ["import Distribution.PackageDescription.Configuration " ++- "(finalizePackageDescription)"]------------------------------------------------------------------------------------case06 :: Assertion-case06 = input' @=? testStep' (step (Just 80) $ fromImportAlign File) input'- where- input' =- [ "import Bar.Qux"- , "import Foo.Bar"- ]------------------------------------------------------------------------------------case07 :: Assertion-case07 =- expected @=? testSnippet (step (Just 80) $ fromImportAlign File) input'- where- input' = Snippet- [ "import Bar.Qux"- , ""- , "import qualified Foo.Bar"- ]-- expected = Snippet- [ "import Bar.Qux"- , ""- , "import qualified Foo.Bar"- ]------------------------------------------------------------------------------------case08 :: Assertion-case08 =- let- options = Options Global WithAlias True Inline Inherit (LPConstant 4) True False- in- expected @=? testSnippet (step (Just 80) options) input- where- expected = Snippet- [ "module Herp where"- , ""- , "import Control.Monad"- , "import Data.List as List (concat, foldl, foldr, head, init,"- , " last, length, map, null, reverse, tail,"- , " (++))"- , "import Data.Map (Map, insert, lookup, (!))"- , "import qualified Data.Map as M"- , "import Only.Instances ()"- , ""- , "import Foo (Bar (..))"- , "import Herp.Derp.Internals hiding (foo)"- , ""- , "herp = putStrLn \"import Hello world\""- ]------------------------------------------------------------------------------------case08b :: Assertion-case08b =- let- options = Options Global WithModuleName True Inline Inherit (LPConstant 4) True False- in- expected @=? testSnippet (step (Just 80) options) input- where- expected = Snippet- ["module Herp where"- , ""- , "import Control.Monad"- , "import Data.List as List (concat, foldl, foldr, head, init,"- , " last, length, map, null, reverse, tail, (++))"- , "import Data.Map (Map, insert, lookup, (!))"- , "import qualified Data.Map as M"- , "import Only.Instances ()"- , ""- , "import Foo (Bar (..))"- , "import Herp.Derp.Internals hiding (foo)"- , ""- , "herp = putStrLn \"import Hello world\""- ]------------------------------------------------------------------------------------case09 :: Assertion-case09 =- let- options = Options Global WithAlias True Multiline Inherit (LPConstant 4) True False- in- expected @=? testSnippet (step (Just 80) options) input- where- expected = Snippet- [ "module Herp where"- , ""- , "import Control.Monad"- , "import Data.List as List"- , " ( concat"- , " , foldl"- , " , foldr"- , " , head"- , " , init"- , " , last"- , " , length"- , " , map"- , " , null"- , " , reverse"- , " , tail"- , " , (++)"- , " )"- , "import Data.Map (Map, insert, lookup, (!))"- , "import qualified Data.Map as M"- , "import Only.Instances ()"- , ""- , "import Foo (Bar (..))"- , "import Herp.Derp.Internals hiding (foo)"- , ""- , "herp = putStrLn \"import Hello world\""- ]------------------------------------------------------------------------------------case10 :: Assertion-case10 =- let- options = Options Group WithAlias True Multiline Inherit (LPConstant 4) True False- in- expected @=? testSnippet (step (Just 40) options) input- where- expected = Snippet- [ "module Herp where"- , ""- , "import Control.Monad"- , "import Data.List as List"- , " ( concat"- , " , foldl"- , " , foldr"- , " , head"- , " , init"- , " , last"- , " , length"- , " , map"- , " , null"- , " , reverse"- , " , tail"- , " , (++)"- , " )"- , "import Data.Map"- , " ( Map"- , " , insert"- , " , lookup"- , " , (!)"- , " )"- , "import qualified Data.Map as M"- , "import Only.Instances ()"- , ""- , "import Foo (Bar (..))"- , "import Herp.Derp.Internals hiding (foo)"- , ""- , "herp = putStrLn \"import Hello world\""- ]-------------------------------------------------------------------------------------case11 :: Assertion-case11 =- let- options = Options Group NewLine True Inline Inherit (LPConstant 4) True False- in- expected @=? testSnippet (step (Just 80) options) input- where- expected = Snippet- [ "module Herp where"- , ""- , "import Control.Monad"- , "import Data.List as List"- , " (concat, foldl, foldr, head, init, last, length, map, null, reverse, tail,"- , " (++))"- , "import Data.Map"- , " (Map, insert, lookup, (!))"- , "import qualified Data.Map as M"- , "import Only.Instances"- , " ()"- , ""- , "import Foo"- , " (Bar (..))"- , "import Herp.Derp.Internals hiding"- , " (foo)"-- , ""- , "herp = putStrLn \"import Hello world\""- ]---case11b :: Assertion-case11b =- let- options = Options Group WithModuleName True Inline Inherit (LPConstant 4) True False- in- expected @=? testSnippet (step (Just 80) options) input- where- expected = Snippet- [ "module Herp where"- , ""- , "import Control.Monad"- , "import Data.List as List (concat, foldl, foldr, head, init, last,"- , " length, map, null, reverse, tail, (++))"- , "import Data.Map (Map, insert, lookup, (!))"- , "import qualified Data.Map as M"- , "import Only.Instances ()"- , ""- , "import Foo (Bar (..))"- , "import Herp.Derp.Internals hiding (foo)"- , ""- , "herp = putStrLn \"import Hello world\""- ]------------------------------------------------------------------------------------case12 :: Assertion-case12 =- let- options = Options Group NewLine True Inline Inherit (LPConstant 2) True False- in- expected @=? testSnippet (step (Just 80) options) input'- where- input' = Snippet- [ "import Data.List (map)"- ]-- expected = Snippet- [ "import Data.List"- , " (map)"- ]------------------------------------------------------------------------------------case12b :: Assertion-case12b =- let- options = Options Group WithModuleName True Inline Inherit (LPConstant 2) True False- in- expected @=? testStep' (step (Just 80) options) input'- where- input' = ["import Data.List (map)"]-- expected = input'------------------------------------------------------------------------------------case13 :: Assertion-case13 =- let- options = Options None WithAlias True InlineWithBreak Inherit (LPConstant 4) True False- in- expected @=? testSnippet (step (Just 80) options) input'- where- input' = Snippet- [ "import qualified Data.List as List (concat, foldl, foldr, head, init,"- , " last, length, map, null, reverse, tail, (++))"- ]-- expected = Snippet- [ "import qualified Data.List as List"- , " (concat, foldl, foldr, head, init, last, length, map, null, reverse, tail,"- , " (++))"- ]------------------------------------------------------------------------------------case13b :: Assertion-case13b =- let- options = Options None WithModuleName True InlineWithBreak Inherit (LPConstant 4) True False- in- expected @=? testSnippet (step (Just 80) options) input'- where- input' = Snippet- [ "import qualified Data.List as List (concat, foldl, foldr, head, init,"- , " last, length, map, null, reverse, tail, (++))"- ]-- expected = Snippet- [ "import qualified Data.List as List"- , " (concat, foldl, foldr, head, init, last, length, map, null, reverse, tail,"- , " (++))"- ]------------------------------------------------------------------------------------case14 :: Assertion-case14 =- let- options = Options None WithAlias True InlineWithBreak Inherit (LPConstant 10) True False- in- expected @=? testSnippet (step (Just 80) options) expected- where- expected = Snippet- [ "import qualified Data.List as List (concat, map, null, reverse, tail, (++))"- ]------------------------------------------------------------------------------------case15 :: Assertion-case15 =- let- options = Options None AfterAlias True Multiline Inherit (LPConstant 4) True False- in- expected @=? testSnippet (step (Just 80) options) input'- where- expected = Snippet- [ "import Data.Acid (AcidState)"- , "import qualified Data.Acid as Acid"- , " ( closeAcidState"- , " , createCheckpoint"- , " , openLocalStateFrom"- , " )"- , "import Data.Default.Class (Default (def))"- , ""- , "import qualified Herp.Derp.Internal.Types.Foobar as Internal (bar, foo)"- ]-- input' = Snippet- [ "import Data.Acid (AcidState)"- , "import qualified Data.Acid as Acid (closeAcidState, createCheckpoint, openLocalStateFrom)"- , "import Data.Default.Class (Default (def))"- , ""- , "import qualified Herp.Derp.Internal.Types.Foobar as Internal (foo, bar)"- ]------------------------------------------------------------------------------------case16 :: Assertion-case16 =- let- options = Options None AfterAlias True Multiline Inherit (LPConstant 4) False False- in- expected @=? testSnippet (step (Just 80) options) input'- where- expected = Snippet- [ "import Data.Acid (AcidState)"- , "import Data.Default.Class (Default(def))"- , ""- , "import Data.Maybe (Maybe(Just, Nothing))"- , ""- , "import Data.Foo (Foo(Bar, Foo), Goo(Goo))"- ]-- input' = Snippet- [ "import Data.Acid (AcidState)"- , "import Data.Default.Class (Default(def))"- , ""- , "import Data.Maybe (Maybe (Just, Nothing))"- , ""- , "import Data.Foo (Foo (Foo,Bar), Goo(Goo))"- ]------------------------------------------------------------------------------------case17 :: Assertion-case17 =- let- options = Options None AfterAlias True Multiline Inherit (LPConstant 4) True False- in- expected @=? testSnippet (step (Just 80) options) input'- where- expected = Snippet- [ "import Control.Applicative (Applicative (pure, (<*>)))"- , ""- , "import Data.Identity (Identity (Identity, runIdentity))"- ]-- input' = Snippet- [ "import Control.Applicative (Applicative ((<*>),pure))"- , ""- , "import Data.Identity (Identity (runIdentity,Identity))"- ]------------------------------------------------------------------------------------case18 :: Assertion-case18 =- let- options = Options None AfterAlias True InlineToMultiline Inherit (LPConstant 4) True False- in- expected @=? testSnippet (step (Just 40) options) input'- where- expected = Snippet- ----------------------------------------- [ "import Data.Foo as Foo (Bar, Baz, Foo)"- , ""- , "import Data.Identity"- , " (Identity (Identity, runIdentity))"- , ""- , "import Data.Acid as Acid"- , " ( closeAcidState"- , " , createCheckpoint"- , " , openLocalStateFrom"- , " )"- ]-- input' = Snippet- [ "import Data.Foo as Foo (Bar, Baz, Foo)"- , ""- , "import Data.Identity (Identity (Identity, runIdentity))"- , ""- , "import Data.Acid as Acid (closeAcidState, createCheckpoint, openLocalStateFrom)"- ]------------------------------------------------------------------------------------case19 :: Assertion-case19 =- let- options = Options Global NewLine True InlineWithBreak RightAfter (LPConstant 17) True False- in- expected @=? testSnippet (step (Just 40) options) case19input- where- expected = Snippet- ----------------------------------------- [ "import Prelude ()"- , "import Prelude.Compat hiding"- , " (foldMap)"- , ""- , "import Data.List"- , " (foldl', intercalate,"- , " intersperse)"- ]---case19b :: Assertion-case19b =- let- options = Options File NewLine True InlineWithBreak RightAfter (LPConstant 17) True False- in- expected @=? testSnippet (step (Just 40) options) case19input- where- expected = Snippet- ----------------------------------------- [ "import Prelude ()"- , "import Prelude.Compat hiding (foldMap)"- , ""- , "import Data.List"- , " (foldl', intercalate,"- , " intersperse)"- ]---case19c :: Assertion-case19c =- let- options = Options File NewLine True InlineWithBreak RightAfter LPModuleName True False- in- expected @=? testSnippet (step (Just 40) options) case19input- where- expected = Snippet- ----------------------------------------- [ "import Prelude ()"- , "import Prelude.Compat hiding (foldMap)"- , ""- , "import Data.List"- , " (foldl', intercalate,"- , " intersperse)"- ]---case19d :: Assertion-case19d =- let- options = Options Global NewLine True InlineWithBreak RightAfter LPModuleName True False- in- expected @=? testSnippet (step (Just 40) options) case19input- where- expected = Snippet- ----------------------------------------- [ "import Prelude ()"- , "import Prelude.Compat hiding"- , " (foldMap)"- , ""- , "import Data.List"- , " (foldl', intercalate,"- , " intersperse)"- ]---case19input :: Snippet-case19input = Snippet- [ "import Prelude.Compat hiding (foldMap)"- , "import Prelude ()"- , ""- , "import Data.List (foldl', intercalate, intersperse)"- ]------------------------------------------------------------------------------------case20 :: Assertion-case20 = expected- @=? testSnippet (step (Just 80) defaultOptions) input'- where- expected = Snippet- [ "import {-# SOURCE #-} Data.ByteString as BS"- , "import qualified Data.Map as Map"- , "import Data.Set (empty)"- , "import {-# SOURCE #-} qualified Data.Text as T"- ]- input' = Snippet- [ "import {-# SOURCE #-} Data.ByteString as BS"- , "import {-# SOURCE #-} qualified Data.Text as T"- , "import qualified Data.Map as Map"- , "import Data.Set (empty)"- ]------------------------------------------------------------------------------------case21 :: Assertion-case21 = expected- @=? testSnippet (step (Just 80) defaultOptions) input'- where- expected = Snippet- [ "{-# LANGUAGE ExplicitNamespaces #-}"- , "import X1 (A, B, C)"- , "import X2 (A, B, C)"- , "import X3 (A (..))"- , "import X4 (A (..))"- , "import X5 (A (..))"- , "import X6 (A (a, b, c), B (m, n, o))"- , "import X7 (a, b, c)"- , "import X8 (type (+), (+))"- , "import X9 hiding (x, y, z)"- ]- input' = Snippet- [ "{-# LANGUAGE ExplicitNamespaces #-}"- , "import X1 (A, B, A, C, A, B, A)"- , "import X2 (C(), B(), A())"- , "import X3 (A(..))"- , "import X4 (A, A(..))"- , "import X5 (A(..), A(x))"- , "import X6 (A(a,b), B(m,n), A(c), B(o))"- , "import X7 (a, b, a, c)"- , "import X8 (type (+), (+))"- , "import X9 hiding (x, y, z, x)"- ]------------------------------------------------------------------------------------case22 :: Assertion-case22 = expected- @=? testSnippet (step (Just 80) defaultOptions) input'- where- expected = Snippet- [ "{-# LANGUAGE PackageImports #-}"- , "import A"- , "import \"blah\" A"- , "import \"foo\" A"- , "import qualified \"foo\" A as X"- , "import \"foo\" B (shortName, someLongName, someLongerName,"- , " theLongestNameYet)"- ]- input' = Snippet- [ "{-# LANGUAGE PackageImports #-}"- , "import A"- , "import \"foo\" A"- , "import \"blah\" A"- , "import qualified \"foo\" A as X"- -- this import fits into 80 chats without "foo",- -- but doesn't fit when "foo" is included into the calculation- , "import \"foo\" B (someLongName, someLongerName, " ++- "theLongestNameYet, shortName)"- ]------------------------------------------------------------------------------------case23 :: Assertion-case23 =- let- options = Options None AfterAlias False Inline Inherit (LPConstant 4) True True- in- expected @=? testSnippet (step (Just 40) options) input'- where- expected = Snippet- ----------------------------------------- [ "import Data.Acid ( AcidState )"- , "import Data.Default.Class ( Default (def) )"- , ""- , "import Data.Monoid ( (<>) )"- , ""- , "import Data.ALongName.Foo ( Boo, Foo,"- , " Goo )"- ]-- input' = Snippet- [ "import Data.Acid (AcidState)"- , "import Data.Default.Class (Default(def))"- , ""- , "import Data.Monoid ((<>) )"- , ""- , "import Data.ALongName.Foo (Foo, Goo, Boo)"- ]------------------------------------------------------------------------------------case23b :: Assertion-case23b =- let- options = Options None WithModuleName False Inline Inherit (LPConstant 4) True True- in- expected @=? testSnippet (step (Just 40) options) input'- where- expected = Snippet- ----------------------------------------- [ "import Data.Acid ( AcidState )"- , "import Data.Default.Class"- , " ( Default (def) )"- , ""- , "import Data.Monoid ( (<>) )"- , ""- , "import Data.ALongName.Foo ( Boo, Foo,"- , " Goo )"- ]-- input' = Snippet- [ "import Data.Acid (AcidState)"- , "import Data.Default.Class (Default(def))"- , ""- , "import Data.Monoid ((<>) )"- , ""- , "import Data.ALongName.Foo (Foo, Goo, Boo)"- ]------------------------------------------------------------------------------------case24 :: Assertion-case24 =- let- options = Options None AfterAlias False InlineWithBreak Inherit (LPConstant 4) True True- in- expected @=? testSnippet (step (Just 40) options) input'- where- expected = Snippet- ----------------------------------------- [ "import Data.Acid ( AcidState )"- , "import Data.Default.Class"- , " ( Default (def) )"- , ""- , "import Data.ALongName.Foo"- , " ( BooReallyLong, FooReallyLong,"- , " GooReallyLong )"- ]-- input' = Snippet- [ "import Data.Acid (AcidState)"- , "import Data.Default.Class (Default(def))"- , ""- , "import Data.ALongName.Foo (FooReallyLong, " ++- "GooReallyLong, BooReallyLong)"- ]------------------------------------------------------------------------------------case25 :: Assertion-case25 =- let- options = Options Group AfterAlias False Multiline Inherit (LPConstant 4) False False- in- expected @=? testSnippet (step (Just 80) options) input'- where- expected = Snippet- [ "import Data.Acid (AcidState)"- , "import Data.Default.Class (Default(def))"- , ""- , "import Data.Maybe (Maybe(Just, Nothing))"- , "import qualified Data.Maybe.Extra (Maybe(Just, Nothing))"- , ""- , "import Data.Foo (Foo(Bar, Foo), Goo(Goo))"- ]- input' = Snippet- [ "import Data.Acid (AcidState)"- , "import Data.Default.Class (Default(def))"- , ""- , "import Data.Maybe (Maybe (Just, Nothing))"- , "import qualified Data.Maybe.Extra (Maybe(Just, Nothing))"- , ""- , "import Data.Foo (Foo (Foo,Bar), Goo(Goo))"- ]------------------------------------------------------------------------------------case26 :: Assertion-case26 = expected- @=? testSnippet (step (Just 80) options ) input'- where- options = defaultOptions { listAlign = NewLine, longListAlign = Multiline }- input' = Snippet ["import Data.List"]- expected = Snippet ["import Data.List"]------------------------------------------------------------------------------------case27 :: Assertion-case27 = expected @=? testSnippet (step Nothing $ fromImportAlign Global) input- where- expected = Snippet- [ "module Herp where"- , ""- , "import Control.Monad"- , "import Data.List as List (concat, foldl, foldr, head, init, last, length, map, null, reverse, tail, (++))"- , "import Data.Map (Map, insert, lookup, (!))"- , "import qualified Data.Map as M"- , "import Only.Instances ()"- , ""- , "import Foo (Bar (..))"- , "import Herp.Derp.Internals hiding (foo)"- , ""- , "herp = putStrLn \"import Hello world\""- ]+{-# LANGUAGE OverloadedLists #-}+module Language.Haskell.Stylish.Step.Imports.Tests+ ( tests+ ) where+++--------------------------------------------------------------------------------+import Test.Framework (Test, testGroup)+import Test.Framework.Providers.HUnit (testCase)+import Test.HUnit (Assertion, (@=?))+++--------------------------------------------------------------------------------+import Language.Haskell.Stylish.Step.Imports+import Language.Haskell.Stylish.Tests.Util+++--------------------------------------------------------------------------------+fromImportAlign :: ImportAlign -> Options+fromImportAlign align = defaultOptions { importAlign = align }+++--------------------------------------------------------------------------------+tests :: Test+tests = testGroup "Language.Haskell.Stylish.Step.Imports.Tests"+ [ testCase "case 01" case01+ , testCase "case 02" case02+ , testCase "case 03" case03+ , testCase "case 04" case04+ , testCase "case 05" case05+ , testCase "case 06" case06+ , testCase "case 07" case07+ , testCase "case 08" case08+ , testCase "case 08b" case08b+ , testCase "case 09" case09+ , testCase "case 10" case10+ , testCase "case 11" case11+ , testCase "case 11b" case11b+ , testCase "case 12" case12+ , testCase "case 12b" case12b+ , testCase "case 13" case13+ , testCase "case 13b" case13b+ , testCase "case 14" case14+ , testCase "case 15" case15+ , testCase "case 16" case16+ , testCase "case 17" case17+ , testCase "case 18" case18+ , testCase "case 19" case19+ , testCase "case 19b" case19b+ , testCase "case 19d" case19c+ , testCase "case 19d" case19d+ , testCase "case 20" case20+ , testCase "case 21" case21+ , testCase "case 22" case22+ , testCase "case 23" case23+ , testCase "case 23b" case23b+ , testCase "case 24" case24+ , testCase "case 25" case25+ , testCase "case 26 (issue 185)" case26+ , testCase "case 27" case27+ , testCase "case 28" case28+ , testCase "case 29" case29+ ]+++--------------------------------------------------------------------------------+input :: Snippet+input =+ [ "module Herp where"+ , ""+ , "import qualified Data.Map as M"+ , "import Control.Monad"+ , "import Only.Instances()"+ , "import Data.Map (lookup, (!), insert, Map)"+ , "import Data.List as List (concat, foldl, foldr, head, init, last,\+ \ length, map, null, reverse, tail, (++))"+ , ""+ , "import Herp.Derp.Internals hiding (foo)"+ , "import Foo (Bar (..))"+ , ""+ , "herp = putStrLn \"import Hello world\""+ ]+++--------------------------------------------------------------------------------+case01 :: Assertion+case01 = assertSnippet (step (Just 80) $ fromImportAlign Global) input+ [ "module Herp where"+ , ""+ , "import Control.Monad"+ , "import Data.List as List (concat, foldl, foldr, head, init,"+ , " last, length, map, null, reverse,"+ , " tail, (++))"+ , "import Data.Map (Map, insert, lookup, (!))"+ , "import qualified Data.Map as M"+ , "import Only.Instances ()"+ , ""+ , "import Foo (Bar (..))"+ , "import Herp.Derp.Internals hiding (foo)"+ , ""+ , "herp = putStrLn \"import Hello world\""+ ]+++--------------------------------------------------------------------------------+case02 :: Assertion+case02 = assertSnippet (step (Just 80) $ fromImportAlign Group) input+ [ "module Herp where"+ , ""+ , "import Control.Monad"+ , "import Data.List as List (concat, foldl, foldr, head, init, last,"+ , " length, map, null, reverse, tail, (++))"+ , "import Data.Map (Map, insert, lookup, (!))"+ , "import qualified Data.Map as M"+ , "import Only.Instances ()"+ , ""+ , "import Foo (Bar (..))"+ , "import Herp.Derp.Internals hiding (foo)"+ , ""+ , "herp = putStrLn \"import Hello world\""+ ]+++--------------------------------------------------------------------------------+case03 :: Assertion+case03 = assertSnippet (step (Just 80) $ fromImportAlign None) input+ [ "module Herp where"+ , ""+ , "import Control.Monad"+ , "import Data.List as List (concat, foldl, foldr, head, init, last, length, map,"+ , " null, reverse, tail, (++))"+ , "import Data.Map (Map, insert, lookup, (!))"+ , "import qualified Data.Map as M"+ , "import Only.Instances ()"+ , ""+ , "import Foo (Bar (..))"+ , "import Herp.Derp.Internals hiding (foo)"+ , ""+ , "herp = putStrLn \"import Hello world\""+ ]+++--------------------------------------------------------------------------------+case04 :: Assertion+case04 = assertSnippet (step (Just 80) $ fromImportAlign Global)+ [ "import Data.Aeson.Types (object, typeMismatch, FromJSON(..)," +++ "ToJSON(..), Value(..), parseEither, (.!=), (.:), (.:?), (.=))"+ ]+ [ "import Data.Aeson.Types (FromJSON (..), ToJSON (..), Value (..),"+ , " object, parseEither, typeMismatch, (.!=),"+ , " (.:), (.:?), (.=))"+ ]+++--------------------------------------------------------------------------------+case05 :: Assertion+case05 = assertSnippet (step (Just 80) $ fromImportAlign Group) input' input'+ where+ -- Putting this on a different line shouldn't really help.+ input' = ["import Distribution.PackageDescription.Configuration " +++ "(finalizePackageDescription)"]+++--------------------------------------------------------------------------------+case06 :: Assertion+case06 = assertSnippet (step (Just 80) $ fromImportAlign File) input' input'+ where+ input' =+ [ "import Bar.Qux"+ , "import Foo.Bar"+ ]+++--------------------------------------------------------------------------------+case07 :: Assertion+case07 = assertSnippet (step (Just 80) $ fromImportAlign File)+ [ "import Bar.Qux"+ , ""+ , "import qualified Foo.Bar"+ ]+ [ "import Bar.Qux"+ , ""+ , "import qualified Foo.Bar"+ ]+++--------------------------------------------------------------------------------+case08 :: Assertion+case08 =+ let+ options = Options Global WithAlias True Inline Inherit (LPConstant 4) True False+ in+ assertSnippet (step (Just 80) options) input+ [ "module Herp where"+ , ""+ , "import Control.Monad"+ , "import Data.List as List (concat, foldl, foldr, head, init,"+ , " last, length, map, null, reverse, tail,"+ , " (++))"+ , "import Data.Map (Map, insert, lookup, (!))"+ , "import qualified Data.Map as M"+ , "import Only.Instances ()"+ , ""+ , "import Foo (Bar (..))"+ , "import Herp.Derp.Internals hiding (foo)"+ , ""+ , "herp = putStrLn \"import Hello world\""+ ]+++--------------------------------------------------------------------------------+case08b :: Assertion+case08b =+ let+ options = Options Global WithModuleName True Inline Inherit (LPConstant 4) True False+ in+ assertSnippet (step (Just 80) options) input+ ["module Herp where"+ , ""+ , "import Control.Monad"+ , "import Data.List as List (concat, foldl, foldr, head, init,"+ , " last, length, map, null, reverse, tail, (++))"+ , "import Data.Map (Map, insert, lookup, (!))"+ , "import qualified Data.Map as M"+ , "import Only.Instances ()"+ , ""+ , "import Foo (Bar (..))"+ , "import Herp.Derp.Internals hiding (foo)"+ , ""+ , "herp = putStrLn \"import Hello world\""+ ]+++--------------------------------------------------------------------------------+case09 :: Assertion+case09 =+ let+ options = Options Global WithAlias True Multiline Inherit (LPConstant 4) True False+ in+ assertSnippet (step (Just 80) options) input+ [ "module Herp where"+ , ""+ , "import Control.Monad"+ , "import Data.List as List"+ , " ( concat"+ , " , foldl"+ , " , foldr"+ , " , head"+ , " , init"+ , " , last"+ , " , length"+ , " , map"+ , " , null"+ , " , reverse"+ , " , tail"+ , " , (++)"+ , " )"+ , "import Data.Map (Map, insert, lookup, (!))"+ , "import qualified Data.Map as M"+ , "import Only.Instances ()"+ , ""+ , "import Foo (Bar (..))"+ , "import Herp.Derp.Internals hiding (foo)"+ , ""+ , "herp = putStrLn \"import Hello world\""+ ]+++--------------------------------------------------------------------------------+case10 :: Assertion+case10 =+ let+ options = Options Group WithAlias True Multiline Inherit (LPConstant 4) True False+ in+ assertSnippet (step (Just 40) options) input+ [ "module Herp where"+ , ""+ , "import Control.Monad"+ , "import Data.List as List"+ , " ( concat"+ , " , foldl"+ , " , foldr"+ , " , head"+ , " , init"+ , " , last"+ , " , length"+ , " , map"+ , " , null"+ , " , reverse"+ , " , tail"+ , " , (++)"+ , " )"+ , "import Data.Map"+ , " ( Map"+ , " , insert"+ , " , lookup"+ , " , (!)"+ , " )"+ , "import qualified Data.Map as M"+ , "import Only.Instances ()"+ , ""+ , "import Foo (Bar (..))"+ , "import Herp.Derp.Internals hiding (foo)"+ , ""+ , "herp = putStrLn \"import Hello world\""+ ]++++--------------------------------------------------------------------------------+case11 :: Assertion+case11 =+ let+ options = Options Group NewLine True Inline Inherit (LPConstant 4) True False+ in+ assertSnippet (step (Just 80) options) input+ [ "module Herp where"+ , ""+ , "import Control.Monad"+ , "import Data.List as List"+ , " (concat, foldl, foldr, head, init, last, length, map, null, reverse, tail,"+ , " (++))"+ , "import Data.Map"+ , " (Map, insert, lookup, (!))"+ , "import qualified Data.Map as M"+ , "import Only.Instances"+ , " ()"+ , ""+ , "import Foo"+ , " (Bar (..))"+ , "import Herp.Derp.Internals hiding"+ , " (foo)"++ , ""+ , "herp = putStrLn \"import Hello world\""+ ]++case11b :: Assertion+case11b =+ let+ options = Options Group WithModuleName True Inline Inherit (LPConstant 4) True False+ in+ assertSnippet (step (Just 80) options) input+ [ "module Herp where"+ , ""+ , "import Control.Monad"+ , "import Data.List as List (concat, foldl, foldr, head, init, last,"+ , " length, map, null, reverse, tail, (++))"+ , "import Data.Map (Map, insert, lookup, (!))"+ , "import qualified Data.Map as M"+ , "import Only.Instances ()"+ , ""+ , "import Foo (Bar (..))"+ , "import Herp.Derp.Internals hiding (foo)"+ , ""+ , "herp = putStrLn \"import Hello world\""+ ]+++--------------------------------------------------------------------------------+case12 :: Assertion+case12 =+ let+ options = Options Group NewLine True Inline Inherit (LPConstant 2) True False+ in+ assertSnippet (step (Just 80) options)+ [ "import Data.List (map)"+ ]+ [ "import Data.List"+ , " (map)"+ ]+++--------------------------------------------------------------------------------+case12b :: Assertion+case12b =+ let+ options = Options Group WithModuleName True Inline Inherit (LPConstant 2) True False+ in+ assertSnippet (step (Just 80) options)+ ["import Data.List (map)"]+ ["import Data.List (map)"]+++--------------------------------------------------------------------------------+case13 :: Assertion+case13 =+ let+ options = Options None WithAlias True InlineWithBreak Inherit (LPConstant 4) True False+ in+ assertSnippet (step (Just 80) options)+ [ "import qualified Data.List as List (concat, foldl, foldr, head, init,"+ , " last, length, map, null, reverse, tail, (++))"+ ]+ [ "import qualified Data.List as List"+ , " (concat, foldl, foldr, head, init, last, length, map, null, reverse, tail,"+ , " (++))"+ ]++case13b :: Assertion+case13b =+ let+ options = Options None WithModuleName True InlineWithBreak Inherit (LPConstant 4) True False+ in+ assertSnippet (step (Just 80) options)+ [ "import qualified Data.List as List (concat, foldl, foldr, head, init,"+ , " last, length, map, null, reverse, tail, (++))"+ ]+ [ "import qualified Data.List as List"+ , " (concat, foldl, foldr, head, init, last, length, map, null, reverse, tail,"+ , " (++))"+ ]+++--------------------------------------------------------------------------------+case14 :: Assertion+case14 =+ let+ options = Options None WithAlias True InlineWithBreak Inherit (LPConstant 10) True False+ in+ assertSnippet (step (Just 80) options)+ [ "import qualified Data.List as List (concat, map, null, reverse, tail, (++))"+ ]+ [ "import qualified Data.List as List (concat, map, null, reverse, tail, (++))"+ ]+++--------------------------------------------------------------------------------+case15 :: Assertion+case15 =+ let+ options = Options None AfterAlias True Multiline Inherit (LPConstant 4) True False+ in+ assertSnippet (step (Just 80) options)+ [ "import Data.Acid (AcidState)"+ , "import qualified Data.Acid as Acid (closeAcidState, createCheckpoint, openLocalStateFrom)"+ , "import Data.Default.Class (Default (def))"+ , ""+ , "import qualified Herp.Derp.Internal.Types.Foobar as Internal (foo, bar)"+ ]+ [ "import Data.Acid (AcidState)"+ , "import qualified Data.Acid as Acid"+ , " ( closeAcidState"+ , " , createCheckpoint"+ , " , openLocalStateFrom"+ , " )"+ , "import Data.Default.Class (Default (def))"+ , ""+ , "import qualified Herp.Derp.Internal.Types.Foobar as Internal (bar, foo)"+ ]+++--------------------------------------------------------------------------------+case16 :: Assertion+case16 =+ let+ options = Options None AfterAlias True Multiline Inherit (LPConstant 4) False False+ in+ assertSnippet (step (Just 80) options)+ [ "import Data.Acid (AcidState)"+ , "import Data.Default.Class (Default(def))"+ , ""+ , "import Data.Maybe (Maybe (Just, Nothing))"+ , ""+ , "import Data.Foo (Foo (Foo,Bar), Goo(Goo))"+ ]+ [ "import Data.Acid (AcidState)"+ , "import Data.Default.Class (Default(def))"+ , ""+ , "import Data.Maybe (Maybe(Just, Nothing))"+ , ""+ , "import Data.Foo (Foo(Bar, Foo), Goo(Goo))"+ ]+++--------------------------------------------------------------------------------+case17 :: Assertion+case17 =+ let+ options = Options None AfterAlias True Multiline Inherit (LPConstant 4) True False+ in+ assertSnippet (step (Just 80) options)+ [ "import Control.Applicative (Applicative ((<*>),pure))"+ , ""+ , "import Data.Identity (Identity (runIdentity,Identity))"+ ]+ [ "import Control.Applicative (Applicative (pure, (<*>)))"+ , ""+ , "import Data.Identity (Identity (Identity, runIdentity))"+ ]+++--------------------------------------------------------------------------------+case18 :: Assertion+case18 =+ let+ options = Options None AfterAlias True InlineToMultiline Inherit (LPConstant 4) True False+ in+ assertSnippet (step (Just 40) options)+ [ "import Data.Foo as Foo (Bar, Baz, Foo)"+ , ""+ , "import Data.Identity (Identity (Identity, runIdentity))"+ , ""+ , "import Data.Acid as Acid (closeAcidState, createCheckpoint, openLocalStateFrom)"+ ]+ ----------------------------------------+ [ "import Data.Foo as Foo (Bar, Baz, Foo)"+ , ""+ , "import Data.Identity"+ , " (Identity (Identity, runIdentity))"+ , ""+ , "import Data.Acid as Acid"+ , " ( closeAcidState"+ , " , createCheckpoint"+ , " , openLocalStateFrom"+ , " )"+ ]+++--------------------------------------------------------------------------------+case19 :: Assertion+case19 =+ let+ options = Options Global NewLine True InlineWithBreak RightAfter (LPConstant 17) True False+ in+ assertSnippet (step (Just 40) options) case19input+ ----------------------------------------+ [ "import Prelude ()"+ , "import Prelude.Compat hiding"+ , " (foldMap)"+ , ""+ , "import Data.List"+ , " (foldl', intercalate,"+ , " intersperse)"+ ]++case19b :: Assertion+case19b =+ let+ options = Options File NewLine True InlineWithBreak RightAfter (LPConstant 17) True False+ in+ assertSnippet (step (Just 40) options) case19input+ ----------------------------------------+ [ "import Prelude ()"+ , "import Prelude.Compat hiding (foldMap)"+ , ""+ , "import Data.List"+ , " (foldl', intercalate,"+ , " intersperse)"+ ]++case19c :: Assertion+case19c =+ let+ options = Options File NewLine True InlineWithBreak RightAfter LPModuleName True False+ in+ assertSnippet (step (Just 40) options) case19input+ ----------------------------------------+ [ "import Prelude ()"+ , "import Prelude.Compat hiding (foldMap)"+ , ""+ , "import Data.List"+ , " (foldl', intercalate,"+ , " intersperse)"+ ]++case19d :: Assertion+case19d =+ let+ options = Options Global NewLine True InlineWithBreak RightAfter LPModuleName True False+ in+ assertSnippet (step (Just 40) options) case19input+ ----------------------------------------+ [ "import Prelude ()"+ , "import Prelude.Compat hiding"+ , " (foldMap)"+ , ""+ , "import Data.List"+ , " (foldl', intercalate,"+ , " intersperse)"+ ]++case19input :: Snippet+case19input = Snippet+ [ "import Prelude.Compat hiding (foldMap)"+ , "import Prelude ()"+ , ""+ , "import Data.List (foldl', intercalate, intersperse)"+ ]+++--------------------------------------------------------------------------------+case20 :: Assertion+case20 = expected+ @=? testSnippet (step (Just 80) defaultOptions) input'+ where+ expected = Snippet+ [ "import {-# SOURCE #-} Data.ByteString as BS"+ , "import qualified Data.Map as Map"+ , "import Data.Set (empty)"+ , "import {-# SOURCE #-} qualified Data.Text as T"+ ]+ input' = Snippet+ [ "import {-# SOURCE #-} Data.ByteString as BS"+ , "import {-# SOURCE #-} qualified Data.Text as T"+ , "import qualified Data.Map as Map"+ , "import Data.Set (empty)"+ ]+++--------------------------------------------------------------------------------+case21 :: Assertion+case21 =+ assertSnippet (step (Just 80) defaultOptions)+ [ "{-# LANGUAGE ExplicitNamespaces #-}"+ , "import X1 (A, B, A, C, A, B, A)"+ , "import X2 (C(), B(), A())"+ , "import X3 (A(..))"+ , "import X4 (A, A(..))"+ , "import X5 (A(..), A(x))"+ , "import X6 (A(a,b), B(m,n), A(c), B(o))"+ , "import X7 (a, b, a, c)"+ , "import X8 (type (+), (+))"+ , "import X9 hiding (x, y, z, x)"+ ]+ [ "{-# LANGUAGE ExplicitNamespaces #-}"+ , "import X1 (A, B, C)"+ , "import X2 (A, B, C)"+ , "import X3 (A (..))"+ , "import X4 (A (..))"+ , "import X5 (A (..))"+ , "import X6 (A (a, b, c), B (m, n, o))"+ , "import X7 (a, b, c)"+ , "import X8 (type (+), (+))"+ , "import X9 hiding (x, y, z)"+ ]+++--------------------------------------------------------------------------------+case22 :: Assertion+case22 = assertSnippet (step (Just 80) defaultOptions)+ [ "{-# LANGUAGE PackageImports #-}"+ , "import A"+ , "import \"foo\" A"+ , "import \"blah\" A"+ , "import qualified \"foo\" A as X"+ -- this import fits into 80 chats without "foo",+ -- but doesn't fit when "foo" is included into the calculation+ , "import \"foo\" B (someLongName, someLongerName, " +++ "theLongestNameYet, shortName)"+ ]+ [ "{-# LANGUAGE PackageImports #-}"+ , "import A"+ , "import \"blah\" A"+ , "import \"foo\" A"+ , "import qualified \"foo\" A as X"+ , "import \"foo\" B (shortName, someLongName, someLongerName,"+ , " theLongestNameYet)"+ ]+++--------------------------------------------------------------------------------+case23 :: Assertion+case23 =+ let+ options = Options None AfterAlias False Inline Inherit (LPConstant 4) True True+ in+ assertSnippet (step (Just 40) options)+ [ "import Data.Acid (AcidState)"+ , "import Data.Default.Class (Default(def))"+ , ""+ , "import Data.Monoid ((<>) )"+ , ""+ , "import Data.ALongName.Foo (Foo, Goo, Boo)"+ ]+ ----------------------------------------+ [ "import Data.Acid ( AcidState )"+ , "import Data.Default.Class ( Default (def) )"+ , ""+ , "import Data.Monoid ( (<>) )"+ , ""+ , "import Data.ALongName.Foo ( Boo, Foo,"+ , " Goo )"+ ]+++--------------------------------------------------------------------------------+case23b :: Assertion+case23b =+ let+ options = Options None WithModuleName False Inline Inherit (LPConstant 4) True True+ in+ assertSnippet (step (Just 40) options)+ [ "import Data.Acid (AcidState)"+ , "import Data.Default.Class (Default(def))"+ , ""+ , "import Data.Monoid ((<>) )"+ , ""+ , "import Data.ALongName.Foo (Foo, Goo, Boo)"+ ]+ ----------------------------------------+ [ "import Data.Acid ( AcidState )"+ , "import Data.Default.Class"+ , " ( Default (def) )"+ , ""+ , "import Data.Monoid ( (<>) )"+ , ""+ , "import Data.ALongName.Foo ( Boo, Foo,"+ , " Goo )"+ ]+++--------------------------------------------------------------------------------+case24 :: Assertion+case24 =+ let+ options = Options None AfterAlias False InlineWithBreak Inherit (LPConstant 4) True True+ in+ assertSnippet (step (Just 40) options)+ [ "import Data.Acid (AcidState)"+ , "import Data.Default.Class (Default(def))"+ , ""+ , "import Data.ALongName.Foo (FooReallyLong, " +++ "GooReallyLong, BooReallyLong)"+ ]+ ----------------------------------------+ [ "import Data.Acid ( AcidState )"+ , "import Data.Default.Class"+ , " ( Default (def) )"+ , ""+ , "import Data.ALongName.Foo"+ , " ( BooReallyLong, FooReallyLong,"+ , " GooReallyLong )"+ ]+++--------------------------------------------------------------------------------+case25 :: Assertion+case25 =+ let+ options = Options Group AfterAlias False Multiline Inherit (LPConstant 4) False False+ in+ assertSnippet (step (Just 80) options)+ [ "import Data.Acid (AcidState)"+ , "import Data.Default.Class (Default(def))"+ , ""+ , "import Data.Maybe (Maybe (Just, Nothing))"+ , "import qualified Data.Maybe.Extra (Maybe(Just, Nothing))"+ , ""+ , "import Data.Foo (Foo (Foo,Bar), Goo(Goo))"+ ]+ [ "import Data.Acid (AcidState)"+ , "import Data.Default.Class (Default(def))"+ , ""+ , "import Data.Maybe (Maybe(Just, Nothing))"+ , "import qualified Data.Maybe.Extra (Maybe(Just, Nothing))"+ , ""+ , "import Data.Foo (Foo(Bar, Foo), Goo(Goo))"+ ]+++--------------------------------------------------------------------------------+case26 :: Assertion+case26 =+ assertSnippet (step (Just 80) options)+ ["import Data.List"]+ ["import Data.List"]+ where+ options = defaultOptions { listAlign = NewLine, longListAlign = Multiline }+++--------------------------------------------------------------------------------+case27 :: Assertion+case27 = assertSnippet (step Nothing $ fromImportAlign Global) input+ [ "module Herp where"+ , ""+ , "import Control.Monad"+ , "import Data.List as List (concat, foldl, foldr, head, init, last, length, map, null, reverse, tail, (++))"+ , "import Data.Map (Map, insert, lookup, (!))"+ , "import qualified Data.Map as M"+ , "import Only.Instances ()"+ , ""+ , "import Foo (Bar (..))"+ , "import Herp.Derp.Internals hiding (foo)"+ , ""+ , "herp = putStrLn \"import Hello world\""+ ]+++--------------------------------------------------------------------------------+case28 :: Assertion+case28 = assertSnippet (step (Just 80) $ fromImportAlign Global)+ [ "import Data.Default.Class (Default(def))"+ , "import qualified Data.Aeson as JSON"+ , "import qualified Data.Aeson as JSON"+ , "import Control.Monad"+ , "import Control.Monad"+ , ""+ , "import Data.Maybe (Maybe (Just, Nothing))"+ , "import qualified Data.Maybe.Extra (Maybe(Just, Nothing))"+ , ""+ , "import Data.Foo (Foo (Foo,Bar), Goo(Goo))"+ , "import Data.Foo (Foo (Foo,Bar))"+ , "import Data.Set (empty, intersect)"+ , "import Data.Set (empty, nub)"+ ]+ [ "import Control.Monad"+ , "import qualified Data.Aeson as JSON"+ , "import Data.Default.Class (Default (def))"+ , ""+ , "import Data.Maybe (Maybe (Just, Nothing))"+ , "import qualified Data.Maybe.Extra (Maybe (Just, Nothing))"+ , ""+ , "import Data.Foo (Foo (Bar, Foo), Goo (Goo))"+ , "import Data.Set (empty, intersect, nub)"+ ]+++--------------------------------------------------------------------------------+case29 :: Assertion+case29 = assertSnippet (step Nothing $ fromImportAlign Group)+ -- Check that "Group" mode recognizes groups with multi-line imports+ [ "import Foo (foo)"+ , "import BarBar ( bar"+ , " , kek)"+ , "import Abcd ()"+ , ""+ , "import A (A)"+ ]+ [ "import Abcd ()"+ , "import BarBar (bar, kek)"+ , "import Foo (foo)"+ , ""+ , "import A (A)"+ ]