Search Apps Documentation Source Content File Folder Download Copy Actions Download

tokenhub_test.gno

7.90 Kb ยท 205 lines
  1package tokenhub
  2
  3import (
  4	"chain/runtime"
  5	"strings"
  6	"testing"
  7
  8	"gno.land/p/demo/tokens/grc1155"
  9	"gno.land/p/demo/tokens/grc20"
 10	"gno.land/p/demo/tokens/grc721"
 11	"gno.land/p/nt/avl"
 12	"gno.land/p/nt/uassert"
 13	"gno.land/p/nt/urequire"
 14)
 15
 16const testRealmPkgPath = "gno.land/r/matijamarjanovic/testrealm"
 17
 18func TestTokenRegistration(t *testing.T) {
 19	resetState(t)
 20	testing.SetRealm(testing.NewCodeRealm(testRealmPkgPath))
 21
 22	token, _ := grc20.NewToken("Test Token", "TEST", 6)
 23	RegisterToken(cross, token, "test_token")
 24
 25	retrievedToken := GetToken("gno.land/r/matijamarjanovic/tokenhub.gno.land/r/matijamarjanovic/testrealm.test_token")
 26
 27	urequire.True(t, retrievedToken != nil, "Should retrieve registered token")
 28	uassert.Equal(t, "Test Token", retrievedToken.GetName(), "Token name should match")
 29	uassert.Equal(t, "TEST", retrievedToken.GetSymbol(), "Token symbol should match")
 30}
 31
 32func TestNFTRegistration(t *testing.T) {
 33	resetState(t)
 34	testing.SetRealm(testing.NewCodeRealm(testRealmPkgPath))
 35
 36	nft := grc721.NewBasicNFT("Test NFT", "TNFT")
 37	nft.Mint(runtime.CurrentRealm().Address(), grc721.TokenID("1"))
 38	err := RegisterNFT(cross, nft.Getter(), "test_nft", "1")
 39
 40	urequire.NoError(t, err, "Should register NFT without error")
 41
 42	retrievedNFT := GetNFT(testRealmPkgPath + ".test_nft.1")
 43
 44	urequire.True(t, retrievedNFT != nil, "Should retrieve registered NFT")
 45
 46	metadata, ok := retrievedNFT.(grc721.IGRC721CollectionMetadata)
 47	urequire.True(t, ok, "NFT should implement IGRC721CollectionMetadata")
 48	uassert.Equal(t, "Test NFT", metadata.Name(), "NFT name should match")
 49	uassert.Equal(t, "TNFT", metadata.Symbol(), "NFT symbol should match")
 50}
 51
 52func TestGRC1155Registration(t *testing.T) {
 53	resetState(t)
 54	testing.SetRealm(testing.NewCodeRealm(testRealmPkgPath))
 55
 56	mt := grc1155.NewBasicGRC1155Token("test-uri")
 57	err := RegisterMultiToken(cross, mt.Getter(), "1")
 58	urequire.NoError(t, err, "Should register multi-token without error")
 59
 60	multiToken := GetMultiToken(testRealmPkgPath + ".1")
 61	urequire.True(t, multiToken != nil, "Should retrieve multi-token")
 62	_, ok := multiToken.(grc1155.IGRC1155)
 63	urequire.True(t, ok, "Retrieved multi-token should implement IGRC1155")
 64
 65	err = RegisterMultiToken(cross, mt.Getter(), "1")
 66	uassert.True(t, err != nil, "Should not allow duplicate registration")
 67}
 68
 69func TestBalanceRetrieval(t *testing.T) {
 70	resetState(t)
 71	testing.SetRealm(testing.NewCodeRealm(testRealmPkgPath))
 72
 73	token, ledger := grc20.NewToken("Test Token", "TEST", 6)
 74	RegisterToken(cross, token, "test_token")
 75	ledger.Mint(runtime.CurrentRealm().Address(), 1000)
 76
 77	balances := GetUserTokenBalances(runtime.CurrentRealm().Address().String())
 78	uassert.True(t, strings.Contains(balances,
 79		"Token:gno.land/r/matijamarjanovic/tokenhub."+testRealmPkgPath+".test_token:1000"), "Should show correct GRC20 balance")
 80
 81	nft := grc721.NewBasicNFT("Test NFT", "TNFT")
 82	nft.Mint(runtime.CurrentRealm().Address(), grc721.TokenID("1"))
 83	uassert.NoError(t, RegisterNFT(cross, nft.Getter(), "test_nft", "1"))
 84
 85	balances = GetUserNFTBalances(runtime.CurrentRealm().Address().String())
 86	uassert.True(t, strings.Contains(balances, "NFT:"+testRealmPkgPath+".test_nft.1"), "Should show correct NFT balance")
 87
 88	mt := grc1155.NewBasicGRC1155Token("test-uri")
 89	err := RegisterMultiToken(cross, mt.Getter(), "1")
 90	urequire.NoError(t, err, "Should register multi-token without error")
 91
 92	balances = GetUserMultiTokenBalances(runtime.CurrentRealm().Address().String())
 93	uassert.True(t, strings.Contains(balances, "MultiToken:"+testRealmPkgPath+".1:0"), "Should show multi-token balance")
 94
 95	nonZeroBalances := GetUserTokenBalancesNonZero(runtime.CurrentRealm().Address().String())
 96	uassert.True(t, strings.Contains(nonZeroBalances,
 97		"Token:gno.land/r/matijamarjanovic/tokenhub."+testRealmPkgPath+".test_token:1000"), "Should show non-zero GRC20 balance")
 98}
 99
