Skip to content

Commit a2344f8

Browse files
thk123svorenova
thk123
authored and
svorenova
committed
Extending the tests for the generic class
1 parent 35cd160 commit a2344f8

8 files changed

+123
-0
lines changed
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

unit/java_bytecode/java_bytecode_parse_generics/generics.java

+28
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
public class generics {
22

3+
interface dummyInterface
4+
{
5+
int getX();
6+
}
7+
38
class element<E> {
49
E elem;
510
}
@@ -14,6 +19,29 @@ void g(NUM e) {
1419
}
1520
}
1621

22+
class double_bound_element<T extends java.lang.Number & dummyInterface>
23+
{
24+
T elem;
25+
}
26+
27+
// definitely need to do some tests with bounded two elements
28+
// the java_generic_type_from_string does not work for complex types
29+
// Need to to unblock just get it so it throws when failing rather than wrong
30+
class two_elements<K, V>
31+
{
32+
K k;
33+
V v;
34+
}
35+
36+
37+
38+
public static boolean foo(String s)
39+
{
40+
if(s.length == 0)
41+
return true;
42+
return false;
43+
}
44+
1745
bound_element<Integer> belem;
1846

1947
Integer f(int n) {

unit/java_bytecode/java_bytecode_parse_generics/parse_generic_class.cpp

+95
Original file line numberDiff line numberDiff line change
@@ -237,4 +237,99 @@ SCENARIO(
237237
}
238238
}
239239
}
240+
GIVEN("A class with multiple bounds")
241+
{
242+
THEN("The bounds should be encoded")
243+
{
244+
REQUIRE(
245+
new_symbol_table.has_symbol("java::generics$double_bound_element"));
246+
THEN("The symbol should have a generic parameter")
247+
{
248+
const symbolt &class_symbol=
249+
new_symbol_table.lookup("java::generics$double_bound_element");
250+
const typet &symbol_type=class_symbol.type;
251+
252+
REQUIRE(symbol_type.id()==ID_struct);
253+
class_typet class_type=to_class_type(symbol_type);
254+
REQUIRE(class_type.is_class());
255+
java_class_typet java_class_type=to_java_class_type(class_type);
256+
REQUIRE(is_java_generics_class_type(java_class_type));
257+
258+
java_generics_class_typet java_generics_class_type=
259+
to_java_generics_class_type(java_class_type);
260+
REQUIRE(java_generics_class_type.generic_types().size()==1);
261+
typet &type_var=java_generics_class_type.generic_types().front();
262+
REQUIRE(is_java_generic_parameter(type_var));
263+
java_generic_parametert generic_type_var=
264+
to_java_generic_parameter(type_var);
265+
266+
REQUIRE(
267+
generic_type_var.type_variable().get_identifier()==
268+
"java::generics$double_bound_element::T");
269+
REQUIRE(
270+
java_generics_class_type_var(0, java_generics_class_type)==
271+
"java::generics$double_bound_element::T");
272+
THEN("Bound must be Number and dummyInterface")
273+
{
274+
// TODO (tkiley): Extend this unit test when bounds are correctly
275+
// parsed.
276+
}
277+
}
278+
}
279+
}
280+
GIVEN("A class with multiple generic parameters")
281+
{
282+
THEN("Both generic parameters should be encoded")
283+
{
284+
const symbolt &class_symbol=
285+
new_symbol_table.lookup("java::generics$two_elements");
286+
const typet &symbol_type=class_symbol.type;
287+
288+
REQUIRE(symbol_type.id()==ID_struct);
289+
class_typet class_type=to_class_type(symbol_type);
290+
REQUIRE(class_type.is_class());
291+
java_class_typet java_class_type=to_java_class_type(class_type);
292+
REQUIRE(is_java_generics_class_type(java_class_type));
293+
294+
java_generics_class_typet java_generics_class_type=
295+
to_java_generics_class_type(java_class_type);
296+
//REQUIRE(java_generics_class_type.generic_types().size()==2);
297+
298+
auto generic_param_iterator=
299+
java_generics_class_type.generic_types().cbegin();
300+
301+
// The first parameter should be called K
302+
{
303+
const typet &first_param=*generic_param_iterator;
304+
REQUIRE(is_java_generic_parameter(first_param));
305+
java_generic_parametert generic_type_var=
306+
to_java_generic_parameter(first_param);
307+
308+
REQUIRE(
309+
generic_type_var.type_variable().get_identifier()==
310+
"java::generics$two_elements::K");
311+
REQUIRE(
312+
java_generics_class_type_var(0, java_generics_class_type)==
313+
"java::generics$two_elements::K");
314+
}
315+
316+
++generic_param_iterator;
317+
318+
319+
// The second parameter should be called V
320+
{
321+
const typet &second_param=*generic_param_iterator;
322+
REQUIRE(is_java_generic_parameter(second_param));
323+
java_generic_parametert generic_type_var=
324+
to_java_generic_parameter(second_param);
325+
326+
REQUIRE(
327+
generic_type_var.type_variable().get_identifier()==
328+
"java::generics$two_elements::V");
329+
REQUIRE(
330+
java_generics_class_type_var(0, java_generics_class_type)==
331+
"java::generics$two_elements::V");
332+
}
333+
}
334+
}
240335
}

0 commit comments

Comments
 (0)