15
15
16
16
#include < java_bytecode/java_bytecode_language.h>
17
17
#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>
21
20
22
21
SCENARIO (
23
22
" java_bytecode_parse_generic_array_class" ,
@@ -27,34 +26,114 @@ SCENARIO(
27
26
" GenericArray" , " ./java_bytecode/java_bytecode_parse_generics" );
28
27
29
28
std::string class_prefix = " java::GenericArray" ;
30
-
31
29
REQUIRE (new_symbol_table.has_symbol (class_prefix));
32
30
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);
35
34
36
- THEN (" There should be a component with name t" )
35
+ THEN (" There should be field t" )
37
36
{
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
+ }
39
63
}
40
64
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" )
45
66
{
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
+ }
49
101
}
50
102
51
- THEN (" The elements of the t component have the parametric type T " )
103
+ THEN (" There should be field t3 " )
52
104
{
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
+ }
59
138
}
60
139
}
0 commit comments