26
26
import score .annotation .Payable ;
27
27
28
28
import java .math .BigInteger ;
29
+ import java .util .Arrays ;
30
+ import java .util .List ;
29
31
30
32
import static org .junit .jupiter .api .Assertions .*;
31
33
@@ -57,6 +59,36 @@ public void deposit() {
57
59
public BigInteger getStored () {
58
60
return store .getOrDefault (BigInteger .ZERO );
59
61
}
62
+
63
+ @ External (readonly =true )
64
+ public boolean [] getBoolArray (boolean [] v ) {
65
+ return v ;
66
+ }
67
+
68
+ @ External (readonly =true )
69
+ public int [] getIntArray (int [] v ) {
70
+ return v ;
71
+ }
72
+
73
+ @ External (readonly =true )
74
+ public String [] getStrArray (String [] v ) {
75
+ return v ;
76
+ }
77
+
78
+ @ External (readonly =true )
79
+ public byte [][] getBytesArray (byte [][] v ) {
80
+ return v ;
81
+ }
82
+
83
+ @ External (readonly =true )
84
+ public Address [] getAddressArray (Address [] v ) {
85
+ return v ;
86
+ }
87
+
88
+ @ External (readonly =true )
89
+ public BigInteger [] getBigIntArray (BigInteger [] v ) {
90
+ return v ;
91
+ }
60
92
}
61
93
62
94
public static class CalleeWithoutFallback {
@@ -94,12 +126,180 @@ public void invoke(Address target, BigInteger value, String method) {
94
126
public void transfer (Address target , BigInteger value ) {
95
127
Context .transfer (target , value );
96
128
}
129
+
130
+ @ External
131
+ public void callWithType (Address target , String type ) {
132
+ switch (type ) {
133
+ case "bool" : {
134
+ var ba = new boolean []{false , true };
135
+ var ret = (List <Object >) Context .call (target , "getBoolArray" , (Object ) ba );
136
+ Context .require (ret .size () == ba .length );
137
+ for (int i = 0 ; i < ba .length ; i ++) {
138
+ var e = ret .get (i );
139
+ if (e instanceof Boolean ) {
140
+ Context .require (((Boolean ) e ) == ba [i ]);
141
+ } else {
142
+ Context .revert ("not a boolean" );
143
+ }
144
+ }
145
+ break ;
146
+ }
147
+ case "int" : {
148
+ var ia = new int []{1 , 2 , 3 };
149
+ var ret = (List <Object >) Context .call (target , "getIntArray" , (Object ) ia );
150
+ Context .require (ret .size () == ia .length );
151
+ for (int i = 0 ; i < ia .length ; i ++) {
152
+ var e = ret .get (i );
153
+ if (e instanceof BigInteger ) {
154
+ Context .require (((BigInteger ) e ).intValue () == ia [i ]);
155
+ } else {
156
+ Context .revert ("not a BigInteger" );
157
+ }
158
+ }
159
+ break ;
160
+ }
161
+ case "str" : {
162
+ var sa = new String []{"a" , "b" , "c" };
163
+ var ret = (List <Object >) Context .call (target , "getStrArray" , (Object ) sa );
164
+ Context .require (ret .size () == sa .length );
165
+ for (int i = 0 ; i < sa .length ; i ++) {
166
+ var e = ret .get (i );
167
+ if (e instanceof String ) {
168
+ Context .require (e .equals (sa [i ]));
169
+ } else {
170
+ Context .revert ("not a String" );
171
+ }
172
+ }
173
+ break ;
174
+ }
175
+ case "bytes" : {
176
+ var ba = new byte [][]{new byte []{0x1 , 0x2 }, new byte []{0x3 , 0x4 }};
177
+ var ret = (List <Object >) Context .call (target , "getBytesArray" , (Object ) ba );
178
+ Context .require (ret .size () == ba .length );
179
+ for (int i = 0 ; i < ba .length ; i ++) {
180
+ var e = ret .get (i );
181
+ if (e instanceof byte []) {
182
+ Context .require (Arrays .equals ((byte []) e , ba [i ]));
183
+ } else {
184
+ Context .revert ("not a byte[]" );
185
+ }
186
+ }
187
+ break ;
188
+ }
189
+ case "Address" : {
190
+ var aa = new Address []{
191
+ Address .fromString ("hx0000000000000000000000000000000000000001" ),
192
+ Address .fromString ("hx0000000000000000000000000000000000000002" )
193
+ };
194
+ var ret = (List <Object >) Context .call (target , "getAddressArray" , (Object ) aa );
195
+ Context .require (ret .size () == aa .length );
196
+ for (int i = 0 ; i < aa .length ; i ++) {
197
+ var e = ret .get (i );
198
+ if (e instanceof Address ) {
199
+ Context .require (e .equals (aa [i ]));
200
+ } else {
201
+ Context .revert ("not an Address" );
202
+ }
203
+ }
204
+ break ;
205
+ }
206
+ case "bigInt" : {
207
+ var ba = new BigInteger []{BigInteger .ZERO , BigInteger .ONE , BigInteger .TWO };
208
+ var ret = (List <Object >) Context .call (target , "getBigIntArray" , (Object ) ba );
209
+ Context .require (ret .size () == ba .length );
210
+ for (int i = 0 ; i < ba .length ; i ++) {
211
+ var e = ret .get (i );
212
+ if (e instanceof BigInteger ) {
213
+ Context .require (e .equals (ba [i ]));
214
+ } else {
215
+ Context .revert ("not a BigInteger" );
216
+ }
217
+ }
218
+ break ;
219
+ }
220
+ case "boolList" : {
221
+ var bl = List .of (false , true );
222
+ var ret = (List <Object >) Context .call (target , "getBoolArray" , (Object ) bl );
223
+ Context .require (ret .size () == bl .size ());
224
+ for (int i = 0 ; i < bl .size (); i ++) {
225
+ var e = ret .get (i );
226
+ if (e instanceof Boolean ) {
227
+ Context .require (e == bl .get (i ));
228
+ } else {
229
+ Context .revert ("not a boolean" );
230
+ }
231
+ }
232
+ break ;
233
+ }
234
+ case "intList" : {
235
+ var il = List .of (1 , 2 , 3 );
236
+ var ret = (List <Object >) Context .call (target , "getIntArray" , (Object ) il );
237
+ Context .require (ret .size () == il .size ());
238
+ for (int i = 0 ; i < il .size (); i ++) {
239
+ var e = ret .get (i );
240
+ if (e instanceof BigInteger ) {
241
+ Context .require (((BigInteger ) e ).intValue () == il .get (i ));
242
+ } else {
243
+ Context .revert ("not a BigInteger" );
244
+ }
245
+ }
246
+ break ;
247
+ }
248
+ case "strList" : {
249
+ var sl = List .of ("a" , "b" , "c" );
250
+ var ret = (List <Object >) Context .call (target , "getStrArray" , (Object ) sl );
251
+ Context .require (ret .size () == sl .size ());
252
+ for (int i = 0 ; i < sl .size (); i ++) {
253
+ var e = ret .get (i );
254
+ if (e instanceof String ) {
255
+ Context .require (e .equals (sl .get (i )));
256
+ } else {
257
+ Context .revert ("not a String" );
258
+ }
259
+ }
260
+ break ;
261
+ }
262
+ case "bytesList" : {
263
+ var bl = List .of (new byte []{0x1 , 0x2 }, new byte []{0x3 , 0x4 });
264
+ var ret = (List <Object >) Context .call (target , "getBytesArray" , (Object ) bl );
265
+ Context .require (ret .size () == bl .size ());
266
+ for (int i = 0 ; i < bl .size (); i ++) {
267
+ var e = ret .get (i );
268
+ if (e instanceof byte []) {
269
+ Context .require (Arrays .equals ((byte []) e , bl .get (i )));
270
+ } else {
271
+ Context .revert ("not a byte[]" );
272
+ }
273
+ }
274
+ break ;
275
+ }
276
+ case "AddressList" : {
277
+ var aa = List .of (
278
+ Address .fromString ("hx0000000000000000000000000000000000000001" ),
279
+ Address .fromString ("hx0000000000000000000000000000000000000002" )
280
+ );
281
+ var ret = (List <Object >) Context .call (target , "getAddressArray" , (Object ) aa );
282
+ Context .require (ret .size () == aa .size ());
283
+ for (int i = 0 ; i < aa .size (); i ++) {
284
+ var e = ret .get (i );
285
+ if (e instanceof Address ) {
286
+ Context .require (e .equals (aa .get (i )));
287
+ } else {
288
+ Context .revert ("not an Address" );
289
+ }
290
+ }
291
+ break ;
292
+ }
293
+ default :
294
+ Context .revert ("Unknown type: " + type );
295
+ }
296
+ }
97
297
}
98
298
99
299
private static Score callee ;
100
300
private static Score callee2 ;
101
301
private static Score caller ;
102
- private static Account user1 = sm .createAccount ();
302
+ private static final Account user1 = sm .createAccount ();
103
303
104
304
@ BeforeAll
105
305
static void setup () throws Exception {
@@ -109,12 +309,23 @@ static void setup() throws Exception {
109
309
}
110
310
111
311
@ Test
112
- void testProxyCall () throws Exception {
312
+ void testProxyCall () {
113
313
assertDoesNotThrow (() ->
114
314
caller .invoke (owner , "proxyCall" , callee .getAddress ())
115
315
);
116
316
}
117
317
318
+ @ Test
319
+ void testTypeConversion () {
320
+ String [] tests = {
321
+ "bool" , "int" , "str" , "bytes" , "Address" , "bigInt" ,
322
+ "boolList" , "intList" , "strList" , "bytesList" , "AddressList" };
323
+ for (var type : tests ) {
324
+ assertDoesNotThrow (() ->
325
+ caller .invoke (owner , "callWithType" , callee .getAddress (), type ));
326
+ }
327
+ }
328
+
118
329
@ Test
119
330
void testTransfer () {
120
331
BigInteger balance ;
0 commit comments