vq / vlib / v / tests / comptime / comptime_for_field_methods_test.v
66 lines · 58 sloc · 1.04 KB · d3f9c67a9a7e2b86799329b234ec955891b8fdbd
Raw
1// Regression test for https://github.com/vlang/v/issues/27076 —
2// `$for method in field.methods` inside `$for field in T.fields` evaluated
3// `$if method.name == ...` against an empty method name and dropped the body.
4
5struct Comp1 {
6mut:
7 a int
8}
9
10fn (mut c Comp1) on_init() {
11 c.a = 42
12}
13
14struct Comp2 {
15mut:
16 b int
17}
18
19fn (mut c Comp2) on_init() {
20 c.b = 42
21}
22
23struct Comp3 {
24mut:
25 c int
26}
27
28fn (mut c Comp3) on_init() {
29 c.c = 42
30}
31
32struct Container {
33mut:
34 id string
35 cmp1 Comp1
36 cmp2 Comp2
37 cmp3 Comp3
38 cmp4 Comp1
39 cmp5 Comp2
40 cmp6 Comp3
41 cmp7 Comp1
42 cmp8 Comp2
43 cmp9 Comp3
44}
45
46fn test_comptime_method_dispatch_on_struct_fields() {
47 mut app := Container{}
48 $for field in Container.fields {
49 $if field.is_struct {
50 $for method in field.methods {
51 $if method.name == 'on_init' {
52 app.$(field.name).on_init()
53 }
54 }
55 }
56 }
57 assert app.cmp1.a == 42
58 assert app.cmp2.b == 42
59 assert app.cmp3.c == 42
60 assert app.cmp4.a == 42
61 assert app.cmp5.b == 42
62 assert app.cmp6.c == 42
63 assert app.cmp7.a == 42
64 assert app.cmp8.b == 42
65 assert app.cmp9.c == 42
66}
67