DefaultJavaCommentParserTest.java
package com.thoughtworks.qdox.parser.impl;
import com.thoughtworks.qdox.builder.Builder;
import com.thoughtworks.qdox.parser.structs.TagDef;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.ArgumentCaptor;
import java.io.IOException;
import java.util.Collection;
import java.util.LinkedList;
import static org.mockito.Mockito.*;
import static org.mockito.AdditionalAnswers.returnsElementsOf;
public class DefaultJavaCommentParserTest
{
private Collection<Integer> lexValues = new LinkedList<Integer>();
private Collection<String> textValues = new LinkedList<String>();
private DefaultJavaCommentLexer lexer;
private Builder builder;
@BeforeEach
public void setUp() {
lexer = mock(DefaultJavaCommentLexer.class);
builder = mock(Builder.class);
lexValues.clear();
textValues.clear();
}
@AfterEach
public void tearDown()
{
verifyNoMoreInteractions( builder );
}
@Test
public void testOneLineJavaDoc() throws Exception {
// setup values
setupLex(DefaultJavaCommentParser.JAVADOCSTART);
setupLex(DefaultJavaCommentParser.JAVADOCLINE, "This is great!");
setupLex(DefaultJavaCommentParser.JAVADOCEND);
setupLex(0);
// execute
DefaultJavaCommentParser parser = new DefaultJavaCommentParser(lexer, builder);
parser.parse();
// verify
verify(builder).addJavaDoc( "This is great!" );
}
@Test
public void testOneJavaDocTag() throws Exception {
// setup values
setupLex(DefaultJavaCommentParser.JAVADOCSTART);
setupLex(DefaultJavaCommentParser.JAVADOCTAG, "@This");
setupLex(DefaultJavaCommentParser.JAVADOCLINE, "is great!");
setupLex(DefaultJavaCommentParser.JAVADOCEND);
setupLex(0);
// execute
DefaultJavaCommentParser parser = new DefaultJavaCommentParser(lexer, builder);
parser.parse();
ArgumentCaptor<TagDef> tagCaptor = ArgumentCaptor.forClass( TagDef.class );
// verify
verify(builder).addJavaDocTag( tagCaptor.capture() );
TagDef tag = tagCaptor.getValue();
Assertions.assertEquals("This", tag.getName());
Assertions.assertEquals("is great!", tag.getText());
}
@Test
public void testOneJavaDocTagWithNoValue() throws Exception {
// setup values
setupLex(DefaultJavaCommentParser.JAVADOCSTART);
setupLex(DefaultJavaCommentParser.JAVADOCTAG, "@eatme");
setupLex(DefaultJavaCommentParser.JAVADOCLINE, "");
setupLex(DefaultJavaCommentParser.JAVADOCEND);
setupLex(0);
// execute
DefaultJavaCommentParser parser = new DefaultJavaCommentParser(lexer, builder);
parser.parse();
ArgumentCaptor<TagDef> tagCaptor = ArgumentCaptor.forClass( TagDef.class );
// verify
verify(builder).addJavaDocTag( tagCaptor.capture() );
TagDef tag = tagCaptor.getValue();
Assertions.assertEquals("eatme", tag.getName());
Assertions.assertEquals("", tag.getText());
}
@Test
public void testOneMultiLineJavaDocTag() throws Exception {
// setup values
setupLex(DefaultJavaCommentParser.JAVADOCSTART);
setupLex(DefaultJavaCommentParser.JAVADOCTAG, "@This");
setupLex(DefaultJavaCommentParser.JAVADOCLINE, "is great! Mmmkay.");
setupLex(DefaultJavaCommentParser.JAVADOCEND);
setupLex(0);
// execute
DefaultJavaCommentParser parser = new DefaultJavaCommentParser(lexer, builder);
parser.parse();
ArgumentCaptor<TagDef> tagCaptor = ArgumentCaptor.forClass( TagDef.class );
// verify
verify( builder ).addJavaDocTag( tagCaptor.capture() );
TagDef tag = tagCaptor.getValue();
Assertions.assertEquals("This", tag.getName());
Assertions.assertEquals("is great! Mmmkay.", tag.getText());
}
@Test
public void testMultipleJavaDocTags() throws Exception {
// setup values
setupLex(DefaultJavaCommentParser.JAVADOCSTART);
setupLex(DefaultJavaCommentParser.JAVADOCTAG, "@This");
setupLex(DefaultJavaCommentParser.JAVADOCLINE, "is great!");
setupLex(DefaultJavaCommentParser.JAVADOCTAG, "@mock");
setupLex(DefaultJavaCommentParser.JAVADOCLINE, "generate");
setupLex(DefaultJavaCommentParser.JAVADOCEND);
setupLex(0);
// execute
DefaultJavaCommentParser parser = new DefaultJavaCommentParser(lexer, builder);
parser.parse();
ArgumentCaptor<TagDef> tagCaptor = ArgumentCaptor.forClass( TagDef.class );
// verify
verify(builder, times(2)).addJavaDocTag( tagCaptor.capture() );
TagDef tag1 = tagCaptor.getAllValues().get( 0 );
Assertions.assertEquals("This", tag1.getName());
Assertions.assertEquals("is great!", tag1.getText());
TagDef tag2 = tagCaptor.getAllValues().get( 1 ) ;
Assertions.assertEquals("mock", tag2.getName());
Assertions.assertEquals("generate", tag2.getText());
}
@Test
public void testJavaDocTextAndMultipleJavaDocTags() throws Exception {
// setup values
setupLex(DefaultJavaCommentParser.JAVADOCSTART);
setupLex(DefaultJavaCommentParser.JAVADOCLINE, "Welcome! Here is my class.");
setupLex(DefaultJavaCommentParser.JAVADOCTAG, "@This");
setupLex(DefaultJavaCommentParser.JAVADOCLINE, "is great!");
setupLex(DefaultJavaCommentParser.JAVADOCTAG, "@mock");
setupLex(DefaultJavaCommentParser.JAVADOCLINE, "generate");
setupLex(DefaultJavaCommentParser.JAVADOCEND);
setupLex(0);
// execute
DefaultJavaCommentParser parser = new DefaultJavaCommentParser(lexer, builder);
parser.parse();
ArgumentCaptor<TagDef> tagCaptor = ArgumentCaptor.forClass( TagDef.class );
// verify
verify(builder).addJavaDoc( "Welcome! Here is my class." );
verify(builder, times(2) ).addJavaDocTag( tagCaptor.capture() );
TagDef tag1 = tagCaptor.getAllValues().get( 0 );
Assertions.assertEquals("This", tag1.getName());
Assertions.assertEquals("is great!", tag1.getText());
TagDef tag2 = tagCaptor.getAllValues().get( 1 ) ;
Assertions.assertEquals("mock", tag2.getName());
Assertions.assertEquals("generate", tag2.getText());
}
@Test
public void testJavaDocEmpty() throws Exception {
// setup values
setupLex(DefaultJavaCommentParser.JAVADOCSTART);
setupLex(DefaultJavaCommentParser.JAVADOCLINE, "");
setupLex(DefaultJavaCommentParser.JAVADOCEND);
setupLex(0);
// execute
DefaultJavaCommentParser parser = new DefaultJavaCommentParser(lexer, builder);
parser.parse();
// verify
verify(builder).addJavaDoc( "" );
}
private void setupLex(int token, String value) {
lexValues.add( token );
textValues.add( value );
}
private void setupLex(int token) throws IOException {
setupLex(token, null);
if( token == 0)
{
when( lexer.lex() ).thenAnswer( returnsElementsOf( lexValues ) );
when( lexer.text() ).thenAnswer( returnsElementsOf( textValues ) );
when( lexer.getLine() ).thenReturn( -1 );
}
}
}