@@ -45,7 +45,17 @@ SCENARIO(
4545 require_type::require_pointer (
4646 field_component.type (), symbol_typet (" java::GenericClass$InnerClass" ));
4747
48- // TODO: then the generic type should be correctly stored
48+ THEN (" The pointer should be generic" )
49+ {
50+ REQUIRE (is_java_generic_type (field_component.type ()));
51+ const auto &generic_variables =
52+ to_java_generic_type (field_component.type ()).generic_type_variables ();
53+ REQUIRE (generic_variables.size () == 1 );
54+ const java_generic_parametert &generic_param = generic_variables[0 ];
55+ REQUIRE (
56+ generic_param.type_variable () ==
57+ symbol_typet (" java::GenericClass::T" ));
58+ }
4959 }
5060
5161 THEN (" The field component should be a pointer to GenericClass$InnerClass" )
@@ -57,48 +67,63 @@ SCENARIO(
5767 field_component.type (),
5868 symbol_typet (" java::GenericClass$GenericInnerClass" ));
5969
60- // TODO: then the generic type should be correctly stored
70+ THEN (" The pointer should be generic" )
71+ {
72+ REQUIRE (is_java_generic_type (field_component.type ()));
73+ const auto &generic_variables =
74+ to_java_generic_type (field_component.type ()).generic_type_variables ();
75+ REQUIRE (generic_variables.size () == 2 );
76+ {
77+ const java_generic_parametert &generic_param = generic_variables[0 ];
78+ REQUIRE (is_java_generic_parameter (generic_param));
79+ REQUIRE (
80+ generic_param.type_variable () ==
81+ symbol_typet (" java::GenericClass::T" ));
82+ }
83+ {
84+ const java_generic_parametert &generic_param = generic_variables[1 ];
85+ REQUIRE (is_java_generic_inst_parameter (generic_param));
86+ REQUIRE (
87+ generic_param ==
88+ java_generic_inst_parametert (symbol_typet (" java::Foo" )));
89+ }
90+ }
6191 }
6292
6393 THEN (" The field component should be a pointer to GenericClass$InnerClass" )
6494 {
6595 const struct_typet::componentt &field_component =
6696 require_type::require_component (class_type, " field3" );
6797
68- require_type::require_pointer (
69- field_component.type (),
70- symbol_typet (" java::GenericClass$SameGenericParamInnerClass" ));
71-
72- // TODO: then the generic type should be correctly stored
73- }
74-
75- THEN (" The field component should be a pointer to GenericClass$InnerClass" )
76- {
77- const struct_typet::componentt &field_component =
78- require_type::require_component (class_type, " field4" );
79-
8098 require_type::require_pointer (
8199 field_component.type (),
82100 symbol_typet (" java::GenericClass$GenericInnerClass" ));
83101
84- // TODO: then the generic type should be correctly stored
85- }
86- THEN (" The field component should be a pointer to GenericClass$InnerClass" )
87- {
88- const struct_typet::componentt &field_component =
89- require_type::require_component (class_type, " field5" );
90-
91- require_type::require_pointer (
92- field_component.type (),
93- symbol_typet (" java::GenericClass$SameGenericParamInnerClass" ));
94-
95- // TODO: then the generic type should be correctly stored
102+ THEN (" The pointer should be generic" )
103+ {
104+ REQUIRE (is_java_generic_type (field_component.type ()));
105+ const auto &generic_variables =
106+ to_java_generic_type (field_component.type ()).generic_type_variables ();
107+ REQUIRE (generic_variables.size () == 2 );
108+ {
109+ const java_generic_parametert &generic_param = generic_variables[0 ];
110+ REQUIRE (is_java_generic_parameter (generic_param));
111+ REQUIRE (
112+ generic_param.type_variable () ==
113+ symbol_typet (" java::GenericClass::T" ));
114+ }
115+ {
116+ const java_generic_parametert &generic_param = generic_variables[1 ];
117+ REQUIRE (is_java_generic_parameter (generic_param));
118+ REQUIRE (
119+ generic_param.type_variable () ==
120+ symbol_typet (" java::GenericClass::T" ));
121+ }
122+ }
96123 }
97124 }
98125
99- THEN (" There should be a symbol for the generic inner class" )
100- {
101- }
126+ // TODO: add fields of doubly nested generic classes
102127}
103128
104129SCENARIO (
@@ -254,6 +279,28 @@ SCENARIO(
254279 require_type::require_parameter (function_call, " input" );
255280 require_type::require_pointer (
256281 param_type.type (), symbol_typet (" java::GenericClass$GenericInnerClass" ));
282+
283+ THEN (" The pointer should be generic" )
284+ {
285+ REQUIRE (is_java_generic_type (param_type.type ()));
286+ const auto &generic_variables =
287+ to_java_generic_type (param_type.type ()).generic_type_variables ();
288+ REQUIRE (generic_variables.size () == 2 );
289+ {
290+ const java_generic_parametert &generic_param = generic_variables[0 ];
291+ REQUIRE (is_java_generic_parameter (generic_param));
292+ REQUIRE (
293+ generic_param.type_variable () ==
294+ symbol_typet (" java::GenericClass::T" ));
295+ }
296+ {
297+ const java_generic_parametert &generic_param = generic_variables[1 ];
298+ REQUIRE (is_java_generic_parameter (generic_param));
299+ REQUIRE (
300+ generic_param.type_variable () ==
301+ symbol_typet (" java::GenericClass::T" ));
302+ }
303+ }
257304 }
258305 THEN (" Method 5 should return a GenericClass$InnerClass" )
259306 {
@@ -272,8 +319,20 @@ SCENARIO(
272319 require_type::require_pointer (
273320 function_call.return_type (),
274321 symbol_typet (" java::GenericClass$InnerClass" ));
322+
323+ THEN (" The pointer should be generic" )
324+ {
325+ REQUIRE (is_java_generic_type (function_call.return_type ()));
326+ const auto &generic_variables =
327+ to_java_generic_type (function_call.return_type ())
328+ .generic_type_variables ();
329+ REQUIRE (generic_variables.size () == 1 );
330+ const java_generic_parametert &generic_param = generic_variables[0 ];
331+ REQUIRE (
332+ generic_param.type_variable () == symbol_typet (" java::GenericClass::T" ));
333+ }
275334 }
276- THEN (" Method 6 should return a GenericClass$InnerClass " )
335+ THEN (" Method 6 should return a GenericClass$GenericInnerClass " )
277336 {
278337 const std::string func_name = " .method6" ;
279338 const std::string func_descriptor = " :()LGenericClass$GenericInnerClass;" ;
@@ -290,8 +349,31 @@ SCENARIO(
290349 require_type::require_pointer (
291350 function_call.return_type (),
292351 symbol_typet (" java::GenericClass$GenericInnerClass" ));
352+
353+ THEN (" The pointer should be generic" )
354+ {
355+ REQUIRE (is_java_generic_type (function_call.return_type ()));
356+ const auto &generic_variables =
357+ to_java_generic_type (function_call.return_type ())
358+ .generic_type_variables ();
359+ REQUIRE (generic_variables.size () == 2 );
360+ {
361+ const java_generic_parametert &generic_param = generic_variables[0 ];
362+ REQUIRE (is_java_generic_parameter (generic_param));
363+ REQUIRE (
364+ generic_param.type_variable () ==
365+ symbol_typet (" java::GenericClass::T" ));
366+ }
367+ {
368+ const java_generic_parametert &generic_param = generic_variables[1 ];
369+ REQUIRE (is_java_generic_inst_parameter (generic_param));
370+ REQUIRE (
371+ generic_param ==
372+ java_generic_inst_parametert (symbol_typet (" java::Foo" )));
373+ }
374+ }
293375 }
294- THEN (" Method 7 should return a GenericClass$InnerClass " )
376+ THEN (" Method 7 should return a GenericClass$GenericInnerClass " )
295377 {
296378 const std::string func_name = " .method7" ;
297379 const std::string func_descriptor = " :()LGenericClass$GenericInnerClass;" ;
@@ -308,5 +390,28 @@ SCENARIO(
308390 require_type::require_pointer (
309391 function_call.return_type (),
310392 symbol_typet (" java::GenericClass$GenericInnerClass" ));
393+
394+ THEN (" The pointer should be generic" )
395+ {
396+ REQUIRE (is_java_generic_type (function_call.return_type ()));
397+ const auto &generic_variables =
398+ to_java_generic_type (function_call.return_type ())
399+ .generic_type_variables ();
400+ REQUIRE (generic_variables.size () == 2 );
401+ {
402+ const java_generic_parametert &generic_param = generic_variables[0 ];
403+ REQUIRE (is_java_generic_parameter (generic_param));
404+ REQUIRE (
405+ generic_param.type_variable () ==
406+ symbol_typet (" java::GenericClass::T" ));
407+ }
408+ {
409+ const java_generic_parametert &generic_param = generic_variables[1 ];
410+ REQUIRE (is_java_generic_parameter (generic_param));
411+ REQUIRE (
412+ generic_param.type_variable () ==
413+ symbol_typet (" java::GenericClass::T" ));
414+ }
415+ }
311416 }
312417}
0 commit comments