library-go/utils/bitmap/bitmap_test.go

158 lines
4.0 KiB
Go
Raw Normal View History

2024-09-04 20:24:31 +00:00
package usecase
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestBitmap_SetTrueAndIsTrue(t *testing.T) {
tests := []struct {
name string
bitPos uint32
expected bool
}{
{"Set bit 0 to true", 0, true},
{"Set bit 1 to true", 1, true},
{"Set bit 63 to true", 63, true},
{"Set bit 64 to true", 64, true},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
bitmap := MakeBitmapWithBitSize(128) // 初始化一個 128 位的 Bitmap
bitmap.SetTrue(tt.bitPos)
result := bitmap.IsTrue(tt.bitPos)
assert.Equal(t, tt.expected, result)
})
}
}
func TestBitmap_SetFalse(t *testing.T) {
tests := []struct {
name string
bitPos uint32
expected bool
}{
{"Set bit 0 to false", 0, false},
{"Set bit 1 to false", 1, false},
{"Set bit 63 to false", 63, false},
{"Set bit 64 to false", 64, false},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
bitmap := MakeBitmapWithBitSize(128) // 初始化一個 128 位的 Bitmap
bitmap.SetTrue(tt.bitPos) // 先設置該 bit 為 true
bitmap.SetFalse(tt.bitPos) // 然後設置該 bit 為 false
result := bitmap.IsTrue(tt.bitPos)
assert.Equal(t, tt.expected, result)
})
}
}
func TestBitmap_Reset(t *testing.T) {
bitmap := MakeBitmapWithBitSize(128) // 初始化一個 128 位的 Bitmap
bitmap.SetTrue(0)
bitmap.SetTrue(64)
// 確認 bit 0 和 bit 64 是 true
assert.True(t, bitmap.IsTrue(0))
assert.True(t, bitmap.IsTrue(64))
bitmap.Reset() // 重置位圖
// 確認所有的位都已經重置為 false
assert.False(t, bitmap.IsTrue(0))
assert.False(t, bitmap.IsTrue(64))
}
func TestBitmap_ByteSize(t *testing.T) {
bitmap := MakeBitmapWithBitSize(64) // 初始化一個 64 位的 Bitmap
assert.Equal(t, 8, bitmap.ByteSize()) // 64 位應該佔用 8 個 byte
}
func TestBitmap_BitSize(t *testing.T) {
bitmap := MakeBitmapWithBitSize(128) // 初始化一個 128 位的 Bitmap
assert.Equal(t, 128, bitmap.BitSize()) // 128 位應該有 128 個 bit
}
func TestBitmap_Resize(t *testing.T) {
tests := []struct {
name string
initialSize int
newBitSize int
expectedLen int
}{
{"Resize to larger size", 64, 128, 16},
{"Resize to smaller size", 128, 64, 16}, // 大小應保持不變
{"Resize to equal size", 64, 64, 8}, // 大小應保持不變
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
// 初始化一個 Bitmap
bitmap := MakeBitmapWithBitSize(tt.initialSize)
// 調用 Resize
resizedBitmap := bitmap.Resize(tt.newBitSize)
// 檢查結果的 byte 大小
assert.Equal(t, tt.expectedLen, len(resizedBitmap))
})
}
}
func TestBitmap_UpdateFrom(t *testing.T) {
tests := []struct {
name string
initialSize int
newBitmapSize int
expectedBitPos uint32
expectedResult bool
}{
{"Update to larger bitmap", 64, 128, 50, true},
{"Update to smaller bitmap", 128, 64, 50, true}, // 新的 Bitmap 將只更新前面部分
{"Update to equal size bitmap", 64, 64, 20, true}, // 將相同大小的 Bitmap 進行合併
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
// 初始化一個初始大小的 Bitmap
bitmap := MakeBitmapWithBitSize(tt.initialSize)
bitmap.SetTrue(tt.expectedBitPos)
// 初始化一個新的 Bitmap
newBitmap := MakeBitmapWithBitSize(tt.newBitmapSize)
newBitmap.SetTrue(tt.expectedBitPos)
// 更新 Bitmap
updatedBitmap := bitmap.UpdateFrom(newBitmap)
// 檢查預期的位是否為 true
result := updatedBitmap.IsTrue(tt.expectedBitPos)
assert.Equal(t, tt.expectedResult, result)
})
}
}
2024-09-05 03:03:52 +00:00
func TestBitmap_SetAllTrueAndSetAllFalse(t *testing.T) {
bitmap := MakeBitmapWithBitSize(128)
// 測試 SetAllTrue
bitmap.SetAllTrue()
for i := 0; i < bitmap.BitSize(); i++ {
if !bitmap.IsTrue(uint32(i)) {
t.Errorf("Expected bit %d to be true, but got false", i)
}
}
// 測試 SetAllFalse
bitmap.SetAllFalse()
for i := 0; i < bitmap.BitSize(); i++ {
if bitmap.IsTrue(uint32(i)) {
t.Errorf("Expected bit %d to be false, but got true", i)
}
}
}