package flow.netbeans.markdown.csl;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.netbeans.modules.csl.api.StructureItem;
import org.pegdown.ast.HeaderNode;
import org.pegdown.ast.TextNode;
public class MarkdownTOCBuilderTest {
private static final Comparator<StructureItem> BY_SORT_KEY = new Comparator<StructureItem>() {
@Override
public int compare(StructureItem o1, StructureItem o2) {
return o1.getSortText().compareTo(o2.getSortText());
}
};
@Before
public void setUp() {
}
@After
public void tearDown() {
}
/**
* Test fix for <a href="https://github.com/madflow/flow-netbeans-markdown/issues/114">issue #114</a>.
*/
@Test
public void testSortKeyReflectsDocumentStructure() {
// given
MarkdownTOCBuilder builder = new MarkdownTOCBuilder(null);
final int count = 20;
List<HeaderNode> nodes = createHeaderNodes(count);
// when
for (HeaderNode node : nodes) {
builder.add(node);
}
builder.finish(count * 100);
List<? extends StructureItem> items = builder.build();
// then
List<? extends StructureItem> expItems = new ArrayList<StructureItem>(items);
Collections.sort(expItems, BY_SORT_KEY);
Assert.assertEquals("items are sorted by sort key", expItems, items);
}
private List<HeaderNode> createHeaderNodes(int count) {
final List<HeaderNode> headerNodes = new ArrayList<HeaderNode>();
for (int index = 0; index < count; ++index) {
headerNodes.add(createHeaderNode(index));
}
return headerNodes;
}
private HeaderNode createHeaderNode(int index) {
TextNode textNode = new TextNode("Heading " + (index + 1));
HeaderNode headerNode = new HeaderNode(1, textNode);
headerNode.setStartIndex(index * 100);
textNode.setStartIndex(headerNode.getStartIndex() + 2);
textNode.setEndIndex(textNode.getStartIndex() + textNode.getText().length());
headerNode.setEndIndex(textNode.getEndIndex());
return headerNode;
}
}