13
13
#include < testing-utils/require_type.h>
14
14
#include < testing-utils/run_test_with_compilers.h>
15
15
#include < testing-utils/require_symbol.h>
16
+ #include < util/expr_iterator.h>
16
17
17
18
struct lambda_assignment_test_datat
18
19
{
19
20
std::regex lambda_variable_id;
20
21
irep_idt lambda_interface;
21
22
std::string lambda_interface_method_descriptor;
22
23
irep_idt lambda_function_id;
24
+
25
+ std::vector<exprt> expected_params;
23
26
};
24
27
25
28
void validate_lamdba_assignement (
@@ -84,8 +87,29 @@ void validate_lamdba_assignement(
84
87
const std::vector<codet> &assignments =
85
88
require_goto_statements::get_all_statements (method_symbol.value );
86
89
87
- require_goto_statements::require_function_call (
88
- assignments, test_data.lambda_function_id );
90
+ code_function_callt function_call =
91
+ require_goto_statements::require_function_call (
92
+ assignments, test_data.lambda_function_id );
93
+
94
+ std::string variable_prefix = id2string (method_identifier) + " ::" ;
95
+ // replace all symbol exprs with a prefixed symbol expr
96
+ std::vector<exprt> expected_args = test_data.expected_params ;
97
+ for (exprt &arg : expected_args)
98
+ {
99
+ for (auto it = arg.depth_begin (); it != arg.depth_end (); ++it)
100
+ {
101
+ if (it->id () == ID_symbol)
102
+ {
103
+ symbol_exprt &symbol_expr = to_symbol_expr (it.mutate ());
104
+ const irep_idt simple_id = symbol_expr.get_identifier ();
105
+ symbol_expr.set_identifier (variable_prefix + id2string (simple_id));
106
+ }
107
+ }
108
+ }
109
+
110
+ REQUIRE_THAT (
111
+ function_call.arguments (),
112
+ Catch::Matchers::Vector::EqualsMatcher<exprt>{expected_args});
89
113
}
90
114
}
91
115
@@ -125,6 +149,7 @@ SCENARIO(
125
149
test_data.lambda_interface = " java::SimpleLambda" ;
126
150
test_data.lambda_interface_method_descriptor = " .Execute:()V" ;
127
151
test_data.lambda_function_id = " java::LocalLambdas.pretendLambda:()V" ;
152
+ test_data.expected_params = {};
128
153
validate_lamdba_assignement (symbol_table, instructions, test_data);
129
154
}
130
155
THEN (
@@ -141,6 +166,15 @@ SCENARIO(
141
166
test_data.lambda_function_id =
142
167
" java::LocalLambdas.lambda$test$1:(ILjava/lang/"
143
168
" Object;LDummyGeneric;)V" ;
169
+
170
+ symbol_exprt integer_param{" primitive" , java_int_type ()};
171
+ symbol_exprt ref_param{" reference" ,
172
+ java_type_from_string (" Ljava/lang/Object;" )};
173
+ symbol_exprt generic_param{
174
+ " specalisedGeneric" ,
175
+ java_type_from_string (" LDummyGeneric<Ljava/lang/Interger;>;" )};
176
+ test_data.expected_params = {integer_param, ref_param, generic_param};
177
+
144
178
validate_lamdba_assignement (symbol_table, instructions, test_data);
145
179
}
146
180
THEN (
@@ -158,6 +192,15 @@ SCENARIO(
158
192
test_data.lambda_function_id =
159
193
" java::LocalLambdas.lambda$test$2:"
160
194
" ([I[Ljava/lang/Object;[LDummyGeneric;)V" ;
195
+
196
+ symbol_exprt integer_param{" primitive" , java_type_from_string (" [I" )};
197
+ symbol_exprt ref_param{" reference" ,
198
+ java_type_from_string (" [Ljava/lang/Object;" )};
199
+ symbol_exprt generic_param{
200
+ " specalisedGeneric" ,
201
+ java_type_from_string (" [LDummyGeneric<Ljava/lang/Interger;>;" )};
202
+ test_data.expected_params = {integer_param, ref_param, generic_param};
203
+
161
204
validate_lamdba_assignement (symbol_table, instructions, test_data);
162
205
}
163
206
}
0 commit comments