/* * 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.signature; import com.sonar.sslr.api.typed.ActionParser; import org.junit.Test; import org.sonar.java.ast.parser.JavaParser; import org.sonar.plugins.java.api.tree.ClassTree; import org.sonar.plugins.java.api.tree.CompilationUnitTree; import org.sonar.plugins.java.api.tree.MethodTree; import org.sonar.plugins.java.api.tree.Tree; import java.nio.charset.StandardCharsets; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; public class MethodSignatureScannerTest { @Test public void scan() { MethodSignature method = MethodSignatureScanner.scan("read(Ljava/lang/String;[S)V"); assertThat(method.getMethodName()).isEqualTo("read"); assertThat(method.getReturnType().getJvmJavaType()).isEqualTo(JvmJavaType.V); assertThat(method.getArgumentTypes().size()).isEqualTo(2); Parameter param1 = method.getArgumentTypes().get(0); assertThat(param1.isOject()).isTrue(); assertThat(param1.getClassName()).isEqualTo("String"); Parameter param2 = method.getArgumentTypes().get(1); assertThat(param2.isOject()).isFalse(); assertThat(param2.isArray()).isTrue(); assertThat(param2.getJvmJavaType()).isEqualTo(JvmJavaType.S); } @Test public void scanMethodWithReturnType() { MethodSignature method = MethodSignatureScanner.scan("read(Ljava/lang/String;S)[Ljava/util/Vector;"); assertThat(method.getReturnType().isOject()).isTrue(); assertThat(method.getReturnType().isArray()).isTrue(); assertThat(method.getReturnType().getClassName()).isEqualTo("Vector"); } @Test public void scanGenericMethod() { MethodSignature method = MethodSignatureScanner.scan("transactionValidation(Ljava/lang/String;Ljava/util/List<Ljava/lang/String;>;)V"); Parameter param1 = method.getArgumentTypes().get(0); assertThat(param1.isOject()).isTrue(); assertThat(param1.getClassName()).isEqualTo("String"); Parameter param2 = method.getArgumentTypes().get(1); assertThat(param2.isOject()).isTrue(); assertThat(param2.getClassName()).isEqualTo("List"); } @Test public void scanMethodTree() { ActionParser p = JavaParser.createParser(StandardCharsets.UTF_8); List<Tree> members = ((ClassTree) ((CompilationUnitTree) p.parse("class A { " + "A(){} " + "String[] method(int a){} " + "int foo(String a){}" + "java.lang.String bar(java.lang.String a){}" + "String qix(List<String> list){}" + "}")).types().get(0)).members(); MethodTree constructorTree = (MethodTree) members.get(0); MethodTree methodTree = (MethodTree) members.get(1); MethodTree primitiveReturnType = (MethodTree) members.get(2); MethodTree fullyQualifiedReturnType = (MethodTree) members.get(3); MethodTree genericParameter = (MethodTree) members.get(4); MethodSignature constructor = MethodSignatureScanner.scan(constructorTree); assertThat(constructor.getMethodName()).isEqualTo("<init>"); assertThat(constructor.getReturnType().isVoid()).isTrue(); MethodSignature method = MethodSignatureScanner.scan(methodTree); assertThat(method.getMethodName()).isEqualTo("method"); assertThat(method.getReturnType().isVoid()).isFalse(); assertThat(method.getReturnType().isArray()).isTrue(); assertThat(method.getReturnType().getClassName()).isEqualTo("String"); assertThat(method.getArgumentTypes().get(0).isOject()).isFalse(); method = MethodSignatureScanner.scan(primitiveReturnType); assertThat(method.getMethodName()).isEqualTo("foo"); assertThat(method.getReturnType().isVoid()).isFalse(); assertThat(method.getReturnType().isOject()).isFalse(); assertThat(method.getReturnType().isArray()).isFalse(); assertThat(method.getArgumentTypes().get(0).isOject()).isTrue(); assertThat(method.getArgumentTypes().get(0).getClassName()).isEqualTo("String"); method = MethodSignatureScanner.scan(fullyQualifiedReturnType); assertThat(method.getMethodName()).isEqualTo("bar"); assertThat(method.getReturnType().isVoid()).isFalse(); assertThat(method.getReturnType().isOject()).isTrue(); assertThat(method.getReturnType().isArray()).isFalse(); assertThat(method.getReturnType().getClassName()).isEqualTo("String"); assertThat(method.getArgumentTypes().get(0).getClassName()).isEqualTo("String"); method = MethodSignatureScanner.scan(genericParameter); assertThat(method.getMethodName()).isEqualTo("qix"); assertThat(method.getArgumentTypes().get(0).getClassName()).isEqualTo("List"); } }