@Test public void testComputeAllSymbols_interface() throws InterruptedException, ExecutionException, IOException { addFileToFolder(workspaceRoot, "my/folder", "ICoordinates.groovy", "interface ICoordinates {\n" + " abstract double getAt(int idx);\n" + "}\n"); parser.parseAllSymbols(); Map<URI, Set<SymbolInformation>> symbols = parser.getFileSymbols(); // The symbols will contain a lot of inherited and default fields and methods, so we just check to make sure it // contains our custom fields and methods. assertThat(mapHasSymbol(symbols, Optional.absent(), "ICoordinates", SymbolKind.Interface)).isTrue(); assertThat(mapHasSymbol(symbols, Optional.of("ICoordinates"), "getAt", SymbolKind.Method)).isTrue(); assertThat(mapHasSymbol(symbols, Optional.of("getAt"), "idx", SymbolKind.Variable)).isTrue(); }
@Test public void testComputeAllSymbols_enum() throws InterruptedException, ExecutionException, IOException { addFileToFolder(workspaceRoot, "Type.groovy", "enum Type {\n" + " ONE, TWO, THREE\n" + "}\n"); parser.parseAllSymbols(); Map<URI, Set<SymbolInformation>> symbols = parser.getFileSymbols(); // The symbols will contain a lot of inherited and default fields and methods, so we just check to make sure it // contains our custom fields and methods. assertThat(mapHasSymbol(symbols, Optional.absent(), "Type", SymbolKind.Enum)).isTrue(); assertThat(mapHasSymbol(symbols, Optional.of("Type"), "ONE", SymbolKind.Field)).isTrue(); assertThat(mapHasSymbol(symbols, Optional.of("Type"), "TWO", SymbolKind.Field)).isTrue(); assertThat(mapHasSymbol(symbols, Optional.of("Type"), "THREE", SymbolKind.Field)).isTrue(); }
@Test public void testComputeAllSymbols_script() throws InterruptedException, ExecutionException, IOException { addFileToFolder(workspaceRoot, "test.groovy", "def name = \"Natacha\"\n" + "def myMethod() {\n" + " def someString = \"Also in symbols\"\n" + " println \"Hello World\"\n" + "}\n" + "println name\n" + "myMethod()\n"); parser.parseAllSymbols(); Map<URI, Set<SymbolInformation>> symbols = parser.getFileSymbols(); assertThat(mapHasSymbol(symbols, Optional.of("test"), "myMethod", SymbolKind.Method)).isTrue(); assertThat(mapHasSymbol(symbols, Optional.of("test"), "name", SymbolKind.Variable)).isTrue(); assertThat(mapHasSymbol(symbols, Optional.of("myMethod"), "someString", SymbolKind.Variable)).isTrue(); }
+ " }\n" + "}\n"); parser.parseAllSymbols();
@Test public void testComputeAllSymbols_class() throws InterruptedException, ExecutionException, IOException { File file = addFileToFolder(workspaceRoot, "someFolder", "Coordinates.groovy", "class Coordinates {\n" + " double latitude\n" + " double longitude\n" + " def name = \"Natacha\"\n" + " double getAt(int idx1, int idx2) {\n" + " def someString = \"Also in symbols\"\n" + " println someString\n" + " if (idx1 == 0) latitude\n" + " else if (idx1 == 1) longitude\n" + " else throw new Exception(\"Wrong coordinate index, use 0 or 1 \")\n" + " }\n" + "}\n"); parser.parseAllSymbols(); Map<URI, Set<SymbolInformation>> symbols = parser.getFileSymbols(); // Assert that the format of the URI doesn't change the result (i.e whether it starts with file:/ or file:///) assertEquals(parser.getFileSymbols().get(file.toURI()), parser.getFileSymbols().get(file.toPath().toUri())); // The symbols will contain a lot of inherited fields and methods, so we just check to make sure it contains our // custom fields and methods. assertThat(mapHasSymbol(symbols, Optional.absent(), "Coordinates", SymbolKind.Class)).isTrue(); assertThat(mapHasSymbol(symbols, Optional.of("Coordinates"), "getAt", SymbolKind.Method)).isTrue(); assertThat(mapHasSymbol(symbols, Optional.of("Coordinates"), "latitude", SymbolKind.Field)).isTrue(); assertThat(mapHasSymbol(symbols, Optional.of("Coordinates"), "longitude", SymbolKind.Field)).isTrue(); assertThat(mapHasSymbol(symbols, Optional.of("Coordinates"), "name", SymbolKind.Field)).isTrue(); assertThat(mapHasSymbol(symbols, Optional.of("getAt"), "idx1", SymbolKind.Variable)).isTrue(); assertThat(mapHasSymbol(symbols, Optional.of("getAt"), "idx2", SymbolKind.Variable)).isTrue(); assertThat(mapHasSymbol(symbols, Optional.of("getAt"), "someString", SymbolKind.Variable)).isTrue(); }
@Test public void testReferences_typeEnumOneLine() throws IOException { // edge case on one line File enumFile = addFileToFolder(workspaceRoot, "MyEnum.groovy", "enum MyEnum {ONE,TWO}\n"); File scriptFile = addFileToFolder(workspaceRoot, "MyScript.groovy", "MyEnum a\n\n"); parser.parseAllSymbols(); // Find one line enum correctly Set<Location> myEnumExpectedResult = Sets.newHashSet( createLocation(scriptFile.toPath(), Ranges.createRange(0, 0, 0, 6))); assertEquals(myEnumExpectedResult, parser.findReferences(createReferenceParams(enumFile.toURI(), 0, 6, false))); }
@Test public void testGotoDefinition_multipleFiles() throws IOException { File dog = addFileToFolder(workspaceRoot, "mydogfolder", "Dog.groovy", "public class Dog {}\n"); File cat = addFileToFolder(workspaceRoot, "mycatfolder", "Cat.groovy", "public class Cat {\n" + " public static Dog dog = new Dog()\n" + " public static Dog foo() {\n" + " Dog newDog = new Dog()\n" + " foo()\n" + " return newDog\n" + " }\n" + "}\n"); parser.parseAllSymbols(); // Dog class Location expectedLocation = new Location(dog.toPath().toUri().toString(), Ranges.createRange(0, 0, 0, 19)); assertEquals(Optional.of(expectedLocation), parser.gotoDefinition(cat.toURI(), new Position(1, 18))); assertEquals(Optional.of(expectedLocation), parser.gotoDefinition(cat.toURI(), new Position(2, 18))); assertEquals(Optional.of(expectedLocation), parser.gotoDefinition(cat.toURI(), new Position(3, 8))); assertEquals(Optional.of(expectedLocation), parser.gotoDefinition(cat.toURI(), new Position(3, 25))); // newDog local variable expectedLocation = new Location(cat.toPath().toUri().toString(), Ranges.createRange(3, 11, 3, 17)); assertEquals(Optional.of(expectedLocation), parser.gotoDefinition(cat.toURI(), new Position(5, 18))); // foo method // TODO(#124): make this more accurate expectedLocation = new Location(cat.toPath().toUri().toString(), Ranges.createRange(2, 3, 6, 4)); assertEquals(Optional.of(expectedLocation), parser.gotoDefinition(cat.toURI(), new Position(4, 10))); }
@Test public void testReferences_catchStatement() throws IOException { File file = addFileToFolder(workspaceRoot, "Coordinates.groovy", "class Foo extends Throwable{}\n" + "try {\n" + " println \"Hello\"" + "}\n catch (Foo e1) {\n" + " println e1\n" + "}\n"); parser.parseAllSymbols(); // Class Foo Set<Location> expectedReferences = Sets.newHashSet(createLocation(file.toPath(), Ranges.createRange(3, 8, 3, 11))); // Get references when providing definition position assertEquals(expectedReferences, parser.findReferences(createReferenceParams(file.toURI(), 0, 6, false))); // Get references when providing position of usage assertEquals(expectedReferences, parser.findReferences(createReferenceParams(file.toURI(), 3, 9, false))); // TODO(#125): add a symbol for the exception variables and test here. }
@Test public void testReferences_typeInnerClassOneLine() throws IOException { // edge case on one line File innerClass = addFileToFolder(workspaceRoot, "AandB.groovy", "public class A {public static class B {}\n" + "A a\n" + "B b\n" + "}\n"); parser.parseAllSymbols(); // Identify type A correctly Set<Location> typeAExpectedResult = Sets.newHashSet( createLocation(innerClass.toPath(), Ranges.createRange(1, 0, 1, 1))); assertEquals(typeAExpectedResult, parser.findReferences(createReferenceParams(innerClass.toURI(), 0, 6, false))); // Identify type B correctly Set<Location> typeBExpectedResult = Sets.newHashSet( createLocation(innerClass.toPath(), Ranges.createRange(2, 0, 2, 1))); assertEquals(typeBExpectedResult, parser.findReferences(createReferenceParams(innerClass.toURI(), 0, 17, false))); }
+ " }\n" + "}\n"); parser.parseAllSymbols();
@Test public void testReferences_typeEnum() throws IOException { File scriptFile = addFileToFolder(workspaceRoot, "MyScript.groovy", "Animal friend = Animal.CAT;\n" + "pet(friend1)\n" + "Animal pet(Animal animal) {\n" + " Animal myAnimal\n" + " println \"Pet the \" + animal\n" + " return animal\n" + "}\n" + "\n"); File animalFile = addFileToFolder(workspaceRoot, "Animal.groovy", "enum Animal {\n" + "CAT, DOG, BUNNY\n" + "}\n"); parser.parseAllSymbols(); Set<Location> expectedResult = Sets.newHashSet( createLocation(scriptFile.toPath(), Ranges.createRange(0, 0, 0, 6)), createLocation(scriptFile.toPath(), Ranges.createRange(0, 16, 0, 22)), createLocation(scriptFile.toPath(), Ranges.createRange(2, 0, 2, 6)), createLocation(scriptFile.toPath(), Ranges.createRange(2, 11, 2, 17)), createLocation(scriptFile.toPath(), Ranges.createRange(3, 3, 3, 9))); assertEquals(expectedResult, parser.findReferences(createReferenceParams(animalFile.toURI(), 0, 5, false))); }
@Test public void testReferences_typeFields() throws IOException { File dogFile = addFileToFolder(workspaceRoot, "Dog.groovy", "class Dog {\n" + " Cat friend1;\n" + " Cat friend2;\n" + " Cat bark(Cat enemy) {\n" + " Cat myCat\n" + " println \"Bark! \" + enemy.name\n" + " return friend1\n" + " }\n" + "}\n"); File catFile = addFileToFolder(workspaceRoot, "Cat.groovy", "class Cat {\n" + " public String name = \"Bobby\"\n" + "}\n"); parser.parseAllSymbols(); // Dog should have no references assertEquals(NO_REFERENCES, parser.findReferences(createReferenceParams(dogFile.toURI(), 0, 7, false))); Set<Location> expectedResult = Sets.newHashSet( createLocation(dogFile.toPath(), Ranges.createRange(1, 3, 1, 6)), createLocation(dogFile.toPath(), Ranges.createRange(2, 3, 2, 6)), createLocation(dogFile.toPath(), Ranges.createRange(3, 3, 3, 6)), createLocation(dogFile.toPath(), Ranges.createRange(3, 12, 3, 15)), createLocation(dogFile.toPath(), Ranges.createRange(4, 6, 4, 9))); assertEquals(expectedResult, parser.findReferences(createReferenceParams(catFile.toURI(), 0, 7, false))); }
+ " }\n" + "}\n"); parser.parseAllSymbols();
+ " public static int foo = 10" + "}\n"); parser.parseAllSymbols();
+ " abstract void something();\n" + "}\n"); parser.parseAllSymbols();
+ " }\n" + "}\n"); parser.parseAllSymbols();
"class Cat {\n" + "}\n"); parser.parseAllSymbols();
+ " }\n" + "}\n"); parser.parseAllSymbols();
+ "Test.myStaticMethod(0)\n" + "Test.myStaticMethod(0, 1)\n"); parser.parseAllSymbols();
+ " abstract double getAt(int idx);\n" + "}\n"); parser.parseAllSymbols();