mirror of
https://github.com/golang/go
synced 2024-11-19 00:14:39 -07:00
e4256a40f4
Break the basic block at the function literal. The code to do this analysis was already there; this CL just factors it out more nicely and uses it in one new place. Also adds a test. Fixes golang/go#6555. R=golang-dev, adg CC=golang-dev https://golang.org/cl/14601043
178 lines
2.8 KiB
Go
178 lines
2.8 KiB
Go
// Copyright 2013 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
// This program is processed by the cover command, and then testAll is called.
|
|
// The test driver in main.go can then compare the coverage statistics with expectation.
|
|
|
|
// The word LINE is replaced by the line number in this file. When the file is executed,
|
|
// the coverage processing has changed the line numbers, so we can't use runtime.Caller.
|
|
|
|
package main
|
|
|
|
const anything = 1e9 // Just some unlikely value that means "we got here, don't care how often"
|
|
|
|
func testAll() {
|
|
testSimple()
|
|
testBlockRun()
|
|
testIf()
|
|
testFor()
|
|
testRange()
|
|
testSwitch()
|
|
testTypeSwitch()
|
|
testSelect1()
|
|
testSelect2()
|
|
}
|
|
|
|
func testSimple() {
|
|
check(LINE, 1)
|
|
}
|
|
|
|
func testIf() {
|
|
if true {
|
|
check(LINE, 1)
|
|
} else {
|
|
check(LINE, 0)
|
|
}
|
|
if false {
|
|
check(LINE, 0)
|
|
} else {
|
|
check(LINE, 1)
|
|
}
|
|
for i := 0; i < 3; i++ {
|
|
if checkVal(LINE, 3, i) <= 2 {
|
|
check(LINE, 3)
|
|
}
|
|
if checkVal(LINE, 3, i) <= 1 {
|
|
check(LINE, 2)
|
|
}
|
|
if checkVal(LINE, 3, i) <= 0 {
|
|
check(LINE, 1)
|
|
}
|
|
}
|
|
for i := 0; i < 3; i++ {
|
|
if checkVal(LINE, 3, i) <= 1 {
|
|
check(LINE, 2)
|
|
} else {
|
|
check(LINE, 1)
|
|
}
|
|
}
|
|
for i := 0; i < 3; i++ {
|
|
if checkVal(LINE, 3, i) <= 0 {
|
|
check(LINE, 1)
|
|
} else if checkVal(LINE, 2, i) <= 1 {
|
|
check(LINE, 1)
|
|
} else if checkVal(LINE, 1, i) <= 2 {
|
|
check(LINE, 1)
|
|
} else if checkVal(LINE, 0, i) <= 3 {
|
|
check(LINE, 0)
|
|
}
|
|
}
|
|
}
|
|
|
|
func testFor() {
|
|
for i := 0; i < 10; i++ {
|
|
check(LINE, 10)
|
|
}
|
|
}
|
|
|
|
func testRange() {
|
|
for _, f := range []func(){
|
|
func() { check(LINE, 1) },
|
|
} {
|
|
f()
|
|
check(LINE, 1)
|
|
}
|
|
}
|
|
|
|
func testBlockRun() {
|
|
check(LINE, 1)
|
|
{
|
|
check(LINE, 1)
|
|
}
|
|
{
|
|
check(LINE, 1)
|
|
}
|
|
check(LINE, 1)
|
|
{
|
|
check(LINE, 1)
|
|
}
|
|
{
|
|
check(LINE, 1)
|
|
}
|
|
check(LINE, 1)
|
|
}
|
|
|
|
func testSwitch() {
|
|
for i := 0; i < 5; i++ {
|
|
switch i {
|
|
case 0:
|
|
check(LINE, 1)
|
|
case 1:
|
|
check(LINE, 1)
|
|
case 2:
|
|
check(LINE, 1)
|
|
default:
|
|
check(LINE, 2)
|
|
}
|
|
}
|
|
}
|
|
|
|
func testTypeSwitch() {
|
|
var x = []interface{}{1, 2.0, "hi"}
|
|
for _, v := range x {
|
|
switch v.(type) {
|
|
case int:
|
|
check(LINE, 1)
|
|
case float64:
|
|
check(LINE, 1)
|
|
case string:
|
|
check(LINE, 1)
|
|
case complex128:
|
|
check(LINE, 0)
|
|
default:
|
|
check(LINE, 0)
|
|
}
|
|
}
|
|
}
|
|
|
|
func testSelect1() {
|
|
c := make(chan int)
|
|
go func() {
|
|
for i := 0; i < 1000; i++ {
|
|
c <- i
|
|
}
|
|
}()
|
|
for {
|
|
select {
|
|
case <-c:
|
|
check(LINE, anything)
|
|
case <-c:
|
|
check(LINE, anything)
|
|
default:
|
|
check(LINE, 1)
|
|
return
|
|
}
|
|
}
|
|
}
|
|
|
|
func testSelect2() {
|
|
c1 := make(chan int, 1000)
|
|
c2 := make(chan int, 1000)
|
|
for i := 0; i < 1000; i++ {
|
|
c1 <- i
|
|
c2 <- i
|
|
}
|
|
for {
|
|
select {
|
|
case <-c1:
|
|
check(LINE, 1000)
|
|
case <-c2:
|
|
check(LINE, 1000)
|
|
default:
|
|
check(LINE, 1)
|
|
return
|
|
}
|
|
}
|
|
}
|