--- /dev/null
+// Copyright ©2013 The Gonum 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 mat
+
+import "testing"
+
+func leaksPanic(fn func()) (panicked bool) {
+ defer func() {
+ r := recover()
+ panicked = r != nil
+ }()
+ Maybe(fn)
+ return
+}
+
+func TestMaybe(t *testing.T) {
+ for i, test := range []struct {
+ fn func()
+ panics bool
+ errors bool
+ }{
+ {
+ fn: func() {},
+ panics: false,
+ errors: false,
+ },
+ {
+ fn: func() { panic("panic") },
+ panics: true,
+ errors: false,
+ },
+ {
+ fn: func() { panic(Error{"panic"}) },
+ panics: false,
+ errors: true,
+ },
+ } {
+ panicked := leaksPanic(test.fn)
+ if panicked != test.panics {
+ t.Errorf("unexpected panic state for test %d: got: panicked=%t want: panicked=%t",
+ i, panicked, test.panics)
+ }
+ if test.errors {
+ err := Maybe(test.fn)
+ stack, ok := err.(ErrorStack)
+ if !ok {
+ t.Errorf("unexpected error type: got:%T want:%T", stack, ErrorStack{})
+ }
+ if stack.StackTrace == "" {
+ t.Error("expected non-empty stack trace")
+ }
+ }
+ }
+}