|
| 1 | +contract; |
| 2 | + |
| 3 | +use std::hash::*; |
| 4 | + |
| 5 | +struct SimpleGeneric<T> { |
| 6 | + single_generic_param: T, |
| 7 | +} |
| 8 | + |
| 9 | +struct PassTheGenericOn<K> { |
| 10 | + one: SimpleGeneric<K>, |
| 11 | +} |
| 12 | + |
| 13 | +struct StructWArrayGeneric<L> { |
| 14 | + a: [L; 2], |
| 15 | +} |
| 16 | + |
| 17 | +struct StructWTupleGeneric<M> { |
| 18 | + a: (M, M), |
| 19 | +} |
| 20 | + |
| 21 | +struct StructWDiffTupleGeneric<M, N> { |
| 22 | + a: (M, N), |
| 23 | +} |
| 24 | + |
| 25 | +enum EnumWGeneric<N> { |
| 26 | + a: u64, |
| 27 | + b: N, |
| 28 | +} |
| 29 | + |
| 30 | +struct MegaExample<T, U> { |
| 31 | + a: ([U; 2], T), |
| 32 | + b: Vec<([EnumWGeneric<StructWTupleGeneric<StructWArrayGeneric<PassTheGenericOn<T>>>>; 1], u32)>, |
| 33 | +} |
| 34 | + |
| 35 | +abi MyContract { |
| 36 | + fn struct_w_generic(arg1: SimpleGeneric<u64>) -> SimpleGeneric<u64>; |
| 37 | + fn struct_delegating_generic(arg1: PassTheGenericOn<str[3]>) -> PassTheGenericOn<str[3]>; |
| 38 | + fn struct_w_generic_in_array(arg1: StructWArrayGeneric<u32>) -> StructWArrayGeneric<u32>; |
| 39 | + fn struct_w_generic_in_tuple(arg1: StructWTupleGeneric<u32>) -> StructWTupleGeneric<u32>; |
| 40 | + fn struct_w_diff_generic_in_tuple(arg1: StructWDiffTupleGeneric<u32, bool>) -> StructWDiffTupleGeneric<u32, bool>; |
| 41 | + |
| 42 | + fn enum_w_generic(arg1: EnumWGeneric<u64>) -> EnumWGeneric<u64>; |
| 43 | + |
| 44 | + fn complex_test(arg1: MegaExample<str[2], b256>); |
| 45 | +} |
| 46 | + |
| 47 | +impl Hash for str[3] { |
| 48 | + fn hash(self, ref mut state: Hasher) { |
| 49 | + state.write_str_array(self); |
| 50 | + } |
| 51 | +} |
| 52 | + |
| 53 | +impl MyContract for Contract { |
| 54 | + fn struct_w_generic(arg1: SimpleGeneric<u64>) -> SimpleGeneric<u64> { |
| 55 | + let expected = SimpleGeneric { |
| 56 | + single_generic_param: 123u64, |
| 57 | + }; |
| 58 | + |
| 59 | + assert(arg1.single_generic_param == expected.single_generic_param); |
| 60 | + |
| 61 | + expected |
| 62 | + } |
| 63 | + |
| 64 | + fn struct_delegating_generic(arg1: PassTheGenericOn<str[3]>) -> PassTheGenericOn<str[3]> { |
| 65 | + let expected = PassTheGenericOn { |
| 66 | + one: SimpleGeneric { |
| 67 | + single_generic_param: __to_str_array("abc"), |
| 68 | + }, |
| 69 | + }; |
| 70 | + |
| 71 | + assert(sha256(expected.one.single_generic_param) == sha256(arg1.one.single_generic_param)); |
| 72 | + |
| 73 | + expected |
| 74 | + } |
| 75 | + |
| 76 | + fn struct_w_generic_in_array(arg1: StructWArrayGeneric<u32>) -> StructWArrayGeneric<u32> { |
| 77 | + let expected = StructWArrayGeneric { |
| 78 | + a: [1u32, 2u32], |
| 79 | + }; |
| 80 | + |
| 81 | + assert(expected.a[0] == arg1.a[0]); |
| 82 | + assert(expected.a[1] == arg1.a[1]); |
| 83 | + |
| 84 | + expected |
| 85 | + } |
| 86 | + |
| 87 | + fn struct_w_generic_in_tuple(arg1: StructWTupleGeneric<u32>) -> StructWTupleGeneric<u32> { |
| 88 | + let expected = StructWTupleGeneric { a: (1u32, 2u32) }; |
| 89 | + assert(expected.a.0 == arg1.a.0); |
| 90 | + assert(expected.a.1 == arg1.a.1); |
| 91 | + |
| 92 | + expected |
| 93 | + } |
| 94 | + |
| 95 | + fn struct_w_diff_generic_in_tuple( |
| 96 | + arg1: StructWDiffTupleGeneric<u32, bool>, |
| 97 | + ) -> StructWDiffTupleGeneric<u32, bool> { |
| 98 | + let expected = StructWDiffTupleGeneric { a: (1u32, false) }; |
| 99 | + assert(expected.a.0 == arg1.a.0); |
| 100 | + assert(expected.a.1 == arg1.a.1); |
| 101 | + |
| 102 | + expected |
| 103 | + } |
| 104 | + fn enum_w_generic(arg1: EnumWGeneric<u64>) -> EnumWGeneric<u64> { |
| 105 | + match arg1 { |
| 106 | + EnumWGeneric::b(value) => { |
| 107 | + assert(value == 10u64); |
| 108 | + } |
| 109 | + _ => { |
| 110 | + assert(false) |
| 111 | + } |
| 112 | + } |
| 113 | + EnumWGeneric::b(10) |
| 114 | + } |
| 115 | + |
| 116 | + fn complex_test(arg1: MegaExample<str[2], b256>) {} |
| 117 | +} |
0 commit comments