dnscrypt-proxy/vendor/github.com/k-sone/critbitgo/map_test.go

165 lines
3.8 KiB
Go

package critbitgo_test
import (
"strings"
"testing"
"github.com/k-sone/critbitgo"
)
func buildSortedMap(keys []string) *critbitgo.SortedMap {
m := critbitgo.NewSortedMap()
for _, key := range keys {
m.Set(key, key)
}
return m
}
func TestSortedMapContains(t *testing.T) {
keys := []string{"", "a", "aa", "b", "bb", "ab", "ba", "aba", "bab"}
m := buildSortedMap(keys)
for _, key := range keys {
if !m.Contains(key) {
t.Error("Contains() - not found - [%s]", key)
}
}
if m.Contains("aaa") {
t.Error("Contains() - phantom found")
}
}
func TestSortedMapGet(t *testing.T) {
keys := []string{"", "a", "aa", "b", "bb", "ab", "ba", "aba", "bab"}
m := buildSortedMap(keys)
for _, key := range keys {
if value, ok := m.Get(key); !ok || value != key {
t.Error("Get() - not found - [%s]", key)
}
}
if value, ok := m.Get("aaa"); ok || value != nil {
t.Error("Get() - phantom found")
}
}
func TestSortedMapDelete(t *testing.T) {
keys := []string{"", "a", "aa", "b", "bb", "ab", "ba", "aba", "bab"}
m := buildSortedMap(keys)
for i, key := range keys {
if !m.Contains(key) {
t.Error("Delete() - not exists - [%s]", key)
}
if value, ok := m.Delete(key); !ok || value != key {
t.Error("Delete() - failed - [%s]", key)
}
if m.Contains(key) {
t.Error("Delete() - exists - [%s]", key)
}
if value, ok := m.Delete(key); ok || value != nil {
t.Error("Delete() - phantom found - [%s]", key)
}
if i != len(keys) {
for _, key2 := range keys[i+1:] {
if !m.Contains(key2) {
t.Errorf("Delete() - other not exists - [%s](%s)", key2, key)
}
}
}
}
}
func TestSortedMapSize(t *testing.T) {
keys := []string{"", "a", "aa", "b", "bb", "ab", "ba", "aba", "bab"}
m := buildSortedMap(keys)
klen := len(keys)
if s := m.Size(); s != klen {
t.Errorf("Size() - expected [%s], actual [%s]", klen, s)
}
for i, key := range keys {
m.Delete(key)
if s := m.Size(); s != klen-(i+1) {
t.Errorf("Size() - expected [%s], actual [%s]", klen, s)
}
}
}
func TestSortedMapKeys(t *testing.T) {
keys := []string{"", "a", "aa", "b", "bb", "ab", "ba", "aba", "bab"}
m := buildSortedMap(keys)
skeys := m.Keys()
for _, key := range keys {
match := false
for _, skey := range skeys {
if key == skey {
match = true
break
}
}
if !match {
t.Errorf("Keys() - not found [%s]", key)
}
}
}
func TestSortedMapEach(t *testing.T) {
keys := []string{"", "a", "aa", "b", "bb", "ab", "ba", "aba", "bab"}
m := buildSortedMap(keys)
elems := make(map[string]interface{})
handle := func(key string, value interface{}) bool {
elems[key] = value
return true
}
if !m.Each("", handle) {
t.Error("Each() - invalid result")
}
for _, key := range keys {
if _, ok := elems[key]; !ok {
t.Errorf("Each() - not found [%s]", key)
} else if value, ok := elems[key].(string); !ok || value != key {
t.Errorf("Each() - invalid value [%s](%s)", value, key)
}
}
elems = make(map[string]interface{})
handle = func(key string, value interface{}) bool {
elems[key] = value
return true
}
if !m.Each("b", handle) {
t.Error("Each() - invalid result")
}
for _, key := range keys {
if strings.Index(key, "b") == 0 {
if _, ok := elems[key]; !ok {
t.Errorf("Each() - not found [%s]", key)
} else if value, ok := elems[key].(string); !ok || value != key {
t.Errorf("Each() - invalid value [%s](%s)", value, key)
}
} else {
if _, ok := elems[key]; ok {
t.Errorf("Each() - phantom found [%s]", key)
}
}
}
elems = make(map[string]interface{})
handle = func(key string, value interface{}) bool {
elems[key] = value
return true
}
if !m.Each("c", handle) {
t.Error("Each() - invalid result")
}
for _, key := range keys {
if _, ok := elems[key]; ok {
t.Errorf("Each() - phantom found [%s]", key)
}
}
}