about summary refs log tree commit diff
path: root/pkg/libs/rangemap/rangemap_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/libs/rangemap/rangemap_test.go')
-rw-r--r--pkg/libs/rangemap/rangemap_test.go115
1 files changed, 79 insertions, 36 deletions
diff --git a/pkg/libs/rangemap/rangemap_test.go b/pkg/libs/rangemap/rangemap_test.go
index b120efa..deb6dc7 100644
--- a/pkg/libs/rangemap/rangemap_test.go
+++ b/pkg/libs/rangemap/rangemap_test.go
@@ -7,65 +7,108 @@ import (
 	"github.com/stretchr/testify/assert"
 )
 
-func TestAppend(t *testing.T) {
+func TestAppendAndGet(t *testing.T) {
 	rm := rangemap.New[string]()
 
-	assert.True(t, rm.AppendToLast(0, "a"))
-	assert.True(t, rm.AppendToLast(1, "b"))
-	assert.True(t, rm.AppendToLast(4, "c"))
+	rm.AppendToLast(0, "a")
+	rm.AppendToLast(1, "b")
+	rm.AppendToLast(4, "c")
+
+	assert.Equal(t, "a", *rm.Get(0))
+	assert.Equal(t, "b", *rm.Get(1))
+	assert.Equal(t, "c", *rm.Get(2))
+	assert.Equal(t, "c", *rm.Get(3))
+	assert.Equal(t, "c", *rm.Get(4))
 }
 
-func TestAppendAndGet(t *testing.T) {
+func TestEmpty(t *testing.T) {
+	rm := rangemap.New[int]()
+
+	assert.Nil(t, rm.Get(0))
+	assert.Nil(t, rm.Get(1))
+	assert.Nil(t, rm.Get(2))
+	assert.Nil(t, rm.Get(-1))
+}
+
+func TestNoOverlap(t *testing.T) {
+	rm := rangemap.New[string]()
+
+	rm.Set(0, 2, "a")
+	rm.Set(3, 3, "b")
+	rm.Set(4, 7, "c")
+
+	assert.Equal(t, "a", *rm.Get(0))
+	assert.Equal(t, "a", *rm.Get(1))
+	assert.Equal(t, "a", *rm.Get(2))
+
+	assert.Equal(t, "b", *rm.Get(3))
+
+	assert.Equal(t, "c", *rm.Get(4))
+	assert.Equal(t, "c", *rm.Get(5))
+	assert.Equal(t, "c", *rm.Get(6))
+	assert.Equal(t, "c", *rm.Get(7))
+
+	assert.Nil(t, rm.Get(8))
+
+	assert.Equal(t, "[{0..2: a}, {3..3: b}, {4..7: c}, {8..-1}]", rm.String())
+}
+
+func TestOverlap(t *testing.T) {
 	rm := rangemap.New[string]()
 
-	assert.True(t, rm.AppendToLast(0, "a"))
-	assert.True(t, rm.AppendToLast(1, "b"))
-	assert.True(t, rm.AppendToLast(4, "c"))
+	rm.Set(0, 2, "a")
+	rm.Set(3, 5, "b")
+	rm.Set(6, 10, "c")
 
-	a, ok := rm.Get(0)
-	assert.True(t, ok)
-	assert.Equal(t, "a", *a)
+	rm.Set(4, 8, "x")
 
-	b, ok := rm.Get(1)
-	assert.True(t, ok)
-	assert.Equal(t, "b", *b)
+	assert.Equal(t, "[{0..2: a}, {3..3: b}, {4..8: x}, {9..10: c}, {11..-1}]", rm.String())
+}
 
-	cfrom, ok := rm.Get(2)
-	assert.True(t, ok)
-	assert.Equal(t, "c", *cfrom)
+func TestOverwrite(t *testing.T) {
+	rm := rangemap.New[string]()
 
-	cmid, ok := rm.Get(3)
-	assert.True(t, ok)
-	assert.Equal(t, "c", *cmid)
+	rm.Set(0, 2, "a")
+	rm.Set(3, 5, "b")
+	rm.Set(6, 10, "c")
 
-	cto, ok := rm.Get(4)
-	assert.True(t, ok)
-	assert.Equal(t, "c", *cto)
+	rm.Set(3, 9, "x")
+
+	assert.Equal(t, "[{0..2: a}, {3..9: x}, {10..10: c}, {11..-1}]", rm.String())
 }
 
-func TestWrongAppend(t *testing.T) {
+func TestOverwriteInBetween(t *testing.T) {
 	rm := rangemap.New[string]()
 
-	assert.True(t, rm.AppendToLast(0, "a"))
-	assert.False(t, rm.AppendToLast(0, "b"))
+	rm.Set(0, 2, "a")
+	rm.Set(3, 4, "b")
+	rm.Set(5, 5, "c")
+	rm.Set(6, 10, "d")
+
+	rm.Set(3, 9, "x")
+
+	assert.Equal(t, "[{0..2: a}, {3..9: x}, {10..10: d}, {11..-1}]", rm.String())
 }
 
-func TestUnknownRange(t *testing.T) {
+func TestPerfectFit(t *testing.T) {
 	rm := rangemap.New[string]()
 
-	assert.True(t, rm.AppendToLast(6, "a"))
+	rm.Set(0, 2, "a")
+	rm.Set(5, 6, "b")
 
-	a, ok := rm.Get(6)
-	assert.True(t, ok)
-	assert.Equal(t, "a", *a)
+	rm.Set(3, 4, "x")
 
-	b, ok := rm.Get(7)
-	assert.False(t, ok)
-	assert.Nil(t, b)
+	assert.Equal(t, "[{0..2: a}, {3..4: x}, {5..6: b}, {7..-1}]", rm.String())
 }
 
-func TestNegativeAppend(t *testing.T) {
+func TestSpaceBetween(t *testing.T) {
 	rm := rangemap.New[string]()
 
-	assert.False(t, rm.AppendToLast(-1, "a"))
+	rm.Set(0, 2, "a")
+	rm.Set(9, 9, "b")
+
+	rm.Set(4, 6, "x")
+
+	// Since our search can never fail, we pad the space with a sentinel value.
+	assert.Equal(t, "[{0..2: a}, {3..3}, {4..6: x}, {7..8}, {9..9: b}, {10..-1}]", rm.String())
 }