github.com/miolini/go@v0.0.0-20160405192216-fca68c8cb408/src/cmd/cover/testdata/main.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  // Test runner for coverage test. This file is not coverage-annotated; test.go is.
     6  // It knows the coverage counter is called "coverTest".
     7  
     8  package main
     9  
    10  import (
    11  	"fmt"
    12  	"os"
    13  )
    14  
    15  func main() {
    16  	testAll()
    17  	verify()
    18  }
    19  
    20  type block struct {
    21  	count uint32
    22  	line  uint32
    23  }
    24  
    25  var counters = make(map[block]bool)
    26  
    27  // check records the location and expected value for a counter.
    28  func check(line, count uint32) {
    29  	b := block{
    30  		count,
    31  		line,
    32  	}
    33  	counters[b] = true
    34  }
    35  
    36  // checkVal is a version of check that returns its extra argument,
    37  // so it can be used in conditionals.
    38  func checkVal(line, count uint32, val int) int {
    39  	b := block{
    40  		count,
    41  		line,
    42  	}
    43  	counters[b] = true
    44  	return val
    45  }
    46  
    47  var PASS = true
    48  
    49  // verify checks the expected counts against the actual. It runs after the test has completed.
    50  func verify() {
    51  	for b := range counters {
    52  		got, index := count(b.line)
    53  		if b.count == anything && got != 0 {
    54  			got = anything
    55  		}
    56  		if got != b.count {
    57  			fmt.Fprintf(os.Stderr, "test_go:%d expected count %d got %d [counter %d]\n", b.line, b.count, got, index)
    58  			PASS = false
    59  		}
    60  	}
    61  	verifyPanic()
    62  	if !PASS {
    63  		fmt.Fprintf(os.Stderr, "FAIL\n")
    64  		os.Exit(2)
    65  	}
    66  }
    67  
    68  // verifyPanic is a special check for the known counter that should be
    69  // after the panic call in testPanic.
    70  func verifyPanic() {
    71  	if coverTest.Count[panicIndex-1] != 1 {
    72  		// Sanity check for test before panic.
    73  		fmt.Fprintf(os.Stderr, "bad before panic")
    74  		PASS = false
    75  	}
    76  	if coverTest.Count[panicIndex] != 0 {
    77  		fmt.Fprintf(os.Stderr, "bad at panic: %d should be 0\n", coverTest.Count[panicIndex])
    78  		PASS = false
    79  	}
    80  	if coverTest.Count[panicIndex+1] != 1 {
    81  		fmt.Fprintf(os.Stderr, "bad after panic")
    82  		PASS = false
    83  	}
    84  }
    85  
    86  // count returns the count and index for the counter at the specified line.
    87  func count(line uint32) (uint32, int) {
    88  	// Linear search is fine. Choose perfect fit over approximate.
    89  	// We can have a closing brace for a range on the same line as a condition for an "else if"
    90  	// and we don't want that brace to steal the count for the condition on the "if".
    91  	// Therefore we test for a perfect (lo==line && hi==line) match, but if we can't
    92  	// find that we take the first imperfect match.
    93  	index := -1
    94  	indexLo := uint32(1e9)
    95  	for i := range coverTest.Count {
    96  		lo, hi := coverTest.Pos[3*i], coverTest.Pos[3*i+1]
    97  		if lo == line && line == hi {
    98  			return coverTest.Count[i], i
    99  		}
   100  		// Choose the earliest match (the counters are in unpredictable order).
   101  		if lo <= line && line <= hi && indexLo > lo {
   102  			index = i
   103  			indexLo = lo
   104  		}
   105  	}
   106  	if index == -1 {
   107  		fmt.Fprintln(os.Stderr, "cover_test: no counter for line", line)
   108  		PASS = false
   109  		return 0, 0
   110  	}
   111  	return coverTest.Count[index], index
   112  }