/**
* Copyright 2013-2015 John Ericksen
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.asciidoctor.asciidoclet;
import com.google.common.base.Optional;
import com.sun.javadoc.Doc;
import com.sun.javadoc.DocErrorReporter;
import com.sun.javadoc.ParamTag;
import com.sun.javadoc.Tag;
import org.asciidoctor.Asciidoctor;
import org.asciidoctor.Options;
import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentMatcher;
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.*;
/**
* @author John Ericksen
*/
public class AsciidoctorRendererTest {
private static final String BASE_DIR = "testBaseDir";
private AsciidoctorRenderer renderer;
private Asciidoctor mockAsciidoctor;
@Before
public void setup() {
mockAsciidoctor = mock(Asciidoctor.class);
renderer = new AsciidoctorRenderer(DocletOptions.NONE, mock(DocErrorReporter.class), Optional.<OutputTemplates>absent(), mockAsciidoctor);
}
@Test
public void testAtLiteralRender() {
Doc mockDoc = mock(Doc.class);
String convertedText = "Test";
String rawText = "@" + convertedText;
when(mockDoc.getRawCommentText()).thenReturn(rawText);
when(mockDoc.commentText()).thenReturn("input");
when(mockDoc.tags()).thenReturn(new Tag[]{});
when(mockAsciidoctor.render(anyString(), any(Options.class))).thenReturn("input");
renderer.renderDoc(mockDoc);
verify(mockDoc).setRawCommentText("{@literal @}" + convertedText);
verify(mockAsciidoctor).render(anyString(), any(Options.class));
}
@Test
public void testTagRender() {
Doc mockDoc = mock(Doc.class);
Tag mockTag = mock(Tag.class);
String tagName = "tagName";
String tagText = "tagText";
String asciidoctorRenderedString = "rendered";
when(mockTag.name()).thenReturn(tagName);
when(mockTag.text()).thenReturn(tagText);
when(mockDoc.getRawCommentText()).thenReturn("input");
when(mockDoc.commentText()).thenReturn("input");
when(mockDoc.tags()).thenReturn(new Tag[]{mockTag});
when(mockAsciidoctor.render(eq("input"), argThat(new OptionsMatcher(false)))).thenReturn("input");
when(mockAsciidoctor.render(eq(tagText), argThat(new OptionsMatcher(true)))).thenReturn(asciidoctorRenderedString);
renderer.renderDoc(mockDoc);
verify(mockAsciidoctor).render(eq("input"), argThat(new OptionsMatcher(false)));
verify(mockAsciidoctor).render(eq(tagText), argThat(new OptionsMatcher(true)));
verify(mockDoc).setRawCommentText("input");
verify(mockDoc).setRawCommentText("input\n" + tagName + " " + asciidoctorRenderedString + "\n");
}
@Test
public void testCleanInput() {
assertEquals("test1\ntest2", AsciidoctorRenderer.cleanJavadocInput(" test1\n test2\n"));
assertEquals("@", AsciidoctorRenderer.cleanJavadocInput("{@literal @}"));
assertEquals("/*\ntest\n*/", AsciidoctorRenderer.cleanJavadocInput("/*\ntest\n*\\/"));
assertEquals("@", AsciidoctorRenderer.cleanJavadocInput("{at}"));
assertEquals("/", AsciidoctorRenderer.cleanJavadocInput("{slash}"));
}
@Test
public void testParamTagWithTypeParameter() {
String commentText = "comment";
String param1Name = "T";
String param1Desc = "";
String param1Text = "<" + param1Name + ">";
String param2Name = "X";
String param2Desc = "description";
String param2Text = "<" + param2Name + "> " + param2Desc;
String sourceText = commentText + "\n@param " + param1Text + "\n@param " + param2Text;
Doc mockDoc = mock(Doc.class);
when(mockDoc.getRawCommentText()).thenReturn(sourceText);
when(mockDoc.commentText()).thenReturn(commentText);
Tag[] tags = new Tag[2];
ParamTag mockTag1 = mock(ParamTag.class);
when(mockTag1.name()).thenReturn("@param");
when(mockTag1.isTypeParameter()).thenReturn(true);
when(mockTag1.parameterName()).thenReturn(param1Name);
when(mockTag1.parameterComment()).thenReturn(param1Desc);
tags[0] = mockTag1;
ParamTag mockTag2 = mock(ParamTag.class);
when(mockTag2.name()).thenReturn("@param");
when(mockTag2.isTypeParameter()).thenReturn(true);
when(mockTag2.parameterName()).thenReturn(param2Name);
when(mockTag2.parameterComment()).thenReturn(param2Desc);
tags[1] = mockTag2;
when(mockDoc.tags()).thenReturn(tags);
when(mockAsciidoctor.render(eq(commentText), any(Options.class))).thenReturn(commentText);
when(mockAsciidoctor.render(eq(param2Desc), any(Options.class))).thenReturn(param2Desc);
renderer.renderDoc(mockDoc);
verify(mockAsciidoctor).render(eq(commentText), argThat(new OptionsMatcher(false)));
verify(mockAsciidoctor).render(eq(param2Desc), argThat(new OptionsMatcher(true)));
// fixture step
verify(mockDoc).setRawCommentText(eq(sourceText));
// result step
verify(mockDoc).setRawCommentText(eq(sourceText));
}
private static final class OptionsMatcher extends ArgumentMatcher<Options> {
private final boolean inline;
private OptionsMatcher(boolean inline) {
this.inline = inline;
}
@Override
public boolean matches(Object input) {
Options options = (Options) input;
return !inline || (options.map().get(Options.DOCTYPE).equals(AsciidoctorRenderer.INLINE_DOCTYPE));
}
}
}