Home | History | Annotate | Download | only in test
      1 // run
      2 
      3 // Copyright 2010 The Go Authors. All rights reserved.
      4 // Use of this source code is governed by a BSD-style
      5 // license that can be found in the LICENSE file.
      6 
      7 // Test of recover for run-time errors.
      8 
      9 // TODO(rsc):
     10 //	null pointer accesses
     11 
     12 package main
     13 
     14 import "strings"
     15 
     16 var x = make([]byte, 10)
     17 
     18 func main() {
     19 	test1()
     20 	test2()
     21 	test3()
     22 	test4()
     23 	test5()
     24 	test6()
     25 	test7()
     26 }
     27 
     28 func mustRecover(s string) {
     29 	v := recover()
     30 	if v == nil {
     31 		panic("expected panic")
     32 	}
     33 	if e := v.(error).Error(); strings.Index(e, s) < 0 {
     34 		panic("want: " + s + "; have: " + e)
     35 	}
     36 }
     37 
     38 func test1() {
     39 	defer mustRecover("index")
     40 	println(x[123])
     41 }
     42 
     43 func test2() {
     44 	defer mustRecover("slice")
     45 	println(x[5:15])
     46 }
     47 
     48 func test3() {
     49 	defer mustRecover("slice")
     50 	var lo = 11
     51 	var hi = 9
     52 	println(x[lo:hi])
     53 }
     54 
     55 func test4() {
     56 	defer mustRecover("interface")
     57 	var x interface{} = 1
     58 	println(x.(float32))
     59 }
     60 
     61 type T struct {
     62 	a, b int
     63 	c    []int
     64 }
     65 
     66 func test5() {
     67 	defer mustRecover("uncomparable")
     68 	var x T
     69 	var z interface{} = x
     70 	println(z != z)
     71 }
     72 
     73 func test6() {
     74 	defer mustRecover("unhashable")
     75 	var x T
     76 	var z interface{} = x
     77 	m := make(map[interface{}]int)
     78 	m[z] = 1
     79 }
     80 
     81 func test7() {
     82 	defer mustRecover("divide by zero")
     83 	var x, y int
     84 	println(x / y)
     85 }
     86