blob: 32815dff4ed254957cdf32b5070f723ec63c19a4 [file] [log] [blame]
package org.netbeans.api.lsp;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import javax.swing.text.BadLocationException;
import javax.swing.text.DefaultStyledDocument;
import javax.swing.text.Document;
import org.netbeans.api.editor.mimelookup.MimeLookup;
import org.netbeans.api.editor.mimelookup.MimePath;
import org.netbeans.api.editor.mimelookup.test.MockMimeLookup;
import org.netbeans.junit.NbTestCase;
import org.netbeans.lib.editor.util.swing.DocumentUtilities;
import org.netbeans.spi.lsp.StructureProvider;
import org.openide.filesystems.FileObject;
import org.openide.filesystems.FileUtil;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
*
* @author Petr Pisl
*/
public class StructureElementTest extends NbTestCase {
private FileObject srcFile;
public StructureElementTest(String name) {
super(name);
}
@Override
protected void setUp() throws Exception {
super.setUp();
clearWorkDir();
FileObject workDir = FileUtil.toFileObject(getWorkDir());
srcFile = FileUtil.createData(workDir, "mytest.test");
MockMimeLookup.setInstances(MimePath.get("text/haha"), new HahaStructureProvider());
}
public void testStructureElements() {
Document doc = createDocument("text/haha", "");
StructureProvider structureProvider = MimeLookup.getLookup(DocumentUtilities.getMimeType(doc)).lookup(StructureProvider.class);
List<StructureElement> structure = structureProvider.getStructure(doc);
assertNotNull(structure);
assertEquals(1, structure.size());
// root
StructureElement root = structure.get(0);
assertEquals("Root1", root.getName());
assertEquals(StructureElement.Kind.Class, root.getKind());
assertEquals(10, root.getSelectionStartOffset());
assertEquals(50, root.getSelectionEndOffset());
assertEquals(5, root.getExpandedStartOffset());
assertEquals(51, root.getExpandedEndOffset());
assertEquals("detail", root.getDetail());
assertNull(root.getTags());
// children
structure = root.getChildren();
assertNotNull(structure);
assertEquals(2, structure.size());
StructureElement child1 = structure.get(0);
assertEquals("field1", child1.getName());
assertEquals(StructureElement.Kind.Field, child1.getKind());
assertEquals(20, child1.getSelectionStartOffset());
assertEquals(25, child1.getSelectionEndOffset());
assertEquals(15, child1.getExpandedStartOffset());
assertEquals(25, child1.getExpandedEndOffset());
assertNull(child1.getDetail());
assertNull(child1.getChildren());
assertNotNull(child1.getTags());
assertTrue(child1.getTags().contains(StructureElement.Tag.Deprecated));
StructureElement child2 = structure.get(1);
assertEquals("method1", child2.getName());
assertEquals(StructureElement.Kind.Method, child2.getKind());
assertEquals(30, child2.getSelectionStartOffset());
assertEquals(45, child2.getSelectionEndOffset());
assertEquals(26, child2.getExpandedStartOffset());
assertEquals(46, child2.getExpandedEndOffset());
assertEquals(": int", child2.getDetail());
assertNull(child2.getChildren());
assertNull(child2.getTags());
}
private Document createDocument(String mimeType, String contents) {
Document doc = new DefaultStyledDocument();
doc.putProperty("mimeType", mimeType);
try {
doc.insertString(0, contents, null);
return doc;
} catch (BadLocationException ble) {
throw new IllegalStateException(ble);
}
}
private class HahaStructureProvider implements StructureProvider {
List<StructureElement> elements;
public HahaStructureProvider() {
elements = new ArrayList<>();
addStructure();
}
@Override
public List<StructureElement> getStructure(Document doc) {
return elements;
}
private void addStructure() {
Builder root = StructureProvider.newBuilder("Root1", StructureElement.Kind.Class);
root.detail("detail");
root.selectionStartOffset(10).selectionEndOffset(50);
root.expandedStartOffset(5).expandedEndOffset(51);
Builder child1 = StructureProvider.newBuilder("field1", StructureElement.Kind.Field);
child1.selectionStartOffset(20).selectionEndOffset(25);
child1.expandedStartOffset(15).expandedEndOffset(25);
child1.addTag(StructureElement.Tag.Deprecated);
root.children(child1.build());
Builder child2 = StructureProvider.newBuilder("method1", StructureElement.Kind.Method);
child2.selectionStartOffset(30).selectionEndOffset(45);
child2.expandedStartOffset(26).expandedEndOffset(46);
child2.detail(": int");
root.children(child2.build());
elements.add(root.build());
}
}
}