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)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|