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
2221SCENARIO (
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