Skip to content

Commit 9db9947

Browse files
author
svorenova
committed
Extending test for generic class
1 parent 89b99ce commit 9db9947

File tree

5 files changed

+131
-19
lines changed

5 files changed

+131
-19
lines changed
Binary file not shown.

unit/java_bytecode/java_bytecode_parse_generics/Generic.java

+1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
class Generic<T>
22
{
33
public T t;
4+
public Generic<Integer> g;
45

56
public static <T> Generic<T> makeGeneric(T value)
67
{
Binary file not shown.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
class GenericTwoParam<T,U>
2+
{
3+
public T t;
4+
public U u;
5+
}

unit/java_bytecode/java_bytecode_parse_generics/parse_generic_class.cpp

+125-19
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include <testing-utils/catch.hpp>
1010
#include <testing-utils/load_java_class.h>
1111
#include <testing-utils/require_symbol.h>
12+
#include <testing-utils/require_type.h>
1213

1314
#include <istream>
1415
#include <memory>
@@ -19,43 +20,148 @@
1920
#include <java_bytecode/java_bytecode_language.h>
2021

2122
SCENARIO(
22-
"java_bytecode_parse_generic_class",
23+
"java_bytecode_parse_generic_class_one_param",
2324
"[core][java_bytecode][java_bytecode_parse_generics]")
2425
{
2526
const symbol_tablet &new_symbol_table =
2627
load_java_class("Generic", "./java_bytecode/java_bytecode_parse_generics");
2728

2829
std::string class_prefix = "java::Generic";
29-
REQUIRE(new_symbol_table.has_symbol(class_prefix));
3030

3131
WHEN("Parsing the class")
3232
{
33-
REQUIRE(new_symbol_table.has_symbol(class_prefix));
34-
THEN("The class symbol is generic")
33+
THEN("There is a generic class symbol Generic")
3534
{
35+
REQUIRE(new_symbol_table.has_symbol(class_prefix));
36+
3637
const symbolt &class_symbol = new_symbol_table.lookup_ref(class_prefix);
3738
class_typet class_type =
3839
require_symbol::require_complete_class(class_symbol);
39-
java_class_typet java_class_type = to_java_class_type(class_type);
40-
41-
REQUIRE(is_java_generics_class_type(java_class_type));
4240
java_generics_class_typet java_generics_class_type =
43-
to_java_generics_class_type(java_class_type);
41+
require_type::require_java_generic_class(class_type);
4442

45-
THEN("The type variable is T")
43+
THEN("It has type variable T")
4644
{
47-
REQUIRE(java_generics_class_type.generic_types().size()==1);
48-
typet &type_var=java_generics_class_type.generic_types().front();
49-
REQUIRE(is_java_generic_parameter(type_var));
50-
java_generic_parametert generic_type_var=
51-
to_java_generic_parameter(type_var);
45+
REQUIRE(java_generics_class_type.generic_types().size() == 1);
46+
const auto &generic_types = java_generics_class_type.generic_types();
47+
5248
REQUIRE(
53-
generic_type_var.type_variable().get_identifier() ==
49+
generic_types[0].type_variable().get_identifier() ==
5450
class_prefix + "::T");
55-
typet &sub_type = generic_type_var.subtype();
56-
REQUIRE(sub_type.id() == ID_symbol);
57-
symbol_typet &bound_type = to_symbol_type(sub_type);
58-
REQUIRE(bound_type.get_identifier() == "java::java.lang.Object");
51+
}
52+
53+
const struct_typet class_struct = to_struct_type(class_symbol.type);
54+
THEN("It has field t")
55+
{
56+
struct_union_typet::componentt field_t =
57+
require_type::require_component(class_struct, "t");
58+
59+
THEN("It is the generic parameter T")
60+
{
61+
REQUIRE(is_java_generic_parameter(field_t.type()));
62+
63+
const java_generic_parametert field_t_param =
64+
to_java_generic_parameter(field_t.type());
65+
REQUIRE(
66+
field_t_param.type_variable().get_identifier() ==
67+
class_prefix + "::T");
68+
}
69+
}
70+
71+
THEN("It has field g pointing to Generic")
72+
{
73+
struct_union_typet::componentt field_g =
74+
require_type::require_component(class_struct, "g");
75+
require_type::require_pointer(
76+
field_g.type(), symbol_typet("java::Generic"));
77+
78+
THEN("It is generic with parameter pointing to java.lang.Integer")
79+
{
80+
REQUIRE(is_java_generic_type(field_g.type()));
81+
82+
const java_generic_typet generic_field_g =
83+
to_java_generic_type(field_g.type());
84+
const java_generic_parametert generic_param_field_g =
85+
generic_field_g.generic_type_variables().front();
86+
require_type::require_pointer(
87+
generic_param_field_g, symbol_typet("java::java.lang.Integer"));
88+
}
89+
}
90+
}
91+
}
92+
}
93+
94+
SCENARIO(
95+
"java_bytecode_parse_generic_class_two_param",
96+
"[core][java_bytecode][java_bytecode_parse_generics]")
97+
{
98+
const symbol_tablet &new_symbol_table = load_java_class(
99+
"GenericTwoParam", "./java_bytecode/java_bytecode_parse_generics");
100+
101+
std::string class_prefix = "java::GenericTwoParam";
102+
103+
WHEN("Parsing the class")
104+
{
105+
THEN("There is a generic class symbol GenericTwoParam")
106+
{
107+
REQUIRE(new_symbol_table.has_symbol(class_prefix));
108+
109+
const symbolt &class_symbol = new_symbol_table.lookup_ref(class_prefix);
110+
class_typet class_type =
111+
require_symbol::require_complete_class(class_symbol);
112+
java_generics_class_typet java_generics_class_type =
113+
require_type::require_java_generic_class(class_type);
114+
115+
THEN("It has type variables T and U")
116+
{
117+
REQUIRE(java_generics_class_type.generic_types().size() == 2);
118+
const auto &generic_types = java_generics_class_type.generic_types();
119+
{
120+
const java_generic_parametert &generic_param = generic_types[0];
121+
REQUIRE(
122+
generic_param.type_variable().get_identifier() ==
123+
class_prefix + "::T");
124+
}
125+
{
126+
const java_generic_parametert &generic_param = generic_types[1];
127+
REQUIRE(
128+
generic_param.type_variable().get_identifier() ==
129+
class_prefix + "::U");
130+
}
131+
}
132+
133+
const struct_typet class_struct = to_struct_type(class_symbol.type);
134+
THEN("It has field t")
135+
{
136+
struct_union_typet::componentt field_t =
137+
require_type::require_component(class_struct, "t");
138+
139+
THEN("It is the generic parameter T")
140+
{
141+
REQUIRE(is_java_generic_parameter(field_t.type()));
142+
143+
const java_generic_parametert field_t_param =
144+
to_java_generic_parameter(field_t.type());
145+
REQUIRE(
146+
field_t_param.type_variable().get_identifier() ==
147+
class_prefix + "::T");
148+
}
149+
}
150+
THEN("It has field u")
151+
{
152+
struct_union_typet::componentt field_u =
153+
require_type::require_component(class_struct, "u");
154+
155+
THEN("It is the generic parameter U")
156+
{
157+
REQUIRE(is_java_generic_parameter(field_u.type()));
158+
159+
const java_generic_parametert field_u_param =
160+
to_java_generic_parameter(field_u.type());
161+
REQUIRE(
162+
field_u_param.type_variable().get_identifier() ==
163+
class_prefix + "::U");
164+
}
59165
}
60166
}
61167
}

0 commit comments

Comments
 (0)