/*
* SonarQube Java
* Copyright (C) 2012-2016 SonarSource SA
* mailto:contact AT sonarsource DOT com
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package org.sonar.java.resolve;
import org.junit.BeforeClass;
import org.junit.Test;
import org.sonar.java.test.ImportsResolutionCases.ImportInnerClass;
import org.sonar.plugins.java.api.semantic.Symbol;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
// FIXME(Godin): must not depend on real files
public class ImportResolutionTest {
private static Result result;
//test inner imports
private ImportInnerClass importInnerClass;
@BeforeClass
public static void setUp() throws Exception {
result = Result.createFor("ImportResolution");
}
@Test
public void extends_should_point_to_correct_symbol() {
assertThat(result.symbol("Class2").kind == JavaSymbol.TYP).isTrue();
JavaSymbol.TypeJavaSymbol class1 = (JavaSymbol.TypeJavaSymbol) result.symbol("Class1");
JavaSymbol.TypeJavaSymbol class2 = (JavaSymbol.TypeJavaSymbol) result.symbol("Class2");
assertThat(class2.getSuperclass().symbol).isEqualTo(class1);
assertThat(class1.getSuperclass()).isNotNull();
assertThat(class1.getSuperclass().symbol.name).isEqualTo("Collection");
JavaSymbol.TypeJavaSymbol interface1 = (JavaSymbol.TypeJavaSymbol) result.symbol("Interface1");
assertThat(interface1.getInterfaces()).isNotEmpty();
assertThat(interface1.getInterfaces().get(0).symbol.name).isEqualTo("List");
}
@Test
public void import_on_inner_type_should_be_resolved() throws Exception {
assertThat(result.symbol("annotationTree").type.symbol.name).isEqualTo("NotImplementedTreeImpl");
assertThat(result.symbol("annotationTree").type.symbol.owner().name).isEqualTo("JavaTree");
}
@Test
public void import_static_var_should_be_resolved() throws Exception {
JavaSymbol http_ok = result.symbol("HTTP_OK");
assertThat(http_ok.owner().name).isEqualTo("HttpURLConnection");
assertThat(http_ok.owner().type.symbol.name).isEqualTo("HttpURLConnection");
assertThat(http_ok.kind).isEqualTo(JavaSymbol.VAR);
assertThat(http_ok.type.tag).isEqualTo(JavaType.INT);
}
@Test
public void import_static_method_should_be_resolved() throws Exception {
JavaSymbol reverse = result.symbol("reverse");
assertThat(reverse.owner().name).isEqualTo("Collections");
assertThat(reverse.owner().type.symbol.name).isEqualTo("Collections");
assertThat(reverse.kind).isEqualTo(JavaSymbol.MTH);
}
@Test
public void import_static_method_should_be_resolved_when_refering_to_multiple_symbols() throws Exception {
JavaSymbol sort = result.symbol("sort");
assertThat(sort.owner().name).isEqualTo("Collections");
assertThat(sort.owner().type.symbol.name).isEqualTo("Collections");
assertThat(sort.kind).isEqualTo(JavaSymbol.MTH);
assertThat(sort.type.tag).isEqualTo(JavaType.METHOD);
assertThat(result.reference(46, 7).name).isEqualTo("sort");
assertThat(result.reference(46, 7)).isEqualTo(sort);
JavaSymbol sortMethod = result.reference(47, 7);
assertThat(sortMethod.name).isEqualTo("sort");
assertThat(sortMethod).isNotEqualTo(sort);
assertThat(sortMethod.isMethodSymbol()).isTrue();
assertThat(((Symbol.MethodSymbol) sortMethod).parameterTypes()).hasSize(2);
JavaSymbol nCopiesSymbol = result.symbol("nCopies");
assertThat(result.reference(67, 5)).isSameAs(nCopiesSymbol);
assertThat(result.reference(68, 5)).isSameAs(nCopiesSymbol);
}
@Test
public void package_should_be_resolved() {
assertThat(result.symbol("sym")).isNotNull();
assertThat(result.symbol("sym").kind).isEqualTo(JavaSymbol.PCK);
assertThat(result.symbol("sym").owner().kind).isEqualTo(JavaSymbol.PCK);
//default package name is empty
assertThat(result.symbol("sym").owner().name).isEmpty();
}
@Test
public void types_from_same_package_should_be_resolved() {
Result result1 = Result.createForJavaFile("src/test/java/org/sonar/java/resolve/BytecodeCompleterTest");
JavaSymbol.TypeJavaSymbol thisTest = (JavaSymbol.TypeJavaSymbol) result1.symbol("BytecodeCompleterTest");
List<JavaSymbol> symbols = thisTest.members().lookup("bytecodeCompleterPackageVisibility");
assertThat(symbols).hasSize(1);
JavaSymbol.VariableJavaSymbol symbol = (JavaSymbol.VariableJavaSymbol) symbols.get(0);
assertThat(symbol.type.symbol.name).isEqualTo("BytecodeCompleterPackageVisibility");
assertThat(symbol.type.symbol.owner().name).isEqualTo(thisTest.owner().name);
}
@Test
public void star_imports_should_be_resolved() {
JavaSymbol sort = result.symbol("file");
assertThat(sort.type.symbol.name).isEqualTo("File");
assertThat(sort.type.symbol.owner().name).isEqualTo("java.io");
}
@Test
public void star_imports_on_type_should_be_resolved() {
Result result1 = Result.createForJavaFile("src/test/java/org/sonar/java/resolve/ImportResolutionTest");
JavaSymbol importInnerClassSymbol = result1.symbol("importInnerClass");
assertThat(importInnerClassSymbol.type.symbol.name).isEqualTo("ImportInnerClass");
assertThat(importInnerClassSymbol.type.symbol.owner().name).isEqualTo("ImportsResolutionCases");
assertThat(importInnerClassSymbol.type.symbol.owner().owner().name).isEqualTo("org.sonar.java.test");
}
@Test
public void import_static_on_demand_should_be_resolved() throws Exception {
JavaSymbol http_accepted = result.reference(42, 10);
assertThat(http_accepted.name).isEqualTo("HTTP_ACCEPTED");
assertThat(http_accepted.owner().name).isEqualTo("HttpURLConnection");
assertThat(http_accepted.owner().type.symbol.name).isEqualTo("HttpURLConnection");
assertThat(http_accepted.kind).isEqualTo(JavaSymbol.VAR);
assertThat(http_accepted.type.tag).isEqualTo(JavaType.INT);
}
@Test
public void imports_from_java_lang() {
JavaSymbol iterable = result.symbol("iterable");
assertThat(iterable.type.symbol.name).isEqualTo("Iterable");
assertThat(iterable.type.symbol.owner().name).isEqualTo("java.lang");
}
@Test
public void only_one_symbol_per_class_should_be_created() {
Result result1 = Result.createForJavaFile("src/test/java/org/sonar/java/resolve/BytecodeCompleterTest");
JavaSymbol.TypeJavaSymbol thisTest = (JavaSymbol.TypeJavaSymbol) result1.symbol("BytecodeCompleterTest");
List<JavaSymbol> symbols = thisTest.members().lookup("bytecodeCompleterPackageVisibility");
assertThat(symbols).hasSize(1);
JavaSymbol.TypeJavaSymbol symbol = ((JavaSymbol.VariableJavaSymbol) symbols.get(0)).type.symbol;
symbols = symbol.members().lookup("bytecodeCompleterTest");
assertThat(symbols).hasSize(1);
JavaSymbol.TypeJavaSymbol test = ((JavaSymbol.VariableJavaSymbol) symbols.get(0)).type.symbol;
assertThat(test).isEqualTo(thisTest);
}
}