Skip to content

Commit 0be81df

Browse files
author
thk123
committed
Adding tests for static lambdas
1 parent 60127aa commit 0be81df

File tree

1 file changed

+158
-0
lines changed

1 file changed

+158
-0
lines changed

unit/java_bytecode/java_bytecode_convert_method/convert_invoke_dynamic.cpp

Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -467,3 +467,161 @@ SCENARIO(
467467
}
468468
});
469469
}
470+
471+
void validate_static_member_variable_lambda_assignment(
472+
const symbol_tablet &symbol_table,
473+
const std::vector<codet> &instructions,
474+
const lambda_assignment_test_datat &test_data,
475+
const std::string static_field_name)
476+
{
477+
const auto lambda_assignment =
478+
require_goto_statements::find_pointer_assignments(
479+
static_field_name, instructions);
480+
481+
REQUIRE(lambda_assignment.non_null_assignments.size() == 1);
482+
REQUIRE_FALSE(lambda_assignment.null_assignment.has_value());
483+
484+
validate_lamdba_assignement(
485+
symbol_table, instructions, test_data, lambda_assignment);
486+
}
487+
488+
SCENARIO(
489+
"Converting invokedynamic with a static member lambda",
490+
"[core]"
491+
"[lamdba][java_bytecode][java_bytecode_convert_method][!mayfail]")
492+
{
493+
// NOLINTNEXTLINE(whitespace/braces)
494+
run_test_with_compilers([](const std::string &compiler) {
495+
GIVEN(
496+
"A class with a static lambda variables from " + compiler + " compiler.")
497+
{
498+
symbol_tablet symbol_table = load_java_class(
499+
"StaticLambdas",
500+
"./java_bytecode/java_bytecode_parser/lambda_examples/" + compiler +
501+
"_classes/",
502+
"StaticLambdas.<clinit>");
503+
504+
WHEN("Inspecting the assignments of the entry function")
505+
{
506+
const std::vector<codet> &instructions =
507+
require_goto_statements::get_all_statements(
508+
symbol_table.lookup_ref("java::StaticLambdas.<clinit>:()V").value);
509+
510+
const std::string function_prefix_regex_str = "java::StaticLambdas";
511+
512+
THEN(
513+
"The local variable should be assigned a temp object implementing "
514+
"SimpleLambda")
515+
{
516+
lambda_assignment_test_datat test_data;
517+
test_data.lambda_interface = "java::SimpleLambda";
518+
test_data.lambda_interface_method_descriptor = ".Execute:()V";
519+
test_data.lambda_function_id = "java::StaticLambdas.lambda$static$0:()V";
520+
test_data.expected_params = {};
521+
test_data.should_return_value = false;
522+
validate_static_member_variable_lambda_assignment(
523+
symbol_table,
524+
instructions,
525+
test_data,
526+
function_prefix_regex_str + ".simpleLambda");
527+
}
528+
THEN(
529+
"The local variable should be assigned a temp object implementing "
530+
"ParameterLambda")
531+
{
532+
lambda_assignment_test_datat test_data;
533+
test_data.lambda_interface = "java::ParameterLambda";
534+
test_data.lambda_interface_method_descriptor =
535+
".Execute:(ILjava/lang/Object;LDummyGeneric;)V";
536+
test_data.lambda_function_id =
537+
"java::StaticLambdas.lambda$static$1:"
538+
"(ILjava/lang/Object;LDummyGeneric;)V";
539+
540+
symbol_exprt integer_param{"primitive", java_int_type()};
541+
symbol_exprt ref_param{"reference",
542+
java_type_from_string("Ljava/lang/Object;")};
543+
symbol_exprt generic_param{
544+
"specalisedGeneric",
545+
java_type_from_string("LDummyGeneric<Ljava/lang/Interger;>;")};
546+
test_data.expected_params = {integer_param, ref_param, generic_param};
547+
548+
test_data.should_return_value = false;
549+
validate_member_variable_lambda_assignment(
550+
symbol_table, instructions, test_data, "paramLambda");
551+
}
552+
THEN(
553+
"The local variable should be assigned a non-null pointer to a "
554+
"array parameter interface implementor")
555+
{
556+
lambda_assignment_test_datat test_data;
557+
test_data.lambda_interface = "java::ArrayParameterLambda";
558+
test_data.lambda_interface_method_descriptor =
559+
".Execute:([I[Ljava/lang/Object;[LDummyGeneric;)V";
560+
test_data.lambda_function_id =
561+
"java::StaticLambdas.lambda$static$2:"
562+
"([I[Ljava/lang/Object;[LDummyGeneric;)V";
563+
564+
symbol_exprt integer_param{"primitive", java_type_from_string("[I")};
565+
symbol_exprt ref_param{"reference",
566+
java_type_from_string("[Ljava/lang/Object;")};
567+
symbol_exprt generic_param{
568+
"specalisedGeneric",
569+
java_type_from_string("[LDummyGeneric<Ljava/lang/Interger;>;")};
570+
test_data.expected_params = {integer_param, ref_param, generic_param};
571+
test_data.should_return_value = false;
572+
573+
validate_member_variable_lambda_assignment(
574+
symbol_table, instructions, test_data, "arrayParamLambda");
575+
}
576+
THEN(
577+
"The local variable should be assigned a temp object implementing "
578+
"ReturningLambdaPrimitive")
579+
{
580+
lambda_assignment_test_datat test_data;
581+
test_data.lambda_interface = "java::ReturningLambdaPrimitive";
582+
test_data.lambda_interface_method_descriptor = ".Execute:()I";
583+
test_data.lambda_function_id = "java::StaticLambdas.lambda$static$3:()I";
584+
test_data.expected_params = {};
585+
test_data.should_return_value = true;
586+
validate_member_variable_lambda_assignment(
587+
symbol_table, instructions, test_data, "returnPrimitiveLambda");
588+
}
589+
THEN(
590+
"The local variable should be assigned a temp object implementing "
591+
"ReturningLambdaReference")
592+
{
593+
lambda_assignment_test_datat test_data;
594+
test_data.lambda_interface = "java::ReturningLambdaReference";
595+
test_data.lambda_interface_method_descriptor =
596+
".Execute:()Ljava/lang/Object;";
597+
test_data.lambda_function_id =
598+
"java::StaticLambdas.lambda$static$4:()Ljava/lang/Object;";
599+
test_data.expected_params = {};
600+
test_data.should_return_value = true;
601+
validate_member_variable_lambda_assignment(
602+
symbol_table, instructions, test_data, "returnReferenceLambda");
603+
}
604+
THEN(
605+
"The local variable should be assigned a temp object implementing "
606+
"ReturningLambdaSpecalisedGeneric")
607+
{
608+
lambda_assignment_test_datat test_data;
609+
test_data.lambda_interface = "java::ReturningLambdaSpecalisedGeneric";
610+
test_data.lambda_interface_method_descriptor =
611+
".Execute:()LDummyGeneric;";
612+
test_data.lambda_function_id =
613+
"java::StaticLambdas.lambda$static$5:()LDummyGeneric;";
614+
test_data.expected_params = {};
615+
test_data.should_return_value = true;
616+
validate_member_variable_lambda_assignment(
617+
symbol_table,
618+
instructions,
619+
test_data,
620+
"returningSpecalisedGenericLambda");
621+
}
622+
623+
// TODO[TG-2486]: Tests for member lambdas that capture member variables
624+
}
625+
}
626+
});
627+
}

0 commit comments

Comments
 (0)