mirror of https://github.com/portainer/portainer
124 lines
2.4 KiB
Go
124 lines
2.4 KiB
Go
package roar
|
|
|
|
import (
|
|
"slices"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestRoar(t *testing.T) {
|
|
r := Roar[int]{}
|
|
require.Equal(t, 0, r.Len())
|
|
|
|
r.Add(1)
|
|
require.Equal(t, 1, r.Len())
|
|
require.True(t, r.Contains(1))
|
|
require.False(t, r.Contains(2))
|
|
|
|
r.Add(2)
|
|
require.Equal(t, 2, r.Len())
|
|
require.True(t, r.Contains(2))
|
|
|
|
r.Remove(1)
|
|
require.Equal(t, 1, r.Len())
|
|
require.False(t, r.Contains(1))
|
|
|
|
s := FromSlice([]int{3, 4, 5})
|
|
require.Equal(t, 3, s.Len())
|
|
require.True(t, s.Contains(3))
|
|
require.True(t, s.Contains(4))
|
|
require.True(t, s.Contains(5))
|
|
|
|
r.Union(s)
|
|
require.Equal(t, 4, r.Len())
|
|
require.True(t, r.Contains(2))
|
|
require.True(t, r.Contains(3))
|
|
require.True(t, r.Contains(4))
|
|
require.True(t, r.Contains(5))
|
|
|
|
r.Iterate(func(id int) bool {
|
|
require.True(t, slices.Contains([]int{2, 3, 4, 5}, id))
|
|
|
|
return true
|
|
})
|
|
|
|
rSlice := r.ToSlice()
|
|
require.EqualValues(t, []int{2, 3, 4, 5}, rSlice)
|
|
|
|
r.Intersection(FromSlice([]int{4}))
|
|
require.Equal(t, 1, r.Len())
|
|
require.True(t, r.Contains(4))
|
|
require.False(t, r.Contains(2))
|
|
require.False(t, r.Contains(3))
|
|
require.False(t, r.Contains(5))
|
|
|
|
b, err := r.MarshalJSON()
|
|
require.NoError(t, err)
|
|
require.NotEqual(t, "null", string(b))
|
|
require.True(t, strings.HasPrefix(string(b), `"`))
|
|
require.True(t, strings.HasSuffix(string(b), `"`))
|
|
}
|
|
|
|
func TestNilSafety(t *testing.T) {
|
|
var r, s, u Roar[int]
|
|
|
|
r.Iterate(func(id int) bool {
|
|
require.Fail(t, "should not iterate over nil Roar")
|
|
|
|
return true
|
|
})
|
|
|
|
b, err := r.MarshalJSON()
|
|
require.NoError(t, err)
|
|
require.Equal(t, "null", string(b))
|
|
|
|
err = r.UnmarshalJSON([]byte("null"))
|
|
require.NoError(t, err)
|
|
require.Equal(t, 0, r.Len())
|
|
|
|
r.Contains(1)
|
|
r.Remove(1)
|
|
|
|
require.Equal(t, 0, r.Len())
|
|
require.Empty(t, r.ToSlice())
|
|
|
|
r.Add(1)
|
|
require.Equal(t, 1, r.Len())
|
|
require.False(t, r.Contains(2))
|
|
|
|
s.Union(r)
|
|
require.Equal(t, 1, s.Len())
|
|
require.True(t, s.Contains(1))
|
|
|
|
r.Union(u)
|
|
require.Equal(t, 1, r.Len())
|
|
require.True(t, r.Contains(1))
|
|
|
|
s.Intersection(u)
|
|
require.Equal(t, 0, s.Len())
|
|
|
|
u.Intersection(r)
|
|
require.Equal(t, 0, u.Len())
|
|
}
|
|
|
|
func TestJSON(t *testing.T) {
|
|
var r, u Roar[int]
|
|
|
|
r.Add(1)
|
|
r.Add(2)
|
|
r.Add(3)
|
|
|
|
b, err := r.MarshalJSON()
|
|
require.NoError(t, err)
|
|
require.NotEqual(t, "null", string(b))
|
|
|
|
err = u.UnmarshalJSON(b)
|
|
require.NoError(t, err)
|
|
require.Equal(t, 3, u.Len())
|
|
require.True(t, u.Contains(1))
|
|
require.True(t, u.Contains(2))
|
|
require.True(t, u.Contains(3))
|
|
}
|