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 / cover / profile_test.go
diff --git a/.config/coc/extensions/coc-go-data/tools/pkg/mod/golang.org/x/tools@v0.0.0-20201028153306-37f0764111ff/cover/profile_test.go b/.config/coc/extensions/coc-go-data/tools/pkg/mod/golang.org/x/tools@v0.0.0-20201028153306-37f0764111ff/cover/profile_test.go
new file mode 100644 (file)
index 0000000..3cecdac
--- /dev/null
@@ -0,0 +1,261 @@
+// Copyright 2019 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.
+
+package cover
+
+import (
+       "fmt"
+       "io/ioutil"
+       "os"
+       "reflect"
+       "testing"
+)
+
+func TestParseProfiles(t *testing.T) {
+       tests := []struct {
+               name      string
+               input     string
+               output    []*Profile
+               expectErr bool
+       }{
+               {
+                       name:   "parsing an empty file produces empty output",
+                       input:  `mode: set`,
+                       output: []*Profile{},
+               },
+               {
+                       name: "simple valid file produces expected output",
+                       input: `mode: set
+some/fancy/path:42.69,44.16 2 1`,
+                       output: []*Profile{
+                               {
+                                       FileName: "some/fancy/path",
+                                       Mode:     "set",
+                                       Blocks: []ProfileBlock{
+                                               {
+                                                       StartLine: 42, StartCol: 69,
+                                                       EndLine: 44, EndCol: 16,
+                                                       NumStmt: 2, Count: 1,
+                                               },
+                                       },
+                               },
+                       },
+               },
+               {
+                       name: "file with syntax characters in path produces expected output",
+                       input: `mode: set
+some fancy:path/some,file.go:42.69,44.16 2 1`,
+                       output: []*Profile{
+                               {
+                                       FileName: "some fancy:path/some,file.go",
+                                       Mode:     "set",
+                                       Blocks: []ProfileBlock{
+                                               {
+                                                       StartLine: 42, StartCol: 69,
+                                                       EndLine: 44, EndCol: 16,
+                                                       NumStmt: 2, Count: 1,
+                                               },
+                                       },
+                               },
+                       },
+               },
+               {
+                       name: "file with multiple blocks in one file produces expected output",
+                       input: `mode: set
+some/fancy/path:42.69,44.16 2 1
+some/fancy/path:44.16,46.3 1 0`,
+                       output: []*Profile{
+                               {
+                                       FileName: "some/fancy/path",
+                                       Mode:     "set",
+                                       Blocks: []ProfileBlock{
+                                               {
+                                                       StartLine: 42, StartCol: 69,
+                                                       EndLine: 44, EndCol: 16,
+                                                       NumStmt: 2, Count: 1,
+                                               },
+                                               {
+                                                       StartLine: 44, StartCol: 16,
+                                                       EndLine: 46, EndCol: 3,
+                                                       NumStmt: 1, Count: 0,
+                                               },
+                                       },
+                               },
+                       },
+               },
+               {
+                       name: "file with multiple files produces expected output",
+                       input: `mode: set
+another/fancy/path:44.16,46.3 1 0
+some/fancy/path:42.69,44.16 2 1`,
+                       output: []*Profile{
+                               {
+                                       FileName: "another/fancy/path",
+                                       Mode:     "set",
+                                       Blocks: []ProfileBlock{
+                                               {
+                                                       StartLine: 44, StartCol: 16,
+                                                       EndLine: 46, EndCol: 3,
+                                                       NumStmt: 1, Count: 0,
+                                               },
+                                       },
+                               },
+                               {
+                                       FileName: "some/fancy/path",
+                                       Mode:     "set",
+                                       Blocks: []ProfileBlock{
+                                               {
+                                                       StartLine: 42, StartCol: 69,
+                                                       EndLine: 44, EndCol: 16,
+                                                       NumStmt: 2, Count: 1,
+                                               },
+                                       },
+                               },
+                       },
+               },
+               {
+                       name: "intertwined files are merged correctly",
+                       input: `mode: set
+some/fancy/path:42.69,44.16 2 1
+another/fancy/path:47.2,47.13 1 1
+some/fancy/path:44.16,46.3 1 0`,
+                       output: []*Profile{
+                               {
+                                       FileName: "another/fancy/path",
+                                       Mode:     "set",
+                                       Blocks: []ProfileBlock{
+                                               {
+                                                       StartLine: 47, StartCol: 2,
+                                                       EndLine: 47, EndCol: 13,
+                                                       NumStmt: 1, Count: 1,
+                                               },
+                                       },
+                               },
+                               {
+                                       FileName: "some/fancy/path",
+                                       Mode:     "set",
+                                       Blocks: []ProfileBlock{
+                                               {
+                                                       StartLine: 42, StartCol: 69,
+                                                       EndLine: 44, EndCol: 16,
+                                                       NumStmt: 2, Count: 1,
+                                               },
+                                               {
+                                                       StartLine: 44, StartCol: 16,
+                                                       EndLine: 46, EndCol: 3,
+                                                       NumStmt: 1, Count: 0,
+                                               },
+                                       },
+                               },
+                       },
+               },
+               {
+                       name: "duplicate blocks are merged correctly",
+                       input: `mode: count
+some/fancy/path:42.69,44.16 2 4
+some/fancy/path:42.69,44.16 2 3`,
+                       output: []*Profile{
+                               {
+                                       FileName: "some/fancy/path",
+                                       Mode:     "count",
+                                       Blocks: []ProfileBlock{
+                                               {
+                                                       StartLine: 42, StartCol: 69,
+                                                       EndLine: 44, EndCol: 16,
+                                                       NumStmt: 2, Count: 7,
+                                               },
+                                       },
+                               },
+                       },
+               },
+               {
+                       name:      "an invalid mode line is an error",
+                       input:     `mode:count`,
+                       expectErr: true,
+               },
+               {
+                       name: "a missing field is an error",
+                       input: `mode: count
+some/fancy/path:42.69,44.16 2`,
+                       expectErr: true,
+               },
+               {
+                       name: "a missing path field is an error",
+                       input: `mode: count
+42.69,44.16 2 3`,
+                       expectErr: true,
+               },
+               {
+                       name: "a non-numeric count is an error",
+                       input: `mode: count
+42.69,44.16 2 nope`,
+                       expectErr: true,
+               },
+               {
+                       name: "an empty path is an error",
+                       input: `mode: count
+:42.69,44.16 2 3`,
+                       expectErr: true,
+               },
+               {
+                       name: "a negative count is an error",
+                       input: `mode: count
+some/fancy/path:42.69,44.16 2 -1`,
+                       expectErr: true,
+               },
+       }
+
+       for _, tc := range tests {
+               t.Run(tc.name, func(t *testing.T) {
+                       f, err := ioutil.TempFile("", "")
+                       if err != nil {
+                               t.Fatalf("Failed to create a temp file: %v.", err)
+                       }
+                       defer func() {
+                               f.Close()
+                               os.Remove(f.Name())
+                       }()
+                       n, err := f.WriteString(tc.input)
+                       if err != nil {
+                               t.Fatalf("Failed to write to temp file: %v", err)
+                       }
+                       if n < len(tc.input) {
+                               t.Fatalf("Didn't write enough bytes to temp file (wrote %d, expected %d).", n, len(tc.input))
+                       }
+                       if err := f.Sync(); err != nil {
+                               t.Fatalf("Failed to sync temp file: %v", err)
+                       }
+
+                       result, err := ParseProfiles(f.Name())
+                       if err != nil {
+                               if !tc.expectErr {
+                                       t.Errorf("Unexpected error: %v", err)
+                               }
+                               return
+                       }
+                       if tc.expectErr {
+                               t.Errorf("Expected an error, but got value %q", stringifyProfileArray(result))
+                       }
+                       if !reflect.DeepEqual(result, tc.output) {
+                               t.Errorf("Mismatched results.\nExpected: %s\nActual:   %s", stringifyProfileArray(tc.output), stringifyProfileArray(result))
+                       }
+               })
+       }
+}
+
+func stringifyProfileArray(profiles []*Profile) string {
+       deref := make([]Profile, 0, len(profiles))
+       for _, p := range profiles {
+               deref = append(deref, *p)
+       }
+       return fmt.Sprintf("%#v", deref)
+}
+
+func BenchmarkParseLine(b *testing.B) {
+       const line = "k8s.io/kubernetes/cmd/kube-controller-manager/app/options/ttlafterfinishedcontroller.go:31.73,32.14 1 1"
+       b.SetBytes(int64(len(line)))
+       for n := 0; n < b.N; n++ {
+               parseLine(line)
+       }
+}