vxx / vlib / v / tests / generics / generic_fn_value_inference_test.v
68 lines · 52 sloc · 1.69 KB · dd68cb18c734f9a8894bad8bfc76cfca675a8d51
Raw
1import math
2
3fn apply_f64(value f64, f fn (f64) f64) f64 {
4 return f(value)
5}
6
7fn test_generic_fn_value_is_inferred_from_expected_fn_type() {
8 assert apply_f64(-1.25, math.abs) == 1.25
9}
10
11struct GenericFnArgFoo {}
12
13fn generic_fn_arg_handler[T](x T) int {
14 _ := x
15 return 41
16}
17
18fn generic_fn_arg_run[T](h fn (T) int) int {
19 return h(T{}) + 1
20}
21
22fn test_generic_fn_value_is_monomorphized_from_generic_call_arg() {
23 assert generic_fn_arg_run[GenericFnArgFoo](generic_fn_arg_handler) == 42
24}
25
26struct GenericFnArgRunner {}
27
28fn (r GenericFnArgRunner) run[T](h fn (T) int) int {
29 _ := r
30 return h(T{}) + 1
31}
32
33fn test_generic_fn_value_is_monomorphized_from_generic_method_call_arg() {
34 assert GenericFnArgRunner{}.run[GenericFnArgFoo](generic_fn_arg_handler) == 42
35}
36
37fn generic_fn_arg_named_handler[U](x U) int {
38 _ := x
39 return 41
40}
41
42fn (r GenericFnArgRunner) run_inferred[T](x T, h fn (T) int) int {
43 _ := r
44 return h(x) + 1
45}
46
47fn test_generic_fn_value_is_monomorphized_from_inferred_generic_method_call_arg() {
48 assert GenericFnArgRunner{}.run_inferred(GenericFnArgFoo{}, generic_fn_arg_named_handler) == 42
49}
50
51fn (r GenericFnArgRunner) run_variadic[T](handlers ...fn (T) int) int {
52 _ := r
53 return handlers[0](T{}) + 1
54}
55
56fn test_generic_fn_value_is_monomorphized_from_variadic_generic_method_call_arg() {
57 assert GenericFnArgRunner{}.run_variadic[GenericFnArgFoo](generic_fn_arg_named_handler) == 42
58}
59
60fn (r GenericFnArgRunner) run_variadic_inferred[T](x T, handlers ...fn (T) int) int {
61 _ := r
62 return handlers[0](x) + 1
63}
64
65fn test_generic_fn_value_is_monomorphized_from_inferred_variadic_generic_method_call_arg() {
66 assert GenericFnArgRunner{}.run_variadic_inferred(GenericFnArgFoo{},
67 generic_fn_arg_named_handler) == 42
68}
69