package jdave.junit4; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.util.ArrayList; import java.util.List; import java.util.Stack; import jdave.Specification; import org.junit.Before; import org.junit.Test; import org.junit.runner.Description; public class DescriptionFactoryTest { private Description desc; public static class ExampleSpec extends Specification<Stack<String>> { public class FirstContext { private Stack<String> stack; public Stack<String> create() { stack = new Stack<String>(); return stack; } public void firstSpecForFirstContext() { } public void secondSpecForFirstContext() { } } public class SecondContext { private Stack<Integer> stack; public Stack<Integer> create() { stack = new Stack<Integer>(); for (int i = 0; i < 10; i++) { stack.push(i); } return stack; } public void firstSpecForSecondContext() { } public void secondSpecForSecondContext() { } } } @Before public void setUp() throws Exception { desc = DescriptionFactory.create(ExampleSpec.class); } @Test public void testTopLevelDescriptionShouldBeTheSpecificationsFullyQualifiedClassName() throws Exception { assertEquals(ExampleSpec.class.getName(), desc.getDisplayName()); } @Test public void testTopLevelDescriptionShouldHaveOneChildPerEachContextClass() throws Exception { final List<Description> children = desc.getChildren(); assertEquals(2, children.size()); assertContainsDescription(children, "FirstContext"); assertContainsDescription(children, "SecondContext"); } private void assertContainsDescription(final List<Description> children, final String displayName) { final List<String> names = new ArrayList<String>(); for (final Description candidate : children) { names.add(candidate.getDisplayName()); } assertTrue("Description '" + displayName + "' not among " + names, names .contains(displayName)); } @Test public void contextDescriptionsShouldHaveOneChildPerEachSpecMethod() throws Exception { final List<Description> allSpecDescriptions = new ArrayList<Description>(); for (final Description context : desc.getChildren()) { allSpecDescriptions.addAll(context.getChildren()); } assertContainsDescription(allSpecDescriptions, "firstSpecForFirstContext(jdave.junit4.DescriptionFactoryTest$ExampleSpec$FirstContext)"); assertContainsDescription(allSpecDescriptions, "firstSpecForSecondContext(jdave.junit4.DescriptionFactoryTest$ExampleSpec$SecondContext)"); } }