123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- package testing
- import (
- "fmt"
- "os"
- "sync/atomic"
- )
- type CoverBlock struct {
- Line0 uint32
- Col0 uint16
- Line1 uint32
- Col1 uint16
- Stmts uint16
- }
- var cover Cover
- type Cover struct {
- Mode string
- Counters map[string][]uint32
- Blocks map[string][]CoverBlock
- CoveredPackages string
- }
- func Coverage() float64 {
- var n, d int64
- for _, counters := range cover.Counters {
- for i := range counters {
- if atomic.LoadUint32(&counters[i]) > 0 {
- n++
- }
- d++
- }
- }
- if d == 0 {
- return 0
- }
- return float64(n) / float64(d)
- }
- func RegisterCover(c Cover) {
- cover = c
- }
- func mustBeNil(err error) {
- if err != nil {
- fmt.Fprintf(os.Stderr, "testing: %s\n", err)
- os.Exit(2)
- }
- }
- func coverReport() {
- var f *os.File
- var err error
- if *coverProfile != "" {
- f, err = os.Create(toOutputDir(*coverProfile))
- mustBeNil(err)
- fmt.Fprintf(f, "mode: %s\n", cover.Mode)
- defer func() { mustBeNil(f.Close()) }()
- }
- var active, total int64
- var count uint32
- for name, counts := range cover.Counters {
- blocks := cover.Blocks[name]
- for i := range counts {
- stmts := int64(blocks[i].Stmts)
- total += stmts
- count = atomic.LoadUint32(&counts[i])
- if count > 0 {
- active += stmts
- }
- if f != nil {
- _, err := fmt.Fprintf(f, "%s:%d.%d,%d.%d %d %d\n", name,
- blocks[i].Line0, blocks[i].Col0,
- blocks[i].Line1, blocks[i].Col1,
- stmts,
- count)
- mustBeNil(err)
- }
- }
- }
- if total == 0 {
- total = 1
- }
- fmt.Printf("coverage: %.1f%% of statements%s\n", 100*float64(active)/float64(total), cover.CoveredPackages)
- }
|