Skip to content

Commit ccdd483

Browse files
author
Thomas Kiley
authored
Merge pull request diffblue#1545 from chrisr-diffblue/TG-1158/unit-test-for-specialising-with-array-types
TG-1158: Add a unit test for specialising Java generic types with array types
2 parents 73808aa + 98de899 commit ccdd483

File tree

4 files changed

+74
-1
lines changed

4 files changed

+74
-1
lines changed

unit/java_bytecode/generate_concrete_generic_type/generate_java_generic_type.cpp

Lines changed: 63 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@
1313
#include <util/symbol_table.h>
1414

1515
#include <java_bytecode/generate_java_generic_type.h>
16-
16+
#include <testing-utils/require_type.h>
17+
#include <util/ui_message.h>
1718

1819
SCENARIO(
1920
"generate_java_generic_type_from_file",
@@ -160,3 +161,64 @@ SCENARIO(
160161
"java::java.lang.Integer");
161162
}
162163
}
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+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
public class generic_field_array_instantiation {
2+
3+
class generic<T> {
4+
T gf;
5+
}
6+
7+
generic<Float []> f;
8+
Float [] af;
9+
}
10+
11+

0 commit comments

Comments
 (0)