Search Apps Documentation Source Content File Folder Download Copy Actions Download State String Boolean Number Struct Map Slice Pointer Function Closure Reference Nil Package Type Interface Unknown

abt_test.gno

6.12 Kb · 153 lines
  1package abt
  2
  3import (
  4	"math"
  5	"testing"
  6
  7	"gno.land/p/nt/uassert/v0"
  8	"gno.land/r/akkadia/beta/admin"
  9)
 10
 11func TestInitialState(t *testing.T) {
 12	uassert.Equal(t, "Akkadia Beta Token", GetName())
 13	uassert.Equal(t, "abt", GetSymbol())
 14	uassert.Equal(t, 6, GetDecimals())
 15	uassert.Equal(t, "gno.land/r/akkadia/beta/abt.abt.0000000", token.ID())
 16	uassert.True(t, IsFrozen())
 17	uassert.Equal(t, int64(0), TotalSupply())
 18	uassert.Equal(t, int64(0), BalanceOf(abtTest.Owner))
 19	uassert.Equal(t, int64(0), Allowance(abtTest.Owner, abtTest.Other))
 20}
 21
 22func TestMintWhileFrozen(cur realm, t *testing.T) {
 23	setupABT(cross(cur), t)
 24	for _, caller := range []address{abtTest.Admin, abtTest.Operator} {
 25		testing.SetOriginCaller(caller)
 26		testing.SetRealm(testing.NewUserRealm(caller))
 27		Mint(cross(cur), abtTest.Owner, 100)
 28		Mint(cross(cur), abtTest.Other, 10)
 29	}
 30	uassert.True(t, IsFrozen())
 31	uassert.Equal(t, int64(220), TotalSupply())
 32	uassert.Equal(t, int64(200), BalanceOf(abtTest.Owner))
 33	uassert.Equal(t, int64(20), BalanceOf(abtTest.Other))
 34	uassert.Equal(t, int64(0), Allowance(abtTest.Owner, abtTest.Other))
 35}
 36
 37func TestMintInvalidInput(cur realm, t *testing.T) {
 38	cases := []struct {
 39		name     string
 40		to       address
 41		amount   int64
 42		panicMsg string
 43	}{
 44		{"empty address", address(""), 1, "invalid abt recipient"},
 45		{"invalid address", address("invalid"), 1, "invalid abt recipient"},
 46		{"zero", abtTest.Owner, 0, "abt amount must be positive"},
 47		{"negative", abtTest.Owner, -1, "abt amount must be positive"},
 48		{"minimum int64", abtTest.Owner, math.MinInt64, "abt amount must be positive"},
 49	}
 50	for _, tc := range cases {
 51		t.Run(tc.name, func(cur realm, t *testing.T) {
 52			setupABT(cross(cur), t)
 53			testing.SetRealm(testing.NewUserRealm(abtTest.Admin))
 54			Mint(cross(cur), abtTest.Owner, 7)
 55			uassert.AbortsWithMessage(t, cur, tc.panicMsg, func() {
 56				Mint(cross(cur), tc.to, tc.amount)
 57			})
 58			uassert.Equal(t, int64(7), TotalSupply())
 59			uassert.Equal(t, int64(7), BalanceOf(abtTest.Owner))
 60			uassert.Equal(t, int64(0), BalanceOf(abtTest.Other))
 61		})
 62	}
 63}
 64
 65func TestMintOverflow(cur realm, t *testing.T) {
 66	setupABT(cross(cur), t)
 67	testing.SetRealm(testing.NewUserRealm(abtTest.Admin))
 68	Mint(cross(cur), abtTest.Owner, math.MaxInt64)
 69	for _, to := range []address{abtTest.Owner, abtTest.Other} {
 70		uassert.AbortsWithMessage(t, cur, "abt mint failed: mint overflow", func() {
 71			Mint(cross(cur), to, 1)
 72		})
 73	}
 74	uassert.Equal(t, int64(math.MaxInt64), TotalSupply())
 75	uassert.Equal(t, int64(math.MaxInt64), BalanceOf(abtTest.Owner))
 76	uassert.Equal(t, int64(0), BalanceOf(abtTest.Other))
 77}
 78
 79func TestFreezeLifecycle(cur realm, t *testing.T) {
 80	setupABT(cross(cur), t)
 81	testing.SetRealm(testing.NewUserRealm(abtTest.Admin))
 82	Mint(cross(cur), abtTest.Owner, 100)
 83	SetFrozen(cross(cur), true)
 84	SetFrozen(cross(cur), false)
 85	SetFrozen(cross(cur), false)
 86	Mint(cross(cur), abtTest.Owner, 5)
 87	testing.SetOriginCaller(abtTest.Owner)
 88	testing.SetRealm(testing.NewUserRealm(abtTest.Owner))
 89	Transfer(cross(cur), abtTest.Other, 10)
 90	Approve(cross(cur), abtTest.Other, 40)
 91	testing.SetOriginCaller(abtTest.Other)
 92	testing.SetRealm(testing.NewUserRealm(abtTest.Other))
 93	TransferFrom(cross(cur), abtTest.Owner, abtTest.Admin, 15)
 94	uassert.Equal(t, int64(80), BalanceOf(abtTest.Owner))
 95	uassert.Equal(t, int64(10), BalanceOf(abtTest.Other))
 96	uassert.Equal(t, int64(15), BalanceOf(abtTest.Admin))
 97	uassert.Equal(t, int64(25), Allowance(abtTest.Owner, abtTest.Other))
 98	testing.SetOriginCaller(abtTest.Admin)
 99	testing.SetRealm(testing.NewUserRealm(abtTest.Admin))
100	SetFrozen(cross(cur), true)
101	testing.SetOriginCaller(abtTest.Owner)
102	testing.SetRealm(testing.NewUserRealm(abtTest.Owner))
103	uassert.AbortsWithMessage(t, cur, "abt is frozen", func() { Approve(cross(cur), abtTest.Other, 0) })
104	uassert.AbortsWithMessage(t, cur, "abt is frozen", func() { Transfer(cross(cur), abtTest.Other, 1) })
105	testing.SetOriginCaller(abtTest.Other)
106	testing.SetRealm(testing.NewUserRealm(abtTest.Other))
107	uassert.AbortsWithMessage(t, cur, "abt is frozen", func() {
108		TransferFrom(cross(cur), abtTest.Owner, abtTest.Admin, 25)
109	})
110	uassert.Equal(t, int64(25), Allowance(abtTest.Owner, abtTest.Other))
111	uassert.Equal(t, int64(80), BalanceOf(abtTest.Owner))
112	uassert.Equal(t, int64(105), TotalSupply())
113	testing.SetOriginCaller(abtTest.Admin)
114	testing.SetRealm(testing.NewUserRealm(abtTest.Admin))
115	SetFrozen(cross(cur), false)
116	testing.SetOriginCaller(abtTest.Other)
117	testing.SetRealm(testing.NewUserRealm(abtTest.Other))
118	TransferFrom(cross(cur), abtTest.Owner, abtTest.Admin, 25)
119	uassert.Equal(t, int64(0), Allowance(abtTest.Owner, abtTest.Other))
120	uassert.Equal(t, int64(55), BalanceOf(abtTest.Owner))
121	uassert.Equal(t, int64(40), BalanceOf(abtTest.Admin))
122	uassert.Equal(t, int64(105), TotalSupply())
123	testing.SetOriginCaller(abtTest.Owner)
124	testing.SetRealm(testing.NewUserRealm(abtTest.Owner))
125	Approve(cross(cur), abtTest.Other, 5)
126	Approve(cross(cur), abtTest.Other, 7)
127	uassert.Equal(t, int64(7), Allowance(abtTest.Owner, abtTest.Other))
128	Approve(cross(cur), abtTest.Other, 0)
129	uassert.Equal(t, int64(0), Allowance(abtTest.Owner, abtTest.Other))
130}
131
132func TestMintRoleChanges(cur realm, t *testing.T) {
133	setupABT(cross(cur), t)
134	testing.SetRealm(testing.NewUserRealm(abtTest.Admin))
135	admin.UnsetOperator(cross(cur), abtTest.Operator)
136	testing.SetOriginCaller(abtTest.Operator)
137	testing.SetRealm(testing.NewUserRealm(abtTest.Operator))
138	uassert.AbortsWithMessage(t, cur, "admin or operator access required", func() { Mint(cross(cur), abtTest.Owner, 1) })
139	testing.SetOriginCaller(abtTest.Admin)
140	testing.SetRealm(testing.NewUserRealm(abtTest.Admin))
141	admin.TransferAdmin(cross(cur), abtTest.Other)
142	testing.SetOriginCaller(abtTest.Other)
143	testing.SetRealm(testing.NewUserRealm(abtTest.Other))
144	admin.AcceptAdmin(cross(cur))
145	Mint(cross(cur), abtTest.Owner, 3)
146	SetFrozen(cross(cur), false)
147	testing.SetOriginCaller(abtTest.Admin)
148	testing.SetRealm(testing.NewUserRealm(abtTest.Admin))
149	uassert.AbortsWithMessage(t, cur, "admin or operator access required", func() { Mint(cross(cur), abtTest.Owner, 1) })
150	uassert.AbortsWithMessage(t, cur, "admin access required", func() { SetFrozen(cross(cur), true) })
151	uassert.Equal(t, int64(3), TotalSupply())
152	uassert.False(t, IsFrozen())
153}