3939import org .junit .jupiter .api .BeforeEach ;
4040import org .junit .jupiter .api .DisplayNameGenerator ;
4141import org .junit .jupiter .api .Named ;
42+ import org .junit .jupiter .api .Nested ;
4243import org .junit .jupiter .api .Tag ;
4344import org .junit .jupiter .api .Test ;
4445import org .junit .jupiter .api .extension .Extension ;
@@ -111,33 +112,63 @@ void fromJupiterEngineDescriptor() {
111112}
112113
113114@ Test
114- @ SuppressWarnings ("resource" )
115115void fromClassTestDescriptor () {
116116var nestedClassDescriptor = nestedClassDescriptor ();
117117var outerClassDescriptor = outerClassDescriptor (nestedClassDescriptor );
118+ var doublyNestedClassDescriptor = doublyNestedClassDescriptor ();
119+ var methodTestDescriptor = nestedMethodDescriptor ();
120+ nestedClassDescriptor .addChild (doublyNestedClassDescriptor );
121+ nestedClassDescriptor .addChild (methodTestDescriptor );
118122
119123var outerExtensionContext = new ClassExtensionContext (null , null , outerClassDescriptor , configuration ,
120124extensionRegistry , null );
121125
122126// @formatter:off
123127assertAll ("outerContext" ,
124- () -> assertThat (outerExtensionContext .getElement ()).contains (OuterClass .class ),
125- () -> assertThat (outerExtensionContext .getTestClass ()).contains (OuterClass .class ),
128+ () -> assertThat (outerExtensionContext .getElement ()).contains (OuterClassTestCase .class ),
129+ () -> assertThat (outerExtensionContext .getTestClass ()).contains (OuterClassTestCase .class ),
126130() -> assertThat (outerExtensionContext .getTestInstance ()).isEmpty (),
127131() -> assertThat (outerExtensionContext .getTestMethod ()).isEmpty (),
128- () -> assertThat (outerExtensionContext .getRequiredTestClass ()).isEqualTo (OuterClass .class ),
132+ () -> assertThat (outerExtensionContext .getRequiredTestClass ()).isEqualTo (OuterClassTestCase .class ),
129133() -> assertThrows (PreconditionViolationException .class , outerExtensionContext ::getRequiredTestInstance ),
130134() -> assertThrows (PreconditionViolationException .class , outerExtensionContext ::getRequiredTestMethod ),
131135() -> assertThat (outerExtensionContext .getDisplayName ()).isEqualTo (outerClassDescriptor .getDisplayName ()),
132136() -> assertThat (outerExtensionContext .getParent ()).isEmpty (),
133137() -> assertThat (outerExtensionContext .getExecutionMode ()).isEqualTo (ExecutionMode .SAME_THREAD ),
134- () -> assertThat (outerExtensionContext .getExtensions (PreInterruptCallback .class )).isEmpty ()
138+ () -> assertThat (outerExtensionContext .getExtensions (PreInterruptCallback .class )).isEmpty (),
139+ () -> assertThat (outerExtensionContext .getEnclosingTestClasses ()).isEmpty ()
135140);
136141// @formatter:on
137142
138143var nestedExtensionContext = new ClassExtensionContext (outerExtensionContext , null , nestedClassDescriptor ,
139144configuration , extensionRegistry , null );
140- assertThat (nestedExtensionContext .getParent ()).containsSame (outerExtensionContext );
145+ // @formatter:off
146+ assertAll ("nestedContext" ,
147+ () -> assertThat (nestedExtensionContext .getParent ()).containsSame (outerExtensionContext ),
148+ () -> assertThat (nestedExtensionContext .getTestClass ()).contains (OuterClassTestCase .NestedClass .class ),
149+ () -> assertThat (nestedExtensionContext .getEnclosingTestClasses ()).containsExactly (OuterClassTestCase .class )
150+ );
151+ // @formatter:on
152+
153+ var doublyNestedExtensionContext = new ClassExtensionContext (nestedExtensionContext , null ,
154+ doublyNestedClassDescriptor , configuration , extensionRegistry , null );
155+ // @formatter:off
156+ assertAll ("doublyNestedContext" ,
157+ () -> assertThat (doublyNestedExtensionContext .getParent ()).containsSame (nestedExtensionContext ),
158+ () -> assertThat (doublyNestedExtensionContext .getTestClass ()).contains (OuterClassTestCase .NestedClass .DoublyNestedClass .class ),
159+ () -> assertThat (doublyNestedExtensionContext .getEnclosingTestClasses ()).containsExactly (OuterClassTestCase .class , OuterClassTestCase .NestedClass .class )
160+ );
161+ // @formatter:on
162+
163+ var methodExtensionContext = new MethodExtensionContext (nestedExtensionContext , null , methodTestDescriptor ,
164+ configuration , extensionRegistry , new OpenTest4JAwareThrowableCollector ());
165+ // @formatter:off
166+ assertAll ("methodContext" ,
167+ () -> assertThat (methodExtensionContext .getParent ()).containsSame (nestedExtensionContext ),
168+ () -> assertThat (methodExtensionContext .getTestClass ()).contains (OuterClassTestCase .NestedClass .class ),
169+ () -> assertThat (methodExtensionContext .getEnclosingTestClasses ()).containsExactly (OuterClassTestCase .class )
170+ );
171+ // @formatter:on
141172}
142173
143174@ Test
@@ -154,7 +185,6 @@ void ExtensionContext_With_ExtensionRegistry_getExtensions() {
154185}
155186
156187@ Test
157- @ SuppressWarnings ("resource" )
158188void tagsCanBeRetrievedInExtensionContext () {
159189var nestedClassDescriptor = nestedClassDescriptor ();
160190var outerClassDescriptor = outerClassDescriptor (nestedClassDescriptor );
@@ -174,20 +204,19 @@ void tagsCanBeRetrievedInExtensionContext() {
174204
175205var methodExtensionContext = new MethodExtensionContext (outerExtensionContext , null , methodTestDescriptor ,
176206configuration , extensionRegistry , new OpenTest4JAwareThrowableCollector ());
177- methodExtensionContext .setTestInstances (DefaultTestInstances .of (new OuterClass ()));
207+ methodExtensionContext .setTestInstances (DefaultTestInstances .of (new OuterClassTestCase ()));
178208assertThat (methodExtensionContext .getTags ()).containsExactlyInAnyOrder ("outer-tag" , "method-tag" );
179209assertThat (methodExtensionContext .getRoot ()).isSameAs (outerExtensionContext );
180210}
181211
182212@ Test
183- @ SuppressWarnings ("resource" )
184213void fromMethodTestDescriptor () {
185214var methodTestDescriptor = methodDescriptor ();
186215var classTestDescriptor = outerClassDescriptor (methodTestDescriptor );
187216var engineDescriptor = new JupiterEngineDescriptor (UniqueId .forEngine ("junit-jupiter" ), configuration );
188217engineDescriptor .addChild (classTestDescriptor );
189218
190- Object testInstance = new OuterClass ();
219+ Object testInstance = new OuterClassTestCase ();
191220var testMethod = methodTestDescriptor .getTestMethod ();
192221
193222var engineExtensionContext = new JupiterEngineExtensionContext (null , engineDescriptor , configuration ,
@@ -201,10 +230,11 @@ void fromMethodTestDescriptor() {
201230// @formatter:off
202231assertAll ("methodContext" ,
203232() -> assertThat (methodExtensionContext .getElement ()).contains (testMethod ),
204- () -> assertThat (methodExtensionContext .getTestClass ()).contains (OuterClass .class ),
233+ () -> assertThat (methodExtensionContext .getTestClass ()).contains (OuterClassTestCase .class ),
234+ () -> assertThat (methodExtensionContext .getEnclosingTestClasses ()).isEmpty (),
205235() -> assertThat (methodExtensionContext .getTestInstance ()).contains (testInstance ),
206236() -> assertThat (methodExtensionContext .getTestMethod ()).contains (testMethod ),
207- () -> assertThat (methodExtensionContext .getRequiredTestClass ()).isEqualTo (OuterClass .class ),
237+ () -> assertThat (methodExtensionContext .getRequiredTestClass ()).isEqualTo (OuterClassTestCase .class ),
208238() -> assertThat (methodExtensionContext .getRequiredTestInstance ()).isEqualTo (testInstance ),
209239() -> assertThat (methodExtensionContext .getRequiredTestMethod ()).isEqualTo (testMethod ),
210240() -> assertThat (methodExtensionContext .getDisplayName ()).isEqualTo (methodTestDescriptor .getDisplayName ()),
@@ -359,7 +389,7 @@ void usingStore() {
359389extensionRegistry , null );
360390var childContext = new MethodExtensionContext (parentContext , null , methodTestDescriptor , configuration ,
361391extensionRegistry , new OpenTest4JAwareThrowableCollector ());
362- childContext .setTestInstances (DefaultTestInstances .of (new OuterClass ()));
392+ childContext .setTestInstances (DefaultTestInstances .of (new OuterClassTestCase ()));
363393
364394var childStore = childContext .getStore (Namespace .GLOBAL );
365395var parentStore = parentContext .getStore (Namespace .GLOBAL );
@@ -430,13 +460,18 @@ void configurationParameter(Function<JupiterConfiguration, ? extends ExtensionCo
430460}
431461
432462private NestedClassTestDescriptor nestedClassDescriptor () {
433- return new NestedClassTestDescriptor (UniqueId .root ("nested-class" , "NestedClass" ), OuterClass .NestedClass .class ,
434- List ::of , configuration );
463+ return new NestedClassTestDescriptor (UniqueId .root ("nested-class" , "NestedClass" ),
464+ OuterClassTestCase .NestedClass .class , List ::of , configuration );
465+ }
466+
467+ private NestedClassTestDescriptor doublyNestedClassDescriptor () {
468+ return new NestedClassTestDescriptor (UniqueId .root ("nested-class" , "DoublyNestedClass" ),
469+ OuterClassTestCase .NestedClass .DoublyNestedClass .class , List ::of , configuration );
435470}
436471
437472private ClassTestDescriptor outerClassDescriptor (TestDescriptor child ) {
438- var classTestDescriptor = new ClassTestDescriptor (UniqueId .root ("class" , "OuterClass" ), OuterClass . class ,
439- configuration );
473+ var classTestDescriptor = new ClassTestDescriptor (UniqueId .root ("class" , "OuterClass" ),
474+ OuterClassTestCase . class , configuration );
440475if (child != null ) {
441476classTestDescriptor .addChild (child );
442477}
@@ -445,19 +480,41 @@ private ClassTestDescriptor outerClassDescriptor(TestDescriptor child) {
445480
446481private TestMethodTestDescriptor methodDescriptor () {
447482try {
448- return new TestMethodTestDescriptor (UniqueId .root ("method" , "aMethod" ), OuterClass .class ,
449- OuterClass .class .getDeclaredMethod ("aMethod" ), List ::of , configuration );
483+ return new TestMethodTestDescriptor (UniqueId .root ("method" , "aMethod" ), OuterClassTestCase .class ,
484+ OuterClassTestCase .class .getDeclaredMethod ("aMethod" ), List ::of , configuration );
450485}
451486catch (NoSuchMethodException e ) {
452487throw new RuntimeException (e );
453488}
454489}
455490
491+ private TestMethodTestDescriptor nestedMethodDescriptor () {
492+ try {
493+ return new TestMethodTestDescriptor (UniqueId .root ("method" , "nestedMethod" ),
494+ OuterClassTestCase .NestedClass .class , BaseNestedTestCase .class .getDeclaredMethod ("nestedMethod" ),
495+ List ::of , configuration );
496+ }
497+ catch (NoSuchMethodException e ) {
498+ throw new RuntimeException (e );
499+ }
500+ }
501+
502+ static abstract class BaseNestedTestCase {
503+ @ Test
504+ void nestedMethod () {
505+ }
506+
507+ @ Nested
508+ class DoublyNestedClass {
509+ }
510+ }
511+
456512@ Tag ("outer-tag" )
457- static class OuterClass {
513+ static class OuterClassTestCase {
458514
459515@ Tag ("nested-tag" )
460- static class NestedClass {
516+ @ Nested
517+ class NestedClass extends BaseNestedTestCase {
461518}
462519
463520@ Tag ("method-tag" )
0 commit comments