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}