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