/ tests / tests / execution / flattened_function_and_inline_matches.adl
flattened_function_and_inline_matches.adl
  1  /*
  2  seed = 123456789
  3  min_height = 16
  4  
  5  [case]
  6  program = "test.alpha"
  7  function = "bar"
  8  input = ["true", "true", "1u8", "0u8"]
  9  [case]
 10  program = "test.alpha"
 11  function = "bar"
 12  input = ["true", "false", "1u8", "1u8"]
 13  [case]
 14  program = "test.alpha"
 15  function = "bar"
 16  input = ["false", "true", "2u8", "1u8"]
 17  [case]
 18  program = "test.alpha"
 19  function = "bar"
 20  input = ["false", "false", "2u8", "2u8"]
 21  [case]
 22  program = "test.alpha"
 23  function = "blar"
 24  input = ["true", "true", "1u8", "0u8"]
 25  [case]
 26  program = "test.alpha"
 27  function = "blar"
 28  input = ["true", "false", "1u8", "1u8"]
 29  [case]
 30  program = "test.alpha"
 31  function = "blar"
 32  input = ["false", "true", "2u8", "1u8"]
 33  [case]
 34  program = "test.alpha"
 35  function = "blar"
 36  input = ["false", "false", "2u8", "2u8"]
 37  */
 38  
 39  // In this test, we expect bar and blar to produce the same result for all inputs.
 40  
 41  program test.alpha {
 42      struct Extra {
 43          c: u8,
 44      }
 45  
 46      struct Data {
 47          a: u8,
 48          b: u8,
 49          c: Extra,
 50      }
 51  
 52      inline foo(a: u8, b: u8, input: Data) -> (u8, u8, Data) {
 53          let extra: Extra = Extra { c: a };
 54          let data: Data = Data { a: a, b: b, c: extra };
 55          if (a == b) {
 56              return (a, b, data);
 57          }
 58          let c: u8 = a + b;
 59          let d: u8 = a - b;
 60          c = c + input.a;
 61          d = d + input.b;
 62  
 63          return (c, d, data);
 64      }
 65  
 66      function floo(a: u8, b: u8, input: Data) -> (u8, u8, Data) {
 67          let extra: Extra = Extra { c: a };
 68          let data: Data = Data { a: a, b: b, c: extra };
 69          if (a == b) {
 70              return (a, b, data);
 71          }
 72          let c: u8 = a + b;
 73          let d: u8 = a - b;
 74          c = c + input.a;
 75          d = d + input.b;
 76  
 77          return (c, d, data);
 78      }
 79  
 80      transition bar(flag1: bool, flag2: bool, a: u8, b: u8) -> (u8, u8, Data) {
 81          let data: Data = Data { a: a, b: b, c: Extra { c: a } };
 82          let start: (u8, u8, Data) = foo(a, b, data);
 83          // (2, 1, Data { a: 1, b: 0, c: Extra { c: 1 } })
 84          if flag1 {
 85              // foo (2, 1, Data { a: 1, b: 0, c: Extra { c: 1 } })
 86              start = foo(start.0, start.2.c.c, start.2);
 87              //
 88          } else {
 89              if flag2 {
 90                  // foo (1, 0, Data { a: 1, b: 0, c: Extra { c: 1 } })
 91                  start = foo(start.1, start.2.b, start.2);
 92              } else {
 93                  // foo (1, 1, Data { a: 1, b: 0, c: Extra { c: 1 } })
 94                  start = foo(start.2.a, start.1, start.2);
 95              }
 96          }
 97          return start;
 98      }
 99  
100      transition blar(flag1: bool, flag2: bool, a: u8, b: u8) -> (u8, u8, Data) {
101          let data: Data = Data { a: a, b: b, c: Extra { c: a } };
102  
103          let start: (u8, u8, Data) = floo(a, b, data);
104          if flag1 {
105              start = floo(start.0, start.2.c.c, start.2);
106          } else {
107              if flag2 {
108                  start = floo(start.1, start.2.b, start.2);
109              } else {
110                  start = floo(start.2.a, start.1, start.2);
111              }
112          }
113          return start;
114      }
115  
116      @noupgrade
117      async constructor() {}
118  
119  }