Skip to content

Commit 4201db9

Browse files
author
thk123
committed
Adding tests for static lambdas
1 parent f9adaa6 commit 4201db9

File tree

1 file changed

+160
-0
lines changed

1 file changed

+160
-0
lines changed

unit/java_bytecode/java_bytecode_convert_method/convert_invoke_dynamic.cpp

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

0 commit comments

Comments
 (0)