Skip to content

Commit e1961d8

Browse files
author
thk123
committed
Adding unit tests for verifying the behaviour of lazy methods on lambdas
1 parent 28c6477 commit e1961d8

File tree

4 files changed

+278
-0
lines changed

4 files changed

+278
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,239 @@
1+
/*******************************************************************\
2+
3+
Module: Unit tests for parsing generic classes
4+
5+
Author: DiffBlue Limited. All rights reserved.
6+
7+
\*******************************************************************/
8+
9+
#include <testing-utils/catch.hpp>
10+
#include <testing-utils/load_java_class.h>
11+
#include <testing-utils/require_symbol.h>
12+
13+
SCENARIO(
14+
"Lazy load lambda methods",
15+
"[core][java_bytecode][ci_lazy_methods][lambdas][!mayfail]")
16+
{
17+
GIVEN("A class with some locally declared lambdas")
18+
{
19+
const symbol_tablet symbol_table = load_java_class_lazy(
20+
"LocalLambdas",
21+
"./java_bytecode/java_bytecode_parser/lambda_examples/",
22+
"LocalLambdas.test");
23+
24+
THEN("Then the lambdas should be loaded")
25+
{
26+
std::string lambda_name_prefix = "java::LocalLambdas.lambda$test$";
27+
require_symbol::require_symbol_exists(
28+
symbol_table, lambda_name_prefix + "0:()V");
29+
30+
require_symbol::require_symbol_exists(
31+
symbol_table,
32+
lambda_name_prefix + "1:(ILjava/lang/Object;LDummyGeneric;)V");
33+
34+
require_symbol::require_symbol_exists(
35+
symbol_table,
36+
lambda_name_prefix + "2:([I[Ljava/lang/Object;[LDummyGeneric;)V");
37+
38+
require_symbol::require_symbol_exists(
39+
symbol_table, lambda_name_prefix + "3:()I");
40+
41+
require_symbol::require_symbol_exists(
42+
symbol_table, lambda_name_prefix + "4:()Ljava/lang/Object;");
43+
44+
require_symbol::require_symbol_exists(
45+
symbol_table, lambda_name_prefix + "5:()LDummyGeneric;");
46+
47+
require_symbol::require_symbol_exists(
48+
symbol_table, lambda_name_prefix + "6:()[I");
49+
50+
require_symbol::require_symbol_exists(
51+
symbol_table, lambda_name_prefix + "7:()[Ljava/lang/Object;");
52+
53+
require_symbol::require_symbol_exists(
54+
symbol_table, lambda_name_prefix + "8:()[LDummyGeneric;");
55+
56+
require_symbol::require_symbol_exists(
57+
symbol_table, lambda_name_prefix + "9:(I)I");
58+
59+
require_symbol::require_symbol_exists(
60+
symbol_table,
61+
lambda_name_prefix + "10:(Ljava/lang/Object;)Ljava/lang/Object;");
62+
63+
require_symbol::require_symbol_exists(
64+
symbol_table, lambda_name_prefix + "11:(LDummyGeneric;)LDummyGeneric;");
65+
}
66+
}
67+
GIVEN("A class with some member lambdas")
68+
{
69+
const symbol_tablet symbol_table = load_java_class_lazy(
70+
"MemberLambdas",
71+
"./java_bytecode/java_bytecode_parser/lambda_examples/",
72+
"MemberLambdas.test");
73+
74+
THEN("Then the lambdas should be loaded")
75+
{
76+
std::string lambda_name_prefix = "java::MemberLambdas.lambda$new$";
77+
require_symbol::require_symbol_exists(
78+
symbol_table, lambda_name_prefix + "0:()V");
79+
80+
require_symbol::require_symbol_exists(
81+
symbol_table,
82+
lambda_name_prefix + "1:(ILjava/lang/Object;LDummyGeneric;)V");
83+
84+
require_symbol::require_symbol_exists(
85+
symbol_table,
86+
lambda_name_prefix + "2:([I[Ljava/lang/Object;[LDummyGeneric;)V");
87+
88+
require_symbol::require_symbol_exists(
89+
symbol_table, lambda_name_prefix + "3:()I");
90+
91+
require_symbol::require_symbol_exists(
92+
symbol_table, lambda_name_prefix + "4:()Ljava/lang/Object;");
93+
94+
require_symbol::require_symbol_exists(
95+
symbol_table, lambda_name_prefix + "5:()LDummyGeneric;");
96+
97+
require_symbol::require_symbol_exists(
98+
symbol_table, lambda_name_prefix + "6:()[I");
99+
100+
require_symbol::require_symbol_exists(
101+
symbol_table, lambda_name_prefix + "7:()[Ljava/lang/Object;");
102+
103+
require_symbol::require_symbol_exists(
104+
symbol_table, lambda_name_prefix + "8:()[LDummyGeneric;");
105+
106+
require_symbol::require_symbol_exists(
107+
symbol_table, lambda_name_prefix + "9:()I");
108+
109+
require_symbol::require_symbol_exists(
110+
symbol_table, lambda_name_prefix + "10:()Ljava/lang/Object;");
111+
112+
require_symbol::require_symbol_exists(
113+
symbol_table, lambda_name_prefix + "11:()LDummyGeneric;");
114+
}
115+
}
116+
GIVEN("A class with some static lambdas")
117+
{
118+
const symbol_tablet symbol_table = load_java_class_lazy(
119+
"StaticLambdas",
120+
"./java_bytecode/java_bytecode_parser/lambda_examples/",
121+
"StaticLambdas.test");
122+
123+
THEN("Then the lambdas should be loaded")
124+
{
125+
std::string lambda_name_prefix = "java::StaticLambdas.lambda$static$";
126+
require_symbol::require_symbol_exists(
127+
symbol_table, lambda_name_prefix + "0:()V");
128+
129+
require_symbol::require_symbol_exists(
130+
symbol_table,
131+
lambda_name_prefix + "1:(ILjava/lang/Object;LDummyGeneric;)V");
132+
133+
require_symbol::require_symbol_exists(
134+
symbol_table,
135+
lambda_name_prefix + "2:([I[Ljava/lang/Object;[LDummyGeneric;)V");
136+
137+
require_symbol::require_symbol_exists(
138+
symbol_table, lambda_name_prefix + "3:()I");
139+
140+
require_symbol::require_symbol_exists(
141+
symbol_table, lambda_name_prefix + "4:()Ljava/lang/Object;");
142+
143+
require_symbol::require_symbol_exists(
144+
symbol_table, lambda_name_prefix + "5:()LDummyGeneric;");
145+
146+
require_symbol::require_symbol_exists(
147+
symbol_table, lambda_name_prefix + "6:()[I");
148+
149+
require_symbol::require_symbol_exists(
150+
symbol_table, lambda_name_prefix + "7:()[Ljava/lang/Object;");
151+
152+
require_symbol::require_symbol_exists(
153+
symbol_table, lambda_name_prefix + "8:()[LDummyGeneric;");
154+
155+
require_symbol::require_symbol_exists(
156+
symbol_table, lambda_name_prefix + "9:()I");
157+
158+
require_symbol::require_symbol_exists(
159+
symbol_table, lambda_name_prefix + "10:()Ljava/lang/Object;");
160+
161+
require_symbol::require_symbol_exists(
162+
symbol_table, lambda_name_prefix + "11:()LDummyGeneric;");
163+
}
164+
}
165+
GIVEN("A class with some outer member lambdas")
166+
{
167+
const symbol_tablet symbol_table = load_java_class_lazy(
168+
"OuterMemberLambdas$Inner",
169+
"./java_bytecode/java_bytecode_parser/lambda_examples/",
170+
"OuterMemberLambdas$Inner.test");
171+
172+
THEN("Then the lambdas should be loaded")
173+
{
174+
std::string lambda_name_prefix =
175+
"java::OuterMemberLambdas$Inner.lambda$new$";
176+
177+
require_symbol::require_symbol_exists(
178+
symbol_table, lambda_name_prefix + "0:()I");
179+
180+
require_symbol::require_symbol_exists(
181+
symbol_table, lambda_name_prefix + "1:()Ljava/lang/Object;");
182+
183+
require_symbol::require_symbol_exists(
184+
symbol_table, lambda_name_prefix + "2:()LDummyGeneric;");
185+
}
186+
}
187+
}
188+
189+
SCENARIO(
190+
"Lazy load lambda methods in seperate class",
191+
"[core][java_bytecode][ci_lazy_methods][lambdas][!mayfail]")
192+
{
193+
const symbol_tablet symbol_table = load_java_class_lazy(
194+
"ExternalLambdaAccessor",
195+
"./java_bytecode/java_bytecode_parser/lambda_examples/",
196+
"ExternalLambdaAccessor.test");
197+
198+
THEN("Then the lambdas should be loaded")
199+
{
200+
std::string lambda_name_prefix = "java::ExternalLambdas.lambda$new$";
201+
require_symbol::require_symbol_exists(
202+
symbol_table, lambda_name_prefix + "0:()V");
203+
204+
require_symbol::require_symbol_exists(
205+
symbol_table,
206+
lambda_name_prefix + "1:(ILjava/lang/Object;LDummyGeneric;)V");
207+
208+
require_symbol::require_symbol_exists(
209+
symbol_table,
210+
lambda_name_prefix + "2:([I[Ljava/lang/Object;[LDummyGeneric;)V");
211+
212+
require_symbol::require_symbol_exists(
213+
symbol_table, lambda_name_prefix + "3:()I");
214+
215+
require_symbol::require_symbol_exists(
216+
symbol_table, lambda_name_prefix + "4:()Ljava/lang/Object;");
217+
218+
require_symbol::require_symbol_exists(
219+
symbol_table, lambda_name_prefix + "5:()LDummyGeneric;");
220+
221+
require_symbol::require_symbol_exists(
222+
symbol_table, lambda_name_prefix + "6:()[I");
223+
224+
require_symbol::require_symbol_exists(
225+
symbol_table, lambda_name_prefix + "7:()[Ljava/lang/Object;");
226+
227+
require_symbol::require_symbol_exists(
228+
symbol_table, lambda_name_prefix + "8:()[LDummyGeneric;");
229+
230+
require_symbol::require_symbol_exists(
231+
symbol_table, lambda_name_prefix + "9:()I");
232+
233+
require_symbol::require_symbol_exists(
234+
symbol_table, lambda_name_prefix + "10:()Ljava/lang/Object;");
235+
236+
require_symbol::require_symbol_exists(
237+
symbol_table, lambda_name_prefix + "11:()LDummyGeneric;");
238+
}
239+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
class ExternalLambdas
2+
{
3+
int memberPrimitive;
4+
Object memberReference;
5+
DummyGeneric<Integer> memberSpecalisedGeneric;
6+
7+
public SimpleLambda simpleLambda = () -> { /*NOP*/ };
8+
public ParameterLambda paramLambda = (int primitive, Object reference, DummyGeneric<Integer> specalisedGeneric) -> {};
9+
public ArrayParameterLambda arrayParamLambda = (int[] primitive, Object[] reference, DummyGeneric<Integer>[] specalisedGeneric) -> {};
10+
public ReturningLambdaPrimitive returnPrimitiveLambda = () -> { return 1; };
11+
public ReturningLambdaReference returnReferenceLambda = () -> { return null; };
12+
public ReturningLambdaSpecalisedGeneric returningSpecalisedGenericLambda = () -> { return null; };
13+
public ReturningLambdaPrimitiveArray returnPrimitiveArrayLambda = () -> { return null; };
14+
public ReturningLambdaReferenceArray returnReferenceArrayLambda = () -> { return null; };
15+
public ReturningLambdaSpecalisedGenericArray returningSpecalisedGenericArrayLambda = () -> { return null; };
16+
public ReturningLambdaPrimitive returnPrimitiveLambdaCapture = () -> { return memberPrimitive; };
17+
public ReturningLambdaReference returnReferenceLambdaCapture = () -> { return memberReference; };
18+
public ReturningLambdaSpecalisedGeneric returningSpecalisedGenericLambdaCapture = () -> { return memberSpecalisedGeneric; };
19+
}
20+
21+
public class ExternalLambdaAccessor
22+
{
23+
public static void test()
24+
{
25+
ExternalLambdas e = new ExternalLambdas();
26+
e.simpleLambda.Execute();
27+
e.paramLambda.Execute(4, null, null);
28+
e.arrayParamLambda.Execute(null, null, null);
29+
e.returnPrimitiveLambda.Execute();
30+
e.returnReferenceLambda.Execute();
31+
e.returningSpecalisedGenericLambda.Execute();
32+
e.returnPrimitiveArrayLambda.Execute();
33+
e.returnReferenceArrayLambda.Execute();
34+
e.returningSpecalisedGenericArrayLambda.Execute();
35+
e.returnPrimitiveLambdaCapture.Execute();
36+
e.returnReferenceLambdaCapture.Execute();
37+
e.returningSpecalisedGenericLambdaCapture.Execute();
38+
}
39+
}
Binary file not shown.

0 commit comments

Comments
 (0)