Skip to content

Commit 752efc0

Browse files
committed
Add new bundling testcases and remove old, failing ones
1 parent cba1d2e commit 752efc0

9 files changed

+439
-96
lines changed

tests/expectations/compiler/async_blocks/too_many_captures_fail.out

Lines changed: 0 additions & 47 deletions
This file was deleted.
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
program test.aleo {
2+
struct Position {
3+
x: u32,
4+
y: u32,
5+
}
6+
7+
struct Entity {
8+
pos: Position,
9+
health: u32,
10+
}
11+
12+
// Test capturing complex types (nested structs, arrays) with bundling
13+
async transition main() -> Future {
14+
let entity1 = Entity {
15+
pos: Position { x: 10u32, y: 20u32 },
16+
health: 100u32,
17+
};
18+
19+
let entity2 = Entity {
20+
pos: Position { x: 30u32, y: 40u32 },
21+
health: 80u32,
22+
};
23+
24+
let arr1 = [1u32, 2u32, 3u32];
25+
let arr2 = [4u32, 5u32, 6u32];
26+
let arr3 = [7u32, 8u32, 9u32];
27+
28+
// Additional scalars to push over 16 captures
29+
let s0 = 0u32;
30+
let s1 = 1u32;
31+
let s2 = 2u32;
32+
let s3 = 3u32;
33+
let s4 = 4u32;
34+
let s5 = 5u32;
35+
let s6 = 6u32;
36+
let s7 = 7u32;
37+
let s8 = 8u32;
38+
let s9 = 9u32;
39+
let s10 = 10u32;
40+
let s11 = 11u32;
41+
let s12 = 12u32;
42+
let s13 = 13u32;
43+
let s14 = 14u32;
44+
let s15 = 15u32;
45+
let s16 = 16u32;
46+
let s17 = 17u32;
47+
48+
// Total captures: 2 entities + 3 arrays + 18 scalars = 23 captures
49+
// Should create 1 bundle with 7 fields
50+
let f = async {
51+
// Use nested struct fields
52+
assert_eq(entity1.pos.x, 10u32);
53+
assert_eq(entity1.pos.y, 20u32);
54+
assert_eq(entity1.health, 100u32);
55+
assert_eq(entity2.pos.x, 30u32);
56+
assert_eq(entity2.health, 80u32);
57+
58+
// Use arrays
59+
assert_eq(arr1[0u32], 1u32);
60+
assert_eq(arr2[1u32], 5u32);
61+
assert_eq(arr3[2u32], 9u32);
62+
63+
// Use scalars
64+
let scalar_sum = s0 + s1 + s2 + s3 + s4 + s5 + s6 + s7 + s8 + s9
65+
+ s10 + s11 + s12 + s13 + s14 + s15 + s16 + s17;
66+
assert_eq(scalar_sum, 153u32);
67+
};
68+
return f;
69+
}
70+
}
71+
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
program test.aleo {
2+
// Test multiple async transition functions with bundling
3+
// Ensures synthetic struct names don't collide across different functions
4+
async transition first() -> Future {
5+
// First set of variables for first async block
6+
let a0 = 0u32;
7+
let a1 = 1u32;
8+
let a2 = 2u32;
9+
let a3 = 3u32;
10+
let a4 = 4u32;
11+
let a5 = 5u32;
12+
let a6 = 6u32;
13+
let a7 = 7u32;
14+
let a8 = 8u32;
15+
let a9 = 9u32;
16+
let a10 = 10u32;
17+
let a11 = 11u32;
18+
let a12 = 12u32;
19+
let a13 = 13u32;
20+
let a14 = 14u32;
21+
let a15 = 15u32;
22+
let a16 = 16u32;
23+
24+
// Async block with 17 captures
25+
let f = async {
26+
let sum1 = a0 + a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9
27+
+ a10 + a11 + a12 + a13 + a14 + a15 + a16;
28+
assert_eq(sum1, 136u32);
29+
};
30+
return f;
31+
}
32+
33+
async transition second() -> Future {
34+
// Second set of variables for second async transition
35+
let b0 = 20u32;
36+
let b1 = 21u32;
37+
let b2 = 22u32;
38+
let b3 = 23u32;
39+
let b4 = 24u32;
40+
let b5 = 25u32;
41+
let b6 = 26u32;
42+
let b7 = 27u32;
43+
let b8 = 28u32;
44+
let b9 = 29u32;
45+
let b10 = 30u32;
46+
let b11 = 31u32;
47+
let b12 = 32u32;
48+
let b13 = 33u32;
49+
let b14 = 34u32;
50+
let b15 = 35u32;
51+
let b16 = 36u32;
52+
let b17 = 37u32;
53+
54+
// Second async block with 18 captures
55+
let f = async {
56+
let sum2 = b0 + b1 + b2 + b3 + b4 + b5 + b6 + b7 + b8 + b9
57+
+ b10 + b11 + b12 + b13 + b14 + b15 + b16 + b17;
58+
assert_eq(sum2, 513u32);
59+
};
60+
return f;
61+
}
62+
}
63+
Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
program test.aleo {
2+
struct Point {
3+
x: u32,
4+
y: u32,
5+
}
6+
7+
struct Color {
8+
r: u8,
9+
g: u8,
10+
b: u8,
11+
}
12+
13+
struct Entity {
14+
id: u32,
15+
health: u32,
16+
active: bool,
17+
}
18+
19+
// Stresss test with a mx of structs, tuples, arrays, and scalars with 50+ captures
20+
async transition main() -> Future {
21+
// 10 Point structs
22+
let p0 = Point { x: 0u32, y: 10u32 };
23+
let p1 = Point { x: 1u32, y: 11u32 };
24+
let p2 = Point { x: 2u32, y: 12u32 };
25+
let p3 = Point { x: 3u32, y: 13u32 };
26+
let p4 = Point { x: 4u32, y: 14u32 };
27+
let p5 = Point { x: 5u32, y: 15u32 };
28+
let p6 = Point { x: 6u32, y: 16u32 };
29+
let p7 = Point { x: 7u32, y: 17u32 };
30+
let p8 = Point { x: 8u32, y: 18u32 };
31+
let p9 = Point { x: 9u32, y: 19u32 };
32+
33+
// 5 Color structs
34+
let c0 = Color { r: 255u8, g: 0u8, b: 0u8 };
35+
let c1 = Color { r: 0u8, g: 255u8, b: 0u8 };
36+
let c2 = Color { r: 0u8, g: 0u8, b: 255u8 };
37+
let c3 = Color { r: 128u8, g: 128u8, b: 0u8 };
38+
let c4 = Color { r: 0u8, g: 128u8, b: 128u8 };
39+
40+
// 5 Entity structs
41+
let e0 = Entity { id: 100u32, health: 100u32, active: true };
42+
let e1 = Entity { id: 101u32, health: 80u32, active: true };
43+
let e2 = Entity { id: 102u32, health: 60u32, active: false };
44+
let e3 = Entity { id: 103u32, health: 40u32, active: true };
45+
let e4 = Entity { id: 104u32, health: 20u32, active: false };
46+
47+
// 5 tuples
48+
let t0 = (0u32, 1u32);
49+
let t1 = (2u32, 3u32);
50+
let t2 = (4u32, 5u32);
51+
let t3 = (6u32, 7u32);
52+
let t4 = (8u32, 9u32);
53+
54+
// 3 arrays
55+
let arr0 = [10u32, 11u32, 12u32];
56+
let arr1 = [13u32, 14u32, 15u32];
57+
let arr2 = [16u32, 17u32, 18u32];
58+
59+
// 20 scalar u32 variables
60+
let s0 = 0u32;
61+
let s1 = 1u32;
62+
let s2 = 2u32;
63+
let s3 = 3u32;
64+
let s4 = 4u32;
65+
let s5 = 5u32;
66+
let s6 = 6u32;
67+
let s7 = 7u32;
68+
let s8 = 8u32;
69+
let s9 = 9u32;
70+
let s10 = 10u32;
71+
let s11 = 11u32;
72+
let s12 = 12u32;
73+
let s13 = 13u32;
74+
let s14 = 14u32;
75+
let s15 = 15u32;
76+
let s16 = 16u32;
77+
let s17 = 17u32;
78+
let s18 = 18u32;
79+
let s19 = 19u32;
80+
81+
// Total: 10 Points + 5 Colors + 5 Entities + 5 Tuples + 3 Arrays + 20 Scalars = 48 captures
82+
// This will require multiple bundle structs
83+
let f = async {
84+
// Use Point structs
85+
let sum_x = p0.x + p1.x + p2.x + p3.x + p4.x + p5.x + p6.x + p7.x + p8.x + p9.x;
86+
let sum_y = p0.y + p1.y + p2.y + p3.y + p4.y + p5.y + p6.y + p7.y + p8.y + p9.y;
87+
88+
// Use Color structs
89+
let sum_r = (c0.r as u32) + (c1.r as u32) + (c2.r as u32) + (c3.r as u32) + (c4.r as u32);
90+
let sum_g = (c0.g as u32) + (c1.g as u32) + (c2.g as u32) + (c3.g as u32) + (c4.g as u32);
91+
92+
// Use Entity structs
93+
let sum_health = e0.health + e1.health + e2.health + e3.health + e4.health;
94+
let active_count = (e0.active ? 1u32 : 0u32) + (e1.active ? 1u32 : 0u32)
95+
+ (e2.active ? 1u32 : 0u32) + (e3.active ? 1u32 : 0u32)
96+
+ (e4.active ? 1u32 : 0u32);
97+
98+
// Use tuples
99+
let sum_tuples = t0.0 + t0.1 + t1.0 + t1.1 + t2.0 + t2.1 + t3.0 + t3.1 + t4.0 + t4.1;
100+
101+
// Use arrays
102+
let sum_arrays = arr0[0u32] + arr0[1u32] + arr1[0u32] + arr1[1u32] + arr2[0u32] + arr2[1u32];
103+
104+
// Use scalars
105+
let sum_scalars = s0 + s1 + s2 + s3 + s4 + s5 + s6 + s7 + s8 + s9
106+
+ s10 + s11 + s12 + s13 + s14 + s15 + s16 + s17 + s18 + s19;
107+
108+
// Verify all values
109+
assert_eq(sum_x, 45u32);
110+
assert_eq(sum_y, 145u32);
111+
assert_eq(sum_r, 511u32);
112+
assert_eq(sum_g, 511u32);
113+
assert_eq(sum_health, 300u32);
114+
assert_eq(active_count, 3u32);
115+
assert_eq(sum_tuples, 45u32);
116+
assert_eq(sum_arrays, 81u32);
117+
assert_eq(sum_scalars, 190u32);
118+
};
119+
return f;
120+
}
121+
}
122+
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
program test.aleo {
2+
struct Data {
3+
amount: u32,
4+
count: u32,
5+
flag: bool,
6+
}
7+
8+
// Test capturing individual struct fields (similar to tuple fields)
9+
// Each field access counts as a separate capture
10+
async transition main() -> Future {
11+
let d1 = Data { amount: 1u32, count: 10u32, flag: true };
12+
let d2 = Data { amount: 2u32, count: 20u32, flag: false };
13+
let d3 = Data { amount: 3u32, count: 30u32, flag: true };
14+
let d4 = Data { amount: 4u32, count: 40u32, flag: false };
15+
let d5 = Data { amount: 5u32, count: 50u32, flag: true };
16+
let d6 = Data { amount: 6u32, count: 60u32, flag: false };
17+
let d7 = Data { amount: 7u32, count: 70u32, flag: true };
18+
let d8 = Data { amount: 8u32, count: 80u32, flag: false };
19+
let d9 = Data { amount: 9u32, count: 90u32, flag: true };
20+
let d10 = Data { amount: 10u32, count: 100u32, flag: false };
21+
let d11 = Data { amount: 11u32, count: 110u32, flag: true };
22+
23+
let s0 = 0u32;
24+
let s1 = 1u32;
25+
let s2 = 2u32;
26+
let s3 = 3u32;
27+
let s4 = 4u32;
28+
let s5 = 5u32;
29+
30+
// Total: 11 structs + 6 scalars = 17 captures
31+
// Should trigger bundling of 1 variable
32+
let f = async {
33+
let sum_amounts = d1.amount + d2.amount + d3.amount + d4.amount + d5.amount + d6.amount
34+
+ d7.amount + d8.amount + d9.amount + d10.amount + d11.amount;
35+
let sum_counts = d1.count + d2.count + d3.count + d4.count + d5.count + d6.count
36+
+ d7.count + d8.count + d9.count + d10.count + d11.count;
37+
let all_flags = d1.flag && !d2.flag && d3.flag && !d4.flag && d5.flag && !d6.flag
38+
&& d7.flag && !d8.flag && d9.flag && !d10.flag && d11.flag;
39+
let scalar_sum = s0 + s1 + s2 + s3 + s4 + s5;
40+
41+
assert_eq(sum_amounts, 66u32);
42+
assert_eq(sum_counts, 660u32);
43+
assert(all_flags);
44+
assert_eq(scalar_sum, 15u32);
45+
};
46+
return f;
47+
}
48+
}
49+
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
program test.aleo {
2+
// Test capturing tuple fields that require bundling
3+
// Tuple fields count as individual captures
4+
async transition main() -> Future {
5+
let tuple1 = (1u32, 2u32, 3u32, 4u32);
6+
let tuple2 = (5u32, 6u32, 7u32, 8u32);
7+
let tuple3 = (9u32, 10u32, 11u32, 12u32);
8+
let tuple4 = (13u32, 14u32, 15u32, 16u32);
9+
let tuple5 = (17u32, 18u32, 19u32, 20u32);
10+
let tuple6 = (21u32, 22u32, 23u32);
11+
let a = 100u32;
12+
let b = 200u32;
13+
14+
// Captures: 4+4+4+4+4+3 tuple fields + 2 scalars = 25 total
15+
// Should create 1 bundle with 9 fields
16+
let f = async {
17+
let sum = tuple1.0 + tuple1.1 + tuple1.2 + tuple1.3
18+
+ tuple2.0 + tuple2.1 + tuple2.2 + tuple2.3
19+
+ tuple3.0 + tuple3.1 + tuple3.2 + tuple3.3
20+
+ tuple4.0 + tuple4.1 + tuple4.2 + tuple4.3
21+
+ tuple5.0 + tuple5.1 + tuple5.2 + tuple5.3
22+
+ tuple6.0 + tuple6.1 + tuple6.2;
23+
assert_eq(sum + a + b, 576u32);
24+
};
25+
return f;
26+
}
27+
}
28+

0 commit comments

Comments
 (0)