Skip to content

Generic tests: check for matching tag, not completely matching type #4172

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions jbmc/unit/java-testing-utils/require_type.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -461,6 +461,14 @@ require_type::require_struct_tag(const typet &type, const irep_idt &identifier)
return result;
}

const pointer_typet
require_type::require_pointer_to_tag(const typet &type, const irep_idt &tag)
{
const auto pointer_type = require_type::require_pointer(type, {});
require_type::require_struct_tag(pointer_type.subtype(), tag);
return pointer_type;
}

/// Verify a given type is a java generic symbol type
/// \param type: The type to check
/// \param identifier: The identifier to match
Expand Down
4 changes: 4 additions & 0 deletions jbmc/unit/java-testing-utils/require_type.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,10 @@ require_pointer(const typet &type, const optionalt<typet> &subtype);
const struct_tag_typet &
require_struct_tag(const typet &type, const irep_idt &identifier = "");

const pointer_typet require_pointer_to_tag(
const typet &type,
const irep_idt &identifier = irep_idt());

struct_typet::componentt require_component(
const struct_typet &struct_type,
const irep_idt &component_name);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,8 +91,8 @@ SCENARIO(
const struct_union_typet::componentt &belem_type =
require_type::require_component(
to_struct_type(class_symbol.type), "belem");
require_type::require_pointer(
belem_type.type(), struct_tag_typet(class_prefix + "$BoundedInner"));
require_type::require_pointer_to_tag(
belem_type.type(), class_prefix + "$BoundedInner");
require_type::require_java_generic_type(
belem_type.type(),
{{require_type::type_argument_kindt::Inst, "java::java.lang.Integer"}});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,7 @@ SCENARIO(
{
const java_method_typet::parametert &param_x =
require_type::require_parameter(func_code, "x");
require_type::require_pointer(
param_x.type(), struct_tag_typet("java::Generic"));
require_type::require_pointer_to_tag(param_x.type(), "java::Generic");

THEN("x is generic with parameter pointing to java.lang.Integer")
{
Expand All @@ -54,8 +53,7 @@ SCENARIO(
THEN("It has return type pointing to Generic")
{
const typet return_type = func_code.return_type();
require_type::require_pointer(
return_type, struct_tag_typet("java::Generic"));
require_type::require_pointer_to_tag(return_type, "java::Generic");

THEN("It is generic with parameter pointing to java.lang.Integer")
{
Expand Down Expand Up @@ -88,8 +86,7 @@ SCENARIO(
{
const java_method_typet::parametert &param_s =
require_type::require_parameter(func_code, "s");
require_type::require_pointer(
param_s.type(), struct_tag_typet("java::Generic"));
require_type::require_pointer_to_tag(param_s.type(), "java::Generic");

THEN("s is generic with parameter pointing to java.lang.String")
{
Expand All @@ -103,8 +100,7 @@ SCENARIO(
THEN("It has return type pointing to Generic")
{
const typet return_type = func_code.return_type();
require_type::require_pointer(
return_type, struct_tag_typet("java::Generic"));
require_type::require_pointer_to_tag(return_type, "java::Generic");

THEN("It is generic with parameter pointing to java.lang.Integer")
{
Expand Down Expand Up @@ -137,8 +133,7 @@ SCENARIO(
{
const java_method_typet::parametert &param_x =
require_type::require_parameter(func_code, "x");
require_type::require_pointer(
param_x.type(), struct_tag_typet("java::Generic"));
require_type::require_pointer_to_tag(param_x.type(), "java::Generic");

THEN("x is generic with parameter pointing to java.lang.Integer")
{
Expand All @@ -153,8 +148,7 @@ SCENARIO(
{
const java_method_typet::parametert &param_y =
require_type::require_parameter(func_code, "y");
require_type::require_pointer(
param_y.type(), struct_tag_typet("java::Generic"));
require_type::require_pointer_to_tag(param_y.type(), "java::Generic");

THEN("y is generic with parameter pointing to java.lang.Integer")
{
Expand All @@ -168,8 +162,7 @@ SCENARIO(
THEN("It has return type pointing to Generic")
{
const typet return_type = func_code.return_type();
require_type::require_pointer(
return_type, struct_tag_typet("java::Generic"));
require_type::require_pointer_to_tag(return_type, "java::Generic");

THEN("It is generic with parameter pointing to java.lang.Integer")
{
Expand Down Expand Up @@ -202,8 +195,7 @@ SCENARIO(
{
const java_method_typet::parametert &param_s =
require_type::require_parameter(func_code, "s");
require_type::require_pointer(
param_s.type(), struct_tag_typet("java::Generic"));
require_type::require_pointer_to_tag(param_s.type(), "java::Generic");

THEN("s is generic with parameter pointing to java.lang.String")
{
Expand All @@ -218,8 +210,7 @@ SCENARIO(
{
const java_method_typet::parametert &param_b =
require_type::require_parameter(func_code, "b");
require_type::require_pointer(
param_b.type(), struct_tag_typet("java::Generic"));
require_type::require_pointer_to_tag(param_b.type(), "java::Generic");

THEN("b is generic with parameter pointing to java.lang.Boolean")
{
Expand All @@ -233,8 +224,7 @@ SCENARIO(
THEN("It has return type pointing to Generic")
{
const typet return_type = func_code.return_type();
require_type::require_pointer(
return_type, struct_tag_typet("java::Generic"));
require_type::require_pointer_to_tag(return_type, "java::Generic");

THEN("It is generic with parameter pointing to java.lang.Integer")
{
Expand Down Expand Up @@ -268,15 +258,14 @@ SCENARIO(
{
const java_method_typet::parametert &param_inner =
require_type::require_parameter(func_code, "inner");
require_type::require_pointer(
param_inner.type(), struct_tag_typet(class_prefix + "$Inner"));
require_type::require_pointer_to_tag(
param_inner.type(), class_prefix + "$Inner");
}

THEN("It has return type pointing to Generic")
{
const typet return_type = func_code.return_type();
require_type::require_pointer(
return_type, struct_tag_typet("java::Generic"));
require_type::require_pointer_to_tag(return_type, "java::Generic");

THEN("It is generic with parameter pointing to java.lang.Integer")
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,9 @@ SCENARIO(

THEN("It is an array")
{
const pointer_typet &field_t_pointer = require_type::require_pointer(
field_t.type(), struct_tag_typet("java::array[reference]"));
const pointer_typet &field_t_pointer =
require_type::require_pointer_to_tag(
field_t.type(), "java::array[reference]");

const struct_tag_typet &field_t_subtype =
to_struct_tag_type(field_t_pointer.subtype());
Expand All @@ -57,8 +58,9 @@ SCENARIO(

THEN("It is an array")
{
const pointer_typet &field_t2_pointer = require_type::require_pointer(
field_t2.type(), struct_tag_typet("java::array[reference]"));
const pointer_typet &field_t2_pointer =
require_type::require_pointer_to_tag(
field_t2.type(), "java::array[reference]");

const struct_tag_typet &field_t2_subtype =
to_struct_tag_type(field_t2_pointer.subtype());
Expand All @@ -69,8 +71,7 @@ SCENARIO(
THEN("The elements have type Generic<T>")
{
const typet &element = java_array_element_type(field_t2_subtype);
require_type::require_pointer(
element, struct_tag_typet("java::Generic"));
require_type::require_pointer_to_tag(element, "java::Generic");
require_type::require_java_generic_type(
element,
{{require_type::type_argument_kindt::Var, class_prefix + "::T"}});
Expand All @@ -85,8 +86,9 @@ SCENARIO(

THEN("It is an array")
{
const pointer_typet &field_t3_pointer = require_type::require_pointer(
field_t3.type(), struct_tag_typet("java::array[reference]"));
const pointer_typet &field_t3_pointer =
require_type::require_pointer_to_tag(
field_t3.type(), "java::array[reference]");

const struct_tag_typet &field_t3_subtype =
to_struct_tag_type(field_t3_pointer.subtype());
Expand All @@ -97,8 +99,7 @@ SCENARIO(
THEN("The elements have type Generic<Integer>")
{
const typet &element = java_array_element_type(field_t3_subtype);
require_type::require_pointer(
element, struct_tag_typet("java::Generic"));
require_type::require_pointer_to_tag(element, "java::Generic");
require_type::require_java_generic_type(
element,
{{require_type::type_argument_kindt::Inst,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,7 @@ SCENARIO(
{
const struct_union_typet::componentt &field_g =
require_type::require_component(class_struct, "g");
require_type::require_pointer(
field_g.type(), struct_tag_typet("java::Generic"));
require_type::require_pointer_to_tag(field_g.type(), "java::Generic");

THEN("It is generic with parameter pointing to java.lang.Integer")
{
Expand Down
Loading