github.com/april1989/origin-go-tools@v0.0.32/cmd/cover/testdata/test.go (about)

     1  // Copyright 2013 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.
     4  
     5  // This program is processed by the cover command, and then testAll is called.
     6  // The test driver in main.go can then compare the coverage statistics with expectation.
     7  
     8  // The word LINE is replaced by the line number in this file. When the file is executed,
     9  // the coverage processing has changed the line numbers, so we can't use runtime.Caller.
    10  
    11  package main
    12  
    13  const anything = 1e9 // Just some unlikely value that means "we got here, don't care how often"
    14  
    15  func testAll() {
    16  	testSimple()
    17  	testBlockRun()
    18  	testIf()
    19  	testFor()
    20  	testRange()
    21  	testSwitch()
    22  	testTypeSwitch()
    23  	testSelect1()
    24  	testSelect2()
    25  	testPanic()
    26  	testEmptySwitches()
    27  }
    28  
    29  // The indexes of the counters in testPanic are known to main.go
    30  const panicIndex = 3
    31  
    32  // This test appears first because the index of its counters is known to main.go
    33  func testPanic() {
    34  	defer func() {
    35  		recover()
    36  	}()
    37  	check(LINE, 1)
    38  	panic("should not get next line")
    39  	check(LINE, 0) // this is GoCover.Count[panicIndex]
    40  	// The next counter is in testSimple and it will be non-zero.
    41  	// If the panic above does not trigger a counter, the test will fail
    42  	// because GoCover.Count[panicIndex] will be the one in testSimple.
    43  }
    44  
    45  func testSimple() {
    46  	check(LINE, 1)
    47  }
    48  
    49  func testIf() {
    50  	if true {
    51  		check(LINE, 1)
    52  	} else {
    53  		check(LINE, 0)
    54  	}
    55  	if false {
    56  		check(LINE, 0)
    57  	} else {
    58  		check(LINE, 1)
    59  	}
    60  	for i := 0; i < 3; i++ {
    61  		if checkVal(LINE, 3, i) <= 2 {
    62  			check(LINE, 3)
    63  		}
    64  		if checkVal(LINE, 3, i) <= 1 {
    65  			check(LINE, 2)
    66  		}
    67  		if checkVal(LINE, 3, i) <= 0 {
    68  			check(LINE, 1)
    69  		}
    70  	}
    71  	for i := 0; i < 3; i++ {
    72  		if checkVal(LINE, 3, i) <= 1 {
    73  			check(LINE, 2)
    74  		} else {
    75  			check(LINE, 1)
    76  		}
    77  	}
    78  	for i := 0; i < 3; i++ {
    79  		if checkVal(LINE, 3, i) <= 0 {
    80  			check(LINE, 1)
    81  		} else if checkVal(LINE, 2, i) <= 1 {
    82  			check(LINE, 1)
    83  		} else if checkVal(LINE, 1, i) <= 2 {
    84  			check(LINE, 1)
    85  		} else if checkVal(LINE, 0, i) <= 3 {
    86  			check(LINE, 0)
    87  		}
    88  	}
    89  	if func(a, b int) bool { return a < b }(3, 4) {
    90  		check(LINE, 1)
    91  	}
    92  }
    93  
    94  func testFor() {
    95  	for i := 0; i < 10; func() { i++; check(LINE, 10) }() {
    96  		check(LINE, 10)
    97  	}
    98  }
    99  
   100  func testRange() {
   101  	for _, f := range []func(){
   102  		func() { check(LINE, 1) },
   103  	} {
   104  		f()
   105  		check(LINE, 1)
   106  	}
   107  }
   108  
   109  func testBlockRun() {
   110  	check(LINE, 1)
   111  	{
   112  		check(LINE, 1)
   113  	}
   114  	{
   115  		check(LINE, 1)
   116  	}
   117  	check(LINE, 1)
   118  	{
   119  		check(LINE, 1)
   120  	}
   121  	{
   122  		check(LINE, 1)
   123  	}
   124  	check(LINE, 1)
   125  }
   126  
   127  func testSwitch() {
   128  	for i := 0; i < 5; func() { i++; check(LINE, 5) }() {
   129  		switch i {
   130  		case 0:
   131  			check(LINE, 1)
   132  		case 1:
   133  			check(LINE, 1)
   134  		case 2:
   135  			check(LINE, 1)
   136  		default:
   137  			check(LINE, 2)
   138  		}
   139  	}
   140  }
   141  
   142  func testTypeSwitch() {
   143  	var x = []interface{}{1, 2.0, "hi"}
   144  	for _, v := range x {
   145  		switch func() { check(LINE, 3) }(); v.(type) {
   146  		case int:
   147  			check(LINE, 1)
   148  		case float64:
   149  			check(LINE, 1)
   150  		case string:
   151  			check(LINE, 1)
   152  		case complex128:
   153  			check(LINE, 0)
   154  		default:
   155  			check(LINE, 0)
   156  		}
   157  	}
   158  }
   159  
   160  func testSelect1() {
   161  	c := make(chan int)
   162  	go func() {
   163  		for i := 0; i < 1000; i++ {
   164  			c <- i
   165  		}
   166  	}()
   167  	for {
   168  		select {
   169  		case <-c:
   170  			check(LINE, anything)
   171  		case <-c:
   172  			check(LINE, anything)
   173  		default:
   174  			check(LINE, 1)
   175  			return
   176  		}
   177  	}
   178  }
   179  
   180  func testSelect2() {
   181  	c1 := make(chan int, 1000)
   182  	c2 := make(chan int, 1000)
   183  	for i := 0; i < 1000; i++ {
   184  		c1 <- i
   185  		c2 <- i
   186  	}
   187  	for {
   188  		select {
   189  		case <-c1:
   190  			check(LINE, 1000)
   191  		case <-c2:
   192  			check(LINE, 1000)
   193  		default:
   194  			check(LINE, 1)
   195  			return
   196  		}
   197  	}
   198  }
   199  
   200  // Empty control statements created syntax errors. This function
   201  // is here just to be sure that those are handled correctly now.
   202  func testEmptySwitches() {
   203  	check(LINE, 1)
   204  	switch 3 {
   205  	}
   206  	check(LINE, 1)
   207  	switch i := (interface{})(3).(int); i {
   208  	}
   209  	check(LINE, 1)
   210  	c := make(chan int)
   211  	go func() {
   212  		check(LINE, 1)
   213  		c <- 1
   214  		select {}
   215  	}()
   216  	<-c
   217  	check(LINE, 1)
   218  }