Giant blob of minor changes
[dotfiles/.git] / .config / coc / extensions / coc-go-data / tools / pkg / mod / golang.org / x / tools@v0.0.0-20201028153306-37f0764111ff / cmd / cover / cover_test.go
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 // No testdata on Android.
6
7 // +build !android
8
9 package main_test
10
11 import (
12         "bytes"
13         "fmt"
14         "io/ioutil"
15         "os"
16         "os/exec"
17         "path/filepath"
18         "testing"
19
20         "golang.org/x/tools/internal/testenv"
21 )
22
23 const (
24         // Data directory, also the package directory for the test.
25         testdata = "testdata"
26 )
27
28 var debug = false // Keeps the rewritten files around if set.
29
30 // Run this shell script, but do it in Go so it can be run by "go test".
31 //
32 //      replace the word LINE with the line number < testdata/test.go > testdata/test_line.go
33 //      go build -o ./testcover
34 //      ./testcover -mode=count -var=CoverTest -o ./testdata/test_cover.go testdata/test_line.go
35 //      go run ./testdata/main.go ./testdata/test.go
36 //
37 func TestCover(t *testing.T) {
38         testenv.NeedsTool(t, "go")
39
40         tmpdir, err := ioutil.TempDir("", "TestCover")
41         if err != nil {
42                 t.Fatal(err)
43         }
44         defer func() {
45                 if debug {
46                         fmt.Printf("test files left in %s\n", tmpdir)
47                 } else {
48                         os.RemoveAll(tmpdir)
49                 }
50         }()
51
52         testcover := filepath.Join(tmpdir, "testcover.exe")
53         testMain := filepath.Join(tmpdir, "main.go")
54         testTest := filepath.Join(tmpdir, "test.go")
55         coverInput := filepath.Join(tmpdir, "test_line.go")
56         coverOutput := filepath.Join(tmpdir, "test_cover.go")
57
58         for _, f := range []string{testMain, testTest} {
59                 data, err := ioutil.ReadFile(filepath.Join(testdata, filepath.Base(f)))
60                 if err != nil {
61                         t.Fatal(err)
62                 }
63                 if err := ioutil.WriteFile(f, data, 0644); err != nil {
64                         t.Fatal(err)
65                 }
66         }
67
68         // Read in the test file (testTest) and write it, with LINEs specified, to coverInput.
69         file, err := ioutil.ReadFile(testTest)
70         if err != nil {
71                 t.Fatal(err)
72         }
73         lines := bytes.Split(file, []byte("\n"))
74         for i, line := range lines {
75                 lines[i] = bytes.Replace(line, []byte("LINE"), []byte(fmt.Sprint(i+1)), -1)
76         }
77         err = ioutil.WriteFile(coverInput, bytes.Join(lines, []byte("\n")), 0666)
78         if err != nil {
79                 t.Fatal(err)
80         }
81
82         // go build -o testcover
83         cmd := exec.Command("go", "build", "-o", testcover)
84         run(cmd, t)
85
86         // ./testcover -mode=count -var=coverTest -o ./testdata/test_cover.go testdata/test_line.go
87         cmd = exec.Command(testcover, "-mode=count", "-var=coverTest", "-o", coverOutput, coverInput)
88         run(cmd, t)
89
90         // defer removal of ./testdata/test_cover.go
91         if !debug {
92                 defer os.Remove(coverOutput)
93         }
94
95         // go run ./testdata/main.go ./testdata/test.go
96         cmd = exec.Command("go", "run", testMain, coverOutput)
97         run(cmd, t)
98 }
99
100 func run(c *exec.Cmd, t *testing.T) {
101         c.Stdout = os.Stdout
102         c.Stderr = os.Stderr
103         err := c.Run()
104         if err != nil {
105                 t.Fatal(err)
106         }
107 }