gopass/pkg/set/set_test.go
Dominik Schulz 1e05f6a618
[chore] Move set from internal to pkg (#3129)
Signed-off-by: Dominik Schulz <dominik.schulz@gauner.org>
2025-04-19 20:29:24 +02:00

232 lines
3.7 KiB
Go

package set
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestString(t *testing.T) {
t.Parallel()
s1 := New[string]()
assert.Equal(t, "ø", s1.String())
s1.Add("a", "b", "c")
assert.Equal(t, "{a, b, c}", s1.String())
s2 := New(1, 2, 3, 4)
assert.Equal(t, "{1, 2, 3, 4}", s2.String())
}
func TestElements(t *testing.T) {
t.Parallel()
s1 := New("c", "b", "a")
assert.Equal(t, []string{"a", "b", "c"}, s1.Elements())
}
func TestClone(t *testing.T) {
t.Parallel()
s1 := New("a", "b", "c")
s2 := s1.Clone()
assert.Equal(t, s1, s2)
s1.Add("d")
assert.NotEqual(t, s1, s2)
}
func TestUpdate(t *testing.T) {
t.Parallel()
s1 := New("a", "b", "c")
s1.Update(New("c", "d", "e"))
assert.Equal(t, New("a", "b", "c", "d", "e"), s1)
var s2 Set[string]
s2.Update(s1)
assert.Equal(t, New("a", "b", "c", "d", "e"), s2)
}
func TestEquals(t *testing.T) {
t.Parallel()
s1 := New("a", "b", "c")
s2 := s1.Clone()
assert.True(t, s1.Equals(s2))
s1.Add("d")
assert.False(t, s1.Equals(s2))
}
func TestIsSubset(t *testing.T) {
t.Parallel()
s1 := New("a", "b", "b", "c", "d")
s2 := New("c", "d")
assert.True(t, s2.IsSubset(s1))
s3 := New[string]()
assert.True(t, s3.IsSubset(s2))
assert.False(t, s2.IsSubset(s3))
s4 := New("foo")
assert.False(t, s4.IsSubset(s1))
}
func TestUnion(t *testing.T) {
t.Parallel()
s1 := New("a", "b", "b", "c", "d")
s2 := New("c", "d")
s3 := New("foo", "bar")
us := s1.Union(s2).Union(s3)
assert.Equal(t, New("a", "b", "c", "d", "foo", "bar"), us)
s4 := New[string]()
assert.Equal(t, s3, s4.Union(s3))
assert.Equal(t, s3, s3.Union(s4))
}
func TestDifference(t *testing.T) {
t.Parallel()
s1 := New("a", "b", "c", "d")
s2 := New("c", "d")
ds := s1.Difference(s2)
assert.Equal(t, New("a", "b"), ds)
}
func TestSymmetricDifference(t *testing.T) {
t.Parallel()
s1 := New("a", "b", "c", "d")
s2 := New("c", "d", "e")
ds := s1.SymmetricDifference(s2)
assert.Equal(t, New("a", "b", "e"), ds)
}
func TestAdd(t *testing.T) {
t.Parallel()
var s1 Set[string]
s1.Add("a")
assert.Equal(t, New("a"), s1)
}
func TestRemove(t *testing.T) {
t.Parallel()
s1 := New("a", "b", "b", "c", "d")
s2 := New("c", "d")
s1.Remove(s2)
assert.Equal(t, New("a", "b"), s1)
s3 := New[string]()
assert.False(t, s3.Remove(New("a")))
}
func TestDiscard(t *testing.T) {
t.Parallel()
s1 := New("a", "b", "b", "c", "d")
s1.Discard("c", "d")
assert.Equal(t, New("a", "b"), s1)
s3 := New[string]()
assert.False(t, s3.Discard("a"))
}
func TestMap(t *testing.T) {
t.Parallel()
s1 := New(1, 2, 3)
s2 := s1.Map(func(i int) int {
return i + 1
})
assert.Equal(t, New(2, 3, 4), s2)
}
func TestEach(t *testing.T) {
t.Parallel()
seen := 0
s1 := New(1, 2, 3)
s1.Each(func(i int) {
seen++
})
assert.Equal(t, s1.Len(), seen)
}
func TestSelect(t *testing.T) {
t.Parallel()
s1 := New(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
s2 := s1.Select(func(i int) bool {
return i%2 == 0
})
assert.Equal(t, New(2, 4, 6, 8, 10), s2)
}
func TestPartition(t *testing.T) {
t.Parallel()
s1 := New(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
s2, s3 := s1.Partition(func(i int) bool {
return i%2 == 0
})
assert.Equal(t, New(2, 4, 6, 8, 10), s2)
assert.Equal(t, New(1, 3, 5, 7, 9), s3)
}
func TestChoose(t *testing.T) {
t.Parallel()
s1 := New(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
v, ok := s1.Choose(func(i int) bool {
return i%3 == 0 && i/3 == 3
})
assert.Equal(t, 9, v)
assert.True(t, ok)
v, ok = s1.Choose(func(i int) bool {
return i > 1024
})
assert.Equal(t, 0, v)
assert.False(t, ok)
s2 := New(1)
v, ok = s2.Choose(nil)
assert.Equal(t, 1, v)
assert.True(t, ok)
}
func TestCount(t *testing.T) {
t.Parallel()
s1 := New(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
c := s1.Count(func(i int) bool {
return i%3 == 0
})
assert.Equal(t, 3, c)
}