v2 / vlib / v / tests / interface_string_ref_arg_test.v
106 lines · 87 sloc · 2.0 KB · e35a1b0e4642f4a8343a1dc22582321221564bee
Raw
1module main
2
3import arrays
4
5interface Value {}
6
7struct Params {
8 email string
9}
10
11fn generate_params(s string) []Value {
12 mut params := []Value{}
13 params = arrays.concat(params, s)
14 return params
15}
16
17fn generate_selector_params(p Params) []Value {
18 mut params := []Value{}
19 params = arrays.concat(params, p.email)
20 return params
21}
22
23fn generate_local_params() []Value {
24 s := '[email protected]'
25 mut params := []Value{}
26 params = arrays.concat(params, s)
27 return params
28}
29
30fn generate_local_selector_params() []Value {
31 p := Params{
32 email: '[email protected]'
33 }
34 mut params := []Value{}
35 params = arrays.concat(params, p.email)
36 return params
37}
38
39struct OptionalParams {
40 email ?string
41}
42
43fn generate_optional_params(p OptionalParams) []Value {
44 mut params := []Value{}
45 if email := p.email {
46 params = arrays.concat(params, email)
47 }
48 return params
49}
50
51struct Statement {
52}
53
54struct Tx {
55}
56
57fn (mut s Statement) execute(params ...Value) !string {
58 match params[0] {
59 string {
60 return params[0] as string
61 }
62 else {
63 return error(typeof(params[0]).name)
64 }
65 }
66}
67
68fn (mut t Tx) prepare() !&Statement {
69 return &Statement{}
70}
71
72fn (mut t Tx) execute(params ...Value) !string {
73 mut stmt := t.prepare()!
74 return stmt.execute(...params)!
75}
76
77fn test_interface_string_ref_arg() {
78 params := generate_params('any_string')
79 assert params == [Value('any_string')]
80}
81
82fn test_interface_string_ref_local() {
83 params := generate_local_params()
84 assert params == [Value('[email protected]')]
85}
86
87fn test_interface_string_ref_selector_arg() {
88 params := generate_selector_params(Params{
89 email: '[email protected]'
90 })
91 assert params == [Value('[email protected]')]
92}
93
94fn test_interface_string_ref_selector_local() {
95 params := generate_local_selector_params()
96 assert params == [Value('[email protected]')]
97}
98
99fn test_interface_string_ref_arg_from_option_unwrap_forwarded_through_variadic_call() {
100 params := generate_optional_params(OptionalParams{
101 email: '[email protected]'
102 })
103 mut tx := Tx{}
104 got := tx.execute(...params) or { panic(err) }
105 assert got == '[email protected]'
106}
107