github.com/gagliardetto/golang-go@v0.0.0-20201020153340-53909ea70814/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 import _ "unsafe" // for go:linkname 14 15 //go:linkname some_name some_name 16 17 const anything = 1e9 // Just some unlikely value that means "we got here, don't care how often" 18 19 func testAll() { 20 testSimple() 21 testBlockRun() 22 testIf() 23 testFor() 24 testRange() 25 testSwitch() 26 testTypeSwitch() 27 testSelect1() 28 testSelect2() 29 testPanic() 30 testEmptySwitches() 31 testFunctionLiteral() 32 testGoto() 33 } 34 35 // The indexes of the counters in testPanic are known to main.go 36 const panicIndex = 3 37 38 // This test appears first because the index of its counters is known to main.go 39 func testPanic() { 40 defer func() { 41 recover() 42 }() 43 check(LINE, 1) 44 panic("should not get next line") 45 check(LINE, 0) // this is GoCover.Count[panicIndex] 46 // The next counter is in testSimple and it will be non-zero. 47 // If the panic above does not trigger a counter, the test will fail 48 // because GoCover.Count[panicIndex] will be the one in testSimple. 49 } 50 51 func testSimple() { 52 check(LINE, 1) 53 } 54 55 func testIf() { 56 if true { 57 check(LINE, 1) 58 } else { 59 check(LINE, 0) 60 } 61 if false { 62 check(LINE, 0) 63 } else { 64 check(LINE, 1) 65 } 66 for i := 0; i < 3; i++ { 67 if checkVal(LINE, 3, i) <= 2 { 68 check(LINE, 3) 69 } 70 if checkVal(LINE, 3, i) <= 1 { 71 check(LINE, 2) 72 } 73 if checkVal(LINE, 3, i) <= 0 { 74 check(LINE, 1) 75 } 76 } 77 for i := 0; i < 3; i++ { 78 if checkVal(LINE, 3, i) <= 1 { 79 check(LINE, 2) 80 } else { 81 check(LINE, 1) 82 } 83 } 84 for i := 0; i < 3; i++ { 85 if checkVal(LINE, 3, i) <= 0 { 86 check(LINE, 1) 87 } else if checkVal(LINE, 2, i) <= 1 { 88 check(LINE, 1) 89 } else if checkVal(LINE, 1, i) <= 2 { 90 check(LINE, 1) 91 } else if checkVal(LINE, 0, i) <= 3 { 92 check(LINE, 0) 93 } 94 } 95 if func(a, b int) bool { return a < b }(3, 4) { 96 check(LINE, 1) 97 } 98 } 99 100 func testFor() { 101 for i := 0; i < 10; func() { i++; check(LINE, 10) }() { 102 check(LINE, 10) 103 } 104 } 105 106 func testRange() { 107 for _, f := range []func(){ 108 func() { check(LINE, 1) }, 109 } { 110 f() 111 check(LINE, 1) 112 } 113 } 114 115 func testBlockRun() { 116 check(LINE, 1) 117 { 118 check(LINE, 1) 119 } 120 { 121 check(LINE, 1) 122 } 123 check(LINE, 1) 124 { 125 check(LINE, 1) 126 } 127 { 128 check(LINE, 1) 129 } 130 check(LINE, 1) 131 } 132 133 func testSwitch() { 134 for i := 0; i < 5; func() { i++; check(LINE, 5) }() { 135 goto label2 136 label1: 137 goto label1 138 label2: 139 switch i { 140 case 0: 141 check(LINE, 1) 142 case 1: 143 check(LINE, 1) 144 case 2: 145 check(LINE, 1) 146 default: 147 check(LINE, 2) 148 } 149 } 150 } 151 152 func testTypeSwitch() { 153 var x = []interface{}{1, 2.0, "hi"} 154 for _, v := range x { 155 switch func() { check(LINE, 3) }(); v.(type) { 156 case int: 157 check(LINE, 1) 158 case float64: 159 check(LINE, 1) 160 case string: 161 check(LINE, 1) 162 case complex128: 163 check(LINE, 0) 164 default: 165 check(LINE, 0) 166 } 167 } 168 } 169 170 func testSelect1() { 171 c := make(chan int) 172 go func() { 173 for i := 0; i < 1000; i++ { 174 c <- i 175 } 176 }() 177 for { 178 select { 179 case <-c: 180 check(LINE, anything) 181 case <-c: 182 check(LINE, anything) 183 default: 184 check(LINE, 1) 185 return 186 } 187 } 188 } 189 190 func testSelect2() { 191 c1 := make(chan int, 1000) 192 c2 := make(chan int, 1000) 193 for i := 0; i < 1000; i++ { 194 c1 <- i 195 c2 <- i 196 } 197 for { 198 select { 199 case <-c1: 200 check(LINE, 1000) 201 case <-c2: 202 check(LINE, 1000) 203 default: 204 check(LINE, 1) 205 return 206 } 207 } 208 } 209 210 // Empty control statements created syntax errors. This function 211 // is here just to be sure that those are handled correctly now. 212 func testEmptySwitches() { 213 check(LINE, 1) 214 switch 3 { 215 } 216 check(LINE, 1) 217 switch i := (interface{})(3).(int); i { 218 } 219 check(LINE, 1) 220 c := make(chan int) 221 go func() { 222 check(LINE, 1) 223 c <- 1 224 select {} 225 }() 226 <-c 227 check(LINE, 1) 228 } 229 230 func testFunctionLiteral() { 231 a := func(f func()) error { 232 f() 233 f() 234 return nil 235 } 236 237 b := func(f func()) bool { 238 f() 239 f() 240 return true 241 } 242 243 check(LINE, 1) 244 a(func() { 245 check(LINE, 2) 246 }) 247 248 if err := a(func() { 249 check(LINE, 2) 250 }); err != nil { 251 } 252 253 switch b(func() { 254 check(LINE, 2) 255 }) { 256 } 257 258 x := 2 259 switch x { 260 case func() int { check(LINE, 1); return 1 }(): 261 check(LINE, 0) 262 panic("2=1") 263 case func() int { check(LINE, 1); return 2 }(): 264 check(LINE, 1) 265 case func() int { check(LINE, 0); return 3 }(): 266 check(LINE, 0) 267 panic("2=3") 268 } 269 } 270 271 func testGoto() { 272 for i := 0; i < 2; i++ { 273 if i == 0 { 274 goto Label 275 } 276 check(LINE, 1) 277 Label: 278 check(LINE, 2) 279 } 280 // Now test that we don't inject empty statements 281 // between a label and a loop. 282 loop: 283 for { 284 check(LINE, 1) 285 break loop 286 } 287 } 288 289 // This comment didn't appear in generated go code. 290 func haha() { 291 // Needed for cover to add counter increment here. 292 _ = 42 293 } 294 295 // Some someFunction. 296 // 297 //go:nosplit 298 func someFunction() { 299 }