mirror of
https://github.com/luxfi/math.git
synced 2026-07-27 03:38:49 +00:00
175 lines
3.8 KiB
Go
175 lines
3.8 KiB
Go
// Copyright (C) 2019-2024, Lux Industries Inc. All rights reserved.
|
|
// See the file LICENSE for licensing terms.
|
|
|
|
package set
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestSampleableSet(t *testing.T) {
|
|
require := require.New(t)
|
|
id1 := 1
|
|
|
|
s := SampleableSet[int]{}
|
|
|
|
s.Add(id1)
|
|
require.True(s.Contains(id1))
|
|
|
|
s.Remove(id1)
|
|
require.False(s.Contains(id1))
|
|
|
|
s.Add(id1)
|
|
require.True(s.Contains(id1))
|
|
require.Len(s.List(), 1)
|
|
require.Equal(id1, s.List()[0])
|
|
|
|
s.Clear()
|
|
require.False(s.Contains(id1))
|
|
|
|
s.Add(id1)
|
|
|
|
s2 := SampleableSet[int]{}
|
|
|
|
require.False(s.Overlaps(s2))
|
|
|
|
s2.Union(s)
|
|
require.True(s2.Contains(id1))
|
|
require.True(s.Overlaps(s2))
|
|
|
|
s2.Difference(s)
|
|
require.False(s2.Contains(id1))
|
|
require.False(s.Overlaps(s2))
|
|
}
|
|
|
|
func TestSampleableSetClear(t *testing.T) {
|
|
require := require.New(t)
|
|
|
|
set := SampleableSet[int]{}
|
|
for i := 0; i < 25; i++ {
|
|
set.Add(i)
|
|
}
|
|
set.Clear()
|
|
require.Zero(set.Len())
|
|
set.Add(1337)
|
|
require.Equal(1, set.Len())
|
|
}
|
|
|
|
func TestSampleableSetMarshalJSON(t *testing.T) {
|
|
require := require.New(t)
|
|
set := SampleableSet[int]{}
|
|
{
|
|
asJSON, err := set.MarshalJSON()
|
|
require.NoError(err)
|
|
require.Equal("[]", string(asJSON))
|
|
}
|
|
id1, id2 := 1, 2
|
|
id1JSON, err := json.Marshal(id1)
|
|
require.NoError(err)
|
|
id2JSON, err := json.Marshal(id2)
|
|
require.NoError(err)
|
|
set.Add(id1)
|
|
{
|
|
asJSON, err := set.MarshalJSON()
|
|
require.NoError(err)
|
|
require.Equal(fmt.Sprintf("[%s]", string(id1JSON)), string(asJSON))
|
|
}
|
|
set.Add(id2)
|
|
{
|
|
asJSON, err := set.MarshalJSON()
|
|
require.NoError(err)
|
|
require.Equal(fmt.Sprintf("[%s,%s]", string(id1JSON), string(id2JSON)), string(asJSON))
|
|
}
|
|
}
|
|
|
|
func TestSampleableSetUnmarshalJSON(t *testing.T) {
|
|
require := require.New(t)
|
|
set := SampleableSet[int]{}
|
|
{
|
|
require.NoError(set.UnmarshalJSON([]byte("[]")))
|
|
require.Zero(set.Len())
|
|
}
|
|
id1, id2 := 1, 2
|
|
id1JSON, err := json.Marshal(id1)
|
|
require.NoError(err)
|
|
id2JSON, err := json.Marshal(id2)
|
|
require.NoError(err)
|
|
{
|
|
require.NoError(set.UnmarshalJSON([]byte(fmt.Sprintf("[%s]", string(id1JSON)))))
|
|
require.Equal(1, set.Len())
|
|
require.True(set.Contains(id1))
|
|
}
|
|
{
|
|
require.NoError(set.UnmarshalJSON([]byte(fmt.Sprintf("[%s,%s]", string(id1JSON), string(id2JSON)))))
|
|
require.Equal(2, set.Len())
|
|
require.True(set.Contains(id1))
|
|
require.True(set.Contains(id2))
|
|
}
|
|
{
|
|
require.NoError(set.UnmarshalJSON([]byte(fmt.Sprintf("[%d,%d,%d]", 3, 4, 5))))
|
|
require.Equal(3, set.Len())
|
|
require.True(set.Contains(3))
|
|
require.True(set.Contains(4))
|
|
require.True(set.Contains(5))
|
|
}
|
|
{
|
|
require.NoError(set.UnmarshalJSON([]byte(fmt.Sprintf("[%d,%d,%d, %d]", 3, 4, 5, 3))))
|
|
require.Equal(3, set.Len())
|
|
require.True(set.Contains(3))
|
|
require.True(set.Contains(4))
|
|
require.True(set.Contains(5))
|
|
}
|
|
{
|
|
set1 := SampleableSet[int]{}
|
|
set2 := SampleableSet[int]{}
|
|
require.NoError(set1.UnmarshalJSON([]byte(fmt.Sprintf("[%s,%s]", string(id1JSON), string(id2JSON)))))
|
|
require.NoError(set2.UnmarshalJSON([]byte(fmt.Sprintf("[%s,%s]", string(id2JSON), string(id1JSON)))))
|
|
require.True(set1.Equals(set2))
|
|
}
|
|
}
|
|
|
|
func TestOfSampleable(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
elements []int
|
|
expected []int
|
|
}{
|
|
{
|
|
name: "nil",
|
|
elements: nil,
|
|
expected: []int{},
|
|
},
|
|
{
|
|
name: "empty",
|
|
elements: []int{},
|
|
expected: []int{},
|
|
},
|
|
{
|
|
name: "unique elements",
|
|
elements: []int{1, 2, 3},
|
|
expected: []int{1, 2, 3},
|
|
},
|
|
{
|
|
name: "duplicate elements",
|
|
elements: []int{1, 2, 3, 1, 2, 3},
|
|
expected: []int{1, 2, 3},
|
|
},
|
|
}
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
require := require.New(t)
|
|
|
|
s := OfSampleable(tt.elements...)
|
|
|
|
require.Equal(len(tt.expected), s.Len())
|
|
for _, expected := range tt.expected {
|
|
require.True(s.Contains(expected))
|
|
}
|
|
})
|
|
}
|
|
}
|