testuite: fix libtdc++ libatomic flags
[official-gcc.git] / libgo / go / testing / example.go
blob0217c5d2425a61ba69421a97c11434adc599b043
1 // Copyright 2009 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
5 package testing
7 import (
8 "fmt"
9 "os"
10 "sort"
11 "strings"
12 "time"
15 type InternalExample struct {
16 Name string
17 F func()
18 Output string
19 Unordered bool
22 // RunExamples is an internal function but exported because it is cross-package;
23 // it is part of the implementation of the "go test" command.
24 func RunExamples(matchString func(pat, str string) (bool, error), examples []InternalExample) (ok bool) {
25 _, ok = runExamples(matchString, examples)
26 return ok
29 func runExamples(matchString func(pat, str string) (bool, error), examples []InternalExample) (ran, ok bool) {
30 ok = true
32 var eg InternalExample
34 for _, eg = range examples {
35 matched, err := matchString(*match, eg.Name)
36 if err != nil {
37 fmt.Fprintf(os.Stderr, "testing: invalid regexp for -test.run: %s\n", err)
38 os.Exit(1)
40 if !matched {
41 continue
43 ran = true
44 if !runExample(eg) {
45 ok = false
49 return ran, ok
52 func sortLines(output string) string {
53 lines := strings.Split(output, "\n")
54 sort.Strings(lines)
55 return strings.Join(lines, "\n")
58 // processRunResult computes a summary and status of the result of running an example test.
59 // stdout is the captured output from stdout of the test.
60 // recovered is the result of invoking recover after running the test, in case it panicked.
62 // If stdout doesn't match the expected output or if recovered is non-nil, it'll print the cause of failure to stdout.
63 // If the test is chatty/verbose, it'll print a success message to stdout.
64 // If recovered is non-nil, it'll panic with that value.
65 // If the test panicked with nil, or invoked runtime.Goexit, it'll be
66 // made to fail and panic with errNilPanicOrGoexit
67 func (eg *InternalExample) processRunResult(stdout string, timeSpent time.Duration, finished bool, recovered interface{}) (passed bool) {
68 passed = true
69 dstr := fmtDuration(timeSpent)
70 var fail string
71 got := strings.TrimSpace(stdout)
72 want := strings.TrimSpace(eg.Output)
73 if eg.Unordered {
74 if sortLines(got) != sortLines(want) && recovered == nil {
75 fail = fmt.Sprintf("got:\n%s\nwant (unordered):\n%s\n", stdout, eg.Output)
77 } else {
78 if got != want && recovered == nil {
79 fail = fmt.Sprintf("got:\n%s\nwant:\n%s\n", got, want)
82 if fail != "" || !finished || recovered != nil {
83 fmt.Printf("--- FAIL: %s (%s)\n%s", eg.Name, dstr, fail)
84 passed = false
85 } else if *chatty {
86 fmt.Printf("--- PASS: %s (%s)\n", eg.Name, dstr)
89 if recovered != nil {
90 // Propagate the previously recovered result, by panicking.
91 panic(recovered)
93 if !finished && recovered == nil {
94 panic(errNilPanicOrGoexit)
97 return