165 lines
3.8 KiB
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)
|
||
|
}
|
||
|
}
|
||
|
}
|