Home | History | Annotate | Download | only in fixedbugs
      1 // run
      2 
      3 // Copyright 2016 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 package main
      8 
      9 import (
     10 	"log"
     11 	"reflect"
     12 )
     13 
     14 func test(got, want interface{}) {
     15 	if !reflect.DeepEqual(got, want) {
     16 		log.Fatalf("got %v, want %v", got, want)
     17 	}
     18 }
     19 
     20 func main() {
     21 	var i int
     22 	var ip *int
     23 	var ok interface{}
     24 
     25 	// Channel receives.
     26 	c := make(chan int, 1)
     27 	c2 := make(chan int)
     28 
     29 	c <- 42
     30 	i, ok = <-c
     31 	test(i, 42)
     32 	test(ok, true)
     33 
     34 	c <- 42
     35 	_, ok = <-c
     36 	test(ok, true)
     37 
     38 	c <- 42
     39 	select {
     40 	case i, ok = <-c:
     41 		test(i, 42)
     42 		test(ok, true)
     43 	}
     44 
     45 	c <- 42
     46 	select {
     47 	case _, ok = <-c:
     48 		test(ok, true)
     49 	}
     50 
     51 	c <- 42
     52 	select {
     53 	case i, ok = <-c:
     54 		test(i, 42)
     55 		test(ok, true)
     56 	default:
     57 		log.Fatal("bad select")
     58 	}
     59 
     60 	c <- 42
     61 	select {
     62 	case _, ok = <-c:
     63 		test(ok, true)
     64 	default:
     65 		log.Fatal("bad select")
     66 	}
     67 
     68 	c <- 42
     69 	select {
     70 	case i, ok = <-c:
     71 		test(i, 42)
     72 		test(ok, true)
     73 	case <-c2:
     74 		log.Fatal("bad select")
     75 	}
     76 
     77 	c <- 42
     78 	select {
     79 	case _, ok = <-c:
     80 		test(ok, true)
     81 	case <-c2:
     82 		log.Fatal("bad select")
     83 	}
     84 
     85 	close(c)
     86 	i, ok = <-c
     87 	test(i, 0)
     88 	test(ok, false)
     89 
     90 	_, ok = <-c
     91 	test(ok, false)
     92 
     93 	// Map indexing.
     94 	m := make(map[int]int)
     95 
     96 	i, ok = m[0]
     97 	test(i, 0)
     98 	test(ok, false)
     99 
    100 	_, ok = m[0]
    101 	test(ok, false)
    102 
    103 	m[0] = 42
    104 	i, ok = m[0]
    105 	test(i, 42)
    106 	test(ok, true)
    107 
    108 	_, ok = m[0]
    109 	test(ok, true)
    110 
    111 	// Type assertions.
    112 	var u interface{}
    113 
    114 	i, ok = u.(int)
    115 	test(i, 0)
    116 	test(ok, false)
    117 
    118 	ip, ok = u.(*int)
    119 	test(ip, (*int)(nil))
    120 	test(ok, false)
    121 
    122 	_, ok = u.(int)
    123 	test(ok, false)
    124 
    125 	u = 42
    126 	i, ok = u.(int)
    127 	test(i, 42)
    128 	test(ok, true)
    129 
    130 	_, ok = u.(int)
    131 	test(ok, true)
    132 
    133 	u = &i
    134 	ip, ok = u.(*int)
    135 	test(ip, &i)
    136 	test(ok, true)
    137 
    138 	_, ok = u.(*int)
    139 	test(ok, true)
    140 }
    141