@@ -81,6 +81,7 @@ void pathUsingBuiltinShadow() {
8181 assertEmptyChainToVariableEntity (source );
8282 assertThat (source .variableMetaModel ()).isEqualTo (previousElementMetaModel );
8383 assertThat (source .isTopLevel ()).isTrue ();
84+ assertThat (source .onRootEntity ()).isTrue ();
8485 assertThat (source .isDeclarative ()).isFalse ();
8586 assertThat (source .targetVariableMetamodel ()).isEqualTo (shadowVariableMetaModel );
8687 assertThat (source .downstreamDeclarativeVariableMetamodel ()).isNull ();
@@ -114,6 +115,7 @@ void pathUsingDeclarativeShadow() {
114115 assertEmptyChainToVariableEntity (source );
115116 assertThat (source .variableMetaModel ()).isEqualTo (dependencyMetaModel );
116117 assertThat (source .isTopLevel ()).isTrue ();
118+ assertThat (source .onRootEntity ()).isTrue ();
117119 assertThat (source .isDeclarative ()).isTrue ();
118120 assertThat (source .targetVariableMetamodel ()).isEqualTo (shadowVariableMetaModel );
119121 assertThat (source .downstreamDeclarativeVariableMetamodel ()).isEqualTo (dependencyMetaModel );
@@ -146,6 +148,7 @@ void pathUsingDeclarativeShadowAfterGroup() {
146148 assertEmptyChainToVariableEntity (source );
147149 assertThat (source .variableMetaModel ()).isEqualTo (dependencyMetaModel );
148150 assertThat (source .isTopLevel ()).isTrue ();
151+ assertThat (source .onRootEntity ()).isFalse ();
149152 assertThat (source .isDeclarative ()).isTrue ();
150153 assertThat (source .targetVariableMetamodel ()).isEqualTo (shadowVariableMetaModel );
151154 assertThat (source .downstreamDeclarativeVariableMetamodel ()).isEqualTo (dependencyMetaModel );
@@ -183,6 +186,7 @@ void pathUsingBuiltinShadowAfterGroup() {
183186 assertEmptyChainToVariableEntity (source );
184187 assertThat (source .variableMetaModel ()).isEqualTo (previousElementMetaModel );
185188 assertThat (source .isTopLevel ()).isTrue ();
189+ assertThat (source .onRootEntity ()).isFalse ();
186190 assertThat (source .isDeclarative ()).isFalse ();
187191 assertThat (source .targetVariableMetamodel ()).isEqualTo (shadowVariableMetaModel );
188192 assertThat (source .downstreamDeclarativeVariableMetamodel ()).isNull ();
@@ -220,6 +224,7 @@ void pathUsingDeclarativeShadowAfterGroupAfterFact() {
220224 assertEmptyChainToVariableEntity (source );
221225 assertThat (source .variableMetaModel ()).isEqualTo (dependencyMetaModel );
222226 assertThat (source .isTopLevel ()).isTrue ();
227+ assertThat (source .onRootEntity ()).isFalse ();
223228 assertThat (source .isDeclarative ()).isTrue ();
224229 assertThat (source .targetVariableMetamodel ()).isEqualTo (shadowVariableMetaModel );
225230 assertThat (source .downstreamDeclarativeVariableMetamodel ()).isEqualTo (dependencyMetaModel );
@@ -259,6 +264,7 @@ void pathUsingDeclarativeShadowAfterBuiltinShadow() {
259264 assertEmptyChainToVariableEntity (previousSource );
260265 assertThat (previousSource .variableMetaModel ()).isEqualTo (previousElementMetaModel );
261266 assertThat (previousSource .isTopLevel ()).isTrue ();
267+ assertThat (previousSource .onRootEntity ()).isTrue ();
262268 assertThat (previousSource .isDeclarative ()).isFalse ();
263269 assertThat (previousSource .targetVariableMetamodel ()).isEqualTo (shadowVariableMetaModel );
264270 assertThat (previousSource .downstreamDeclarativeVariableMetamodel ()).isEqualTo (dependencyMetaModel );
@@ -285,6 +291,44 @@ void pathUsingDeclarativeShadowAfterBuiltinShadow() {
285291 verifyNoMoreInteractions (rootVisitor );
286292 }
287293
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+
288332 @ Test
289333 @ SuppressWarnings ("unchecked" )
290334 void pathUsingDeclarativeShadowAfterBuiltinShadowAfterGroup () {
@@ -303,6 +347,7 @@ void pathUsingDeclarativeShadowAfterBuiltinShadowAfterGroup() {
303347 assertEmptyChainToVariableEntity (previousSource );
304348 assertThat (previousSource .variableMetaModel ()).isEqualTo (previousElementMetaModel );
305349 assertThat (previousSource .isTopLevel ()).isTrue ();
350+ assertThat (previousSource .onRootEntity ()).isFalse ();
306351 assertThat (previousSource .isDeclarative ()).isFalse ();
307352 assertThat (previousSource .targetVariableMetamodel ()).isEqualTo (shadowVariableMetaModel );
308353 assertThat (previousSource .downstreamDeclarativeVariableMetamodel ()).isEqualTo (dependencyMetaModel );
@@ -312,6 +357,7 @@ void pathUsingDeclarativeShadowAfterBuiltinShadowAfterGroup() {
312357 assertChainToVariableEntity (dependencySource , "previous" );
313358 assertThat (dependencySource .variableMetaModel ()).isEqualTo (dependencyMetaModel );
314359 assertThat (dependencySource .isTopLevel ()).isFalse ();
360+ assertThat (dependencySource .onRootEntity ()).isFalse ();
315361 assertThat (dependencySource .isDeclarative ()).isTrue ();
316362 assertThat (dependencySource .targetVariableMetamodel ()).isEqualTo (shadowVariableMetaModel );
317363 assertThat (dependencySource .downstreamDeclarativeVariableMetamodel ()).isEqualTo (dependencyMetaModel );
@@ -362,23 +408,7 @@ void invalidPathUsingBuiltinShadowAfterBuiltinShadow() {
362408 .hasMessageContaining ("The source path (previous.previous)" +
363409 " starting from root entity class (TestdataInvalidDeclarativeValue)" +
364410 " 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)." );
382412 }
383413
384414 @ Test
0 commit comments