@@ -22,10 +22,13 @@ const PROCEDURE_NAME_RU: &str = "Процедура";
2222const OUT_FUNCTION_NAME_EN : & str = "OutFunction" ;
2323const OUT_FUNCTION_NAME_RU : & str = "ВыводФункция" ;
2424
25+ const ANY_ARG_NAME_EN : & str = "AnyArg" ;
26+ const ANY_ARG_NAME_RU : & str = "ЛюбойАргумент" ;
27+
2528const INVALID_NAME : & str = "Invalid" ;
2629
2730#[ derive( AddIn ) ]
28- struct TestAddIn {
31+ struct TestAddInFixture {
2932 #[ add_in_con]
3033 connection : Arc < Option < & ' static Connection > > ,
3134
@@ -45,11 +48,16 @@ struct TestAddIn {
4548 #[ add_in_func( name = OUT_FUNCTION_NAME_EN , name_ru = OUT_FUNCTION_NAME_RU ) ]
4649 #[ arg( ty = Str , as_out, default = OUT_STR ) ]
4750 pub out_function : fn ( & mut String ) ,
51+
52+ #[ add_in_func( name = ANY_ARG_NAME_EN , name_ru = ANY_ARG_NAME_RU ) ]
53+ #[ arg( ty = Any ) ]
54+ #[ returns( ty = Any ) ]
55+ pub any_arg_func : fn ( & Self , ParamValue ) -> ParamValue ,
4856}
4957
5058#[ fixture]
51- fn add_in ( ) -> TestAddIn {
52- TestAddIn {
59+ fn add_in ( ) -> TestAddInFixture {
60+ TestAddInFixture {
5361 connection : Arc :: new ( None ) ,
5462 storage : 0 ,
5563 function : |addin, a, b| Ok ( a + b + addin. storage ) ,
@@ -59,12 +67,13 @@ fn add_in() -> TestAddIn {
5967 out_function : |out_str| {
6068 * out_str = format ! ( "Hello, {out_str}!" ) ;
6169 } ,
70+ any_arg_func : |_, arg| arg,
6271 }
6372}
6473
6574#[ rstest]
66- fn test_get_n_methods ( add_in : TestAddIn ) {
67- assert_eq ! ( add_in. get_n_methods( ) , 3 )
75+ fn test_get_n_methods ( add_in : TestAddInFixture ) {
76+ assert_eq ! ( add_in. get_n_methods( ) , 4 )
6877}
6978
7079#[ rstest]
@@ -75,7 +84,7 @@ fn test_get_n_methods(add_in: TestAddIn) {
7584#[ case( OUT_FUNCTION_NAME_EN , Some ( 2 ) ) ]
7685#[ case( OUT_FUNCTION_NAME_RU , Some ( 2 ) ) ]
7786#[ case( INVALID_NAME , None ) ]
78- fn test_find_method ( add_in : TestAddIn , #[ case] name : & str , #[ case] expected : Option < usize > ) {
87+ fn test_find_method ( add_in : TestAddInFixture , #[ case] name : & str , #[ case] expected : Option < usize > ) {
7988 use native_api_1c:: native_api_1c_core:: ffi:: string_utils:: os_string_nil;
8089
8190 assert_eq ! ( add_in. find_method( & os_string_nil( name) ) , expected) ;
@@ -91,9 +100,9 @@ fn test_find_method(add_in: TestAddIn, #[case] name: &str, #[case] expected: Opt
91100#[ case( 2 , 0 , Some ( OUT_FUNCTION_NAME_EN ) ) ]
92101#[ case( 2 , 1 , Some ( OUT_FUNCTION_NAME_RU ) ) ]
93102#[ case( 2 , 42 , Some ( OUT_FUNCTION_NAME_RU ) ) ]
94- #[ case( 3 , 0 , None ) ]
103+ #[ case( 42 , 0 , None ) ]
95104fn test_get_method_name (
96- add_in : TestAddIn ,
105+ add_in : TestAddInFixture ,
97106 #[ case] method_i : usize ,
98107 #[ case] alias_i : usize ,
99108 #[ case] expected : Option < & str > ,
@@ -110,8 +119,9 @@ fn test_get_method_name(
110119#[ case( 0 , 2 ) ]
111120#[ case( 1 , 2 ) ]
112121#[ case( 2 , 1 ) ]
113- #[ case( 3 , 0 ) ]
114- fn test_get_n_params ( add_in : TestAddIn , #[ case] method_i : usize , #[ case] n_params : usize ) {
122+ #[ case( 3 , 1 ) ]
123+ #[ case( 42 , 0 ) ]
124+ fn test_get_n_params ( add_in : TestAddInFixture , #[ case] method_i : usize , #[ case] n_params : usize ) {
115125 assert_eq ! ( add_in. get_n_params( method_i) , n_params) ;
116126}
117127
@@ -126,7 +136,7 @@ fn test_get_n_params(add_in: TestAddIn, #[case] method_i: usize, #[case] n_param
126136#[ case( 2 , 42 , None ) ]
127137#[ case( 3 , 0 , None ) ]
128138fn test_get_param_def_value (
129- add_in : TestAddIn ,
139+ add_in : TestAddInFixture ,
130140 #[ case] method_i : usize ,
131141 #[ case] param_i : usize ,
132142 #[ case] expected : Option < ParamValue > ,
@@ -138,13 +148,14 @@ fn test_get_param_def_value(
138148#[ case( 0 , true ) ]
139149#[ case( 1 , false ) ]
140150#[ case( 2 , false ) ]
141- #[ case( 3 , false ) ]
142- fn test_has_ret_val ( add_in : TestAddIn , #[ case] method_i : usize , #[ case] has_ret_val : bool ) {
151+ #[ case( 3 , true ) ]
152+ #[ case( 42 , false ) ]
153+ fn test_has_ret_val ( add_in : TestAddInFixture , #[ case] method_i : usize , #[ case] has_ret_val : bool ) {
143154 assert_eq ! ( add_in. has_ret_val( method_i) , has_ret_val) ;
144155}
145156
146157#[ rstest]
147- fn test_call_function ( mut add_in : TestAddIn ) {
158+ fn test_call_function ( mut add_in : TestAddInFixture ) {
148159 let a = ParamValue :: I32 ( 1 ) ;
149160 let b = ParamValue :: I32 ( 2 ) ;
150161 let mut params = ParamValues :: new ( vec ! [ a, b] ) ;
@@ -158,7 +169,7 @@ fn test_call_function(mut add_in: TestAddIn) {
158169}
159170
160171#[ rstest]
161- fn test_call_procedure ( mut add_in : TestAddIn ) {
172+ fn test_call_procedure ( mut add_in : TestAddInFixture ) {
162173 let a = ParamValue :: I32 ( 1 ) ;
163174 let b = ParamValue :: I32 ( 2 ) ;
164175 let mut params = ParamValues :: new ( vec ! [ a, b] ) ;
@@ -172,7 +183,7 @@ fn test_call_procedure(mut add_in: TestAddIn) {
172183}
173184
174185#[ rstest]
175- fn test_call_out_function ( mut add_in : TestAddIn ) {
186+ fn test_call_out_function ( mut add_in : TestAddInFixture ) {
176187 let out_str = os_string ( "1C" ) ;
177188 let mut params = ParamValues :: new ( vec ! [ ParamValue :: String ( out_str) ] ) ;
178189
@@ -183,3 +194,16 @@ fn test_call_out_function(mut add_in: TestAddIn) {
183194 assert ! ( result. is_ok( ) ) ;
184195 assert_eq ! ( params[ 0 ] , ParamValue :: String ( os_string( "Hello, 1C!" ) ) ) ;
185196}
197+
198+ #[ rstest]
199+ #[ case( ParamValue :: I32 ( 42 ) ) ]
200+ #[ case( ParamValue :: String ( os_string( "Test" ) ) ) ]
201+ #[ case( ParamValue :: Bool ( true ) ) ]
202+ fn test_call_any_arg_function ( mut add_in : TestAddInFixture , #[ case] value : ParamValue ) {
203+ let params = ParamValues :: new ( vec ! [ value. clone( ) ] ) ;
204+ let func = add_in. find_method ( & os_string ( ANY_ARG_NAME_EN ) ) . unwrap ( ) ;
205+
206+ let result = add_in. call_as_func ( func, & mut params. clone ( ) ) ;
207+ assert ! ( result. is_ok( ) ) ;
208+ assert_eq ! ( result. unwrap( ) , value) ;
209+ }
0 commit comments