From bdf364681f2cf542d2363cba220637cefd14eaa6 Mon Sep 17 00:00:00 2001 From: Abel Salgado Romero Date: Fri, 19 Apr 2024 10:50:25 +0200 Subject: [PATCH] Refactor construction of Asciidoctor options to make them independent (#134) Refactor construction of Asciidoctor options to make them independent for each conversion. Now we can apply the original intended code where we respect DocType if present. Only template initialization is shared to reduce IO operations (create temp dirs). * Refactor options creation into AsciidoctorOptionsFactory * Remove shared attribute options from AsciidoctorConverter. * Remove unnecessary cleanup logic from AsciidoctorFilteredEnvironment. * Minor refactors and formatting fixes. Closes #125 --- pom.xml | 6 + .../asciidoclet/AsciiDocTrees.java | 21 ++- .../asciidoctor/asciidoclet/Asciidoclet.java | 6 +- .../asciidoclet/AsciidoctorConverter.java | 95 ++----------- .../AsciidoctorFilteredEnvironment.java | 6 +- .../AsciidoctorOptionsFactory.java | 70 +++++++++ .../asciidoclet/AttributesLoader.java | 18 +-- .../asciidoclet/DocletOptions.java | 2 +- .../asciidoclet/OutputTemplates.java | 32 ++--- .../AsciidoctorOptionsFactoryTest.java | 134 ++++++++++++++++++ .../asciidoclet/DocletOptionsTest.java | 14 +- 11 files changed, 267 insertions(+), 137 deletions(-) create mode 100644 src/main/java/org/asciidoctor/asciidoclet/AsciidoctorOptionsFactory.java create mode 100644 src/test/java/org/asciidoctor/asciidoclet/AsciidoctorOptionsFactoryTest.java diff --git a/pom.xml b/pom.xml index 0809acc..de67338 100644 --- a/pom.xml +++ b/pom.xml @@ -61,6 +61,12 @@ 3.25.3 test + + org.mockito + mockito-core + 5.11.0 + test + diff --git a/src/main/java/org/asciidoctor/asciidoclet/AsciiDocTrees.java b/src/main/java/org/asciidoctor/asciidoclet/AsciiDocTrees.java index 9ac8ec2..dbd0f69 100644 --- a/src/main/java/org/asciidoctor/asciidoclet/AsciiDocTrees.java +++ b/src/main/java/org/asciidoctor/asciidoclet/AsciiDocTrees.java @@ -98,12 +98,11 @@ private Tokens.Comment convertToAsciidoctor(Tokens.Comment comment) { AsciidocComment result = new AsciidocComment(asciidoc, comment); return result; } - + private String convertJavadocStringToAsciidoctorString(String javadocString) { - return converter.convert(javadocString); + return converter.convert(javadocString); } - - + @Override public DocCommentTree getDocCommentTree(Element e) { TreePath path = getPath(e); @@ -154,19 +153,19 @@ public DocTreePath getDocTreePath(FileObject fileObject, PackageElement packageE public Element getElement(DocTreePath path) { return docTrees.getElement(path); } - + // Not giving @Override in order to make this class compilable under all of JDK 11, 17, 21. public TypeMirror getType(DocTreePath path) { // In order to make this method compilable with JDK11, which doesn't define DocTrees#getType method, // and make this method work with JDK 17 and later, invoke the DocTrees#getType(DocTreePath) method reflectively. // Once we decide to stop supporting JDK 11, just call getType directly. - try { - return (TypeMirror) DocTrees.class.getMethod("getType", DocTreePath.class).invoke(docTrees, path); - } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { - throw new RuntimeException(e); - } + try { + return (TypeMirror) DocTrees.class.getMethod("getType", DocTreePath.class).invoke(docTrees, path); + } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { + throw new RuntimeException(e); + } } - + @Override public List getFirstSentence(List list) { return docTrees.getFirstSentence(list); diff --git a/src/main/java/org/asciidoctor/asciidoclet/Asciidoclet.java b/src/main/java/org/asciidoctor/asciidoclet/Asciidoclet.java index 3012da6..ef2e80a 100644 --- a/src/main/java/org/asciidoctor/asciidoclet/Asciidoclet.java +++ b/src/main/java/org/asciidoctor/asciidoclet/Asciidoclet.java @@ -21,8 +21,6 @@ import jdk.javadoc.doclet.StandardDoclet; import javax.lang.model.SourceVersion; -import java.io.IOException; -import java.io.UncheckedIOException; import java.util.Arrays; import java.util.HashSet; import java.util.Locale; @@ -213,13 +211,11 @@ public SourceVersion getSupportedSourceVersion() { @Override public boolean run(DocletEnvironment environment) { - docletOptions.validateOptions(); + docletOptions.validate(); AsciidoctorConverter converter = new AsciidoctorConverter(docletOptions, reporter); boolean result; try (AsciidoctorFilteredEnvironment env = new AsciidoctorFilteredEnvironment(environment, converter)) { result = standardDoclet.run(env); - } catch (IOException e) { - throw new UncheckedIOException(e); } return result && postProcess(environment); } diff --git a/src/main/java/org/asciidoctor/asciidoclet/AsciidoctorConverter.java b/src/main/java/org/asciidoctor/asciidoclet/AsciidoctorConverter.java index bddd244..c95e862 100644 --- a/src/main/java/org/asciidoctor/asciidoclet/AsciidoctorConverter.java +++ b/src/main/java/org/asciidoctor/asciidoclet/AsciidoctorConverter.java @@ -17,17 +17,9 @@ import jdk.javadoc.doclet.Reporter; import org.asciidoctor.Asciidoctor; -import org.asciidoctor.Attributes; -import org.asciidoctor.AttributesBuilder; import org.asciidoctor.Options; -import org.asciidoctor.OptionsBuilder; -import org.asciidoctor.SafeMode; -import org.asciidoctor.extension.RubyExtensionRegistry; import org.asciidoctor.jruby.AsciidoctorJRuby; -import java.io.IOException; -import java.util.List; -import java.util.Optional; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -40,36 +32,20 @@ class AsciidoctorConverter { static final String MARKER = " \t \t"; - private static AttributesBuilder defaultAttributes() { - return Attributes.builder() - .attribute("at", "@") - .attribute("slash", "/") - .attribute("icons", null) - .attribute("idprefix", "") - .attribute("idseparator", "-") - .attribute("javadoc", "") - .attribute("showtitle", true) - .attribute("source-highlighter", "coderay") - .attribute("coderay-css", "class") - .attribute("env-asciidoclet") - .attribute("env", "asciidoclet"); - } - - private static OptionsBuilder defaultOptions() { - return Options.builder() - .safe(SafeMode.SAFE) - .backend("html5"); - } - private static final Pattern TYPE_PARAM = Pattern.compile("\\s*<(\\w+)>(.*)"); private static final String INLINE_DOCTYPE = "inline"; + private final DocletOptions docletOptions; + private final Reporter reporter; + private final Asciidoctor asciidoctor; - private final Optional templates; - private final Options options; + private final OutputTemplates templates; AsciidoctorConverter(DocletOptions docletOptions, Reporter reporter) { - this(docletOptions, reporter, OutputTemplates.create(reporter), createAsciidoctorInstance(docletOptions.gemPath())); + this.asciidoctor = createAsciidoctorInstance(docletOptions.gemPath()); + this.reporter = reporter; + this.templates = OutputTemplates.create(reporter); + this.docletOptions = docletOptions; } private static Asciidoctor createAsciidoctorInstance(String gemPath) { @@ -79,37 +55,6 @@ private static Asciidoctor createAsciidoctorInstance(String gemPath) { return Asciidoctor.Factory.create(); } - /** - * Constructor used directly for testing purposes only. - */ - AsciidoctorConverter(DocletOptions docletOptions, Reporter errorReporter, Optional templates, Asciidoctor asciidoctor) { - this.asciidoctor = asciidoctor; - this.templates = templates; - this.options = buildOptions(docletOptions, errorReporter); - } - - private Options buildOptions(DocletOptions docletOptions, Reporter errorReporter) { - final OptionsBuilder opts = defaultOptions(); - if (docletOptions.baseDir().isPresent()) { - opts.baseDir(docletOptions.baseDir().get()); - } - templates.ifPresent(outputTemplates -> opts.templateDir(outputTemplates.templateDir().toFile())); - opts.attributes(buildAttributes(docletOptions, errorReporter)); - if (docletOptions.requires().size() > 0) { - RubyExtensionRegistry rubyExtensionRegistry = asciidoctor.rubyExtensionRegistry(); - for (String require : docletOptions.requires()) { - rubyExtensionRegistry.requireLibrary(require); - } - } - return opts.get(); - } - - private Attributes buildAttributes(DocletOptions docletOptions, Reporter errorReporter) { - return defaultAttributes() - .attributes(new AttributesLoader(asciidoctor, docletOptions, errorReporter).load()) - .get(); - } - /** * Converts a generic document (class, field, method, etc.). * @@ -132,12 +77,6 @@ String convert(String doc) { return buffer.toString(); } - void cleanup() throws IOException { - if (templates.isPresent()) { - templates.get().delete(); - } - } - /** * Renders a document tag in the standard way. * @@ -181,21 +120,17 @@ private String convert(String input, boolean inline) { if (input.trim().isEmpty()) { return ""; } + Options options = new AsciidoctorOptionsFactory(asciidoctor, reporter) + .create(docletOptions, templates); // Setting doctype to null results in an NPE from asciidoctor. // the default value from the command line is "article". // https://docs.asciidoctor.org/asciidoctor/latest/cli/man1/asciidoctor/#options - // In general, in order to respect original doctype, we should do the following. - // options.setDocType(inline ? - // INLINE_DOCTYPE : - // options.map().containsKey(Options.DOCTYPE) ? - // (String)options.map().get(Options.DOCTYPE) : - // "article"); - // However, this fix breaks AsciidoctorConverterTest#testParameterWithoutTypeTag. - // For now, I simply set it to "article", always. options.setDocType(inline ? - INLINE_DOCTYPE : - "article"); // upstream sets this to "". - + INLINE_DOCTYPE : + options.map().containsKey(Options.DOCTYPE) ? + (String) options.map().get(Options.DOCTYPE) : + "article"); + return asciidoctor.convert(cleanJavadocInput(input), options); } diff --git a/src/main/java/org/asciidoctor/asciidoclet/AsciidoctorFilteredEnvironment.java b/src/main/java/org/asciidoctor/asciidoclet/AsciidoctorFilteredEnvironment.java index 7adbbb8..150de16 100644 --- a/src/main/java/org/asciidoctor/asciidoclet/AsciidoctorFilteredEnvironment.java +++ b/src/main/java/org/asciidoctor/asciidoclet/AsciidoctorFilteredEnvironment.java @@ -21,7 +21,6 @@ import javax.tools.JavaFileManager; import javax.tools.StandardJavaFileManager; -import java.io.IOException; /** * An operating environment defined for AsciiDoclet. @@ -30,13 +29,11 @@ public class AsciidoctorFilteredEnvironment extends DocEnvImpl implements DocletEnvironment, AutoCloseable { - private final AsciidoctorConverter converter; private final StandardJavaFileManager fileManager; private final AsciiDocTrees asciiDocTrees; AsciidoctorFilteredEnvironment(DocletEnvironment environment, AsciidoctorConverter converter) { super(((DocEnvImpl) environment).toolEnv, ((DocEnvImpl) environment).etable); - this.converter = converter; this.fileManager = new AsciidoctorFileManager(converter, (StandardJavaFileManager) environment.getJavaFileManager()); this.asciiDocTrees = new AsciiDocTrees(converter, fileManager, environment.getDocTrees()); } @@ -52,7 +49,6 @@ public DocTrees getDocTrees() { } @Override - public void close() throws IOException { - converter.cleanup(); + public void close() { } } diff --git a/src/main/java/org/asciidoctor/asciidoclet/AsciidoctorOptionsFactory.java b/src/main/java/org/asciidoctor/asciidoclet/AsciidoctorOptionsFactory.java new file mode 100644 index 0000000..9137153 --- /dev/null +++ b/src/main/java/org/asciidoctor/asciidoclet/AsciidoctorOptionsFactory.java @@ -0,0 +1,70 @@ +package org.asciidoctor.asciidoclet; + +import jdk.javadoc.doclet.Reporter; +import org.asciidoctor.Asciidoctor; +import org.asciidoctor.Attributes; +import org.asciidoctor.AttributesBuilder; +import org.asciidoctor.Options; +import org.asciidoctor.OptionsBuilder; +import org.asciidoctor.SafeMode; +import org.asciidoctor.extension.RubyExtensionRegistry; + +class AsciidoctorOptionsFactory { + + private static final String DEFAULT_BACKEND = "html5"; + + private final Asciidoctor asciidoctor; + private final Reporter reporter; + + AsciidoctorOptionsFactory(Asciidoctor asciidoctor, Reporter reporter) { + this.asciidoctor = asciidoctor; + this.reporter = reporter; + } + + Options create(DocletOptions docletOptions, OutputTemplates templates) { + final OptionsBuilder opts = defaultOptions(); + if (docletOptions.baseDir().isPresent()) { + opts.baseDir(docletOptions.baseDir().get()); + } + if (templates != null) { + opts.templateDir(templates.templateDir().toFile()); + } + + opts.attributes(buildAttributes(docletOptions)); + if (docletOptions.requires().size() > 0) { + RubyExtensionRegistry rubyExtensionRegistry = asciidoctor.rubyExtensionRegistry(); + for (String require : docletOptions.requires()) { + rubyExtensionRegistry.requireLibrary(require); + } + } + return opts.get(); + } + + private Attributes buildAttributes(DocletOptions docletOptions) { + return defaultAttributes() + .attributes(new AttributesLoader(asciidoctor, docletOptions, reporter).load()) + .get(); + } + + private static OptionsBuilder defaultOptions() { + return Options.builder() + .safe(SafeMode.SAFE) + .backend(DEFAULT_BACKEND); + } + + private static AttributesBuilder defaultAttributes() { + return org.asciidoctor.Attributes.builder() + .attribute("at", "@") + .attribute("slash", "/") + .attribute("icons", null) + .attribute("idprefix", "") + .attribute("idseparator", "-") + .attribute("javadoc", "") + .attribute("showtitle", true) + .attribute("source-highlighter", "coderay") + .attribute("coderay-css", "class") + .attribute("env-asciidoclet") + .attribute("env", "asciidoclet"); + } + +} diff --git a/src/main/java/org/asciidoctor/asciidoclet/AttributesLoader.java b/src/main/java/org/asciidoctor/asciidoclet/AttributesLoader.java index 8f5ec10..5be9358 100644 --- a/src/main/java/org/asciidoctor/asciidoclet/AttributesLoader.java +++ b/src/main/java/org/asciidoctor/asciidoclet/AttributesLoader.java @@ -21,15 +21,11 @@ import org.asciidoctor.Options; import org.asciidoctor.OptionsBuilder; import org.asciidoctor.SafeMode; -import org.asciidoctor.jruby.internal.IOUtils; import javax.tools.Diagnostic; import java.io.File; -import java.io.IOException; import java.io.Reader; -import java.io.StringReader; import java.nio.file.Files; -import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; @@ -41,12 +37,12 @@ class AttributesLoader { private final Asciidoctor asciidoctor; private final DocletOptions docletOptions; - private final Reporter errorReporter; + private final Reporter reporter; - AttributesLoader(Asciidoctor asciidoctor, DocletOptions docletOptions, Reporter errorReporter) { + AttributesLoader(Asciidoctor asciidoctor, DocletOptions docletOptions, Reporter reporter) { this.asciidoctor = asciidoctor; this.docletOptions = docletOptions; - this.errorReporter = errorReporter; + this.reporter = reporter; } Map load() { @@ -80,7 +76,7 @@ private Map parseAttributesFile(Optional attrsFile, Map parseAttributes(Reader in, Map exist options.baseDir(docletOptions.baseDir().get()); } - final String content = read(in); - final Map parsed = asciidoctor.load(content, options.build()).getAttributes(); - return parsed; + return asciidoctor.load(read(in), options.build()).getAttributes(); } public static String read(Reader reader) { - try (Scanner scanner = new Scanner(reader).useDelimiter("\\A")){ + try (Scanner scanner = new Scanner(reader).useDelimiter("\\A")) { return scanner.next(); } } diff --git a/src/main/java/org/asciidoctor/asciidoclet/DocletOptions.java b/src/main/java/org/asciidoctor/asciidoclet/DocletOptions.java index 85d1601..b6c4f26 100644 --- a/src/main/java/org/asciidoctor/asciidoclet/DocletOptions.java +++ b/src/main/java/org/asciidoctor/asciidoclet/DocletOptions.java @@ -89,7 +89,7 @@ private Stream splitTrimStream(List list) { .filter(s -> !s.isEmpty()); } - void validateOptions() { + void validate() { if (baseDir().isEmpty()) { printWarning(AsciidocletOptions.BASEDIR + " must be present for includes or file reference features to work properly"); } diff --git a/src/main/java/org/asciidoctor/asciidoclet/OutputTemplates.java b/src/main/java/org/asciidoctor/asciidoclet/OutputTemplates.java index 4f5d85a..8441e7a 100644 --- a/src/main/java/org/asciidoctor/asciidoclet/OutputTemplates.java +++ b/src/main/java/org/asciidoctor/asciidoclet/OutputTemplates.java @@ -24,7 +24,6 @@ import java.io.UncheckedIOException; import java.nio.file.Files; import java.nio.file.Path; -import java.util.Optional; /** * Sets up a temporary directory containing output templates for use by Asciidoctor. @@ -39,32 +38,32 @@ private OutputTemplates(Path templateDir) { this.templateDir = templateDir; } - static Optional create(Reporter errorReporter) { - Path dir = prepareTemplateDir(errorReporter); - return Optional.ofNullable(dir).map(OutputTemplates::new); + static OutputTemplates create(Reporter reporter) { + final Path dir = prepareTemplateDir(reporter); + return dir != null ? new OutputTemplates(dir) : null; } Path templateDir() { return templateDir; } - void delete() throws IOException { - for (String templateName : TEMPLATE_NAMES) { - Files.deleteIfExists(templateDir.resolve(templateName)); - } - Files.delete(templateDir); - } - - private static Path prepareTemplateDir(Reporter errorReporter) { + /** + * Creates and returns a directory in OS's temps path holding Asciidoctor + * templates during conversion. + * + * @param reporter doclet {@link Reporter}. + * @return Path to templates, or null if it could not be created. + */ + private static Path prepareTemplateDir(Reporter reporter) { // copy our template resources to the templateDir so Asciidoctor can use them. try { - Path templateDir = Files.createTempDirectory("asciidoclet"); + final Path templateDir = Files.createTempDirectory("asciidoclet"); for (String templateName : TEMPLATE_NAMES) { prepareTemplate(templateDir, templateName); } return templateDir; } catch (IOException e) { - errorReporter.print(Diagnostic.Kind.WARNING, "Failed to prepare templates: " + e.getLocalizedMessage()); + reporter.print(Diagnostic.Kind.WARNING, "Failed to prepare templates: " + e.getLocalizedMessage()); return null; } } @@ -80,14 +79,15 @@ private static Path prepareTemplateDir(Reporter errorReporter) { */ private static void prepareTemplate(Path templateDir, String template) throws IOException { final String templatePath = "templates/" + template; - InputStream input = ModuleLayer.boot().findModule("asciidoclet") + final InputStream input = ModuleLayer.boot() + .findModule("asciidoclet") .map(module -> getResourceAsStream(module, templatePath)) .orElseGet(() -> OutputTemplates.class.getClassLoader().getResourceAsStream(templatePath)); if (input == null) { throw new IOException("Could not find template " + template); } - Path path = templateDir.resolve(template); + final Path path = templateDir.resolve(template); try (OutputStream output = Files.newOutputStream(path)) { input.transferTo(output); } finally { diff --git a/src/test/java/org/asciidoctor/asciidoclet/AsciidoctorOptionsFactoryTest.java b/src/test/java/org/asciidoctor/asciidoclet/AsciidoctorOptionsFactoryTest.java new file mode 100644 index 0000000..cdfdbc7 --- /dev/null +++ b/src/test/java/org/asciidoctor/asciidoclet/AsciidoctorOptionsFactoryTest.java @@ -0,0 +1,134 @@ +package org.asciidoctor.asciidoclet; + +import org.asciidoctor.Asciidoctor; +import org.asciidoctor.Options; +import org.asciidoctor.SafeMode; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; + +import java.io.File; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import static org.assertj.core.api.Assertions.assertThat; + +class AsciidoctorOptionsFactoryTest { + + private Asciidoctor asciidoctor = Asciidoctor.Factory.create(); + private StubReporter reporter = new StubReporter(); + + private AsciidoctorOptionsFactory optionsFactory; + + @BeforeEach + void setup() { + optionsFactory = new AsciidoctorOptionsFactory(asciidoctor, reporter); + } + + @Test + void createsDefaultOptions() { + DocletOptions docletOptions = new DocletOptions(reporter); + + Options options = optionsFactory.create(docletOptions, null); + + Map optionsMap = options.map(); + assertContainsDefaultOptions(optionsMap, 3); + + Map attributes = (Map) optionsMap.get("attributes"); + assertContainsDefaultAttributes(attributes, 11); + } + + @Test + void withCustomAttributes() { + DocletOptions docletOptions = Mockito.mock(DocletOptions.class); + Mockito.when(docletOptions.attributes()).thenReturn(List.of("my-attribute=my-value", "another=42")); + + Options options = optionsFactory.create(docletOptions, null); + + Map optionsMap = options.map(); + assertContainsDefaultOptions(optionsMap, 3); + assertThat(optionsMap).hasSize(3); + + Map attributes = (Map) optionsMap.get("attributes"); + assertContainsDefaultAttributes(attributes, 13); + assertThat(attributes) + .containsEntry("my-attribute", "my-value") + .containsEntry("another", "42"); + } + + @Test + void withCustomBaseDir() { + DocletOptions docletOptions = Mockito.mock(DocletOptions.class); + File baseDir = new File("some/path"); + Mockito.when(docletOptions.baseDir()).thenReturn(Optional.of(baseDir)); + + Options options = optionsFactory.create(docletOptions, null); + + Map optionsMap = options.map(); + assertContainsDefaultOptions(optionsMap, 4); + assertThat(optionsMap) + .containsEntry("base_dir", baseDir.getAbsolutePath()); + + Map attributes = (Map) optionsMap.get("attributes"); + assertContainsDefaultAttributes(attributes, 11); + } + + @Test + void withTemplateDir() { + DocletOptions docletOptions = new DocletOptions(reporter); + OutputTemplates outputTemplates = OutputTemplates.create(reporter); + assertThat(outputTemplates.templateDir()).isNotEmptyDirectory(); + + Options options = optionsFactory.create(docletOptions, outputTemplates); + + Map optionsMap = options.map(); + assertContainsDefaultOptions(optionsMap, 4); + assertThat(optionsMap) + .containsEntry("template_dirs", List.of(outputTemplates.templateDir().toString())); + + Map attributes = (Map) optionsMap.get("attributes"); + assertContainsDefaultAttributes(attributes, 11); + } + + @Test + void withRequires() { + DocletOptions mock = Mockito.mock(DocletOptions.class); + // Use gems available in the classpath to avoid errors + Mockito.when(mock.requires()).thenReturn(List.of("asciidoctor", "coderay")); + + Options options = optionsFactory.create(mock, null); + + Map optionsMap = options.map(); + assertContainsDefaultOptions(optionsMap, 3); + assertThat(optionsMap).hasSize(3); + + Map attributes = (Map) optionsMap.get("attributes"); + assertContainsDefaultAttributes(attributes, 11); + } + + private static void assertContainsDefaultOptions(Map options, int size) { + assertThat(options) + .containsEntry("backend", "html5") + .containsEntry("safe", SafeMode.SAFE.getLevel()) + .containsKey("attributes"); + assertThat(options).hasSize(size); + } + + private static void assertContainsDefaultAttributes(Map attributes, int size) { + assertThat(attributes) + .containsEntry("at", "@") + .containsEntry("slash", "/") + .containsEntry("icons", null) + .containsEntry("idprefix", "") + .containsEntry("idseparator", "-") + .containsEntry("javadoc", "") + .containsEntry("showtitle", true) + .containsEntry("source-highlighter", "coderay") + .containsEntry("coderay-css", "class") + .containsEntry("env-asciidoclet", "") + .containsEntry("env", "asciidoclet"); + assertThat(attributes).hasSize(size); + } + +} diff --git a/src/test/java/org/asciidoctor/asciidoclet/DocletOptionsTest.java b/src/test/java/org/asciidoctor/asciidoclet/DocletOptionsTest.java index e521e74..c3ec080 100644 --- a/src/test/java/org/asciidoctor/asciidoclet/DocletOptionsTest.java +++ b/src/test/java/org/asciidoctor/asciidoclet/DocletOptionsTest.java @@ -44,7 +44,7 @@ void testGetBaseDir() { DocletOptions options = new DocletOptions(reporter); options.collect(AsciidocletOptions.BASEDIR, List.of("test")); - options.validateOptions(); + options.validate(); assertThat(options.baseDir().get().getName()).isEqualTo("test"); } @@ -56,7 +56,7 @@ void testAttributes() { DocletOptions options = new DocletOptions(reporter); options.collect(AsciidocletOptions.ATTRIBUTE, List.of(attribute)); - options.validateOptions(); + options.validate(); assertThat(options.attributes()).hasSize(1); assertThat(options.attributes()).first().isEqualTo(attribute); @@ -69,7 +69,7 @@ void testAttributesLong() { DocletOptions options = new DocletOptions(reporter); options.collect(AsciidocletOptions.ATTRIBUTE_LONG, List.of(attribute)); - options.validateOptions(); + options.validate(); assertThat(options.attributes()).hasSize(1); assertThat(options.attributes()).first().isEqualTo(attribute); @@ -87,7 +87,7 @@ void testDefaultEncoding() { void testEncoding(String encoding, Charset expected) { DocletOptions options = new DocletOptions(reporter); options.collect(AsciidocletOptions.ENCODING, List.of(encoding)); - options.validateOptions(); + options.validate(); assertThat(options.encoding()).isEqualTo(expected); } @@ -105,7 +105,7 @@ void testStylesheetFile() { DocletOptions options = new DocletOptions(reporter); options.collect(AsciidocletOptions.STYLESHEET, List.of("foo.css")); - options.validateOptions(); + options.validate(); assertThat(options.stylesheet().get().getName()).isEqualTo("foo.css"); } @@ -115,14 +115,14 @@ void testRequires() { DocletOptions options = new DocletOptions(reporter); options.collect(AsciidocletOptions.REQUIRE, List.of("foo", "bar")); - options.validateOptions(); + options.validate(); assertThat(options.requires()).containsExactlyInAnyOrder("foo", "bar"); options = new DocletOptions(reporter); options.collect(AsciidocletOptions.REQUIRE, List.of("a", "diagrams/awesome")); options.collect(AsciidocletOptions.REQUIRE_LONG, List.of("bar")); options.collect(AsciidocletOptions.REQUIRE_LONG, List.of("baz,noddy")); - options.validateOptions(); + options.validate(); assertThat(options.requires()).containsExactlyInAnyOrder("a", "diagrams/awesome", "bar", "baz", "noddy"); } }