From 246c77339a197d8b936c13bdc160c74cd4563dc6 Mon Sep 17 00:00:00 2001 From: Cesar Gimenes Date: Thu, 1 Mar 2018 22:41:05 -0300 Subject: [PATCH] =?UTF-8?q?adiciona=20fun=C3=A7=C3=A3o=20closer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- interface_closer/closer.go | 13 +++++ interface_closer/closer_test.go | 95 +++++++++++++++++++++++++++++++++ interface_closer/main/main.go | 31 +++++++++++ 3 files changed, 139 insertions(+) create mode 100644 interface_closer/closer.go create mode 100644 interface_closer/closer_test.go create mode 100644 interface_closer/main/main.go diff --git a/interface_closer/closer.go b/interface_closer/closer.go new file mode 100644 index 0000000..0ffc005 --- /dev/null +++ b/interface_closer/closer.go @@ -0,0 +1,13 @@ +package closer + +import ( + "fmt" + "io" +) + +func Closer(a io.Closer) { + err := a.Close() + if err != nil { + fmt.Println(err) + } +} diff --git a/interface_closer/closer_test.go b/interface_closer/closer_test.go new file mode 100644 index 0000000..23b9e73 --- /dev/null +++ b/interface_closer/closer_test.go @@ -0,0 +1,95 @@ +package closer + +import ( + "errors" + "fmt" + "io" + "io/ioutil" + "os" + "testing" +) + +type closerSuccess struct { +} + +func (c closerSuccess) Close() (err error) { + return +} + +type closerError struct { +} + +func (c closerError) Close() (err error) { + err = errors.New("closer error") + return +} + +func TestCloser(t *testing.T) { + + getStdout := func(obj io.Closer) (out []byte, err error) { + rescueStdout := os.Stdout + defer func() { os.Stdout = rescueStdout }() + r, w, err := os.Pipe() + if err != nil { + return nil, err + } + os.Stdout = w + + Closer(obj) + + err = w.Close() + if err != nil { + return + } + out, err = ioutil.ReadAll(r) + return + } + + cs := closerSuccess{} + ce := closerError{} + + type args struct { + body io.Closer + } + type expected struct { + err bool + } + tests := []struct { + name string + args args + want expected + }{ + { + name: "success", + args: args{ + body: cs, + }, + want: expected{ + err: false, + }, + }, + { + name: "error", + args: args{ + body: ce, + }, + want: expected{ + err: true, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + out, err := getStdout(tt.args.body) + if err != nil { + t.Error(err) + return + } + + if (len(out) > 0) != tt.want.err { + fmt.Printf("out: %q\n", string(out)) + t.Errorf("closer() unexpected log %q", string(out)) + } + }) + } +} diff --git a/interface_closer/main/main.go b/interface_closer/main/main.go new file mode 100644 index 0000000..a3ade25 --- /dev/null +++ b/interface_closer/main/main.go @@ -0,0 +1,31 @@ +package main + +import ( + "fmt" + "io" + "os" +) + +func closer(a io.Closer) { + err := a.Close() + if err != nil { + fmt.Println(err) + } +} + +func main() { + file, err := os.Open("nome.txt") + if err != nil { + fmt.Println(err) + return + } + defer closer(file) + + file2, err := os.Open("nome.txt") + if err != nil { + fmt.Println(err) + return + } + defer closer(file2) + // .... +}