2022-02-14 06:50:44 +00:00
|
|
|
package page_writer
|
|
|
|
|
|
|
|
import (
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
"testing"
|
|
|
|
)
|
|
|
|
|
|
|
|
func Test_PageChunkWrittenIntervalList(t *testing.T) {
|
|
|
|
list := newChunkWrittenIntervalList()
|
|
|
|
|
|
|
|
assert.Equal(t, 0, list.size(), "empty list")
|
|
|
|
|
2023-01-03 07:20:45 +00:00
|
|
|
list.MarkWritten(0, 5, 1)
|
2022-02-14 06:50:44 +00:00
|
|
|
assert.Equal(t, 1, list.size(), "one interval")
|
|
|
|
|
2023-01-03 07:20:45 +00:00
|
|
|
list.MarkWritten(0, 5, 2)
|
2022-02-14 06:50:44 +00:00
|
|
|
assert.Equal(t, 1, list.size(), "duplicated interval2")
|
|
|
|
|
2023-01-03 07:20:45 +00:00
|
|
|
list.MarkWritten(95, 100, 3)
|
2022-02-14 06:50:44 +00:00
|
|
|
assert.Equal(t, 2, list.size(), "two intervals")
|
|
|
|
|
2023-01-03 07:20:45 +00:00
|
|
|
list.MarkWritten(50, 60, 4)
|
2022-02-14 06:50:44 +00:00
|
|
|
assert.Equal(t, 3, list.size(), "three intervals")
|
|
|
|
|
2023-01-03 07:20:45 +00:00
|
|
|
list.MarkWritten(50, 55, 5)
|
|
|
|
assert.Equal(t, 4, list.size(), "three intervals merge")
|
2022-02-14 06:50:44 +00:00
|
|
|
|
2023-01-03 07:20:45 +00:00
|
|
|
list.MarkWritten(40, 50, 6)
|
|
|
|
assert.Equal(t, 5, list.size(), "three intervals grow forward")
|
2022-02-14 06:50:44 +00:00
|
|
|
|
2023-01-03 07:20:45 +00:00
|
|
|
list.MarkWritten(50, 65, 7)
|
|
|
|
assert.Equal(t, 4, list.size(), "three intervals grow backward")
|
2022-02-14 06:50:44 +00:00
|
|
|
|
2023-01-03 07:20:45 +00:00
|
|
|
list.MarkWritten(70, 80, 8)
|
|
|
|
assert.Equal(t, 5, list.size(), "four intervals")
|
2022-02-14 06:50:44 +00:00
|
|
|
|
2023-01-03 07:20:45 +00:00
|
|
|
list.MarkWritten(60, 70, 9)
|
|
|
|
assert.Equal(t, 6, list.size(), "three intervals merged")
|
2022-02-14 06:50:44 +00:00
|
|
|
|
2023-01-03 07:20:45 +00:00
|
|
|
list.MarkWritten(59, 71, 10)
|
|
|
|
assert.Equal(t, 6, list.size(), "covered three intervals")
|
2022-02-14 06:50:44 +00:00
|
|
|
|
2023-01-03 07:20:45 +00:00
|
|
|
list.MarkWritten(5, 59, 11)
|
|
|
|
assert.Equal(t, 5, list.size(), "covered two intervals")
|
2022-02-14 06:50:44 +00:00
|
|
|
|
2023-01-03 07:20:45 +00:00
|
|
|
list.MarkWritten(70, 99, 12)
|
|
|
|
assert.Equal(t, 5, list.size(), "covered one intervals")
|
2022-02-14 06:50:44 +00:00
|
|
|
|
|
|
|
}
|
2023-01-03 07:20:45 +00:00
|
|
|
|
|
|
|
type interval struct {
|
|
|
|
start int64
|
|
|
|
stop int64
|
|
|
|
expected bool
|
|
|
|
}
|
|
|
|
|
|
|
|
func Test_PageChunkWrittenIntervalList1(t *testing.T) {
|
|
|
|
list := newChunkWrittenIntervalList()
|
|
|
|
inputs := []interval{
|
|
|
|
{1, 5, true},
|
|
|
|
{2, 3, true},
|
|
|
|
}
|
|
|
|
for i, input := range inputs {
|
|
|
|
list.MarkWritten(input.start, input.stop, int64(i)+1)
|
|
|
|
actual := hasData(list, 0, 4)
|
|
|
|
if actual != input.expected {
|
|
|
|
t.Errorf("input [%d,%d) expected %v actual %v", input.start, input.stop, input.expected, actual)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func hasData(usage *ChunkWrittenIntervalList, chunkStartOffset, x int64) bool {
|
|
|
|
for t := usage.head.next; t != usage.tail; t = t.next {
|
|
|
|
logicStart := chunkStartOffset + t.StartOffset
|
|
|
|
logicStop := chunkStartOffset + t.stopOffset
|
|
|
|
if logicStart <= x && x < logicStop {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|