vxx2 / vlib / v / tests / option_result_alias_fn_ret_test.v
87 lines · 69 sloc · 1.42 KB · 56e61c291d14aa83e2a8a3d362011bbe61149957
Raw
1// Regression test for https://github.com/vlang/v/issues/27056 and
2// https://github.com/vlang/v/issues/27006: returning `?T` / `!T` from a
3// function whose return type is `?Alias` / `!Alias` (where `type Alias = T`)
4// must compile, both for the direct alias case and for containers (`?[]Alias`,
5// `![]Alias`, etc.).
6
7struct Bb {
8 s string
9}
10
11type Aa = Bb
12
13fn returns_b_option() ?Bb {
14 return Bb{
15 s: 'b'
16 }
17}
18
19fn returns_b_result() !Bb {
20 return Bb{
21 s: 'b'
22 }
23}
24
25fn returns_bs_option() ?[]Bb {
26 return [Bb{ s: 'b' }]
27}
28
29fn returns_bs_result() ![]Bb {
30 return [Bb{ s: 'b' }]
31}
32
33fn case_a() !Aa {
34 return returns_b_result()
35}
36
37fn case_b() ?Aa {
38 return returns_b_option()
39}
40
41fn case_c() ?[]Aa {
42 return returns_bs_option()
43}
44
45fn case_d() ![]Aa {
46 return returns_bs_result()
47}
48
49fn case_e() !Aa {
50 return returns_b_result()
51}
52
53fn case_f() ?Aa {
54 return returns_b_option()
55}
56
57fn test_result_alias_direct() {
58 a := case_a() or { panic(err) }
59 assert a.s == 'b'
60}
61
62fn test_option_alias_direct() {
63 b := case_b() or { panic(err) }
64 assert b.s == 'b'
65}
66
67fn test_option_alias_array() {
68 c := case_c() or { panic(err) }
69 assert c.len == 1
70 assert c[0].s == 'b'
71}
72
73fn test_result_alias_array() {
74 d := case_d() or { panic(err) }
75 assert d.len == 1
76 assert d[0].s == 'b'
77}
78
79fn test_result_alias_paren_wrapped() {
80 e := case_e() or { panic(err) }
81 assert e.s == 'b'
82}
83
84fn test_option_alias_paren_wrapped() {
85 f := case_f() or { panic('none') }
86 assert f.s == 'b'
87}
88