mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			87 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			87 lines
		
	
	
		
			2.2 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.
 | |
| 
 | |
| // Support for test coverage.
 | |
| 
 | |
| package testing
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 	"os"
 | |
| )
 | |
| 
 | |
| // CoverBlock records the coverage data for a single basic block.
 | |
| // NOTE: This struct is internal to the testing infrastructure and may change.
 | |
| // It is not covered (yet) by the Go 1 compatibility guidelines.
 | |
| type CoverBlock struct {
 | |
| 	Line0 uint32
 | |
| 	Col0  uint16
 | |
| 	Line1 uint32
 | |
| 	Col1  uint16
 | |
| 	Stmts uint16
 | |
| }
 | |
| 
 | |
| var cover Cover
 | |
| 
 | |
| // Cover records information about test coverage checking.
 | |
| // NOTE: This struct is internal to the testing infrastructure and may change.
 | |
| // It is not covered (yet) by the Go 1 compatibility guidelines.
 | |
| type Cover struct {
 | |
| 	Mode            string
 | |
| 	Counters        map[string][]uint32
 | |
| 	Blocks          map[string][]CoverBlock
 | |
| 	CoveredPackages string
 | |
| }
 | |
| 
 | |
| // RegisterCover records the coverage data accumulators for the tests.
 | |
| // NOTE: This function is internal to the testing infrastructure and may change.
 | |
| // It is not covered (yet) by the Go 1 compatibility guidelines.
 | |
| func RegisterCover(c Cover) {
 | |
| 	cover = c
 | |
| }
 | |
| 
 | |
| // mustBeNil checks the error and, if present, reports it and exits.
 | |
| func mustBeNil(err error) {
 | |
| 	if err != nil {
 | |
| 		fmt.Fprintf(os.Stderr, "testing: %s\n", err)
 | |
| 		os.Exit(2)
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // coverReport reports the coverage percentage and writes a coverage profile if requested.
 | |
| 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
 | |
| 	for name, counts := range cover.Counters {
 | |
| 		blocks := cover.Blocks[name]
 | |
| 		for i, count := range counts {
 | |
| 			stmts := int64(blocks[i].Stmts)
 | |
| 			total += stmts
 | |
| 			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)
 | |
| }
 |