github.com/zebozhuang/go@v0.0.0-20200207033046-f8a98f6f5c5d/src/go/types/self_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  package types_test
     6  
     7  import (
     8  	"flag"
     9  	"fmt"
    10  	"go/ast"
    11  	"go/importer"
    12  	"go/parser"
    13  	"go/token"
    14  	"path/filepath"
    15  	"testing"
    16  	"time"
    17  
    18  	. "go/types"
    19  )
    20  
    21  var benchmark = flag.Bool("b", false, "run benchmarks")
    22  
    23  func TestSelf(t *testing.T) {
    24  	fset := token.NewFileSet()
    25  	files, err := pkgFiles(fset, ".")
    26  	if err != nil {
    27  		t.Fatal(err)
    28  	}
    29  
    30  	conf := Config{Importer: importer.Default()}
    31  	_, err = conf.Check("go/types", fset, files, nil)
    32  	if err != nil {
    33  		// Importing go/constant doesn't work in the
    34  		// build dashboard environment. Don't report an error
    35  		// for now so that the build remains green.
    36  		// TODO(gri) fix this
    37  		t.Log(err) // replace w/ t.Fatal eventually
    38  		return
    39  	}
    40  }
    41  
    42  func TestBenchmark(t *testing.T) {
    43  	if !*benchmark {
    44  		return
    45  	}
    46  
    47  	// We're not using testing's benchmarking mechanism directly
    48  	// because we want custom output.
    49  
    50  	for _, p := range []string{"types", "constant", filepath.Join("internal", "gcimporter")} {
    51  		path := filepath.Join("..", p)
    52  		runbench(t, path, false)
    53  		runbench(t, path, true)
    54  		fmt.Println()
    55  	}
    56  }
    57  
    58  func runbench(t *testing.T, path string, ignoreFuncBodies bool) {
    59  	fset := token.NewFileSet()
    60  	files, err := pkgFiles(fset, path)
    61  	if err != nil {
    62  		t.Fatal(err)
    63  	}
    64  
    65  	b := testing.Benchmark(func(b *testing.B) {
    66  		for i := 0; i < b.N; i++ {
    67  			conf := Config{IgnoreFuncBodies: ignoreFuncBodies}
    68  			conf.Check(path, fset, files, nil)
    69  		}
    70  	})
    71  
    72  	// determine line count
    73  	lines := 0
    74  	fset.Iterate(func(f *token.File) bool {
    75  		lines += f.LineCount()
    76  		return true
    77  	})
    78  
    79  	d := time.Duration(b.NsPerOp())
    80  	fmt.Printf(
    81  		"%s: %s for %d lines (%d lines/s), ignoreFuncBodies = %v\n",
    82  		filepath.Base(path), d, lines, int64(float64(lines)/d.Seconds()), ignoreFuncBodies,
    83  	)
    84  }
    85  
    86  func pkgFiles(fset *token.FileSet, path string) ([]*ast.File, error) {
    87  	filenames, err := pkgFilenames(path) // from stdlib_test.go
    88  	if err != nil {
    89  		return nil, err
    90  	}
    91  
    92  	var files []*ast.File
    93  	for _, filename := range filenames {
    94  		file, err := parser.ParseFile(fset, filename, nil, 0)
    95  		if err != nil {
    96  			return nil, err
    97  		}
    98  		files = append(files, file)
    99  	}
   100  
   101  	return files, nil
   102  }