v2 / vlib / v / tests / fns / fn_high_test.v
148 lines · 122 sloc · 2.46 KB · 6488041a749df9762348d019c4223908c476f2e2
Raw
1// helper
2fn sqr(x int) int {
3 return x * x
4}
5
6fn high_fn(f fn (int) int) {
7 x := f(111)
8 println('x == ${x}')
9}
10
11fn high_fn_no_ret(f fn (int)) {
12 f(111)
13}
14
15fn high_fn_array(f fn (a []int) []int) {
16}
17
18fn high_fn_multi_return(a int, b fn (c []int, d []string) ([]int, []string)) {
19}
20
21fn high_fn_return_single_anon() fn (int) f32 {
22 _ = 1
23 correct := fn (n int) f32 {
24 return f32(n * n)
25 }
26 return correct
27}
28
29fn high_fn_return_multi_anons() (fn (int) f32, fn (int) string) {
30 // parsing trap
31 _ = fn (n int) u8 {
32 return 0x00
33 }
34 correct_second := fn (n int) string {
35 return '${n}'
36 }
37 correct_first := fn (n int) f32 {
38 return f32(n * n)
39 }
40 // parsing trap
41 _ = fn (n int) []int {
42 return [n]
43 }
44 return correct_first, correct_second
45}
46
47fn high_fn_return_named_fn() fn (int) int {
48 return sqr
49}
50
51fn test_high_fn_ret_anons() {
52 param := 13
53 func_sqr1 := high_fn_return_single_anon()
54 assert func_sqr1(param) == param * param
55
56 func_sqr2, func_repr := high_fn_return_multi_anons()
57 assert func_sqr2(param) == (param * param)
58 assert func_repr(param) == '${param}'
59
60 top_lvl_sqr := high_fn_return_named_fn()
61 assert top_lvl_sqr(param) == param * param
62}
63
64fn high_fn_applier(arg int, func fn (a int) string) string {
65 return func(arg)
66}
67
68fn test_high_fn_applier() {
69 arg := 13
70 expect := '${arg} ${arg}'
71 func := fn (arg int) string {
72 return '${arg} ${arg}'
73 }
74 assert expect == high_fn_applier(arg, func)
75}
76
77fn test_fns() {
78 // no asserts for now, just test function declarations above
79 high_fn(sqr)
80}
81
82fn test_anon_fn() {
83 f1 := fn (a int) {
84 println('hello from f1')
85 }
86 f1(1)
87
88 f2 := fn (a int) int {
89 println('hello from f2')
90 return 10
91 }
92 f2res := f2(1)
93 println('f2res == ${f2res}')
94 // TODO/FIXME: assert bug? uncomment to see
95 // assert f2res == 10
96
97 high_fn(fn (x int) int {
98 return x + 1
99 })
100
101 high_fn_no_ret(fn (x int) {
102 println('hello ${x}')
103 })
104}
105
106fn test_anon_fn_direct_call() {
107 fn (name string) {
108 println('hello ${name}')
109 }('from anon')
110
111 b := fn (n int) int {
112 return 11 + n
113 }(100)
114 assert b == 111
115}
116
117//
118// Test assigning functions (IdentFn)
119//
120
121fn simple_fn1() int {
122 return 1
123}
124
125fn simple_fn2(n f32) (int, string) {
126 return int(1 + n), 'fish'
127}
128
129fn test_assigning_fns() {
130 func1 := simple_fn1
131 assert func1() == 1
132
133 func2 := simple_fn2
134 res2_1, res2_2 := func2(13.0)
135 assert res2_1 == 14.0
136 assert res2_2 == 'fish'
137
138 anon_func1 := fn (s string) int {
139 return s.len
140 }
141 func3 := anon_func1
142 res3 := func3('fish')
143 assert res3 == 4
144}
145
146//
147// End assigning functions (IdentFn)
148//
149