Skip to content

Commit 12e482a

Browse files
author
thk123
committed
Adding unit tests for verifying the behaviour of lazy methods on lambdas
1 parent 3ed6e36 commit 12e482a

File tree

4 files changed

+283
-0
lines changed

4 files changed

+283
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,244 @@
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,
111+
lambda_name_prefix + "10:()Ljava/lang/Object;");
112+
113+
require_symbol::require_symbol_exists(
114+
symbol_table, lambda_name_prefix + "11:()LDummyGeneric;");
115+
}
116+
}
117+
GIVEN("A class with some static lambdas")
118+
{
119+
const symbol_tablet symbol_table = load_java_class_lazy(
120+
"StaticLambdas",
121+
"./java_bytecode/java_bytecode_parser/lambda_examples/",
122+
"StaticLambdas.test");
123+
124+
THEN("Then the lambdas should be loaded")
125+
{
126+
std::string lambda_name_prefix = "java::StaticLambdas.lambda$static$";
127+
require_symbol::require_symbol_exists(
128+
symbol_table, lambda_name_prefix + "0:()V");
129+
130+
require_symbol::require_symbol_exists(
131+
symbol_table,
132+
lambda_name_prefix + "1:(ILjava/lang/Object;LDummyGeneric;)V");
133+
134+
require_symbol::require_symbol_exists(
135+
symbol_table,
136+
lambda_name_prefix + "2:([I[Ljava/lang/Object;[LDummyGeneric;)V");
137+
138+
require_symbol::require_symbol_exists(
139+
symbol_table, lambda_name_prefix + "3:()I");
140+
141+
require_symbol::require_symbol_exists(
142+
symbol_table, lambda_name_prefix + "4:()Ljava/lang/Object;");
143+
144+
require_symbol::require_symbol_exists(
145+
symbol_table, lambda_name_prefix + "5:()LDummyGeneric;");
146+
147+
require_symbol::require_symbol_exists(
148+
symbol_table, lambda_name_prefix + "6:()[I");
149+
150+
require_symbol::require_symbol_exists(
151+
symbol_table, lambda_name_prefix + "7:()[Ljava/lang/Object;");
152+
153+
require_symbol::require_symbol_exists(
154+
symbol_table, lambda_name_prefix + "8:()[LDummyGeneric;");
155+
156+
require_symbol::require_symbol_exists(
157+
symbol_table, lambda_name_prefix + "9:()I");
158+
159+
require_symbol::require_symbol_exists(
160+
symbol_table,
161+
lambda_name_prefix + "10:()Ljava/lang/Object;");
162+
163+
require_symbol::require_symbol_exists(
164+
symbol_table, lambda_name_prefix + "11:()LDummyGeneric;");
165+
}
166+
}
167+
GIVEN("A class with some outer member lambdas")
168+
{
169+
const symbol_tablet symbol_table = load_java_class_lazy(
170+
"OuterMemberLambdas$Inner",
171+
"./java_bytecode/java_bytecode_parser/lambda_examples/",
172+
"OuterMemberLambdas$Inner.test");
173+
174+
THEN("Then the lambdas should be loaded")
175+
{
176+
std::string lambda_name_prefix =
177+
"java::OuterMemberLambdas$Inner.lambda$new$";
178+
179+
180+
require_symbol::require_symbol_exists(
181+
symbol_table, lambda_name_prefix + "0:()I");
182+
183+
require_symbol::require_symbol_exists(
184+
symbol_table,
185+
lambda_name_prefix + "1:()Ljava/lang/Object;");
186+
187+
require_symbol::require_symbol_exists(
188+
symbol_table, lambda_name_prefix + "2:()LDummyGeneric;");
189+
}
190+
}
191+
}
192+
193+
194+
SCENARIO("Lazy load lambda methods in seperate class",
195+
"[core][java_bytecode][ci_lazy_methods][lambdas][!mayfail]")
196+
{
197+
const symbol_tablet symbol_table = load_java_class_lazy(
198+
"ExternalLambdaAccessor",
199+
"./java_bytecode/java_bytecode_parser/lambda_examples/",
200+
"ExternalLambdaAccessor.test");
201+
202+
THEN("Then the lambdas should be loaded")
203+
{
204+
std::string lambda_name_prefix = "java::ExternalLambdas.lambda$new$";
205+
require_symbol::require_symbol_exists(
206+
symbol_table, lambda_name_prefix + "0:()V");
207+
208+
require_symbol::require_symbol_exists(
209+
symbol_table,
210+
lambda_name_prefix + "1:(ILjava/lang/Object;LDummyGeneric;)V");
211+
212+
require_symbol::require_symbol_exists(
213+
symbol_table,
214+
lambda_name_prefix + "2:([I[Ljava/lang/Object;[LDummyGeneric;)V");
215+
216+
require_symbol::require_symbol_exists(
217+
symbol_table, lambda_name_prefix + "3:()I");
218+
219+
require_symbol::require_symbol_exists(
220+
symbol_table, lambda_name_prefix + "4:()Ljava/lang/Object;");
221+
222+
require_symbol::require_symbol_exists(
223+
symbol_table, lambda_name_prefix + "5:()LDummyGeneric;");
224+
225+
require_symbol::require_symbol_exists(
226+
symbol_table, lambda_name_prefix + "6:()[I");
227+
228+
require_symbol::require_symbol_exists(
229+
symbol_table, lambda_name_prefix + "7:()[Ljava/lang/Object;");
230+
231+
require_symbol::require_symbol_exists(
232+
symbol_table, lambda_name_prefix + "8:()[LDummyGeneric;");
233+
234+
require_symbol::require_symbol_exists(
235+
symbol_table, lambda_name_prefix + "9:()I");
236+
237+
require_symbol::require_symbol_exists(
238+
symbol_table,
239+
lambda_name_prefix + "10:()Ljava/lang/Object;");
240+
241+
require_symbol::require_symbol_exists(
242+
symbol_table, lambda_name_prefix + "11:()LDummyGeneric;");
243+
}
244+
}
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)