@@ -45,7 +45,17 @@ SCENARIO(
45
45
require_type::require_pointer (
46
46
field_component.type (), symbol_typet (" java::GenericClass$InnerClass" ));
47
47
48
- // TODO: then the generic type should be correctly stored
48
+ THEN (" The pointer should be generic" )
49
+ {
50
+ REQUIRE (is_java_generic_type (field_component.type ()));
51
+ const auto &generic_variables =
52
+ to_java_generic_type (field_component.type ()).generic_type_variables ();
53
+ REQUIRE (generic_variables.size () == 1 );
54
+ const java_generic_parametert &generic_param = generic_variables[0 ];
55
+ REQUIRE (
56
+ generic_param.type_variable () ==
57
+ symbol_typet (" java::GenericClass::T" ));
58
+ }
49
59
}
50
60
51
61
THEN (" The field component should be a pointer to GenericClass$InnerClass" )
@@ -57,48 +67,63 @@ SCENARIO(
57
67
field_component.type (),
58
68
symbol_typet (" java::GenericClass$GenericInnerClass" ));
59
69
60
- // TODO: then the generic type should be correctly stored
70
+ THEN (" The pointer should be generic" )
71
+ {
72
+ REQUIRE (is_java_generic_type (field_component.type ()));
73
+ const auto &generic_variables =
74
+ to_java_generic_type (field_component.type ()).generic_type_variables ();
75
+ REQUIRE (generic_variables.size () == 2 );
76
+ {
77
+ const java_generic_parametert &generic_param = generic_variables[0 ];
78
+ REQUIRE (is_java_generic_parameter (generic_param));
79
+ REQUIRE (
80
+ generic_param.type_variable () ==
81
+ symbol_typet (" java::GenericClass::T" ));
82
+ }
83
+ {
84
+ const java_generic_parametert &generic_param = generic_variables[1 ];
85
+ REQUIRE (is_java_generic_inst_parameter (generic_param));
86
+ REQUIRE (
87
+ generic_param ==
88
+ java_generic_inst_parametert (symbol_typet (" java::Foo" )));
89
+ }
90
+ }
61
91
}
62
92
63
93
THEN (" The field component should be a pointer to GenericClass$InnerClass" )
64
94
{
65
95
const struct_typet::componentt &field_component =
66
96
require_type::require_component (class_type, " field3" );
67
97
68
- require_type::require_pointer (
69
- field_component.type (),
70
- symbol_typet (" java::GenericClass$SameGenericParamInnerClass" ));
71
-
72
- // TODO: then the generic type should be correctly stored
73
- }
74
-
75
- THEN (" The field component should be a pointer to GenericClass$InnerClass" )
76
- {
77
- const struct_typet::componentt &field_component =
78
- require_type::require_component (class_type, " field4" );
79
-
80
98
require_type::require_pointer (
81
99
field_component.type (),
82
100
symbol_typet (" java::GenericClass$GenericInnerClass" ));
83
101
84
- // TODO: then the generic type should be correctly stored
85
- }
86
- THEN (" The field component should be a pointer to GenericClass$InnerClass" )
87
- {
88
- const struct_typet::componentt &field_component =
89
- require_type::require_component (class_type, " field5" );
90
-
91
- require_type::require_pointer (
92
- field_component.type (),
93
- symbol_typet (" java::GenericClass$SameGenericParamInnerClass" ));
94
-
95
- // TODO: then the generic type should be correctly stored
102
+ THEN (" The pointer should be generic" )
103
+ {
104
+ REQUIRE (is_java_generic_type (field_component.type ()));
105
+ const auto &generic_variables =
106
+ to_java_generic_type (field_component.type ()).generic_type_variables ();
107
+ REQUIRE (generic_variables.size () == 2 );
108
+ {
109
+ const java_generic_parametert &generic_param = generic_variables[0 ];
110
+ REQUIRE (is_java_generic_parameter (generic_param));
111
+ REQUIRE (
112
+ generic_param.type_variable () ==
113
+ symbol_typet (" java::GenericClass::T" ));
114
+ }
115
+ {
116
+ const java_generic_parametert &generic_param = generic_variables[1 ];
117
+ REQUIRE (is_java_generic_parameter (generic_param));
118
+ REQUIRE (
119
+ generic_param.type_variable () ==
120
+ symbol_typet (" java::GenericClass::T" ));
121
+ }
122
+ }
96
123
}
97
124
}
98
125
99
- THEN (" There should be a symbol for the generic inner class" )
100
- {
101
- }
126
+ // TODO: add fields of doubly nested generic classes
102
127
}
103
128
104
129
SCENARIO (
@@ -254,6 +279,28 @@ SCENARIO(
254
279
require_type::require_parameter (function_call, " input" );
255
280
require_type::require_pointer (
256
281
param_type.type (), symbol_typet (" java::GenericClass$GenericInnerClass" ));
282
+
283
+ THEN (" The pointer should be generic" )
284
+ {
285
+ REQUIRE (is_java_generic_type (param_type.type ()));
286
+ const auto &generic_variables =
287
+ to_java_generic_type (param_type.type ()).generic_type_variables ();
288
+ REQUIRE (generic_variables.size () == 2 );
289
+ {
290
+ const java_generic_parametert &generic_param = generic_variables[0 ];
291
+ REQUIRE (is_java_generic_parameter (generic_param));
292
+ REQUIRE (
293
+ generic_param.type_variable () ==
294
+ symbol_typet (" java::GenericClass::T" ));
295
+ }
296
+ {
297
+ const java_generic_parametert &generic_param = generic_variables[1 ];
298
+ REQUIRE (is_java_generic_parameter (generic_param));
299
+ REQUIRE (
300
+ generic_param.type_variable () ==
301
+ symbol_typet (" java::GenericClass::T" ));
302
+ }
303
+ }
257
304
}
258
305
THEN (" Method 5 should return a GenericClass$InnerClass" )
259
306
{
@@ -272,8 +319,20 @@ SCENARIO(
272
319
require_type::require_pointer (
273
320
function_call.return_type (),
274
321
symbol_typet (" java::GenericClass$InnerClass" ));
322
+
323
+ THEN (" The pointer should be generic" )
324
+ {
325
+ REQUIRE (is_java_generic_type (function_call.return_type ()));
326
+ const auto &generic_variables =
327
+ to_java_generic_type (function_call.return_type ())
328
+ .generic_type_variables ();
329
+ REQUIRE (generic_variables.size () == 1 );
330
+ const java_generic_parametert &generic_param = generic_variables[0 ];
331
+ REQUIRE (
332
+ generic_param.type_variable () == symbol_typet (" java::GenericClass::T" ));
333
+ }
275
334
}
276
- THEN (" Method 6 should return a GenericClass$InnerClass " )
335
+ THEN (" Method 6 should return a GenericClass$GenericInnerClass " )
277
336
{
278
337
const std::string func_name = " .method6" ;
279
338
const std::string func_descriptor = " :()LGenericClass$GenericInnerClass;" ;
@@ -290,8 +349,31 @@ SCENARIO(
290
349
require_type::require_pointer (
291
350
function_call.return_type (),
292
351
symbol_typet (" java::GenericClass$GenericInnerClass" ));
352
+
353
+ THEN (" The pointer should be generic" )
354
+ {
355
+ REQUIRE (is_java_generic_type (function_call.return_type ()));
356
+ const auto &generic_variables =
357
+ to_java_generic_type (function_call.return_type ())
358
+ .generic_type_variables ();
359
+ REQUIRE (generic_variables.size () == 2 );
360
+ {
361
+ const java_generic_parametert &generic_param = generic_variables[0 ];
362
+ REQUIRE (is_java_generic_parameter (generic_param));
363
+ REQUIRE (
364
+ generic_param.type_variable () ==
365
+ symbol_typet (" java::GenericClass::T" ));
366
+ }
367
+ {
368
+ const java_generic_parametert &generic_param = generic_variables[1 ];
369
+ REQUIRE (is_java_generic_inst_parameter (generic_param));
370
+ REQUIRE (
371
+ generic_param ==
372
+ java_generic_inst_parametert (symbol_typet (" java::Foo" )));
373
+ }
374
+ }
293
375
}
294
- THEN (" Method 7 should return a GenericClass$InnerClass " )
376
+ THEN (" Method 7 should return a GenericClass$GenericInnerClass " )
295
377
{
296
378
const std::string func_name = " .method7" ;
297
379
const std::string func_descriptor = " :()LGenericClass$GenericInnerClass;" ;
@@ -308,5 +390,28 @@ SCENARIO(
308
390
require_type::require_pointer (
309
391
function_call.return_type (),
310
392
symbol_typet (" java::GenericClass$GenericInnerClass" ));
393
+
394
+ THEN (" The pointer should be generic" )
395
+ {
396
+ REQUIRE (is_java_generic_type (function_call.return_type ()));
397
+ const auto &generic_variables =
398
+ to_java_generic_type (function_call.return_type ())
399
+ .generic_type_variables ();
400
+ REQUIRE (generic_variables.size () == 2 );
401
+ {
402
+ const java_generic_parametert &generic_param = generic_variables[0 ];
403
+ REQUIRE (is_java_generic_parameter (generic_param));
404
+ REQUIRE (
405
+ generic_param.type_variable () ==
406
+ symbol_typet (" java::GenericClass::T" ));
407
+ }
408
+ {
409
+ const java_generic_parametert &generic_param = generic_variables[1 ];
410
+ REQUIRE (is_java_generic_parameter (generic_param));
411
+ REQUIRE (
412
+ generic_param.type_variable () ==
413
+ symbol_typet (" java::GenericClass::T" ));
414
+ }
415
+ }
311
416
}
312
417
}
0 commit comments