--- /dev/null
+[!gofumpt] skip 'don''t add or remove imports'
+
+gofumpt -w foo.go
+cmp foo.go foo.go.golden
+
+gofumpt -d foo.go.golden
+! stdout .
+
+-- foo.go --
+package p
+
+import (
+ "io"
+ "io/ioutil" // if the user keeps them in the top group, obey that
+ _ "io/ioutil"
+
+ _ "image/png"
+
+ "bufio" // the above is for a side effect; this one has a comment
+)
+
+import (
+ "os"
+
+ "foo.local/one"
+
+ bytes_ "bytes"
+
+ "io"
+)
+
+import (
+ "foo.local/two"
+
+ "fmt"
+)
+
+// If they are in order, but with extra newlines, join them.
+import (
+ "more"
+
+ "std"
+)
+
+// We need to split std vs non-std in this case too.
+import (
+ "foo.local/three"
+ math "math"
+)
+
+import (
+ "x"
+ // don't mess up this comment
+ "y"
+ // or many
+ // of them
+ "z"
+)
+
+// This used to crash gofumpt, as there's no space to insert an extra newline.
+import (
+"std"
+"non.std/pkg"
+)
+
+// All of the extra imports below are known to not belong in std.
+// For example/ and test/, see https://golang.org/issue/37641.
+import (
+ "io"
+
+ "example/foo"
+ "internal/bar"
+ "test/baz"
+)
+-- foo.go.golden --
+package p
+
+import (
+ "io"
+ "io/ioutil" // if the user keeps them in the top group, obey that
+ _ "io/ioutil"
+
+ _ "image/png"
+
+ "bufio" // the above is for a side effect; this one has a comment
+)
+
+import (
+ "io"
+ "os"
+
+ "foo.local/one"
+
+ bytes_ "bytes"
+)
+
+import (
+ "fmt"
+
+ "foo.local/two"
+)
+
+// If they are in order, but with extra newlines, join them.
+import (
+ "more"
+ "std"
+)
+
+// We need to split std vs non-std in this case too.
+import (
+ math "math"
+
+ "foo.local/three"
+)
+
+import (
+ "x"
+ // don't mess up this comment
+ "y"
+ // or many
+ // of them
+ "z"
+)
+
+// This used to crash gofumpt, as there's no space to insert an extra newline.
+import (
+ "std"
+
+ "non.std/pkg"
+)
+
+// All of the extra imports below are known to not belong in std.
+// For example/ and test/, see https://golang.org/issue/37641.
+import (
+ "io"
+
+ "example/foo"
+ "internal/bar"
+ "test/baz"
+)