v2 / vlib / v / tests / fns / fn_variadic_test.v
129 lines · 107 sloc · 2.53 KB · 845ce0d8bd95fee0b9037d9118135688de0aa783
Raw
1struct VaTestGroup {
2 name string
3}
4
5// basic
6fn variadic_test(name string, groups ...VaTestGroup) {
7 assert groups.len == 2
8 assert groups[0].name == 'users'
9 assert groups[1].name == 'admins'
10}
11
12fn test_fn_variadic() {
13 group1 := VaTestGroup{
14 name: 'users'
15 }
16 group2 := VaTestGroup{
17 name: 'admins'
18 }
19 variadic_test('joe', group1, group2)
20}
21
22/*
23// QTODO
24// generic
25fn variadic_test_generic[T](a int, b ...T) T {
26 b1 := b[0]
27 b2 := b[1]
28 return '${a} ${b1} ${b2}'
29}
30
31fn test_fn_variadic_generic() {
32 assert variadic_test_generic(111, 'hello', 'v') == '111 hello v'
33}
34*/
35// forwarding
36fn variadic_forward_a(a ...string) string {
37 return variadic_fn_a(...a)
38}
39
40fn variadic_fn_a(a ...string) string {
41 a0 := a[0]
42 a1 := a[1]
43 a2 := a[2]
44 return '${a0}${a1}${a2}'
45}
46
47fn test_fn_variadic_forward() {
48 assert variadic_forward_a('a', 'b', 'c') == 'abc'
49}
50
51fn variadic_fn_head_tail(head string, tail ...string) string {
52 return '${head}|${tail.join(',')}'
53}
54
55fn variadic_forward_with_fixed_arg(args ...string) string {
56 return variadic_fn_head_tail(...args)
57}
58
59fn test_fn_variadic_forward_with_fixed_arg() {
60 assert variadic_forward_with_fixed_arg('a') == 'a|'
61 assert variadic_forward_with_fixed_arg('a', 'b', 'c') == 'a|b,c'
62}
63
64fn fn_variadic_with_arg_no_vargs(name string, groups ...VaTestGroup) {
65 assert groups.len == 0
66}
67
68fn test_fn_variadic_with_arg_no_vargs() {
69 fn_variadic_with_arg_no_vargs('marko')
70}
71
72fn fn_variadic_only_with_no_vargs(groups ...VaTestGroup) {
73 assert groups.len == 0
74}
75
76fn test_variadic_only_with_no_vargs() {
77 fn_variadic_only_with_no_vargs()
78}
79
80fn test_array_decomposition_to_vargs() {
81 a := ['a', 'b', 'c']
82 assert variadic_fn_a(...a) == 'abc'
83}
84
85struct VaTestStruct {
86}
87
88fn (a VaTestStruct) variadic_method(name string, groups ...VaTestGroup) {
89 assert groups.len == 2
90 assert groups[0].name == 'users'
91 assert groups[1].name == 'admins'
92}
93
94fn (a VaTestStruct) variadic_method_no_args(name string, groups ...VaTestGroup) {
95 assert groups.len == 0
96}
97
98fn test_fn_variadic_method() {
99 a := VaTestStruct{}
100 group1 := VaTestGroup{
101 name: 'users'
102 }
103 group2 := VaTestGroup{
104 name: 'admins'
105 }
106 a.variadic_method('marko', group1, group2)
107}
108
109fn test_fn_variadic_method_no_args() {
110 a := VaTestStruct{}
111 a.variadic_method_no_args('marko')
112}
113
114// test vargs with pointer type
115fn take_variadic_string_ptr(strings ...&string) {
116 take_array_string_ptr(strings)
117}
118
119fn take_array_string_ptr(strings []&string) {
120 assert strings.len == 2
121 assert *strings[0] == 'a'
122 assert *strings[1] == 'b'
123}
124
125fn test_varg_pointer() {
126 a := 'a'
127 b := 'b'
128 take_variadic_string_ptr(&a, &b)
129}
130