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 } 219