@@ -81,6 +81,7 @@ void pathUsingBuiltinShadow() {
81
81
assertEmptyChainToVariableEntity (source );
82
82
assertThat (source .variableMetaModel ()).isEqualTo (previousElementMetaModel );
83
83
assertThat (source .isTopLevel ()).isTrue ();
84
+ assertThat (source .onRootEntity ()).isTrue ();
84
85
assertThat (source .isDeclarative ()).isFalse ();
85
86
assertThat (source .targetVariableMetamodel ()).isEqualTo (shadowVariableMetaModel );
86
87
assertThat (source .downstreamDeclarativeVariableMetamodel ()).isNull ();
@@ -114,6 +115,7 @@ void pathUsingDeclarativeShadow() {
114
115
assertEmptyChainToVariableEntity (source );
115
116
assertThat (source .variableMetaModel ()).isEqualTo (dependencyMetaModel );
116
117
assertThat (source .isTopLevel ()).isTrue ();
118
+ assertThat (source .onRootEntity ()).isTrue ();
117
119
assertThat (source .isDeclarative ()).isTrue ();
118
120
assertThat (source .targetVariableMetamodel ()).isEqualTo (shadowVariableMetaModel );
119
121
assertThat (source .downstreamDeclarativeVariableMetamodel ()).isEqualTo (dependencyMetaModel );
@@ -146,6 +148,7 @@ void pathUsingDeclarativeShadowAfterGroup() {
146
148
assertEmptyChainToVariableEntity (source );
147
149
assertThat (source .variableMetaModel ()).isEqualTo (dependencyMetaModel );
148
150
assertThat (source .isTopLevel ()).isTrue ();
151
+ assertThat (source .onRootEntity ()).isFalse ();
149
152
assertThat (source .isDeclarative ()).isTrue ();
150
153
assertThat (source .targetVariableMetamodel ()).isEqualTo (shadowVariableMetaModel );
151
154
assertThat (source .downstreamDeclarativeVariableMetamodel ()).isEqualTo (dependencyMetaModel );
@@ -183,6 +186,7 @@ void pathUsingBuiltinShadowAfterGroup() {
183
186
assertEmptyChainToVariableEntity (source );
184
187
assertThat (source .variableMetaModel ()).isEqualTo (previousElementMetaModel );
185
188
assertThat (source .isTopLevel ()).isTrue ();
189
+ assertThat (source .onRootEntity ()).isFalse ();
186
190
assertThat (source .isDeclarative ()).isFalse ();
187
191
assertThat (source .targetVariableMetamodel ()).isEqualTo (shadowVariableMetaModel );
188
192
assertThat (source .downstreamDeclarativeVariableMetamodel ()).isNull ();
@@ -220,6 +224,7 @@ void pathUsingDeclarativeShadowAfterGroupAfterFact() {
220
224
assertEmptyChainToVariableEntity (source );
221
225
assertThat (source .variableMetaModel ()).isEqualTo (dependencyMetaModel );
222
226
assertThat (source .isTopLevel ()).isTrue ();
227
+ assertThat (source .onRootEntity ()).isFalse ();
223
228
assertThat (source .isDeclarative ()).isTrue ();
224
229
assertThat (source .targetVariableMetamodel ()).isEqualTo (shadowVariableMetaModel );
225
230
assertThat (source .downstreamDeclarativeVariableMetamodel ()).isEqualTo (dependencyMetaModel );
@@ -259,6 +264,7 @@ void pathUsingDeclarativeShadowAfterBuiltinShadow() {
259
264
assertEmptyChainToVariableEntity (previousSource );
260
265
assertThat (previousSource .variableMetaModel ()).isEqualTo (previousElementMetaModel );
261
266
assertThat (previousSource .isTopLevel ()).isTrue ();
267
+ assertThat (previousSource .onRootEntity ()).isTrue ();
262
268
assertThat (previousSource .isDeclarative ()).isFalse ();
263
269
assertThat (previousSource .targetVariableMetamodel ()).isEqualTo (shadowVariableMetaModel );
264
270
assertThat (previousSource .downstreamDeclarativeVariableMetamodel ()).isEqualTo (dependencyMetaModel );
@@ -285,6 +291,44 @@ void pathUsingDeclarativeShadowAfterBuiltinShadow() {
285
291
verifyNoMoreInteractions (rootVisitor );
286
292
}
287
293
294
+ @ Test
295
+ void pathUsingBuiltinShadowAfterFact () {
296
+ var rootVariableSource = RootVariableSource .from (
297
+ planningSolutionMetaModel ,
298
+ TestdataInvalidDeclarativeValue .class ,
299
+ "shadow" ,
300
+ "fact.previous" ,
301
+ DEFAULT_MEMBER_ACCESSOR_FACTORY ,
302
+ DEFAULT_DESCRIPTOR_POLICY );
303
+
304
+ assertThat (rootVariableSource .rootEntity ()).isEqualTo (TestdataInvalidDeclarativeValue .class );
305
+ assertThat (rootVariableSource .variableSourceReferences ()).hasSize (1 );
306
+ var previousSource = rootVariableSource .variableSourceReferences ().get (0 );
307
+
308
+ assertChainToVariableEntity (previousSource , "fact" );
309
+ assertThat (previousSource .variableMetaModel ()).isEqualTo (previousElementMetaModel );
310
+ assertThat (previousSource .onRootEntity ()).isFalse ();
311
+ assertThat (previousSource .isTopLevel ()).isTrue ();
312
+ assertThat (previousSource .isDeclarative ()).isFalse ();
313
+ assertThat (previousSource .targetVariableMetamodel ()).isEqualTo (shadowVariableMetaModel );
314
+ assertThat (previousSource .downstreamDeclarativeVariableMetamodel ()).isNull ();
315
+
316
+ var previousElement = new TestdataInvalidDeclarativeValue ("previous" );
317
+ var factElement = new TestdataInvalidDeclarativeValue ("fact" );
318
+ var currentElement = new TestdataInvalidDeclarativeValue ("current" );
319
+
320
+ factElement .setPrevious (previousElement );
321
+ currentElement .setFact (factElement );
322
+
323
+ var result = previousSource .targetEntityFunctionStartingFromVariableEntity ().apply (factElement );
324
+ assertThat (result ).isSameAs (factElement );
325
+
326
+ var rootVisitor = mock (Consumer .class );
327
+ rootVariableSource .valueEntityFunction ().accept (currentElement , rootVisitor );
328
+ verify (rootVisitor ).accept (factElement );
329
+ verifyNoMoreInteractions (rootVisitor );
330
+ }
331
+
288
332
@ Test
289
333
@ SuppressWarnings ("unchecked" )
290
334
void pathUsingDeclarativeShadowAfterBuiltinShadowAfterGroup () {
@@ -303,6 +347,7 @@ void pathUsingDeclarativeShadowAfterBuiltinShadowAfterGroup() {
303
347
assertEmptyChainToVariableEntity (previousSource );
304
348
assertThat (previousSource .variableMetaModel ()).isEqualTo (previousElementMetaModel );
305
349
assertThat (previousSource .isTopLevel ()).isTrue ();
350
+ assertThat (previousSource .onRootEntity ()).isFalse ();
306
351
assertThat (previousSource .isDeclarative ()).isFalse ();
307
352
assertThat (previousSource .targetVariableMetamodel ()).isEqualTo (shadowVariableMetaModel );
308
353
assertThat (previousSource .downstreamDeclarativeVariableMetamodel ()).isEqualTo (dependencyMetaModel );
@@ -312,6 +357,7 @@ void pathUsingDeclarativeShadowAfterBuiltinShadowAfterGroup() {
312
357
assertChainToVariableEntity (dependencySource , "previous" );
313
358
assertThat (dependencySource .variableMetaModel ()).isEqualTo (dependencyMetaModel );
314
359
assertThat (dependencySource .isTopLevel ()).isFalse ();
360
+ assertThat (dependencySource .onRootEntity ()).isFalse ();
315
361
assertThat (dependencySource .isDeclarative ()).isTrue ();
316
362
assertThat (dependencySource .targetVariableMetamodel ()).isEqualTo (shadowVariableMetaModel );
317
363
assertThat (dependencySource .downstreamDeclarativeVariableMetamodel ()).isEqualTo (dependencyMetaModel );
@@ -362,23 +408,7 @@ void invalidPathUsingBuiltinShadowAfterBuiltinShadow() {
362
408
.hasMessageContaining ("The source path (previous.previous)" +
363
409
" starting from root entity class (TestdataInvalidDeclarativeValue)" +
364
410
" accesses a non-declarative shadow variable (previous)" +
365
- " not from the root entity or collection." );
366
- }
367
-
368
- @ Test
369
- void invalidPathUsingBuiltinShadowAfterFact () {
370
- assertThatCode (() -> RootVariableSource .from (
371
- planningSolutionMetaModel ,
372
- TestdataInvalidDeclarativeValue .class ,
373
- "shadow" ,
374
- "fact.previous" ,
375
- DEFAULT_MEMBER_ACCESSOR_FACTORY ,
376
- DEFAULT_DESCRIPTOR_POLICY ))
377
- .isInstanceOf (IllegalArgumentException .class )
378
- .hasMessageContaining ("The source path (fact.previous)" +
379
- " starting from root entity class (TestdataInvalidDeclarativeValue)" +
380
- " accesses a non-declarative shadow variable (previous)" +
381
- " not from the root entity or collection." );
411
+ " after another non-declarative shadow variable (previous)." );
382
412
}
383
413
384
414
@ Test
0 commit comments