package io.vertx.test.codegen;
import io.vertx.codegen.ClassModel;
import io.vertx.codegen.Generator;
import io.vertx.codegen.MethodInfo;
import io.vertx.codegen.doc.Doc;
import io.vertx.codegen.doc.Tag;
import io.vertx.codegen.doc.Token;
import io.vertx.test.codegen.doc.FooEnum;
import io.vertx.test.codegen.doc.LinkLabel;
import io.vertx.test.codegen.doc.LinkToEnum;
import io.vertx.test.codegen.doc.LinkToMethodInSameType;
import io.vertx.test.codegen.doc.LinkToSameType;
import org.junit.Test;
import javax.lang.model.element.ElementKind;
import java.util.Arrays;
import java.util.List;
import static org.junit.Assert.*;
/**
* @author <a href="mailto:julien@julienviet.com">Julien Viet</a>
*/
public class DocTest {
@Test
public void testTags() {
assertTag("foo");
assertTag("foo bar");
assertTag("foo bar");
assertTag("foo\nbar");
assertTag("foo \n bar");
assertTag(" foo");
assertTag("foo ");
}
private void assertTag(String value) {
Tag tag = new Tag("foo", value);
assertEquals(value, tag.getValue());
}
@Test
public void testCommentParser() {
assertComment("first", "first", null);
assertComment("first\n\nbody", "first", "body");
assertComment("first @tag", "first @tag", null);
assertComment("first\n@tag1 value1", "first", null, new Tag("tag1", "value1"));
assertComment("first\n@tag1 line1\nline2", "first", null, new Tag("tag1", "line1\nline2"));
assertComment("first\n@tag1 value1\n@tag2 value2", "first", null, new Tag("tag1", "value1"), new Tag("tag2", "value2"));
assertComment("@tag1 value", "", null, new Tag("tag1", "value"));
assertComment("\n@tag1 value", "", null, new Tag("tag1", "value"));
assertComment("@tag1 value1\n@tag2 value2", "", null, new Tag("tag1", "value1"), new Tag("tag2", "value2"));
}
private void assertComment(String text, String expectedFirstSentence, String expectedBody, Tag... expectedBlockTags) {
Doc comment = Doc.create(text);
assertEquals(expectedFirstSentence, comment.getFirstSentence().getValue());
assertEquals(expectedBody, comment.getBody() != null ? comment.getBody().getValue() : null);
assertEquals(Arrays.asList(expectedBlockTags), comment.getBlockTags());
}
@Test
public void testText() {
List<Token> events = Token.tokenize("abc");
assertEquals(1, events.size());
assertTrue(events.get(0).isText());
assertEquals("abc", events.get(0).getValue());
}
@Test
public void testTag1() {
List<Token> events = Token.tokenize("{@def}");
assertEquals(1, events.size());
assertTrue(events.get(0).isInlineTag());
assertEquals("{@def}", events.get(0).getValue());
assertEquals("def", ((Token.InlineTag)events.get(0)).getTag().getName());
assertEquals("", ((Token.InlineTag)events.get(0)).getTag().getValue());
}
@Test
public void testTag2() {
List<Token> events = Token.tokenize("{@def ghi}");
assertEquals(1, events.size());
assertTrue(events.get(0).isInlineTag());
assertEquals("{@def ghi}", events.get(0).getValue());
assertEquals("def", ((Token.InlineTag)events.get(0)).getTag().getName());
assertEquals(" ghi", ((Token.InlineTag)events.get(0)).getTag().getValue());
}
@Test
public void testTag3() {
List<Token> events = Token.tokenize("{@def\nghi}");
assertEquals(1, events.size());
assertTrue(events.get(0).isInlineTag());
assertEquals("{@def\nghi}", events.get(0).getValue());
assertEquals("def", ((Token.InlineTag)events.get(0)).getTag().getName());
assertEquals("\nghi", ((Token.InlineTag)events.get(0)).getTag().getValue());
}
@Test
public void testSequence() {
List<Token> events = Token.tokenize("abc{@def}\nghi{@jkl mno}\n");
assertEquals(6, events.size());
assertTrue(events.get(0).isText());
assertEquals("abc", events.get(0).getValue());
assertTrue(events.get(1).isInlineTag());
assertEquals("{@def}", events.get(1).getValue());
assertEquals("def", ((Token.InlineTag)events.get(1)).getTag().getName());
assertEquals("", ((Token.InlineTag)events.get(1)).getTag().getValue());
assertTrue(events.get(2).isLineBreak());
assertEquals("\n", events.get(2).getValue());
assertTrue(events.get(3).isText());
assertEquals("ghi", events.get(3).getValue());
assertTrue(events.get(4).isInlineTag());
assertEquals("{@jkl mno}", events.get(4).getValue());
assertEquals("jkl", ((Token.InlineTag)events.get(4)).getTag().getName());
assertEquals(" mno", ((Token.InlineTag)events.get(4)).getTag().getValue());
assertTrue(events.get(5).isLineBreak());
assertEquals("\n", events.get(5).getValue());
}
@Test
public void testLinkToMethodInSameType() throws Exception {
ClassModel model = new Generator().generateClass(LinkToMethodInSameType.class);
MethodInfo method = model.getMethodMap().get("m").get(0);
Doc doc = method.getDoc();
List<Token> tokens = doc.getTokens();
assertEquals(4, tokens.size());
for (Token token : tokens) {
Tag.Link link = (Tag.Link) ((Token.InlineTag) token).getTag();
assertEquals(ElementKind.METHOD, link.getTargetElement().getKind());
assertEquals("method(java.lang.String,int)", link.getTargetElement().toString());
}
}
@Test
public void testLinkToSameType() throws Exception {
ClassModel model = new Generator().generateClass(LinkToSameType.class);
MethodInfo method = model.getMethodMap().get("m").get(0);
Doc doc = method.getDoc();
List<Token> tokens = doc.getTokens();
assertEquals(2, tokens.size());
for (Token token : tokens) {
Tag.Link link = (Tag.Link) ((Token.InlineTag) token).getTag();
assertEquals(LinkToSameType.class.getName(), link.getTargetElement().toString());
}
}
@Test
public void testLinkToEnum() throws Exception {
ClassModel model = new Generator().generateClass(LinkToEnum.class);
MethodInfo method = model.getMethodMap().get("m").get(0);
Doc doc = method.getDoc();
List<Token> tokens = doc.getTokens();
assertEquals(2, tokens.size());
for (Token token : tokens) {
Tag.Link link = (Tag.Link) ((Token.InlineTag) token).getTag();
assertEquals(FooEnum.class.getName(), link.getTargetElement().toString());
}
}
@Test
public void testLinkLabel() throws Exception {
ClassModel model = new Generator().generateClass(LinkLabel.class);
MethodInfo method = model.getMethodMap().get("m").get(0);
Doc doc = method.getDoc();
List<Token> tokens = doc.getTokens();
String[] expectedLabels = {""," "," the label value"};
assertEquals(expectedLabels.length, tokens.size());
for (int i = 0;i < tokens.size();i++) {
Tag.Link link = (Tag.Link) ((Token.InlineTag) tokens.get(i)).getTag();
assertEquals("" + i,expectedLabels[i], link.getLabel());
}
}
@Test
public void testTagParam() {
assertTagParam("param_name param_desc", "param_name", "param_desc");
assertTagParam("param_name", "param_name", null);
assertTagParam("param_name ", "param_name", null);
assertTagParam("param_name ", "param_name", null);
assertTagParam("param_name param_desc", "param_name", "param_desc");
assertTagParam(" param_name param_desc", "param_name", "param_desc");
assertTagParam("param_name\nparam_desc", "param_name", "param_desc");
assertTagParam("param_name param_\ndesc", "param_name", "param_ desc");
assertTagParam("param_name param_desc ", "param_name", "param_desc");
assertTagParam("param_name param desc", "param_name", "param desc");
assertTagParam(")param_name param desc", null, null);
}
private void assertTagParam(String comment, String expectedName, String expectedDescription) {
Tag.Param param = new Tag.Param("param", comment);
assertEquals(expectedName, param.getParamName());
assertEquals(expectedDescription, param.getParamDescription());
}
}