memberstore_test.gno

package memberstore

import (
	"strconv"
	"testing"

	"gno.land/p/nt/urequire/v0"
)

func TestPower(t *testing.T) {
	ms := NewMembersByTier()
	addMembers(ms, 100, T1)
	addMembers(ms, 100, T2)
	addMembers(ms, 100, T3)

	tiers.Iterate("", "", func(key string, value interface{}) bool {
		po := value.(Tier).PowerHandler(ms, tiers)
		if key == T1 && po != 3.0 {
			t.Fatal("wrong value for T1")
		}
		if key == T2 && po != 2.0 {
			t.Fatal("wrong value for T2")
		}
		if key == T3 && po != 1.0 {
			t.Fatal("wrong value for T3")
		}

		return false
	})

	ms = NewMembersByTier()
	addMembers(ms, 100, T1)
	addMembers(ms, 50, T2)
	addMembers(ms, 10, T3)

	tiers.Iterate("", "", func(key string, value interface{}) bool {
		po := value.(Tier).PowerHandler(ms, tiers)
		if key == T1 && po != 3.0 {
			t.Fatal("wrong value for T1")
		}
		if key == T2 && po != 2.0 {
			t.Fatal("wrong value for T2")
		}
		if key == T3 && po != 1.0 {
			t.Fatal("wrong value for T3")
		}

		return false
	})

	ms = NewMembersByTier()
	addMembers(ms, 100, T1)
	addMembers(ms, 200, T2)
	addMembers(ms, 100, T3)

	tiers.Iterate("", "", func(key string, value interface{}) bool {
		po := value.(Tier).PowerHandler(ms, tiers)
		if key == T1 && po != 3.0 {
			t.Fatal("wrong value for T1")
		}
		if key == T2 && po != 1.0 {
			t.Fatal("wrong value for T2")
		}
		if key == T3 && po != 1.0 {
			t.Fatal("wrong value for T3")
		}

		return false
	})

	ms = NewMembersByTier()
	addMembers(ms, 100, T1)
	addMembers(ms, 200, T2)
	addMembers(ms, 1000, T3)

	tiers.Iterate("", "", func(key string, value interface{}) bool {
		po := value.(Tier).PowerHandler(ms, tiers)
		if key == T1 && po != 3.0 {
			t.Fatal("wrong value for T1")
		}
		if key == T2 && po != 1.0 {
			t.Fatal("wrong value for T2")
		}
		if key == T3 && po != 0.1 {
			t.Fatal("wrong value for T3")
		}

		return false
	})
}

func TestCreateMembers(t *testing.T) {
	ms := NewMembersByTier()
	println("adding members...")
	addMembers(ms, 10, "T1")
	println("added T1")
	addMembers(ms, 100, "T2")
	println("added T2")
	addMembers(ms, 1000, "T3")
	println("added T3")

	m, tier := ms.GetMember(address("11T3"))
	urequire.Equal(t, "T3", tier)

	m, tier = ms.GetMember(address("2000T1"))
	urequire.Equal(t, "", tier)
	if m != nil {
		t.Fatal("member must be nil if not found")
	}

	tier = ms.RemoveMember(address("1T1"))
	urequire.Equal(t, "T1", tier)
}

func addMembers(ms MembersByTier, c int, tier string) {
	// mt := avl.NewTree() XXX
	ms.SetTier(tier)
	for i := 0; i < c; i++ {
		addr := address(strconv.Itoa(i) + tier)
		if err := ms.SetMember(tier, addr, &Member{}); err != nil {
			panic(err.Error())
		}
	}
}