@@ -237,4 +237,99 @@ SCENARIO(
237237 }
238238 }
239239 }
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+ }
240335}
0 commit comments