Skip to content

Commit 2883bb1

Browse files
author
svorenova
committed
Extending test for generic arrays
1 parent de97e23 commit 2883bb1

File tree

3 files changed

+103
-22
lines changed

3 files changed

+103
-22
lines changed
Binary file not shown.
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
class GenericArray<T>
22
{
33
public T [] t;
4+
Generic<T>[] t2;
5+
Generic<Integer>[] t3;
46
}

unit/java_bytecode/java_bytecode_parse_generics/parse_generic_array_class.cpp

+101-22
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,8 @@
1515

1616
#include <java_bytecode/java_bytecode_language.h>
1717
#include <testing-utils/load_java_class.h>
18-
19-
#include <iostream>
20-
#include <util/namespace.h>
18+
#include <testing-utils/require_type.h>
19+
#include <testing-utils/require_symbol.h>
2120

2221
SCENARIO(
2322
"java_bytecode_parse_generic_array_class",
@@ -27,34 +26,114 @@ SCENARIO(
2726
"GenericArray", "./java_bytecode/java_bytecode_parse_generics");
2827

2928
std::string class_prefix = "java::GenericArray";
30-
3129
REQUIRE(new_symbol_table.has_symbol(class_prefix));
3230

33-
const struct_typet &type =
34-
to_struct_type(new_symbol_table.lookup_ref(class_prefix).type);
31+
const symbolt &class_symbol = new_symbol_table.lookup_ref(class_prefix);
32+
const class_typet &class_type =
33+
require_symbol::require_complete_class(class_symbol);
3534

36-
THEN("There should be a component with name t")
35+
THEN("There should be field t")
3736
{
38-
REQUIRE(type.has_component("t"));
37+
struct_union_typet::componentt field_t =
38+
require_type::require_component(class_type, "t");
39+
40+
THEN("It is an array")
41+
{
42+
pointer_typet field_t_pointer =
43+
require_type::require_pointer(
44+
field_t.type(),
45+
symbol_typet("java::array[reference]"));
46+
47+
const symbol_typet &field_t_subtype =
48+
to_symbol_type(field_t_pointer.subtype());
49+
const struct_typet &subtype_type = to_struct_type(
50+
new_symbol_table.lookup_ref(field_t_subtype.get_identifier()).type);
51+
REQUIRE(is_valid_java_array(subtype_type));
52+
53+
THEN("The elements have the parametric type T")
54+
{
55+
const typet &element = field_t_subtype.find_type(ID_C_element_type);
56+
REQUIRE(is_java_generic_parameter(element));
57+
java_generic_parametert element_parameter =
58+
to_java_generic_parameter(element);
59+
REQUIRE(element_parameter.type_variable().get_identifier() ==
60+
class_prefix + "::T");
61+
}
62+
}
3963
}
4064

41-
const pointer_typet &t_component =
42-
to_pointer_type(type.get_component("t").type());
43-
const symbol_typet &subtype = to_symbol_type(t_component.subtype());
44-
THEN("The t component is a valid java array")
65+
THEN("There should be field t2")
4566
{
46-
const struct_typet &subtype_type = to_struct_type(
47-
new_symbol_table.lookup_ref(subtype.get_identifier()).type);
48-
REQUIRE(is_valid_java_array(subtype_type));
67+
struct_union_typet::componentt field_t2 =
68+
require_type::require_component(class_type, "t2");
69+
70+
THEN("It is an array")
71+
{
72+
pointer_typet field_t2_pointer =
73+
require_type::require_pointer(
74+
field_t2.type(),
75+
symbol_typet("java::array[reference]"));
76+
77+
const symbol_typet &field_t2_subtype =
78+
to_symbol_type(field_t2_pointer.subtype());
79+
const struct_typet &subtype_struct = to_struct_type(
80+
new_symbol_table.lookup_ref(field_t2_subtype.get_identifier()).type);
81+
REQUIRE(is_valid_java_array(subtype_struct));
82+
83+
THEN("The elements have type Generic<T>")
84+
{
85+
const typet &element = field_t2_subtype.find_type(ID_C_element_type);
86+
REQUIRE(is_java_generic_type(element));
87+
const java_generic_typet generic_element =
88+
to_java_generic_type(element);
89+
require_type::require_pointer(
90+
generic_element, symbol_typet
91+
("java::Generic"));
92+
93+
REQUIRE(is_java_generic_parameter(
94+
generic_element.generic_type_variables().front()));
95+
java_generic_parametert parameter =
96+
generic_element.generic_type_variables().front();
97+
REQUIRE(parameter.type_variable().get_identifier() ==
98+
class_prefix + "::T");
99+
}
100+
}
49101
}
50102

51-
THEN("The elements of the t component have the parametric type T")
103+
THEN("There should be field t3")
52104
{
53-
const typet &element =
54-
static_cast<const typet &>(subtype.find(ID_C_element_type));
55-
REQUIRE(is_java_generic_parameter(element));
56-
REQUIRE(
57-
to_java_generic_parameter(element).type_variable().get_identifier() ==
58-
"java::GenericArray::T");
105+
struct_union_typet::componentt field_t3 =
106+
require_type::require_component(class_type, "t3");
107+
108+
THEN("It is an array")
109+
{
110+
pointer_typet field_t3_pointer =
111+
require_type::require_pointer(
112+
field_t3.type(),
113+
symbol_typet("java::array[reference]"));
114+
115+
const symbol_typet &field_t3_subtype =
116+
to_symbol_type(field_t3_pointer.subtype());
117+
const struct_typet &subtype_struct = to_struct_type(
118+
new_symbol_table.lookup_ref(field_t3_subtype.get_identifier()).type);
119+
REQUIRE(is_valid_java_array(subtype_struct));
120+
121+
THEN("The elements have type Generic<Integer>")
122+
{
123+
const typet &element = field_t3_subtype.find_type(ID_C_element_type);
124+
REQUIRE(is_java_generic_type(element));
125+
const java_generic_typet generic_element =
126+
to_java_generic_type(element);
127+
require_type::require_pointer(
128+
generic_element, symbol_typet("java::Generic"));
129+
130+
REQUIRE(is_java_generic_inst_parameter(
131+
generic_element.generic_type_variables().front()));
132+
java_generic_parametert parameter =
133+
generic_element.generic_type_variables().front();
134+
require_type::require_pointer(
135+
parameter, symbol_typet("java::java.lang.Integer"));
136+
}
137+
}
59138
}
60139
}

0 commit comments

Comments
 (0)