2121
2222import java .lang .reflect .InvocationTargetException ;
2323import java .lang .reflect .Method ;
24+ import java .util .Map ;
2425
2526import org .apache .commons .text .CaseUtils ;
2627import org .junit .jupiter .api .BeforeEach ;
28+ import org .junit .jupiter .api .extension .RegisterExtension ;
2729import org .junit .jupiter .params .ParameterizedTest ;
2830import org .junit .jupiter .params .provider .MethodSource ;
31+ import org .junit .jupiter .params .provider .ValueSource ;
2932import org .mockito .stubbing .Stubber ;
3033import org .xwiki .rendering .listener .ListType ;
3134import org .xwiki .rendering .listener .Listener ;
3235import org .xwiki .rendering .listener .MetaData ;
36+ import org .xwiki .test .LogLevel ;
37+ import org .xwiki .test .junit5 .LogCaptureExtension ;
3338
3439import static org .junit .jupiter .api .Assertions .assertEquals ;
40+ import static org .junit .jupiter .api .Assertions .assertFalse ;
3541import static org .junit .jupiter .api .Assertions .assertNotNull ;
3642import static org .junit .jupiter .api .Assertions .assertNull ;
3743import static org .mockito .Mockito .doAnswer ;
@@ -50,6 +56,9 @@ class BlockStateChainingListenerTest
5056
5157 private ChainingListener mockListener ;
5258
59+ @ RegisterExtension
60+ private LogCaptureExtension logCaptureExtension = new LogCaptureExtension (LogLevel .DEBUG );
61+
5362 @ BeforeEach
5463 void setUpChain ()
5564 {
@@ -188,4 +197,61 @@ void testOnMethod(Method method, Object[] parameters) throws InvocationTargetExc
188197
189198 this .listener .endDocument (MetaData .EMPTY );
190199 }
200+
201+ @ ParameterizedTest
202+ @ ValueSource (booleans = { true , false })
203+ void testListItemWithoutParent (boolean withParameter ) throws Exception
204+ {
205+ Class <?>[] parameterTypes = withParameter ? new Class <?>[] { Map .class } : new Class <?>[0 ];
206+ Method beginMethod = BlockStateChainingListener .class .getDeclaredMethod ("beginListItem" , parameterTypes );
207+ Method endMethod = BlockStateChainingListener .class .getDeclaredMethod ("endListItem" , parameterTypes );
208+ Object [] parameters = withParameter ? new Object [] { Listener .EMPTY_PARAMETERS } : new Object [0 ];
209+
210+ this .listener .beginDocument (MetaData .EMPTY );
211+ beginMethod .invoke (this .listener , parameters );
212+ assertEquals (-1 , this .listener .getListItemIndex ());
213+ assertFalse (this .listener .isInList ());
214+ assertEquals (0 , this .listener .getListDepth ());
215+ endMethod .invoke (this .listener , parameters );
216+ beginMethod .invoke (this .listener , parameters );
217+ assertEquals (-1 , this .listener .getListItemIndex ());
218+ assertFalse (this .listener .isInList ());
219+ assertEquals (0 , this .listener .getListDepth ());
220+ endMethod .invoke (this .listener , parameters );
221+ this .listener .endDocument (MetaData .EMPTY );
222+
223+ assertEquals (2 , this .logCaptureExtension .size ());
224+ String expectedMessage =
225+ "Invalid nesting: list item" + (withParameter ? " with parameters" : "" ) + " outside list." ;
226+ for (int i = 0 ; i < 2 ; ++i ) {
227+ assertEquals (expectedMessage , this .logCaptureExtension .getLogEvent (i ).getMessage ());
228+ }
229+ }
230+
231+ @ ParameterizedTest
232+ @ ValueSource (strings = { "Term" , "Description" })
233+ void testDefinitionListItemWithoutParent (String methodSuffix ) throws Exception
234+ {
235+ Method beginMethod = BlockStateChainingListener .class .getDeclaredMethod ("beginDefinition" + methodSuffix );
236+ Method endMethod = BlockStateChainingListener .class .getDeclaredMethod ("endDefinition" + methodSuffix );
237+ this .listener .beginDocument (MetaData .EMPTY );
238+ beginMethod .invoke (this .listener );
239+ assertFalse (this .listener .isInDefinitionList ());
240+ assertEquals (-1 , this .listener .getDefinitionListItemIndex ());
241+ assertEquals (0 , this .listener .getDefinitionListDepth ());
242+ endMethod .invoke (this .listener );
243+ beginMethod .invoke (this .listener );
244+ assertFalse (this .listener .isInDefinitionList ());
245+ assertEquals (-1 , this .listener .getDefinitionListItemIndex ());
246+ assertEquals (0 , this .listener .getDefinitionListDepth ());
247+ endMethod .invoke (this .listener );
248+ this .listener .endDocument (MetaData .EMPTY );
249+
250+ assertEquals (2 , this .logCaptureExtension .size ());
251+ String expectedMessage =
252+ "Invalid nesting: definition " + methodSuffix .toLowerCase () + " outside definition list." ;
253+ for (int i = 0 ; i < 2 ; ++i ) {
254+ assertEquals (expectedMessage , this .logCaptureExtension .getLogEvent (i ).getMessage ());
255+ }
256+ }
191257}
0 commit comments