100func TestErrorCases(t *testing.T) {
101	resetState(t)
102	testing.SetRealm(testing.NewCodeRealm(testRealmPkgPath))
103
104	nft := grc721.NewBasicNFT("Test NFT", "TNFT")
105	err := RegisterNFT(cross, nft.Getter(), "test_nft", "1")
106
107	err = RegisterNFT(cross, nft.Getter(), "test_nft", "1")
108	uassert.True(t, err != nil, "Should not allow duplicate registration")
109
110	mt := grc1155.NewBasicGRC1155Token("test-uri")
111	err = RegisterMultiToken(cross, mt.Getter(), "1")
112
113	err = RegisterMultiToken(cross, mt.Getter(), "1")
114	uassert.True(t, err != nil, "Should not allow duplicate registrasdasdation")
115}
116
117func TestTokenListingFunctions(t *testing.T) {
118	resetState(t)
119	testing.SetRealm(testing.NewCodeRealm(testRealmPkgPath))
120
121	grc20Token, _ := grc20.NewToken("Test Token", "TEST", 6)
122	RegisterToken(cross, grc20Token, "listing_token")
123
124	grc20List := GetAllTokens()
125	uassert.True(t, strings.Contains(grc20List, "Token:gno.land/r/matijamarjanovic/tokenhub."+testRealmPkgPath+".listing_token"),
126		"GetAllGRC20Tokens should list registered token")
127
128	nftToken := grc721.NewBasicNFT("Listing NFT", "LNFT")
129	nftToken.Mint(address("g1ej0qca5ptsw9kfr64ey8jvfy9eacga6mpj2z0y"), grc721.TokenID("1"))
130	RegisterNFT(cross, nftToken.Getter(), "listing_nft", "1")
131
132	nftList := GetAllNFTs()
133	uassert.True(t, strings.Contains(nftList, "NFT:"+testRealmPkgPath+".listing_nft.1"),
134		"GetAllNFTs should list registered NFT")
135
136	multiToken := grc1155.NewBasicGRC1155Token("test-uri")
137	RegisterMultiToken(cross, multiToken.Getter(), "listing_mt")
138
139	grc1155List := GetAllMultiTokens()
140	uassert.True(t, strings.Contains(grc1155List, "MultiToken:"+testRealmPkgPath+".listing_mt"),
141		"GetAllMultiTokens should list registered multi-token")
142
143	completeList := GetAllRegistered()
144	uassert.True(t, strings.Contains(completeList, "NFT:"+testRealmPkgPath+".listing_nft.1"),
145		"GetAllTokens should list NFTs")
146	uassert.True(t, strings.Contains(completeList, "Token:gno.land/r/matijamarjanovic/tokenhub."+testRealmPkgPath+".listing_token"),
147		"GetAllTokens should list GRC20 tokens")
148	uassert.True(t, strings.Contains(completeList, "MultiToken:"+testRealmPkgPath+".listing_mt"),
149		"GetAllTokens should list multi-tokens")
150}
151
152func TestMustGetFunctions(t *testing.T) {
153	testing.SetRealm(testing.NewCodeRealm(testRealmPkgPath))
154
155	token, _ := grc20.NewToken("Must Token", "MUST", 6)
156	RegisterToken(cross, token, "must_token")
157
158	retrievedToken := MustGetToken("gno.land/r/matijamarjanovic/tokenhub." + testRealmPkgPath + ".must_token")
159	uassert.Equal(t, "Must Token", retrievedToken.GetName(), "Token name should match")
160
161	defer func() {
162		r := recover()
163		uassert.True(t, r != nil, "MustGetToken should panic for non-existent token")
164		uassert.True(t, strings.Contains(r.(string), "unknown token"), "Panic message should mention unknown token")
165	}()
166	MustGetToken("non_existent_token")
167
168	nft := grc721.NewBasicNFT("Must NFT", "MNFT")
169	nft.Mint(runtime.CurrentRealm().Address(), grc721.TokenID("1"))
170	RegisterNFT(cross, nft.Getter(), "must_nft", "1")
171
172	retrievedNFT := MustGetNFT("gno.land/r/matijamarjanovic/home.must_nft.1")
173	metadata, ok := retrievedNFT.(grc721.IGRC721CollectionMetadata)
174	urequire.True(t, ok, "NFT should implement IGRC721CollectionMetadata")
175	uassert.Equal(t, "Must NFT", metadata.Name(), "NFT name should match")
176
177	defer func() {
178		r := recover()
179		uassert.True(t, r != nil, "MustGetNFT should panic for non-existent NFT")
180		uassert.True(t, strings.Contains(r.(string), "unknown NFT"), "Panic message should mention unknown NFT")
181	}()
182	MustGetNFT("non_existent_nft")
183
184	mt := grc1155.NewBasicGRC1155Token("must-uri")
185	RegisterMultiToken(cross, mt.Getter(), "must_mt")
186
187	retrievedMT := MustGetMultiToken("gno.land/r/matijamarjanovic/home.must_mt")
188	_, ok = retrievedMT.(grc1155.IGRC1155)
189	urequire.True(t, ok, "Retrieved multi-token should implement IGRC1155")
190
191	defer func() {
192		r := recover()
193		uassert.True(t, r != nil, "MustGetMultiToken should panic for non-existent multi-token")
194		uassert.True(t, strings.Contains(r.(string), "unknown multi-token"), "Panic message should mention unknown multi-token")
195	}()
196	MustGetMultiToken("non_existent_mt")
197}
198
199func resetState(t *testing.T) {
200	t.Helper()
201
202	registeredTokens = avl.NewTree()
203	registeredNFTs = avl.NewTree()
204	registeredMTs = avl.NewTree()
205}