package db import ( "fmt" "testing" ) func TestPrefixIteratorNoMatchNil(t *testing.T) { for backend, _ := range backends { t.Run(fmt.Sprintf("Prefix w/ backend %s", backend), func(t *testing.T) { db := newTempDB(t, backend) itr := IteratePrefix(db, []byte("2")) checkInvalid(t, itr) }) } } func TestPrefixIteratorNoMatch1(t *testing.T) { for backend, _ := range backends { t.Run(fmt.Sprintf("Prefix w/ backend %s", backend), func(t *testing.T) { db := newTempDB(t, backend) itr := IteratePrefix(db, []byte("2")) db.SetSync(bz("1"), bz("value_1")) checkInvalid(t, itr) }) } } func TestPrefixIteratorMatch2(t *testing.T) { for backend, _ := range backends { t.Run(fmt.Sprintf("Prefix w/ backend %s", backend), func(t *testing.T) { db := newTempDB(t, backend) db.SetSync(bz("2"), bz("value_2")) itr := IteratePrefix(db, []byte("2")) checkValid(t, itr, true) checkItem(t, itr, bz("2"), bz("value_2")) checkNext(t, itr, false) // Once invalid... checkInvalid(t, itr) }) } } func TestPrefixIteratorMatch3(t *testing.T) { for backend, _ := range backends { t.Run(fmt.Sprintf("Prefix w/ backend %s", backend), func(t *testing.T) { db := newTempDB(t, backend) db.SetSync(bz("3"), bz("value_3")) itr := IteratePrefix(db, []byte("2")) // Once invalid... checkInvalid(t, itr) }) } } // Search for a/1, fail by too much Next() func TestPrefixIteratorMatches1N(t *testing.T) { for backend, _ := range backends { t.Run(fmt.Sprintf("Prefix w/ backend %s", backend), func(t *testing.T) { db := newTempDB(t, backend) db.SetSync(bz("a/1"), bz("value_1")) db.SetSync(bz("a/3"), bz("value_3")) itr := IteratePrefix(db, []byte("a/")) itr.Seek(bz("a/1")) checkValid(t, itr, true) checkItem(t, itr, bz("a/1"), bz("value_1")) checkNext(t, itr, true) checkItem(t, itr, bz("a/3"), bz("value_3")) // Bad! checkNext(t, itr, false) // Once invalid... checkInvalid(t, itr) }) } } // Search for a/1, fail by too much Prev() func TestPrefixIteratorMatches1P(t *testing.T) { for backend, _ := range backends { t.Run(fmt.Sprintf("Prefix w/ backend %s", backend), func(t *testing.T) { db := newTempDB(t, backend) db.SetSync(bz("a/1"), bz("value_1")) db.SetSync(bz("a/3"), bz("value_3")) itr := IteratePrefix(db, []byte("a/")) itr.Seek(bz("a/1")) checkValid(t, itr, true) checkItem(t, itr, bz("a/1"), bz("value_1")) checkNext(t, itr, true) checkItem(t, itr, bz("a/3"), bz("value_3")) checkPrev(t, itr, true) checkItem(t, itr, bz("a/1"), bz("value_1")) // Bad! checkPrev(t, itr, false) // Once invalid... checkInvalid(t, itr) }) } } // Search for a/2, fail by too much Next() func TestPrefixIteratorMatches2N(t *testing.T) { for backend, _ := range backends { t.Run(fmt.Sprintf("Prefix w/ backend %s", backend), func(t *testing.T) { db := newTempDB(t, backend) db.SetSync(bz("a/1"), bz("value_1")) db.SetSync(bz("a/3"), bz("value_3")) itr := IteratePrefix(db, []byte("a/")) itr.Seek(bz("a/2")) checkValid(t, itr, true) checkItem(t, itr, bz("a/3"), bz("value_3")) checkPrev(t, itr, true) checkItem(t, itr, bz("a/1"), bz("value_1")) checkNext(t, itr, true) checkItem(t, itr, bz("a/3"), bz("value_3")) // Bad! checkNext(t, itr, false) // Once invalid... checkInvalid(t, itr) }) } } // Search for a/2, fail by too much Prev() func TestPrefixIteratorMatches2P(t *testing.T) { for backend, _ := range backends { t.Run(fmt.Sprintf("Prefix w/ backend %s", backend), func(t *testing.T) { db := newTempDB(t, backend) db.SetSync(bz("a/1"), bz("value_1")) db.SetSync(bz("a/3"), bz("value_3")) itr := IteratePrefix(db, []byte("a/")) itr.Seek(bz("a/2")) checkValid(t, itr, true) checkItem(t, itr, bz("a/3"), bz("value_3")) checkPrev(t, itr, true) checkItem(t, itr, bz("a/1"), bz("value_1")) // Bad! checkPrev(t, itr, false) // Once invalid... checkInvalid(t, itr) }) } } // Search for a/3, fail by too much Next() func TestPrefixIteratorMatches3N(t *testing.T) { for backend, _ := range backends { t.Run(fmt.Sprintf("Prefix w/ backend %s", backend), func(t *testing.T) { db := newTempDB(t, backend) db.SetSync(bz("a/1"), bz("value_1")) db.SetSync(bz("a/3"), bz("value_3")) itr := IteratePrefix(db, []byte("a/")) itr.Seek(bz("a/3")) checkValid(t, itr, true) checkItem(t, itr, bz("a/3"), bz("value_3")) checkPrev(t, itr, true) checkItem(t, itr, bz("a/1"), bz("value_1")) checkNext(t, itr, true) checkItem(t, itr, bz("a/3"), bz("value_3")) // Bad! checkNext(t, itr, false) // Once invalid... checkInvalid(t, itr) }) } } // Search for a/3, fail by too much Prev() func TestPrefixIteratorMatches3P(t *testing.T) { for backend, _ := range backends { t.Run(fmt.Sprintf("Prefix w/ backend %s", backend), func(t *testing.T) { db := newTempDB(t, backend) db.SetSync(bz("a/1"), bz("value_1")) db.SetSync(bz("a/3"), bz("value_3")) itr := IteratePrefix(db, []byte("a/")) itr.Seek(bz("a/3")) checkValid(t, itr, true) checkItem(t, itr, bz("a/3"), bz("value_3")) checkPrev(t, itr, true) checkItem(t, itr, bz("a/1"), bz("value_1")) // Bad! checkPrev(t, itr, false) // Once invalid... checkInvalid(t, itr) }) } }