package com.dmarcotte.handlebars.structure; import com.intellij.ide.structureView.StructureViewBuilder; import com.intellij.ide.structureView.impl.StructureViewComposite; import com.intellij.ide.structureView.newStructureView.StructureViewComponent; import com.intellij.lang.LanguageStructureViewBuilder; import com.intellij.openapi.fileEditor.FileEditor; import com.intellij.openapi.fileEditor.FileEditorManager; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiFile; import com.intellij.testFramework.fixtures.LightPlatformCodeInsightFixtureTestCase; import com.intellij.util.Consumer; import javax.swing.*; import static com.intellij.testFramework.PlatformTestUtil.assertTreeEqual; public class HbStructureViewTest extends LightPlatformCodeInsightFixtureTestCase { private static final String ourTestFileName = "test.hbs"; private void doStructureViewTest(final String fileText, final String expectedTree) { myFixture.configureByText(ourTestFileName, fileText); testStructureView(myFixture.getFile(), component -> { JTree tree = ((StructureViewComponent) component.getSelectedStructureView()).getTree(); // expand the whole tree int rowCount = tree.getRowCount(); for (int i = 0; i <= rowCount; i++) { tree.expandRow(i); } assertTreeEqual(tree, expectedTree + "\n"); }); } public void testStructureView(PsiFile file, Consumer<StructureViewComposite> consumer) { final VirtualFile vFile = file.getVirtualFile(); final FileEditor fileEditor = FileEditorManager.getInstance(getProject()).getSelectedEditor(vFile); final StructureViewBuilder builder = LanguageStructureViewBuilder.INSTANCE.getStructureViewBuilder(file); assert builder != null; StructureViewComposite composite = null; try { composite = (StructureViewComposite) builder.createStructureView(fileEditor, file.getProject()); consumer.consume(composite); } finally { if (composite != null) Disposer.dispose(composite); } } public void testNestedBlocks() throws Exception { doStructureViewTest( "{{#foo}}\n" + " {{#bar}}\n" + " {{baz}}<caret>\n" + " {{/bar}}\n" + "{{/foo}}\n", "-" + ourTestFileName + "\n" + " -foo\n" + " -bar\n" + " baz" ); } public void testUnclosedBlocks() throws Exception { doStructureViewTest( "{{#foo}}\n" + "{{^bar}}", "-" + ourTestFileName + "\n" + " -foo\n" + " bar" ); } public void testAllConstructs() throws Exception { doStructureViewTest( "{{#block}}\n" + "{{/block}}\n" + "{{^inverse}}\n" + " {{else}}\n" + "{{/inverse}}\n" + "{{mustache}}\n" + "{{>partial}}\n" + "{{#>partialBlock}}\n" + "{{/partialBlock}}\n" + "{{@data}}\n" + "{{^}}\n" + "{{{unescaped}}\n", "-" + ourTestFileName + "\n" + " block\n" + " -inverse\n" + " else\n" + " mustache\n" + " partial\n" + " partialBlock\n" + " @data\n" + " unescaped" ); } }