Skip to content

Commit f14e0d7

Browse files
author
thk123
committed
Adding tests for static lambdas
1 parent 2e02e91 commit f14e0d7

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

0 commit comments

Comments
 (0)