github.com/jd-ly/tools@v0.5.7/internal/event/label/label_test.go (about) 1 // Copyright 2020 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 label_test 6 7 import ( 8 "bytes" 9 "fmt" 10 "testing" 11 12 "github.com/jd-ly/tools/internal/event/keys" 13 "github.com/jd-ly/tools/internal/event/label" 14 ) 15 16 var ( 17 AKey = keys.NewString("A", "") 18 BKey = keys.NewString("B", "") 19 CKey = keys.NewString("C", "") 20 A = AKey.Of("a") 21 B = BKey.Of("b") 22 C = CKey.Of("c") 23 all = []label.Label{A, B, C} 24 ) 25 26 func TestList(t *testing.T) { 27 for _, test := range []struct { 28 name string 29 labels []label.Label 30 expect string 31 }{{ 32 name: "empty", 33 }, { 34 name: "single", 35 labels: []label.Label{A}, 36 expect: `A="a"`, 37 }, { 38 name: "invalid", 39 labels: []label.Label{{}}, 40 expect: ``, 41 }, { 42 name: "two", 43 labels: []label.Label{A, B}, 44 expect: `A="a", B="b"`, 45 }, { 46 name: "three", 47 labels: []label.Label{A, B, C}, 48 expect: `A="a", B="b", C="c"`, 49 }, { 50 name: "missing A", 51 labels: []label.Label{{}, B, C}, 52 expect: `B="b", C="c"`, 53 }, { 54 name: "missing B", 55 labels: []label.Label{A, {}, C}, 56 expect: `A="a", C="c"`, 57 }, { 58 name: "missing C", 59 labels: []label.Label{A, B, {}}, 60 expect: `A="a", B="b"`, 61 }, { 62 name: "missing AB", 63 labels: []label.Label{{}, {}, C}, 64 expect: `C="c"`, 65 }, { 66 name: "missing AC", 67 labels: []label.Label{{}, B, {}}, 68 expect: `B="b"`, 69 }, { 70 name: "missing BC", 71 labels: []label.Label{A, {}, {}}, 72 expect: `A="a"`, 73 }} { 74 t.Run(test.name, func(t *testing.T) { 75 got := printList(label.NewList(test.labels...)) 76 if got != test.expect { 77 t.Errorf("got %q want %q", got, test.expect) 78 } 79 }) 80 } 81 } 82 83 func TestFilter(t *testing.T) { 84 for _, test := range []struct { 85 name string 86 labels []label.Label 87 filters []label.Key 88 expect string 89 }{{ 90 name: "no filters", 91 labels: all, 92 expect: `A="a", B="b", C="c"`, 93 }, { 94 name: "no labels", 95 filters: []label.Key{AKey}, 96 expect: ``, 97 }, { 98 name: "filter A", 99 labels: all, 100 filters: []label.Key{AKey}, 101 expect: `B="b", C="c"`, 102 }, { 103 name: "filter B", 104 labels: all, 105 filters: []label.Key{BKey}, 106 expect: `A="a", C="c"`, 107 }, { 108 name: "filter C", 109 labels: all, 110 filters: []label.Key{CKey}, 111 expect: `A="a", B="b"`, 112 }, { 113 name: "filter AC", 114 labels: all, 115 filters: []label.Key{AKey, CKey}, 116 expect: `B="b"`, 117 }} { 118 t.Run(test.name, func(t *testing.T) { 119 labels := label.NewList(test.labels...) 120 got := printList(label.Filter(labels, test.filters...)) 121 if got != test.expect { 122 t.Errorf("got %q want %q", got, test.expect) 123 } 124 }) 125 } 126 } 127 128 func TestMap(t *testing.T) { 129 for _, test := range []struct { 130 name string 131 labels []label.Label 132 keys []label.Key 133 expect string 134 }{{ 135 name: "no labels", 136 keys: []label.Key{AKey}, 137 expect: `nil`, 138 }, { 139 name: "match A", 140 labels: all, 141 keys: []label.Key{AKey}, 142 expect: `A="a"`, 143 }, { 144 name: "match B", 145 labels: all, 146 keys: []label.Key{BKey}, 147 expect: `B="b"`, 148 }, { 149 name: "match C", 150 labels: all, 151 keys: []label.Key{CKey}, 152 expect: `C="c"`, 153 }, { 154 name: "match ABC", 155 labels: all, 156 keys: []label.Key{AKey, BKey, CKey}, 157 expect: `A="a", B="b", C="c"`, 158 }, { 159 name: "missing A", 160 labels: []label.Label{{}, B, C}, 161 keys: []label.Key{AKey, BKey, CKey}, 162 expect: `nil, B="b", C="c"`, 163 }, { 164 name: "missing B", 165 labels: []label.Label{A, {}, C}, 166 keys: []label.Key{AKey, BKey, CKey}, 167 expect: `A="a", nil, C="c"`, 168 }, { 169 name: "missing C", 170 labels: []label.Label{A, B, {}}, 171 keys: []label.Key{AKey, BKey, CKey}, 172 expect: `A="a", B="b", nil`, 173 }} { 174 t.Run(test.name, func(t *testing.T) { 175 lm := label.NewMap(test.labels...) 176 got := printMap(lm, test.keys) 177 if got != test.expect { 178 t.Errorf("got %q want %q", got, test.expect) 179 } 180 }) 181 } 182 } 183 184 func TestMapMerge(t *testing.T) { 185 for _, test := range []struct { 186 name string 187 maps []label.Map 188 keys []label.Key 189 expect string 190 }{{ 191 name: "no maps", 192 keys: []label.Key{AKey}, 193 expect: `nil`, 194 }, { 195 name: "one map", 196 maps: []label.Map{label.NewMap(all...)}, 197 keys: []label.Key{AKey}, 198 expect: `A="a"`, 199 }, { 200 name: "invalid map", 201 maps: []label.Map{label.NewMap()}, 202 keys: []label.Key{AKey}, 203 expect: `nil`, 204 }, { 205 name: "two maps", 206 maps: []label.Map{label.NewMap(B, C), label.NewMap(A)}, 207 keys: []label.Key{AKey, BKey, CKey}, 208 expect: `A="a", B="b", C="c"`, 209 }, { 210 name: "invalid start map", 211 maps: []label.Map{label.NewMap(), label.NewMap(B, C)}, 212 keys: []label.Key{AKey, BKey, CKey}, 213 expect: `nil, B="b", C="c"`, 214 }, { 215 name: "invalid mid map", 216 maps: []label.Map{label.NewMap(A), label.NewMap(), label.NewMap(C)}, 217 keys: []label.Key{AKey, BKey, CKey}, 218 expect: `A="a", nil, C="c"`, 219 }, { 220 name: "invalid end map", 221 maps: []label.Map{label.NewMap(A, B), label.NewMap()}, 222 keys: []label.Key{AKey, BKey, CKey}, 223 expect: `A="a", B="b", nil`, 224 }, { 225 name: "three maps one nil", 226 maps: []label.Map{label.NewMap(A), label.NewMap(B), nil}, 227 keys: []label.Key{AKey, BKey, CKey}, 228 expect: `A="a", B="b", nil`, 229 }, { 230 name: "two maps one nil", 231 maps: []label.Map{label.NewMap(A, B), nil}, 232 keys: []label.Key{AKey, BKey, CKey}, 233 expect: `A="a", B="b", nil`, 234 }} { 235 t.Run(test.name, func(t *testing.T) { 236 tagMap := label.MergeMaps(test.maps...) 237 got := printMap(tagMap, test.keys) 238 if got != test.expect { 239 t.Errorf("got %q want %q", got, test.expect) 240 } 241 }) 242 } 243 } 244 245 func printList(list label.List) string { 246 buf := &bytes.Buffer{} 247 for index := 0; list.Valid(index); index++ { 248 l := list.Label(index) 249 if !l.Valid() { 250 continue 251 } 252 if buf.Len() > 0 { 253 buf.WriteString(", ") 254 } 255 fmt.Fprint(buf, l) 256 } 257 return buf.String() 258 } 259 260 func printMap(lm label.Map, keys []label.Key) string { 261 buf := &bytes.Buffer{} 262 for _, key := range keys { 263 if buf.Len() > 0 { 264 buf.WriteString(", ") 265 } 266 fmt.Fprint(buf, lm.Find(key)) 267 } 268 return buf.String() 269 }