/ tests / tests / execution / optional_types.adl
optional_types.adl
  1  /*
  2  seed = 123456789
  3  
  4  [case]
  5  program = "all_types.alpha"
  6  function = "optional_basic_primitives"
  7  input = []
  8  
  9  [case]
 10  program = "all_types.alpha"
 11  function = "array_of_optionals"
 12  input = []
 13  
 14  [case]
 15  program = "all_types.alpha"
 16  function = "optional_array"
 17  input = []
 18  
 19  [case]
 20  program = "all_types.alpha"
 21  function = "optional_struct_field"
 22  input = []
 23  
 24  [case]
 25  program = "all_types.alpha"
 26  function = "optional_struct"
 27  input = []
 28  
 29  [case]
 30  program = "all_types.alpha"
 31  function = "array_of_optional_structs"
 32  input = []
 33  
 34  [case]
 35  program = "all_types.alpha"
 36  function = "nested_optional_structs"
 37  input = []
 38  
 39  [case]
 40  program = "all_types.alpha"
 41  function = "tuples_with_optional_elements"
 42  input = []
 43  
 44  [case]
 45  program = "all_types.alpha"
 46  function = "optional_misc_primitive_types"
 47  input = [] 
 48  
 49  [case]
 50  program = "all_types.alpha"
 51  function = "optional_address"
 52  input = [] 
 53  */
 54  
 55  program all_types.alpha {
 56  
 57      // --- Shared Structs ---
 58      struct OptStruct {
 59          val: u16?,
 60      }
 61  
 62      struct MyStruct {
 63          x: u8,
 64      }
 65  
 66      struct Foo {
 67          x: u8,
 68      }
 69  
 70      struct Inner {
 71          val: u8?,
 72      }
 73  
 74      struct Wrapper {
 75          arr: [Inner?; 2]?,
 76      }
 77  
 78      struct Container {
 79          wrappers: [Wrapper?; 2]?,
 80      }
 81  
 82      struct Top {
 83          container: Container?,
 84      }
 85  
 86      // --- Section 1: Basic Optionals and Inference ---
 87      transition optional_basic_primitives() -> u32 {
 88          let a: u32? = 10;
 89          let b: u32? = none;
 90          let c: u32 = a.unwrap();
 91          let d: u32 = b.unwrap_or(42);
 92          return c + d; // 10 + 42 = 52
 93      }
 94  
 95      // --- Section 2: Arrays of Optionals ---
 96      transition array_of_optionals() -> u8 {
 97          let arr: [u8?; 3] = [1, none, 3];
 98          let sum = arr[0].unwrap_or(10)
 99                    + arr[1].unwrap_or(20)
100                    + arr[2].unwrap_or(30);
101          return sum; // 1 + 20 + 3 = 24
102      }
103  
104      // --- Section 3: Optional Arrays ---
105      transition optional_array() -> u128 {
106          let arr_opt: [u128?; 2]? = [1000, none];
107          let arr_opt2: [u128?; 3]? = [42; 3];
108          let first =   arr_opt.unwrap()[0].unwrap_or(10) 
109                      + arr_opt.unwrap()[1].unwrap_or(11) 
110                      + arr_opt2.unwrap()[0].unwrap_or(12)
111                      + arr_opt2.unwrap()[2].unwrap_or(13);
112          return first;
113      }
114  
115      // --- Section 4: Structs with Optional Fields ---
116      transition optional_struct_field() -> u16 {
117          let s = OptStruct { val: none };
118          return s.val.unwrap_or(123); // 123
119      }
120  
121      // --- Section 5: Optional Structs ---
122      transition optional_struct() -> u8 {
123          let s: MyStruct? = MyStruct { x: 5 };
124          return s.unwrap().x; // 5
125      }
126  
127      // --- Section 6: Arrays of Optional Structs ---
128      transition array_of_optional_structs() -> u8 {
129          let arr: [Foo?; 2] = [Foo { x: 10 }, none];
130          return arr[0].unwrap().x; // 10
131      }
132  
133      // --- Section 7: Nested Optionals in Structs & Arrays ---
134      transition nested_optional_structs() -> u8 {
135          let inner = Inner { val: 10 };
136          let wrapper = Wrapper { arr: [inner, none] };
137          let container = Container { wrappers: [wrapper, none] };
138          let top = Top { container };
139  
140          return top.container.unwrap()
141              .wrappers.unwrap()[0].unwrap()
142              .arr.unwrap()[0].unwrap()
143              .val.unwrap(); // 10
144      }
145  
146      // --- Section 8: Tuples with Optional Elements ---
147      transition tuples_with_optional_elements() -> u32 {
148          let t1: (u32, u32?) = (100, 200);
149          let t2: (u32, u32?) = (300, none);
150  
151          let sum = t1.0 + t1.1.unwrap_or(0)
152                  + t2.0 + t2.1.unwrap_or(50);
153          return sum; // 100 + 200 + 300 + 50 = 650
154      }
155  
156      // --- Section 9: Optionals with address, group, field, scalar, signature ---
157      transition optional_misc_primitive_types() -> (group, field, scalar) {
158          let gr: group? = 0;
159          let fl: field? = 1;
160          let sc: scalar? = 2;
161          
162          return (
163              gr.unwrap(),
164              fl.unwrap_or(2),
165              sc.unwrap(),
166          );
167      }
168  
169      // --- Section 10: Optionals with Address ---
170      struct AddrStruct { a: address, b: address? }
171      struct InnerAddr { val: address? }
172      struct WrapperAddr { inner: InnerAddr }
173      transition optional_address() -> (address, address, address, address) {
174          // Case 1: Direct optional address
175          let a: address? = none;
176          let b: address? = ax10qerras5799u6k7rjtc9y3hcwxuykr45qra7x7dp6jgnc0923czqm0lgta;
177          let val1 = b.unwrap_or(a.unwrap_or(ax10qerras5799u6k7rjtc9y3hcwxuykr45qra7x7dp6jgnc0923czqm0lgta));
178  
179          // Case 2: Struct containing address and optional address
180          let s = AddrStruct { 
181              a: ax10qerras5799u6k7rjtc9y3hcwxuykr45qra7x7dp6jgnc0923czqm0lgta, 
182              b: none 
183          };
184          let val2 = s.b.unwrap_or(s.a);
185  
186          // Case 3: Optional struct containing address
187          let s_opt: AddrStruct? = AddrStruct { 
188              a: ax10qerras5799u6k7rjtc9y3hcwxuykr45qra7x7dp6jgnc0923czqm0lgta, 
189              b: none 
190          };
191          let val3 = s_opt.unwrap().a;
192  
193          // Case 4: Nested struct with optional address field
194  
195          let wrapper = WrapperAddr { inner: InnerAddr { val: ax10qerras5799u6k7rjtc9y3hcwxuykr45qra7x7dp6jgnc0923czqm0lgta } };
196          let val4 = wrapper.inner.val.unwrap();
197  
198          // Just return one of the addresses to satisfy return type
199          return (val1, val2, val3, val4);
200      }
201  
202      @noupgrade
203      async constructor() {}
204  }