tailscale/util/set/set_test.go
Chris Palmer 3a9f5c02bf
util/set: make Clone a method (#10044)
Updates #cleanup

Signed-off-by: Chris Palmer <cpalmer@tailscale.com>
2023-11-01 10:20:38 -07:00

115 lines
1.9 KiB
Go

// Copyright (c) Tailscale Inc & AUTHORS
// SPDX-License-Identifier: BSD-3-Clause
package set
import (
"slices"
"testing"
)
func TestSet(t *testing.T) {
s := Set[int]{}
s.Add(1)
s.Add(2)
if !s.Contains(1) {
t.Error("missing 1")
}
if !s.Contains(2) {
t.Error("missing 2")
}
if s.Contains(3) {
t.Error("shouldn't have 3")
}
if s.Len() != 2 {
t.Errorf("wrong len %d; want 2", s.Len())
}
more := []int{3, 4}
s.AddSlice(more)
if !s.Contains(3) {
t.Error("missing 3")
}
if !s.Contains(4) {
t.Error("missing 4")
}
if s.Contains(5) {
t.Error("shouldn't have 5")
}
if s.Len() != 4 {
t.Errorf("wrong len %d; want 4", s.Len())
}
es := s.Slice()
if len(es) != 4 {
t.Errorf("slice has wrong len %d; want 4", len(es))
}
for _, e := range []int{1, 2, 3, 4} {
if !slices.Contains(es, e) {
t.Errorf("slice missing %d (%#v)", e, es)
}
}
}
func TestSetOf(t *testing.T) {
s := SetOf[int]([]int{1, 2, 3, 4, 4, 1})
if s.Len() != 4 {
t.Errorf("wrong len %d; want 4", s.Len())
}
for _, n := range []int{1, 2, 3, 4} {
if !s.Contains(n) {
t.Errorf("should contain %d", n)
}
}
}
func TestEqual(t *testing.T) {
type test struct {
name string
a Set[int]
b Set[int]
expected bool
}
tests := []test{
{
"equal",
SetOf([]int{1, 2, 3, 4}),
SetOf([]int{1, 2, 3, 4}),
true,
},
{
"not equal",
SetOf([]int{1, 2, 3, 4}),
SetOf([]int{1, 2, 3, 5}),
false,
},
{
"different lengths",
SetOf([]int{1, 2, 3, 4, 5}),
SetOf([]int{1, 2, 3, 5}),
false,
},
}
for _, tt := range tests {
if tt.a.Equal(tt.b) != tt.expected {
t.Errorf("%s: failed", tt.name)
}
}
}
func TestClone(t *testing.T) {
s := SetOf[int]([]int{1, 2, 3, 4, 4, 1})
if s.Len() != 4 {
t.Errorf("wrong len %d; want 4", s.Len())
}
s2 := s.Clone()
if !s.Equal(s2) {
t.Error("clone not equal to original")
}
s.Add(100)
if s.Equal(s2) {
t.Error("clone is not distinct from original")
}
}