aboutsummaryrefslogtreecommitdiff
path: root/v_windows/v/vlib/v/tests/fn_high_test.v
blob: e172c7a211498e5cd382b8b819ec70775cead763 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
// helper
fn sqr(x int) int {
	return x * x
}

fn high_fn(f fn (int) int) {
	x := f(111)
	println('x == $x')
}

fn high_fn_no_ret(f fn (int)) {
	f(111)
}

fn high_fn_array(f fn (a []int) []int) {
}

fn high_fn_multi_return(a int, b fn (c []int, d []string) ([]int, []string)) {
}

fn high_fn_return_single_anon() fn (int) f32 {
	_ = 1
	correct := fn (n int) f32 {
		return f32(n * n)
	}
	return correct
}

fn high_fn_return_multi_anons() (fn (int) f32, fn (int) string) {
	// parsing trap
	_ = fn (n int) byte {
		return 0x00
	}
	correct_second := fn (n int) string {
		return '$n'
	}
	correct_first := fn (n int) f32 {
		return f32(n * n)
	}
	// parsing trap
	_ = fn (n int) []int {
		return [n]
	}
	return correct_first, correct_second
}

fn high_fn_return_named_fn() fn (int) int {
	return sqr
}

fn test_high_fn_ret_anons() {
	param := 13
	func_sqr1 := high_fn_return_single_anon()
	assert func_sqr1(param) == param * param

	func_sqr2, func_repr := high_fn_return_multi_anons()
	assert func_sqr2(param) == (param * param)
	assert func_repr(param) == '$param'

	top_lvl_sqr := high_fn_return_named_fn()
	assert top_lvl_sqr(param) == param * param
}

fn high_fn_applier(arg int, func fn (a int) string) string {
	return func(arg)
}

fn test_high_fn_applier() {
	arg := 13
	expect := '$arg $arg'
	func := fn (arg int) string {
		return '$arg $arg'
	}
	assert expect == high_fn_applier(arg, func)
}

fn test_fns() {
	// no asserts for now, just test function declarations above
	high_fn(sqr)
}

fn test_anon_fn() {
	f1 := fn (a int) {
		println('hello from f1')
	}
	f1(1)

	f2 := fn (a int) int {
		println('hello from f2')
		return 10
	}
	f2res := f2(1)
	println('f2res == $f2res')
	// TODO/FIXME: assert bug? uncomment to see
	// assert f2res == 10

	high_fn(fn (x int) int {
		return x + 1
	})

	high_fn_no_ret(fn (x int) {
		println('hello $x')
	})
}

fn test_anon_fn_direct_call() {
	fn (name string) {
		println('hello $name')
	}('from anon')

	b := fn (n int) int {
		return 11 + n
	}(100)
	assert b == 111
}

//
// Test assigning functions (IdentFn)
//

fn simple_fn1() int {
	return 1
}

fn simple_fn2(n f32) (int, string) {
	return int(1 + n), 'fish'
}

fn test_assigning_fns() {
	func1 := simple_fn1
	assert func1() == 1

	func2 := simple_fn2
	res2_1, res2_2 := func2(13.0)
	assert res2_1 == 14.0
	assert res2_2 == 'fish'

	anon_func1 := fn (s string) int {
		return s.len
	}
	func3 := anon_func1
	res3 := func3('fish')
	assert res3 == 4
}

//
// End assigning functions (IdentFn)
//