test: super.BitSet 完善测试用例
This commit is contained in:
parent
959abff85f
commit
f08f06891c
|
@ -7,9 +7,13 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
// NewBitSet 通过指定的 Bit 位创建一个 BitSet
|
// NewBitSet 通过指定的 Bit 位创建一个 BitSet
|
||||||
|
// - 当指定的 Bit 位存在负数时,将会 panic
|
||||||
func NewBitSet[Bit generic.Integer](bits ...Bit) *BitSet[Bit] {
|
func NewBitSet[Bit generic.Integer](bits ...Bit) *BitSet[Bit] {
|
||||||
set := &BitSet[Bit]{set: make([]uint64, 0, 1)}
|
set := &BitSet[Bit]{set: make([]uint64, 0, 1)}
|
||||||
for _, bit := range bits {
|
for _, bit := range bits {
|
||||||
|
if bit < 0 {
|
||||||
|
panic(fmt.Errorf("bit %v is negative", bit))
|
||||||
|
}
|
||||||
set.Set(bit)
|
set.Set(bit)
|
||||||
}
|
}
|
||||||
return set
|
return set
|
||||||
|
@ -43,6 +47,15 @@ func (slf *BitSet[Bit]) Del(bit Bit) *BitSet[Bit] {
|
||||||
// Shrink 将 BitSet 中的比特位集合缩小到最小
|
// Shrink 将 BitSet 中的比特位集合缩小到最小
|
||||||
// - 正常情况下当 BitSet 中的比特位超出 64 位时,将自动增长,当 BitSet 中的比特位数量减少时,可以使用该方法将 BitSet 中的比特位集合缩小到最小
|
// - 正常情况下当 BitSet 中的比特位超出 64 位时,将自动增长,当 BitSet 中的比特位数量减少时,可以使用该方法将 BitSet 中的比特位集合缩小到最小
|
||||||
func (slf *BitSet[Bit]) Shrink() *BitSet[Bit] {
|
func (slf *BitSet[Bit]) Shrink() *BitSet[Bit] {
|
||||||
|
switch len(slf.set) {
|
||||||
|
case 0:
|
||||||
|
return slf
|
||||||
|
case 1:
|
||||||
|
if slf.set[0] == 0 {
|
||||||
|
slf.set = nil
|
||||||
|
return slf
|
||||||
|
}
|
||||||
|
}
|
||||||
index := len(slf.set) - 1
|
index := len(slf.set) - 1
|
||||||
if slf.set[index] != 0 {
|
if slf.set[index] != 0 {
|
||||||
return slf
|
return slf
|
||||||
|
|
|
@ -0,0 +1,74 @@
|
||||||
|
package super_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/kercylan98/minotaur/utils/super"
|
||||||
|
)
|
||||||
|
|
||||||
|
func ExampleNewBitSet() {
|
||||||
|
var bs = super.NewBitSet(1, 2, 3, 4, 5, 6, 7, 8, 9)
|
||||||
|
bs.Set(10)
|
||||||
|
fmt.Println(bs.Bits())
|
||||||
|
// Output:
|
||||||
|
// [1 2 3 4 5 6 7 8 9 10]
|
||||||
|
}
|
||||||
|
|
||||||
|
func ExampleBitSet_Set() {
|
||||||
|
var bs = super.NewBitSet[int]()
|
||||||
|
bs.Set(10)
|
||||||
|
fmt.Println(bs.Bits())
|
||||||
|
// Output:
|
||||||
|
// [10]
|
||||||
|
}
|
||||||
|
|
||||||
|
func ExampleBitSet_Del() {
|
||||||
|
var bs = super.NewBitSet(1, 2, 3, 4, 5, 6, 7, 8, 9)
|
||||||
|
bs.Del(1)
|
||||||
|
fmt.Println(bs.Bits())
|
||||||
|
// Output:
|
||||||
|
// [2 3 4 5 6 7 8 9]
|
||||||
|
}
|
||||||
|
|
||||||
|
func ExampleBitSet_Shrink() {
|
||||||
|
var bs = super.NewBitSet(111, 222, 333, 444)
|
||||||
|
fmt.Println(bs.Cap())
|
||||||
|
bs.Del(444)
|
||||||
|
fmt.Println(bs.Cap())
|
||||||
|
bs.Shrink()
|
||||||
|
fmt.Println(bs.Cap())
|
||||||
|
// Output:
|
||||||
|
// 448
|
||||||
|
// 448
|
||||||
|
// 384
|
||||||
|
}
|
||||||
|
|
||||||
|
func ExampleBitSet_Cap() {
|
||||||
|
var bs = super.NewBitSet(63)
|
||||||
|
fmt.Println(bs.Cap())
|
||||||
|
// Output:
|
||||||
|
// 64
|
||||||
|
}
|
||||||
|
|
||||||
|
func ExampleBitSet_Has() {
|
||||||
|
var bs = super.NewBitSet(1, 2, 3, 4, 5, 6, 7, 8, 9)
|
||||||
|
fmt.Println(bs.Has(1))
|
||||||
|
fmt.Println(bs.Has(10))
|
||||||
|
// Output:
|
||||||
|
// true
|
||||||
|
// false
|
||||||
|
}
|
||||||
|
|
||||||
|
func ExampleBitSet_Clear() {
|
||||||
|
var bs = super.NewBitSet(1, 2, 3, 4, 5, 6, 7, 8, 9)
|
||||||
|
bs.Clear()
|
||||||
|
fmt.Println(bs.Bits())
|
||||||
|
// Output:
|
||||||
|
// []
|
||||||
|
}
|
||||||
|
|
||||||
|
func ExampleBitSet_Len() {
|
||||||
|
var bs = super.NewBitSet(1, 2, 3, 4, 5, 6, 7, 8, 9)
|
||||||
|
fmt.Println(bs.Len())
|
||||||
|
// Output:
|
||||||
|
// 9
|
||||||
|
}
|
|
@ -5,29 +5,118 @@ import (
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestBitSet_Set(t *testing.T) {
|
func TestNewBitSet(t *testing.T) {
|
||||||
bs := super.NewBitSet(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
|
var cases = []struct {
|
||||||
bs.Set(11)
|
name string
|
||||||
bs.Set(12)
|
in []int
|
||||||
bs.Set(13)
|
shouldPanic bool
|
||||||
|
}{
|
||||||
|
{name: "normal", in: []int{1, 2, 3, 4, 5, 6, 7, 8, 9}},
|
||||||
|
{name: "empty", in: make([]int, 0)},
|
||||||
|
{name: "nil", in: nil},
|
||||||
|
{name: "negative", in: []int{-1, -2}, shouldPanic: true},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, c := range cases {
|
||||||
|
t.Run(c.name, func(t *testing.T) {
|
||||||
|
defer func() {
|
||||||
|
if r := recover(); r != nil && !c.shouldPanic {
|
||||||
|
t.Fatalf("panic: %v", r)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
bs := super.NewBitSet(c.in...)
|
||||||
t.Log(bs)
|
t.Log(bs)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestBitSet_Set(t *testing.T) {
|
||||||
|
var cases = []struct {
|
||||||
|
name string
|
||||||
|
in []int
|
||||||
|
shouldPanic bool
|
||||||
|
}{
|
||||||
|
{name: "normal", in: []int{1, 2, 3, 4, 5, 6, 7, 8, 9}},
|
||||||
|
{name: "empty", in: make([]int, 0)},
|
||||||
|
{name: "nil", in: nil},
|
||||||
|
{name: "negative", in: []int{-1, -2}, shouldPanic: true},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, c := range cases {
|
||||||
|
t.Run(c.name, func(t *testing.T) {
|
||||||
|
defer func() {
|
||||||
|
if r := recover(); r != nil && !c.shouldPanic {
|
||||||
|
t.Fatalf("panic: %v", r)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
bs := super.NewBitSet[int]()
|
||||||
|
for _, bit := range c.in {
|
||||||
|
bs.Set(bit)
|
||||||
|
}
|
||||||
|
for _, bit := range c.in {
|
||||||
|
if !bs.Has(bit) {
|
||||||
|
t.Fatalf("bit %v not set", bit)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestBitSet_Del(t *testing.T) {
|
func TestBitSet_Del(t *testing.T) {
|
||||||
bs := super.NewBitSet(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
|
var cases = []struct {
|
||||||
bs.Del(11)
|
name string
|
||||||
bs.Del(12)
|
in []int
|
||||||
bs.Del(13)
|
shouldPanic bool
|
||||||
bs.Del(10)
|
}{
|
||||||
t.Log(bs)
|
{name: "normal", in: []int{1, 2, 3, 4, 5, 6, 7, 8, 9}},
|
||||||
|
{name: "empty", in: make([]int, 0)},
|
||||||
|
{name: "nil", in: nil},
|
||||||
|
{name: "negative", in: []int{-1, -2}, shouldPanic: true},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, c := range cases {
|
||||||
|
t.Run(c.name, func(t *testing.T) {
|
||||||
|
defer func() {
|
||||||
|
if r := recover(); r != nil && !c.shouldPanic {
|
||||||
|
t.Fatalf("panic: %v", r)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
bs := super.NewBitSet[int]()
|
||||||
|
for _, bit := range c.in {
|
||||||
|
bs.Set(bit)
|
||||||
|
}
|
||||||
|
for _, bit := range c.in {
|
||||||
|
bs.Del(bit)
|
||||||
|
}
|
||||||
|
for _, bit := range c.in {
|
||||||
|
if bs.Has(bit) {
|
||||||
|
t.Fatalf("bit %v not del", bit)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestBitSet_Shrink(t *testing.T) {
|
func TestBitSet_Shrink(t *testing.T) {
|
||||||
bs := super.NewBitSet(63)
|
var cases = []struct {
|
||||||
t.Log(bs.Cap())
|
name string
|
||||||
bs.Set(200)
|
in []int
|
||||||
t.Log(bs.Cap())
|
}{
|
||||||
bs.Del(200)
|
{name: "normal", in: []int{1, 2, 3, 4, 5, 6, 7, 8, 9}},
|
||||||
|
{name: "empty", in: make([]int, 0)},
|
||||||
|
{name: "nil", in: nil},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, c := range cases {
|
||||||
|
t.Run(c.name, func(t *testing.T) {
|
||||||
|
bs := super.NewBitSet(c.in...)
|
||||||
|
for _, v := range c.in {
|
||||||
|
bs.Del(v)
|
||||||
|
}
|
||||||
bs.Shrink()
|
bs.Shrink()
|
||||||
t.Log(bs.Cap())
|
if bs.Cap() != 0 {
|
||||||
|
t.Fatalf("cap %v != 0", bs.Cap())
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue