--- /dev/null
+// Copyright 2020 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 label_test
+
+import (
+ "bytes"
+ "fmt"
+ "testing"
+
+ "golang.org/x/tools/internal/event/keys"
+ "golang.org/x/tools/internal/event/label"
+)
+
+var (
+ AKey = keys.NewString("A", "")
+ BKey = keys.NewString("B", "")
+ CKey = keys.NewString("C", "")
+ A = AKey.Of("a")
+ B = BKey.Of("b")
+ C = CKey.Of("c")
+ all = []label.Label{A, B, C}
+)
+
+func TestList(t *testing.T) {
+ for _, test := range []struct {
+ name string
+ labels []label.Label
+ expect string
+ }{{
+ name: "empty",
+ }, {
+ name: "single",
+ labels: []label.Label{A},
+ expect: `A="a"`,
+ }, {
+ name: "invalid",
+ labels: []label.Label{{}},
+ expect: ``,
+ }, {
+ name: "two",
+ labels: []label.Label{A, B},
+ expect: `A="a", B="b"`,
+ }, {
+ name: "three",
+ labels: []label.Label{A, B, C},
+ expect: `A="a", B="b", C="c"`,
+ }, {
+ name: "missing A",
+ labels: []label.Label{{}, B, C},
+ expect: `B="b", C="c"`,
+ }, {
+ name: "missing B",
+ labels: []label.Label{A, {}, C},
+ expect: `A="a", C="c"`,
+ }, {
+ name: "missing C",
+ labels: []label.Label{A, B, {}},
+ expect: `A="a", B="b"`,
+ }, {
+ name: "missing AB",
+ labels: []label.Label{{}, {}, C},
+ expect: `C="c"`,
+ }, {
+ name: "missing AC",
+ labels: []label.Label{{}, B, {}},
+ expect: `B="b"`,
+ }, {
+ name: "missing BC",
+ labels: []label.Label{A, {}, {}},
+ expect: `A="a"`,
+ }} {
+ t.Run(test.name, func(t *testing.T) {
+ got := printList(label.NewList(test.labels...))
+ if got != test.expect {
+ t.Errorf("got %q want %q", got, test.expect)
+ }
+ })
+ }
+}
+
+func TestFilter(t *testing.T) {
+ for _, test := range []struct {
+ name string
+ labels []label.Label
+ filters []label.Key
+ expect string
+ }{{
+ name: "no filters",
+ labels: all,
+ expect: `A="a", B="b", C="c"`,
+ }, {
+ name: "no labels",
+ filters: []label.Key{AKey},
+ expect: ``,
+ }, {
+ name: "filter A",
+ labels: all,
+ filters: []label.Key{AKey},
+ expect: `B="b", C="c"`,
+ }, {
+ name: "filter B",
+ labels: all,
+ filters: []label.Key{BKey},
+ expect: `A="a", C="c"`,
+ }, {
+ name: "filter C",
+ labels: all,
+ filters: []label.Key{CKey},
+ expect: `A="a", B="b"`,
+ }, {
+ name: "filter AC",
+ labels: all,
+ filters: []label.Key{AKey, CKey},
+ expect: `B="b"`,
+ }} {
+ t.Run(test.name, func(t *testing.T) {
+ labels := label.NewList(test.labels...)
+ got := printList(label.Filter(labels, test.filters...))
+ if got != test.expect {
+ t.Errorf("got %q want %q", got, test.expect)
+ }
+ })
+ }
+}
+
+func TestMap(t *testing.T) {
+ for _, test := range []struct {
+ name string
+ labels []label.Label
+ keys []label.Key
+ expect string
+ }{{
+ name: "no labels",
+ keys: []label.Key{AKey},
+ expect: `nil`,
+ }, {
+ name: "match A",
+ labels: all,
+ keys: []label.Key{AKey},
+ expect: `A="a"`,
+ }, {
+ name: "match B",
+ labels: all,
+ keys: []label.Key{BKey},
+ expect: `B="b"`,
+ }, {
+ name: "match C",
+ labels: all,
+ keys: []label.Key{CKey},
+ expect: `C="c"`,
+ }, {
+ name: "match ABC",
+ labels: all,
+ keys: []label.Key{AKey, BKey, CKey},
+ expect: `A="a", B="b", C="c"`,
+ }, {
+ name: "missing A",
+ labels: []label.Label{{}, B, C},
+ keys: []label.Key{AKey, BKey, CKey},
+ expect: `nil, B="b", C="c"`,
+ }, {
+ name: "missing B",
+ labels: []label.Label{A, {}, C},
+ keys: []label.Key{AKey, BKey, CKey},
+ expect: `A="a", nil, C="c"`,
+ }, {
+ name: "missing C",
+ labels: []label.Label{A, B, {}},
+ keys: []label.Key{AKey, BKey, CKey},
+ expect: `A="a", B="b", nil`,
+ }} {
+ t.Run(test.name, func(t *testing.T) {
+ lm := label.NewMap(test.labels...)
+ got := printMap(lm, test.keys)
+ if got != test.expect {
+ t.Errorf("got %q want %q", got, test.expect)
+ }
+ })
+ }
+}
+
+func TestMapMerge(t *testing.T) {
+ for _, test := range []struct {
+ name string
+ maps []label.Map
+ keys []label.Key
+ expect string
+ }{{
+ name: "no maps",
+ keys: []label.Key{AKey},
+ expect: `nil`,
+ }, {
+ name: "one map",
+ maps: []label.Map{label.NewMap(all...)},
+ keys: []label.Key{AKey},
+ expect: `A="a"`,
+ }, {
+ name: "invalid map",
+ maps: []label.Map{label.NewMap()},
+ keys: []label.Key{AKey},
+ expect: `nil`,
+ }, {
+ name: "two maps",
+ maps: []label.Map{label.NewMap(B, C), label.NewMap(A)},
+ keys: []label.Key{AKey, BKey, CKey},
+ expect: `A="a", B="b", C="c"`,
+ }, {
+ name: "invalid start map",
+ maps: []label.Map{label.NewMap(), label.NewMap(B, C)},
+ keys: []label.Key{AKey, BKey, CKey},
+ expect: `nil, B="b", C="c"`,
+ }, {
+ name: "invalid mid map",
+ maps: []label.Map{label.NewMap(A), label.NewMap(), label.NewMap(C)},
+ keys: []label.Key{AKey, BKey, CKey},
+ expect: `A="a", nil, C="c"`,
+ }, {
+ name: "invalid end map",
+ maps: []label.Map{label.NewMap(A, B), label.NewMap()},
+ keys: []label.Key{AKey, BKey, CKey},
+ expect: `A="a", B="b", nil`,
+ }, {
+ name: "three maps one nil",
+ maps: []label.Map{label.NewMap(A), label.NewMap(B), nil},
+ keys: []label.Key{AKey, BKey, CKey},
+ expect: `A="a", B="b", nil`,
+ }, {
+ name: "two maps one nil",
+ maps: []label.Map{label.NewMap(A, B), nil},
+ keys: []label.Key{AKey, BKey, CKey},
+ expect: `A="a", B="b", nil`,
+ }} {
+ t.Run(test.name, func(t *testing.T) {
+ tagMap := label.MergeMaps(test.maps...)
+ got := printMap(tagMap, test.keys)
+ if got != test.expect {
+ t.Errorf("got %q want %q", got, test.expect)
+ }
+ })
+ }
+}
+
+func printList(list label.List) string {
+ buf := &bytes.Buffer{}
+ for index := 0; list.Valid(index); index++ {
+ l := list.Label(index)
+ if !l.Valid() {
+ continue
+ }
+ if buf.Len() > 0 {
+ buf.WriteString(", ")
+ }
+ fmt.Fprint(buf, l)
+ }
+ return buf.String()
+}
+
+func printMap(lm label.Map, keys []label.Key) string {
+ buf := &bytes.Buffer{}
+ for _, key := range keys {
+ if buf.Len() > 0 {
+ buf.WriteString(", ")
+ }
+ fmt.Fprint(buf, lm.Find(key))
+ }
+ return buf.String()
+}