88
99#include < testing-utils/catch.hpp>
1010#include < testing-utils/load_java_class.h>
11- #include < testing-utils/require_symbol.h>
1211#include < testing-utils/require_type.h>
1312
14- #include < memory>
15-
1613#include < util/config.h>
1714#include < util/language.h>
1815#include < java_bytecode/java_bytecode_language.h>
@@ -28,36 +25,29 @@ SCENARIO(
2825 std::string class_prefix = " java::BoundedGenericInnerClasses" ;
2926 REQUIRE (new_symbol_table.has_symbol (class_prefix));
3027
28+ const symbolt &class_symbol = new_symbol_table.lookup_ref (class_prefix);
29+ const java_class_typet &java_class_type =
30+ require_type::require_java_non_generic_class (class_symbol.type );
31+
3132 WHEN (" Parsing an inner class with type variable" )
3233 {
3334 std::string inner_name = class_prefix + " $Inner" ;
3435 REQUIRE (new_symbol_table.has_symbol (inner_name));
3536 THEN (" The symbol type should be generic" )
3637 {
3738 const symbolt &class_symbol = new_symbol_table.lookup_ref (inner_name);
38- class_typet class_type =
39- require_symbol::require_complete_class (class_symbol);
40- java_generics_class_typet java_generics_class_type =
41- require_type::require_java_generic_class (class_type);
42-
43- const typet &elem_type =
44- to_java_class_type (class_type).component_type (" elem" );
45- REQUIRE (is_java_generic_parameter (elem_type));
39+ const java_generics_class_typet &java_generics_class_type =
40+ require_type::require_java_generic_class (
41+ class_symbol.type , {inner_name + " ::E" });
4642
47- REQUIRE (java_generics_class_type.generic_types ().size () == 1 );
48- THEN (" Type variable is named 'E'" )
43+ THEN (" The fields are of correct types" )
4944 {
50- typet &type_var = java_generics_class_type.generic_types ().front ();
51- REQUIRE (is_java_generic_parameter (type_var));
52- java_generic_parametert generic_type_var =
53- to_java_generic_parameter (type_var);
54- REQUIRE (
55- generic_type_var.type_variable ().get_identifier () ==
56- inner_name + " ::E" );
57- typet &sub_type = generic_type_var.subtype ();
58- REQUIRE (sub_type.id () == ID_symbol);
59- symbol_typet &bound_type = to_symbol_type (sub_type);
60- REQUIRE (bound_type.get_identifier () == " java::java.lang.Object" );
45+ const struct_union_typet::componentt &elem =
46+ require_type::require_component (
47+ to_struct_type (class_symbol.type ), " elem" );
48+ require_type::require_java_generic_parameter (
49+ elem.type (),
50+ {require_type::type_parameter_kindt::Var, inner_name + " ::E" });
6151 }
6252 }
6353 }
@@ -70,157 +60,98 @@ SCENARIO(
7060 {
7161 const symbolt &class_symbol =
7262 new_symbol_table.lookup_ref (boundedinner_name);
73- class_typet class_type =
74- require_symbol::require_complete_class (class_symbol);
75- java_generics_class_typet java_generics_class_type =
76- require_type::require_java_generic_class (class_type);
77-
78- REQUIRE (java_generics_class_type.generic_types ().size () == 1 );
79- typet &type_var = java_generics_class_type.generic_types ().front ();
80- REQUIRE (is_java_generic_parameter (type_var));
81- java_generic_parametert generic_type_var =
82- to_java_generic_parameter (type_var);
83-
84- REQUIRE (
85- generic_type_var.type_variable ().get_identifier () ==
86- boundedinner_name + " ::NUM" );
87- REQUIRE (
88- java_generics_class_type_var (0 , java_generics_class_type) ==
89- boundedinner_name + " ::NUM" );
90- THEN (" Bound must be Number" )
63+ const java_generics_class_typet &java_generics_class_type =
64+ require_type::require_java_generic_class (
65+ class_symbol.type , {boundedinner_name + " ::NUM" });
66+
67+ // TODO extend when bounds are parsed correctly - TG-1286
68+
69+ THEN (" The fields are of correct types" )
9170 {
92- typet &sub_type = generic_type_var.subtype ();
93- REQUIRE (sub_type.id () == ID_symbol);
94- symbol_typet &bound_type = to_symbol_type (sub_type);
95- REQUIRE (bound_type.get_identifier () == " java::java.lang.Number" );
96- REQUIRE (
97- to_symbol_type (
98- java_generics_class_type_bound (0 , java_generics_class_type))
99- .get_identifier () == " java::java.lang.Number" );
71+ const struct_union_typet::componentt &elem =
72+ require_type::require_component (
73+ to_struct_type (class_symbol.type ), " elem" );
74+ require_type::require_java_generic_parameter (
75+ elem.type (),
76+ {require_type::type_parameter_kindt::Var,
77+ boundedinner_name + " ::NUM" });
10078 }
101-
102- const typet &elem_type =
103- to_java_class_type (class_type).component_type (" elem" );
104- REQUIRE (is_java_generic_parameter (elem_type));
10579 }
10680 }
10781
10882 WHEN (" There is a generic field with a concrete type" )
10983 {
110- const symbolt &class_symbol = new_symbol_table.lookup_ref (class_prefix);
111- class_typet class_type =
112- require_symbol::require_complete_class (class_symbol);
113-
114- java_class_typet java_class_type = to_java_class_type (class_type);
115- REQUIRE (!is_java_generics_class_type (java_class_type));
116-
117- const typet &belem_type = java_class_type.component_type (" belem" );
118-
119- REQUIRE (belem_type != nil_typet ());
120- REQUIRE (is_java_generic_type (belem_type));
121- THEN (" Field has instantiated type variable" )
122- {
123- const java_generic_typet &container = to_java_generic_type (belem_type);
124-
125- const std::vector<java_generic_parametert> &generic_types =
126- container.generic_type_variables ();
127- REQUIRE (generic_types.size () == 1 );
128-
129- const typet &inst_type = java_generic_get_inst_type (0 , container);
130-
131- REQUIRE (inst_type.id () == ID_pointer);
132- const typet &inst_type_symbol = inst_type.subtype ();
133- REQUIRE (inst_type_symbol.id () == ID_symbol);
134- REQUIRE (
135- to_symbol_type (inst_type_symbol).get_identifier () ==
136- " java::java.lang.Integer" );
137- }
84+ const struct_union_typet::componentt &belem_type =
85+ require_type::require_component (
86+ to_struct_type (class_symbol.type ), " belem" );
87+ require_type::require_pointer (
88+ belem_type.type (), symbol_typet (class_prefix + " $BoundedInner" ));
89+ require_type::require_java_generic_type (
90+ belem_type.type (),
91+ {{require_type::type_parameter_kindt::Inst, " java::java.lang.Integer" }});
13892 }
13993
14094 WHEN (" Parsing an inner class with double bounded type variable" )
14195 {
14296 std::string doubleboundedinner_name = class_prefix + " $DoubleBoundedInner" ;
14397 REQUIRE (new_symbol_table.has_symbol (doubleboundedinner_name));
144- THEN (" The bounds should be encoded " )
98+ THEN (" The symbol type should be generic " )
14599 {
146100 const symbolt &class_symbol =
147101 new_symbol_table.lookup_ref (doubleboundedinner_name);
148- class_typet class_type =
149- require_symbol::require_complete_class (class_symbol);
150-
151- java_class_typet java_class_type = to_java_class_type (class_type);
152- REQUIRE_FALSE (is_java_generics_class_type (java_class_type));
153-
154- // TODO (tkiley): Extend this unit test when bounds are correctly
155- // parsed - issue TG-1286
156- #if 0
157- java_generics_class_typet java_generics_class_type=
158- to_java_generics_class_type(java_class_type);
159- REQUIRE(java_generics_class_type.generic_types().size()==1);
160- typet &type_var=java_generics_class_type.generic_types().front();
161- REQUIRE(is_java_generic_parameter(type_var));
162- java_generic_parametert generic_type_var=
163- to_java_generic_parameter(type_var);
164-
165- REQUIRE(
166- generic_type_var.type_variable().get_identifier()==
167- doubleboundedinner_name+"::T");
168- REQUIRE(
169- java_generics_class_type_var(0, java_generics_class_type)==
170- doubleboundedinner_name+"::T");
171- THEN("Bound must be Number and Interface")
172- {
102+ const java_generics_class_typet &java_generics_class_type =
103+ require_type::require_java_generic_class (
104+ class_symbol.type , {doubleboundedinner_name + " ::T" });
173105
106+ // TODO extend when bounds are parsed correctly - TG-1286
107+
108+ THEN (" The fields are of correct types" )
109+ {
110+ const struct_union_typet::componentt &elem =
111+ require_type::require_component (
112+ to_struct_type (class_symbol.type ), " elem" );
113+ require_type::require_java_generic_parameter (
114+ elem.type (),
115+ {require_type::type_parameter_kindt::Var,
116+ doubleboundedinner_name + " ::T" });
117+
118+ // TODO extend when bounds are parsed correctly - TG-1286
174119 }
175- #endif
176120 }
177121 }
178122
179123 GIVEN (" An inner class with multiple generic parameters" )
180124 {
181125 std::string twoelementinner_name = class_prefix + " $TwoElementInner" ;
182126 REQUIRE (new_symbol_table.has_symbol (twoelementinner_name));
183- THEN (" Both generic parameters should be encoded " )
127+ THEN (" The symbol type should be generic with two type variables " )
184128 {
185129 const symbolt &class_symbol =
186130 new_symbol_table.lookup_ref (twoelementinner_name);
187- class_typet class_type =
188- require_symbol::require_complete_class (class_symbol);
189- java_generics_class_typet java_generics_class_type =
190- require_type::require_java_generic_class (class_type);
191-
192- REQUIRE (java_generics_class_type.generic_types ().size () == 2 );
131+ const java_generics_class_typet &java_generics_class_type =
132+ require_type::require_java_generic_class (
133+ class_symbol.type ,
134+ {twoelementinner_name + " ::K" , twoelementinner_name + " ::V" });
193135
194- // The first parameter should be called K
195- {
196- const typet first_param =
197- java_generics_class_type.generic_types ().at (0 );
198- REQUIRE (is_java_generic_parameter (first_param));
199- java_generic_parametert generic_type_var =
200- to_java_generic_parameter (first_param);
201-
202- REQUIRE (
203- generic_type_var.type_variable ().get_identifier () ==
204- twoelementinner_name + " ::K" );
205- REQUIRE (
206- java_generics_class_type_var (0 , java_generics_class_type) ==
207- twoelementinner_name + " ::K" );
208- }
136+ // TODO extend when bounds are parsed correctly - TG-1286
209137
210- // The second parameter should be called V
138+ THEN ( " The fields are of correct types " )
211139 {
212- const typet &second_param =
213- java_generics_class_type.generic_types ().at (1 );
214- REQUIRE (is_java_generic_parameter (second_param));
215- java_generic_parametert generic_type_var =
216- to_java_generic_parameter (second_param);
217-
218- REQUIRE (
219- generic_type_var.type_variable ().get_identifier () ==
220- twoelementinner_name + " ::V" );
221- REQUIRE (
222- java_generics_class_type_var (1 , java_generics_class_type) ==
223- twoelementinner_name + " ::V" );
140+ const struct_union_typet::componentt &elemk =
141+ require_type::require_component (
142+ to_struct_type (class_symbol.type ), " k" );
143+ require_type::require_java_generic_parameter (
144+ elemk.type (),
145+ {require_type::type_parameter_kindt::Var,
146+ twoelementinner_name + " ::K" });
147+
148+ const struct_union_typet::componentt &elemv =
149+ require_type::require_component (
150+ to_struct_type (class_symbol.type ), " v" );
151+ require_type::require_java_generic_parameter (
152+ elemv.type (),
153+ {require_type::type_parameter_kindt::Var,
154+ twoelementinner_name + " ::V" });
224155 }
225156 }
226157 }
0 commit comments