//////////////////////////////////////////////////////////////////////////////// // checkstyle: Checks Java source code for adherence to a set of rules. // Copyright (C) 2001-2017 the original author or authors. // // This library 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 2.1 of the License, or (at your option) any later version. // // This library 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 library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA //////////////////////////////////////////////////////////////////////////////// package com.puppycrawl.tools.checkstyle.utils; import static com.puppycrawl.tools.checkstyle.internal.TestUtils.assertUtilsClassHasPrivateConstructor; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.util.List; import org.junit.Test; import com.puppycrawl.tools.checkstyle.api.Comment; import com.puppycrawl.tools.checkstyle.api.DetailAST; import com.puppycrawl.tools.checkstyle.api.JavadocTokenTypes; import com.puppycrawl.tools.checkstyle.api.TokenTypes; import com.puppycrawl.tools.checkstyle.checks.javadoc.JavadocNodeImpl; import com.puppycrawl.tools.checkstyle.checks.javadoc.JavadocTag; import com.puppycrawl.tools.checkstyle.checks.javadoc.JavadocTagInfo; import com.puppycrawl.tools.checkstyle.checks.javadoc.JavadocTags; public class JavadocUtilsTest { @Test public void testTags() { final String[] text = { "/** @see elsewhere ", " * {@link List }, {@link List link text }", " {@link List#add(Object) link text}", " * {@link Class link text}", }; final Comment comment = new Comment(text, 1, 4, text[3].length()); final JavadocTags allTags = JavadocUtils.getJavadocTags(comment, JavadocUtils.JavadocTagType.ALL); assertEquals(5, allTags.getValidTags().size()); } @Test public void testTagType() { final String[] text = { "/** @see block", " * {@link List inline}, {@link List#add(Object)}", }; final Comment comment = new Comment(text, 1, 2, text[1].length()); final JavadocTags blockTags = JavadocUtils.getJavadocTags(comment, JavadocUtils.JavadocTagType.BLOCK); final JavadocTags inlineTags = JavadocUtils.getJavadocTags(comment, JavadocUtils.JavadocTagType.INLINE); assertEquals(1, blockTags.getValidTags().size()); assertEquals(2, inlineTags.getValidTags().size()); } @Test public void testInlineTagLinkText() { final String[] text = { "/** {@link List link text }", }; final Comment comment = new Comment(text, 1, 1, text[0].length()); final List<JavadocTag> tags = JavadocUtils.getJavadocTags( comment, JavadocUtils.JavadocTagType.ALL).getValidTags(); assertEquals("List link text", tags.get(0).getFirstArg()); } @Test public void testInlineTagMethodRef() { final String[] text = { "/** {@link List#add(Object)}", }; final Comment comment = new Comment(text, 1, 1, text[0].length()); final List<JavadocTag> tags = JavadocUtils.getJavadocTags( comment, JavadocUtils.JavadocTagType.ALL).getValidTags(); assertEquals("List#add(Object)", tags.get(0).getFirstArg()); } @Test public void testTagPositions() { final String[] text = { "/** @see elsewhere", " also {@link Name value} */", }; final Comment comment = new Comment(text, 1, 2, text[1].length()); final List<JavadocTag> tags = JavadocUtils.getJavadocTags( comment, JavadocUtils.JavadocTagType.ALL).getValidTags(); assertEquals(2, tags.size()); for (final JavadocTag tag : tags) { if (JavadocTagInfo.SEE.getName().equals(tag.getTagName())) { assertEquals(1, tag.getLineNo()); assertEquals(5, tag.getColumnNo()); } else if (JavadocTagInfo.LINK.getName().equals(tag.getTagName())) { assertEquals(2, tag.getLineNo()); assertEquals(10, tag.getColumnNo()); } else { fail("Unexpected tag: " + tag); } } } @Test public void testInvalidTags() { final String[] text = { "/** @fake block", " * {@bogus inline}", " * {@link List valid}", }; final Comment comment = new Comment(text, 1, 3, text[2].length()); final JavadocTags allTags = JavadocUtils.getJavadocTags(comment, JavadocUtils.JavadocTagType.ALL); assertEquals(2, allTags.getInvalidTags().size()); assertEquals(1, allTags.getValidTags().size()); } @Test public void testEmptyBlockComment() { final String emptyComment = ""; assertFalse(JavadocUtils.isJavadocComment(emptyComment)); } @Test public void testEmptyBlockCommentAst() { final DetailAST commentBegin = new DetailAST(); commentBegin.setType(TokenTypes.BLOCK_COMMENT_BEGIN); commentBegin.setText("/*"); final DetailAST commentContent = new DetailAST(); commentContent.setType(TokenTypes.COMMENT_CONTENT); commentContent.setText(""); final DetailAST commentEnd = new DetailAST(); commentEnd.setType(TokenTypes.BLOCK_COMMENT_END); commentEnd.setText("*/"); commentBegin.setFirstChild(commentContent); commentContent.setNextSibling(commentEnd); assertFalse(JavadocUtils.isJavadocComment(commentBegin)); } @Test public void testEmptyJavadocComment() { final String emptyJavadocComment = "*"; assertTrue(JavadocUtils.isJavadocComment(emptyJavadocComment)); } @Test public void testEmptyJavadocCommentAst() { final DetailAST commentBegin = new DetailAST(); commentBegin.setType(TokenTypes.BLOCK_COMMENT_BEGIN); commentBegin.setText("/*"); final DetailAST javadocCommentContent = new DetailAST(); javadocCommentContent.setType(TokenTypes.COMMENT_CONTENT); javadocCommentContent.setText("*"); final DetailAST commentEnd = new DetailAST(); commentEnd.setType(TokenTypes.BLOCK_COMMENT_END); commentEnd.setText("*/"); commentBegin.setFirstChild(javadocCommentContent); javadocCommentContent.setNextSibling(commentEnd); assertTrue(JavadocUtils.isJavadocComment(commentBegin)); } @Test public void testIsProperUtilsClass() throws ReflectiveOperationException { assertUtilsClassHasPrivateConstructor(JavadocUtils.class); } @Test public void testBranchContains() { final JavadocNodeImpl node = new JavadocNodeImpl(); final JavadocNodeImpl firstChild = new JavadocNodeImpl(); final JavadocNodeImpl secondChild = new JavadocNodeImpl(); node.setType(JavadocTokenTypes.JAVADOC); firstChild.setType(JavadocTokenTypes.BODY_TAG_OPEN); secondChild.setType(JavadocTokenTypes.CODE_LITERAL); node.setChildren(firstChild, secondChild); assertFalse(JavadocUtils.containsInBranch(node, JavadocTokenTypes.AUTHOR_LITERAL)); firstChild.setParent(node); secondChild.setParent(node); assertFalse(JavadocUtils.containsInBranch(node, JavadocTokenTypes.AUTHOR_LITERAL)); secondChild.setType(JavadocTokenTypes.AUTHOR_LITERAL); assertTrue(JavadocUtils.containsInBranch(node, JavadocTokenTypes.AUTHOR_LITERAL)); } @Test public void testGetTokenNameForId() { assertEquals("EOF", JavadocUtils.getTokenName(JavadocTokenTypes.EOF)); } @Test public void testGetTokenNameForLargeId() { try { JavadocUtils.getTokenName(20074); fail("exception expected"); } catch (IllegalArgumentException ex) { assertEquals("Unknown javadoc token id. Given id: 20074", ex.getMessage()); } } @Test public void testGetTokenNameForInvalidId() { try { JavadocUtils.getTokenName(100); fail("exception expected"); } catch (IllegalArgumentException ex) { assertEquals("Unknown javadoc token id. Given id: 100", ex.getMessage()); } } @Test public void testGetTokenIdThatIsUnknown() { try { JavadocUtils.getTokenId(""); fail("exception expected"); } catch (IllegalArgumentException ex) { assertEquals("Unknown javadoc token name. Given name ", ex.getMessage()); } } }