@@ -237,4 +237,99 @@ SCENARIO(
237
237
}
238
238
}
239
239
}
240
+ GIVEN (" A class with multiple bounds" )
241
+ {
242
+ THEN (" The bounds should be encoded" )
243
+ {
244
+ REQUIRE (
245
+ new_symbol_table.has_symbol (" java::generics$double_bound_element" ));
246
+ THEN (" The symbol should have a generic parameter" )
247
+ {
248
+ const symbolt &class_symbol=
249
+ new_symbol_table.lookup (" java::generics$double_bound_element" );
250
+ const typet &symbol_type=class_symbol.type ;
251
+
252
+ REQUIRE (symbol_type.id ()==ID_struct);
253
+ class_typet class_type=to_class_type (symbol_type);
254
+ REQUIRE (class_type.is_class ());
255
+ java_class_typet java_class_type=to_java_class_type (class_type);
256
+ REQUIRE (is_java_generics_class_type (java_class_type));
257
+
258
+ java_generics_class_typet java_generics_class_type=
259
+ to_java_generics_class_type (java_class_type);
260
+ REQUIRE (java_generics_class_type.generic_types ().size ()==1 );
261
+ typet &type_var=java_generics_class_type.generic_types ().front ();
262
+ REQUIRE (is_java_generic_parameter (type_var));
263
+ java_generic_parametert generic_type_var=
264
+ to_java_generic_parameter (type_var);
265
+
266
+ REQUIRE (
267
+ generic_type_var.type_variable ().get_identifier ()==
268
+ " java::generics$double_bound_element::T" );
269
+ REQUIRE (
270
+ java_generics_class_type_var (0 , java_generics_class_type)==
271
+ " java::generics$double_bound_element::T" );
272
+ THEN (" Bound must be Number and dummyInterface" )
273
+ {
274
+ // TODO (tkiley): Extend this unit test when bounds are correctly
275
+ // parsed.
276
+ }
277
+ }
278
+ }
279
+ }
280
+ GIVEN (" A class with multiple generic parameters" )
281
+ {
282
+ THEN (" Both generic parameters should be encoded" )
283
+ {
284
+ const symbolt &class_symbol=
285
+ new_symbol_table.lookup (" java::generics$two_elements" );
286
+ const typet &symbol_type=class_symbol.type ;
287
+
288
+ REQUIRE (symbol_type.id ()==ID_struct);
289
+ class_typet class_type=to_class_type (symbol_type);
290
+ REQUIRE (class_type.is_class ());
291
+ java_class_typet java_class_type=to_java_class_type (class_type);
292
+ REQUIRE (is_java_generics_class_type (java_class_type));
293
+
294
+ java_generics_class_typet java_generics_class_type=
295
+ to_java_generics_class_type (java_class_type);
296
+ // REQUIRE(java_generics_class_type.generic_types().size()==2);
297
+
298
+ auto generic_param_iterator=
299
+ java_generics_class_type.generic_types ().cbegin ();
300
+
301
+ // The first parameter should be called K
302
+ {
303
+ const typet &first_param=*generic_param_iterator;
304
+ REQUIRE (is_java_generic_parameter (first_param));
305
+ java_generic_parametert generic_type_var=
306
+ to_java_generic_parameter (first_param);
307
+
308
+ REQUIRE (
309
+ generic_type_var.type_variable ().get_identifier ()==
310
+ " java::generics$two_elements::K" );
311
+ REQUIRE (
312
+ java_generics_class_type_var (0 , java_generics_class_type)==
313
+ " java::generics$two_elements::K" );
314
+ }
315
+
316
+ ++generic_param_iterator;
317
+
318
+
319
+ // The second parameter should be called V
320
+ {
321
+ const typet &second_param=*generic_param_iterator;
322
+ REQUIRE (is_java_generic_parameter (second_param));
323
+ java_generic_parametert generic_type_var=
324
+ to_java_generic_parameter (second_param);
325
+
326
+ REQUIRE (
327
+ generic_type_var.type_variable ().get_identifier ()==
328
+ " java::generics$two_elements::V" );
329
+ REQUIRE (
330
+ java_generics_class_type_var (0 , java_generics_class_type)==
331
+ " java::generics$two_elements::V" );
332
+ }
333
+ }
334
+ }
240
335
}
0 commit comments