blob: 3f6e8c6a45057ea951806a99d0e0d3166f1d87ae [file] [log] [blame]
package ps
import . "strconv"
import "testing"
import "sort"
func TestMapNil(t *testing.T) {
m := NewMap()
keys := m.Keys()
if len(keys) != 0 {
t.Errorf("Empty map has keys")
}
}
func TestMapImmutable(t *testing.T) {
// build a couple small maps
world := NewMap().Set("hello", "world")
kids := world.Set("hello", "kids")
// both maps should still retain their data
if v, _ := world.Lookup("hello"); v != "world" {
t.Errorf("Set() modified the receiving map")
}
if size := world.Size(); size != 1 {
t.Errorf("world size is not 1 : %d", size)
}
if v, _ := kids.Lookup("hello"); v != "kids" {
t.Errorf("Set() did not modify the resulting map")
}
if size := kids.Size(); size != 1 {
t.Errorf("kids size is not 1 : %d", size)
}
// both maps have the right keys
if keys := world.Keys(); len(keys) != 1 || keys[0] != "hello" {
t.Errorf("world has the wrong keys: %#v", keys)
}
if keys := kids.Keys(); len(keys) != 1 || keys[0] != "hello" {
t.Errorf("kids has the wrong keys: %#v", keys)
}
// test deletion
empty := kids.Delete("hello")
if size := empty.Size(); size != 0 {
t.Errorf("empty size is not 1 : %d", size)
}
if keys := empty.Keys(); len(keys) != 0 {
t.Errorf("empty has the wrong keys: %#v", keys)
}
}
func TestMapMultipleKeys(t *testing.T) {
// map with multiple keys each with pointer values
one := 1
two := 2
three := 3
m := NewMap().Set("one", &one).Set("two", &two).Set("three", &three)
// do we have the right number of keys?
keys := m.Keys()
if len(keys) != 3 {
t.Logf("wrong size keys: %d", len(keys))
t.FailNow()
}
// do we have the right keys?
sort.Strings(keys)
if keys[0] != "one" {
t.Errorf("unexpected key: %s", keys[0])
}
if keys[1] != "three" {
t.Errorf("unexpected key: %s", keys[1])
}
if keys[2] != "two" {
t.Errorf("unexpected key: %s", keys[2])
}
// do we have the right values?
vp, ok := m.Lookup("one");
if !ok {
t.Logf("missing value for one")
t.FailNow()
}
if v := vp.(*int); *v != 1 {
t.Errorf("wrong value: %d\n", *v)
}
vp, ok = m.Lookup("two");
if !ok {
t.Logf("missing value for two")
t.FailNow()
}
if v := vp.(*int); *v != 2 {
t.Errorf("wrong value: %d\n", *v)
}
vp, ok = m.Lookup("three");
if !ok {
t.Logf("missing value for three")
t.FailNow()
}
if v := vp.(*int); *v != 3 {
t.Errorf("wrong value: %d\n", *v)
}
}
func TestMapManyKeys (t *testing.T) {
// build a map with many keys and values
count := 100
m := NewMap()
for i := 0; i<count; i++ {
m = m.Set(Itoa(i), i)
}
if m.Size() != 100 {
t.Errorf("Wrong number of keys", m.Size())
}
m = m.Delete("42").Delete("7").Delete("19").Delete("99")
if m.Size() != 96 {
t.Errorf("Wrong number of keys", m.Size())
}
for i:=43; i<99; i++ {
v, ok := m.Lookup(Itoa(i))
if !ok || v != i {
t.Errorf("Wrong value for key %d", i)
}
}
}
func BenchmarkMapSet(b *testing.B) {
m := NewMap()
for i := 0; i < b.N; i++ {
m = m.Set("foo", i)
}
}
func BenchmarkMapDelete(b *testing.B) {
m := NewMap().Set("key", "value")
for i := 0; i < b.N; i++ {
m.Delete("key")
}
}