summaryrefslogtreecommitdiff
path: root/search/set_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'search/set_test.go')
-rw-r--r--search/set_test.go130
1 files changed, 130 insertions, 0 deletions
diff --git a/search/set_test.go b/search/set_test.go
new file mode 100644
index 0000000..098947d
--- /dev/null
+++ b/search/set_test.go
@@ -0,0 +1,130 @@
+package set
+
+import (
+ "fmt"
+ "testing"
+
+ "github.com/snonux/algorithms/ds"
+ "github.com/snonux/algorithms/sort"
+)
+
+const factor int = 10
+const minLength int = 1
+const maxLength int = 10000
+
+// Store results here to avoid compiler optimizations
+var benchResult int
+
+func TestElementary(t *testing.T) {
+ for i := minLength; i <= maxLength; i *= factor {
+ test(NewElementary(), i, t)
+ }
+}
+
+func TestBST(t *testing.T) {
+ for i := minLength; i <= maxLength; i *= factor {
+ test(NewBST(), i, t)
+ }
+}
+
+func test(s Set, l int, t *testing.T) {
+ keys := ds.NewRandomArrayList(l, l)
+ randoms := ds.NewRandomArrayList(l, -1)
+ mapping := make(map[int]int, l)
+
+ get := func(key int, del bool) int {
+ var val int
+ var err error
+ switch {
+ case del:
+ defer delete(mapping, key)
+ val, err = s.Del(key)
+ //t.Log("Del", key, val, err)
+ default:
+ val, err = s.Get(key)
+ //t.Log("Get", key, val, err)
+ }
+
+ if mVal, ok := mapping[key]; ok {
+ if err != nil {
+ t.Error("Could not get element", key, val, mVal, err)
+ }
+ if mVal != val {
+ t.Error("Got wrong value for element", key, val, mVal)
+ }
+ return val
+ }
+
+ if err == nil {
+ t.Error("Got element but expected not to", key, val)
+ }
+ return val
+ }
+ testGet := func(key int) int { return get(key, false) }
+ testDel := func(key int) int { return get(key, true) }
+
+ testSet := func(key, val int) {
+ s.Set(key, val)
+ mapping[key] = val
+ //t.Log("Set", key, val)
+ testGet(key)
+ }
+
+ t.Log("Set random key-values", l)
+ var prevKey int
+ for _, key := range sort.Shuffle(keys) {
+ testSet(key, randoms[key])
+ testGet(prevKey)
+ prevKey = key
+ }
+ t.Log("Del random key-values", l)
+ for _, key := range sort.Shuffle(keys) {
+ testDel(key)
+ testGet(prevKey)
+ prevKey = key
+ }
+ if !s.Empty() {
+ t.Error("Expected set to be empty", l)
+ }
+}
+
+func TestBalancedBST(t *testing.T) {
+ for i := minLength; i <= maxLength; i *= factor {
+ test(NewBalancedBST(), i, t)
+ }
+}
+
+func BenchmarkElementary(t *testing.B) {
+ s := NewElementary()
+ for i := minLength; i <= maxLength; i *= factor {
+ benchmark(s, i, t)
+ }
+}
+
+func BenchmarkBST(t *testing.B) {
+ s := NewBST()
+ for i := minLength; i <= maxLength; i *= factor {
+ benchmark(s, i, t)
+ }
+}
+
+func BenchmarkBalancedBST(t *testing.B) {
+ s := NewBalancedBST()
+ for i := minLength; i <= maxLength; i *= factor {
+ benchmark(s, i, t)
+ }
+}
+
+func benchmark(s Set, l int, b *testing.B) {
+ list := ds.NewRandomArrayList(l, -1)
+
+ b.Run(fmt.Sprintf("random(%d)", l), func(b *testing.B) {
+ b.ResetTimer()
+ for i, a := range list {
+ s.Set(a, i)
+ }
+ for _, a := range list {
+ benchResult, _ = s.Get(a)
+ }
+ })
+}