|
13 | 13 | #include <util/symbol_table.h>
|
14 | 14 |
|
15 | 15 | #include <java_bytecode/generate_java_generic_type.h>
|
16 |
| - |
| 16 | +#include <testing-utils/require_type.h> |
| 17 | +#include <util/ui_message.h> |
17 | 18 |
|
18 | 19 | SCENARIO(
|
19 | 20 | "generate_java_generic_type_from_file",
|
@@ -160,3 +161,64 @@ SCENARIO(
|
160 | 161 | "java::java.lang.Integer");
|
161 | 162 | }
|
162 | 163 | }
|
| 164 | + |
| 165 | +SCENARIO( |
| 166 | + "generate_java_generic_type_with_array_concrete_type", |
| 167 | + "[core][java_bytecode][generate_java_generic_type]") |
| 168 | +{ |
| 169 | + // We have a 'harness' class who's only purpose is to contain a reference |
| 170 | + // to the generic class so that we can test the specialization of that generic |
| 171 | + // class |
| 172 | + const irep_idt harness_class= |
| 173 | + "java::generic_field_array_instantiation"; |
| 174 | + |
| 175 | + // We want to test that the specialized/instantiated class has it's field |
| 176 | + // type updated, so find the specialized class, not the generic class. |
| 177 | + const irep_idt test_class= |
| 178 | + "java::generic_field_array_instantiation$generic<java::array[reference]>"; |
| 179 | + |
| 180 | + GIVEN("A generic type instantiated with an array type") |
| 181 | + { |
| 182 | + symbol_tablet new_symbol_table= |
| 183 | + load_java_class( |
| 184 | + "generic_field_array_instantiation", |
| 185 | + "./java_bytecode/generate_concrete_generic_type"); |
| 186 | + |
| 187 | + // Ensure the class has been specialized |
| 188 | + REQUIRE(new_symbol_table.has_symbol(harness_class)); |
| 189 | + const symbolt &harness_symbol= |
| 190 | + new_symbol_table.lookup_ref(harness_class); |
| 191 | + |
| 192 | + const struct_typet::componentt &harness_component= |
| 193 | + require_type::require_component( |
| 194 | + to_struct_type(harness_symbol.type), |
| 195 | + "f"); |
| 196 | + |
| 197 | + ui_message_handlert message_handler; |
| 198 | + generate_java_generic_typet instantiate_generic_type(message_handler); |
| 199 | + instantiate_generic_type( |
| 200 | + to_java_generic_type(harness_component.type()), new_symbol_table); |
| 201 | + |
| 202 | + // Test the specialized class |
| 203 | + REQUIRE(new_symbol_table.has_symbol(test_class)); |
| 204 | + const symbolt test_class_symbol= |
| 205 | + new_symbol_table.lookup_ref(test_class); |
| 206 | + |
| 207 | + REQUIRE(test_class_symbol.type.id()==ID_struct); |
| 208 | + const struct_typet::componentt &field_component= |
| 209 | + require_type::require_component( |
| 210 | + to_struct_type(test_class_symbol.type), |
| 211 | + "gf"); |
| 212 | + const typet &test_field_type=field_component.type(); |
| 213 | + |
| 214 | + REQUIRE(test_field_type.id()==ID_pointer); |
| 215 | + REQUIRE(test_field_type.subtype().id()==ID_symbol); |
| 216 | + const symbol_typet test_field_array= |
| 217 | + to_symbol_type(test_field_type.subtype()); |
| 218 | + REQUIRE(test_field_array.get_identifier()=="java::array[reference]"); |
| 219 | + const pointer_typet &element_type= |
| 220 | + require_type::require_pointer( |
| 221 | + java_array_element_type(test_field_array), |
| 222 | + symbol_typet("java::java.lang.Float")); |
| 223 | + } |
| 224 | +} |
0 commit comments