aboutsummaryrefslogtreecommitdiff
path: root/libgo/go/testing/example.go
diff options
context:
space:
mode:
Diffstat (limited to 'libgo/go/testing/example.go')
-rw-r--r--libgo/go/testing/example.go84
1 files changed, 84 insertions, 0 deletions
diff --git a/libgo/go/testing/example.go b/libgo/go/testing/example.go
new file mode 100644
index 0000000..f148951
--- /dev/null
+++ b/libgo/go/testing/example.go
@@ -0,0 +1,84 @@
+// Copyright 2009 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package testing
+
+import (
+ "bytes"
+ "fmt"
+ "io"
+ "os"
+ "time"
+)
+
+type InternalExample struct {
+ Name string
+ F func()
+ Output string
+}
+
+func RunExamples(examples []InternalExample) (ok bool) {
+ ok = true
+
+ stdout, stderr := os.Stdout, os.Stderr
+ defer func() {
+ os.Stdout, os.Stderr = stdout, stderr
+ if e := recover(); e != nil {
+ if err, ok := e.(os.Error); ok {
+ fmt.Fprintln(os.Stderr, err)
+ os.Exit(1)
+ }
+ panic(e)
+ }
+ }()
+
+ for _, eg := range examples {
+ if *chatty {
+ fmt.Fprintln(os.Stderr, "=== RUN:", eg.Name)
+ }
+
+ // capture stdout and stderr for testing purposes
+ r, w, err := os.Pipe()
+ if err != nil {
+ fmt.Fprintln(os.Stderr, err)
+ os.Exit(1)
+ }
+ os.Stdout, os.Stderr = w, w
+ outC := make(chan string)
+ go func() {
+ buf := new(bytes.Buffer)
+ _, err := io.Copy(buf, r)
+ if err != nil {
+ fmt.Fprintln(os.Stderr, err)
+ os.Exit(1)
+ }
+ outC <- buf.String()
+ }()
+
+ // run example
+ ns := -time.Nanoseconds()
+ eg.F()
+ ns += time.Nanoseconds()
+
+ // close pipe, restore stdout/stderr, get output
+ w.Close()
+ os.Stdout, os.Stderr = stdout, stderr
+ out := <-outC
+
+ // report any errors
+ if out != eg.Output {
+ fmt.Fprintf(
+ os.Stderr,
+ "--- FAIL: %s\ngot:\n%s\nwant:\n%s\n",
+ eg.Name, out, eg.Output,
+ )
+ ok = false
+ } else if *chatty {
+ tstr := fmt.Sprintf("(%.2f seconds)", float64(ns)/1e9)
+ fmt.Fprintln(os.Stderr, "--- PASS:", eg.Name, tstr)
+ }
+ }
+
+ return
+}