[*] Rework registration of TweedExtensions

This commit is contained in:
2025-04-25 15:33:55 +02:00
parent c97f711c0b
commit 59f882bd12
27 changed files with 639 additions and 257 deletions

View File

@@ -2,8 +2,11 @@ package de.siphalor.tweed5.defaultextensions.comment.api;
import de.siphalor.tweed5.core.api.entry.ConfigEntry;
import de.siphalor.tweed5.core.api.extension.TweedExtension;
import de.siphalor.tweed5.defaultextensions.comment.impl.CommentExtensionImpl;
import org.jspecify.annotations.Nullable;
public interface CommentExtension extends TweedExtension {
Class<? extends CommentExtension> DEFAULT = CommentExtensionImpl.class;
@Nullable String getFullComment(ConfigEntry<?> configEntry);
}

View File

@@ -1,6 +1,7 @@
package de.siphalor.tweed5.defaultextensions.comment.impl;
import com.google.auto.service.AutoService;
import de.siphalor.tweed5.core.api.container.ConfigContainer;
import de.siphalor.tweed5.core.api.entry.ConfigEntry;
import de.siphalor.tweed5.core.api.extension.EntryExtensionsData;
import de.siphalor.tweed5.core.api.extension.RegisteredExtensionData;
@@ -14,15 +15,21 @@ import de.siphalor.tweed5.defaultextensions.comment.api.*;
import lombok.Getter;
import lombok.Value;
import org.jspecify.annotations.NonNull;
import org.jspecify.annotations.NullUnmarked;
import org.jspecify.annotations.Nullable;
@AutoService(CommentExtension.class)
@NullUnmarked
public class CommentExtensionImpl implements ReadWriteRelatedExtension, CommentExtension {
private final ConfigContainer<?> configContainer;
@Getter
private RegisteredExtensionData<EntryExtensionsData, InternalCommentEntryData> internalEntryDataExtension;
private DefaultMiddlewareContainer<CommentProducer> middlewareContainer;
private final RegisteredExtensionData<EntryExtensionsData, InternalCommentEntryData> internalEntryDataExtension;
private final DefaultMiddlewareContainer<CommentProducer> middlewareContainer;
public CommentExtensionImpl(ConfigContainer<?> configContainer, TweedExtensionSetupContext context) {
this.configContainer = configContainer;
this.internalEntryDataExtension = context.registerEntryExtensionData(InternalCommentEntryData.class);
context.registerEntryExtensionData(EntryComment.class);
this.middlewareContainer = new DefaultMiddlewareContainer<>();
}
@Override
public String getId() {
@@ -30,18 +37,12 @@ public class CommentExtensionImpl implements ReadWriteRelatedExtension, CommentE
}
@Override
public void setup(TweedExtensionSetupContext context) {
internalEntryDataExtension = context.registerEntryExtensionData(InternalCommentEntryData.class);
context.registerEntryExtensionData(EntryComment.class);
middlewareContainer = new DefaultMiddlewareContainer<>();
for (TweedExtension extension : context.configContainer().extensions()) {
public void extensionsFinalized() {
for (TweedExtension extension : configContainer.extensions()) {
if (extension instanceof CommentModifyingExtension) {
middlewareContainer.register(((CommentModifyingExtension) extension).commentMiddleware());
}
}
middlewareContainer.seal();
}

View File

@@ -32,8 +32,10 @@ public class PathTracking implements PatherData {
}
public void popPathPart() {
String poppedPart = pathParts.pop();
pathBuilder.setLength(pathBuilder.length() - poppedPart.length() - 1);
if (!pathParts.isEmpty()) {
String poppedPart = pathParts.pop();
pathBuilder.setLength(pathBuilder.length() - poppedPart.length() - 1);
}
}
public void pushListContext() {

View File

@@ -1,6 +1,8 @@
package de.siphalor.tweed5.defaultextensions.pather.api;
import de.siphalor.tweed5.core.api.extension.TweedExtension;
import de.siphalor.tweed5.defaultextensions.pather.impl.PatherExtensionImpl;
public interface PatherExtension extends TweedExtension {
Class<? extends PatherExtension> DEFAULT = PatherExtensionImpl.class;
}

View File

@@ -11,10 +11,7 @@ import de.siphalor.tweed5.data.extension.api.extension.ReadWriteExtensionSetupCo
import de.siphalor.tweed5.data.extension.api.extension.ReadWriteRelatedExtension;
import de.siphalor.tweed5.dataapi.api.TweedDataReader;
import de.siphalor.tweed5.dataapi.api.TweedDataVisitor;
import de.siphalor.tweed5.defaultextensions.pather.api.PathTracking;
import de.siphalor.tweed5.defaultextensions.pather.api.PathTrackingDataReader;
import de.siphalor.tweed5.defaultextensions.pather.api.PathTrackingDataVisitor;
import de.siphalor.tweed5.defaultextensions.pather.api.PatherExtension;
import de.siphalor.tweed5.defaultextensions.pather.api.*;
import lombok.val;
import org.jspecify.annotations.NonNull;
import org.jspecify.annotations.NullUnmarked;
@@ -25,7 +22,7 @@ import org.jspecify.annotations.Nullable;
public class PatherExtensionImpl implements PatherExtension, TweedExtension, ReadWriteRelatedExtension {
private static final String PATHER_ID = "pather";
private RegisteredExtensionData<ReadWriteContextExtensionsData, PathTracking> rwContextPathTrackingData;
private RegisteredExtensionData<ReadWriteContextExtensionsData, PatherData> rwContextPathTrackingData;
private Middleware<TweedEntryReader<?, ?>> entryReaderMiddleware;
private Middleware<TweedEntryWriter<?, ?>> entryWriterMiddleware;
@@ -36,7 +33,7 @@ public class PatherExtensionImpl implements PatherExtension, TweedExtension, Rea
@Override
public void setupReadWriteExtension(ReadWriteExtensionSetupContext context) {
rwContextPathTrackingData = context.registerReadWriteContextExtensionData(PathTracking.class);
rwContextPathTrackingData = context.registerReadWriteContextExtensionData(PatherData.class);
entryReaderMiddleware = createEntryReaderMiddleware();
entryWriterMiddleware = createEntryWriterMiddleware();
@@ -55,7 +52,7 @@ public class PatherExtensionImpl implements PatherExtension, TweedExtension, Rea
val castedInner = (TweedEntryReader<Object, @NonNull ConfigEntry<Object>>) inner;
return (TweedDataReader reader, ConfigEntry<Object> entry, TweedReadContext context) -> {
if (context.extensionsData().isPatchworkPartSet(PathTracking.class)) {
if (context.extensionsData().isPatchworkPartSet(PatherData.class)) {
return castedInner.read(reader, entry, context);
}
@@ -80,7 +77,7 @@ public class PatherExtensionImpl implements PatherExtension, TweedExtension, Rea
val castedInner = (TweedEntryWriter<Object, @NonNull ConfigEntry<Object>>) inner;
return (TweedDataVisitor writer, Object value, ConfigEntry<Object> entry, TweedWriteContext context) -> {
if (context.extensionsData().isPatchworkPartSet(PathTracking.class)) {
if (context.extensionsData().isPatchworkPartSet(PatherData.class)) {
castedInner.write(writer, value, entry, context);
return;
}

View File

@@ -3,8 +3,11 @@ package de.siphalor.tweed5.defaultextensions.validation.api;
import de.siphalor.tweed5.core.api.entry.ConfigEntry;
import de.siphalor.tweed5.core.api.extension.TweedExtension;
import de.siphalor.tweed5.defaultextensions.validation.api.result.ValidationIssues;
import de.siphalor.tweed5.defaultextensions.validation.impl.ValidationExtensionImpl;
import org.jspecify.annotations.Nullable;
public interface ValidationExtension extends TweedExtension {
Class<? extends ValidationExtension> DEFAULT = ValidationExtensionImpl.class;
<T extends @Nullable Object> ValidationIssues validate(ConfigEntry<T> entry, T value);
}

View File

@@ -1,6 +1,7 @@
package de.siphalor.tweed5.defaultextensions.validation.impl;
import com.google.auto.service.AutoService;
import de.siphalor.tweed5.core.api.container.ConfigContainer;
import de.siphalor.tweed5.core.api.entry.ConfigEntry;
import de.siphalor.tweed5.core.api.entry.ConfigEntryValueVisitor;
import de.siphalor.tweed5.core.api.extension.EntryExtensionsData;
@@ -22,26 +23,24 @@ import de.siphalor.tweed5.defaultextensions.comment.api.CommentProducer;
import de.siphalor.tweed5.defaultextensions.pather.api.PathTracking;
import de.siphalor.tweed5.defaultextensions.pather.api.PathTrackingConfigEntryValueVisitor;
import de.siphalor.tweed5.defaultextensions.pather.api.PatherData;
import de.siphalor.tweed5.defaultextensions.pather.impl.PatherExtensionImpl;
import de.siphalor.tweed5.defaultextensions.pather.api.PatherExtension;
import de.siphalor.tweed5.defaultextensions.validation.api.ConfigEntryValidator;
import de.siphalor.tweed5.defaultextensions.validation.api.EntrySpecificValidation;
import de.siphalor.tweed5.defaultextensions.validation.api.ValidationExtension;
import de.siphalor.tweed5.defaultextensions.validation.api.ValidationProvidingExtension;
import de.siphalor.tweed5.defaultextensions.validation.api.result.ValidationIssues;
import de.siphalor.tweed5.defaultextensions.validation.api.result.ValidationIssue;
import de.siphalor.tweed5.defaultextensions.validation.api.result.ValidationIssueLevel;
import de.siphalor.tweed5.defaultextensions.validation.api.result.ValidationIssues;
import de.siphalor.tweed5.defaultextensions.validation.api.result.ValidationResult;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.Value;
import org.jetbrains.annotations.NotNull;
import org.jspecify.annotations.NullUnmarked;
import org.jspecify.annotations.Nullable;
import java.util.*;
@AutoService(ValidationExtension.class)
@NullUnmarked
public class ValidationExtensionImpl implements ReadWriteRelatedExtension, ValidationExtension, CommentModifyingExtension {
private static final ValidationResult<?> PRIMITIVE_IS_NULL_RESULT = ValidationResult.withIssues(
null,
@@ -74,9 +73,19 @@ public class ValidationExtensionImpl implements ReadWriteRelatedExtension, Valid
}
};
private RegisteredExtensionData<EntryExtensionsData, InternalValidationEntryData> validationEntryDataExtension;
private MiddlewareContainer<ConfigEntryValidator> entryValidatorMiddlewareContainer;
private RegisteredExtensionData<ReadWriteContextExtensionsData, ValidationIssues> readContextValidationIssuesExtensionData;
private final ConfigContainer<?> configContainer;
private final RegisteredExtensionData<EntryExtensionsData, InternalValidationEntryData> validationEntryDataExtension;
private final MiddlewareContainer<ConfigEntryValidator> entryValidatorMiddlewareContainer
= new DefaultMiddlewareContainer<>();
private @Nullable RegisteredExtensionData<ReadWriteContextExtensionsData, ValidationIssues>
readContextValidationIssuesExtensionData;
public ValidationExtensionImpl(ConfigContainer<?> configContainer, TweedExtensionSetupContext context) {
this.configContainer = configContainer;
this.validationEntryDataExtension = context.registerEntryExtensionData(InternalValidationEntryData.class);
context.registerEntryExtensionData(EntrySpecificValidation.class);
context.registerExtension(PatherExtension.class);
}
@Override
public String getId() {
@@ -84,16 +93,12 @@ public class ValidationExtensionImpl implements ReadWriteRelatedExtension, Valid
}
@Override
public void setup(TweedExtensionSetupContext context) {
context.registerExtension(new PatherExtensionImpl());
validationEntryDataExtension = context.registerEntryExtensionData(InternalValidationEntryData.class);
context.registerEntryExtensionData(EntrySpecificValidation.class);
entryValidatorMiddlewareContainer = new DefaultMiddlewareContainer<>();
for (TweedExtension extension : context.configContainer().extensions()) {
public void extensionsFinalized() {
for (TweedExtension extension : configContainer.extensions()) {
if (extension instanceof ValidationProvidingExtension) {
entryValidatorMiddlewareContainer.register(((ValidationProvidingExtension) extension).validationMiddleware());
entryValidatorMiddlewareContainer.register(
((ValidationProvidingExtension) extension).validationMiddleware()
);
}
}
entryValidatorMiddlewareContainer.seal();

View File

@@ -1,6 +1,8 @@
package de.siphalor.tweed5.defaultextensions.validationfallback.api;
import de.siphalor.tweed5.core.api.extension.TweedExtension;
import de.siphalor.tweed5.defaultextensions.validationfallback.impl.ValidationFallbackExtensionImpl;
public interface ValidationFallbackExtension extends TweedExtension {
Class<? extends ValidationFallbackExtension> DEFAULT = ValidationFallbackExtensionImpl.class;
}

View File

@@ -20,14 +20,13 @@ import java.util.stream.Collectors;
@AutoService(ValidationFallbackExtension.class)
public class ValidationFallbackExtensionImpl implements ValidationFallbackExtension, ValidationProvidingExtension {
@Override
public String getId() {
return "validation-fallback";
public ValidationFallbackExtensionImpl(TweedExtensionSetupContext context) {
context.registerEntryExtensionData(ValidationFallbackValue.class);
}
@Override
public void setup(TweedExtensionSetupContext context) {
context.registerEntryExtensionData(ValidationFallbackValue.class);
public String getId() {
return "validation-fallback";
}
@Override

View File

@@ -13,37 +13,40 @@ import de.siphalor.tweed5.data.extension.api.TweedEntryReader;
import de.siphalor.tweed5.data.extension.api.TweedEntryWriter;
import de.siphalor.tweed5.data.extension.api.readwrite.TweedEntryReaderWriter;
import de.siphalor.tweed5.data.extension.api.readwrite.TweedEntryReaderWriters;
import de.siphalor.tweed5.data.extension.impl.ReadWriteExtensionImpl;
import de.siphalor.tweed5.data.hjson.HjsonCommentType;
import de.siphalor.tweed5.data.hjson.HjsonWriter;
import de.siphalor.tweed5.defaultextensions.comment.api.CommentExtension;
import de.siphalor.tweed5.defaultextensions.comment.api.CommentModifyingExtension;
import de.siphalor.tweed5.defaultextensions.comment.api.CommentProducer;
import de.siphalor.tweed5.defaultextensions.comment.api.EntryComment;
import lombok.NoArgsConstructor;
import lombok.RequiredArgsConstructor;
import lombok.Value;
import org.jspecify.annotations.NullUnmarked;
import org.junit.jupiter.api.Test;
import java.io.StringWriter;
import java.util.*;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import static org.junit.jupiter.api.Assertions.*;
@NullUnmarked
class CommentExtensionImplTest {
private DefaultConfigContainer<Map<String, Object>> configContainer;
private CommentExtension commentExtension;
private StaticMapCompoundConfigEntryImpl<Map<String, Object>> rootEntry;
private SimpleConfigEntryImpl<Integer> intEntry;
private SimpleConfigEntryImpl<String> stringEntry;
private SimpleConfigEntryImpl<Long> noCommentEntry;
void setupContainer(Collection<TweedExtension> extraExtensions) {
@SafeVarargs
final void setupContainer(Class<? extends TweedExtension>... extraExtensions) {
configContainer = new DefaultConfigContainer<>();
commentExtension = new CommentExtensionImpl();
configContainer.registerExtension(commentExtension);
extraExtensions.forEach(configContainer::registerExtension);
configContainer.registerExtension(CommentExtension.DEFAULT);
configContainer.registerExtensions(extraExtensions);
configContainer.finishExtensionSetup();
//noinspection unchecked
@@ -68,9 +71,10 @@ class CommentExtensionImplTest {
@Test
void simpleComments() {
setupContainer(Collections.emptyList());
setupContainer();
configContainer.initialize();
CommentExtension commentExtension = configContainer.extension(CommentExtension.class).orElseThrow();
assertEquals("It is an integer", commentExtension.getFullComment(intEntry));
assertEquals("It is a string", commentExtension.getFullComment(stringEntry));
assertNull(commentExtension.getFullComment(noCommentEntry));
@@ -78,9 +82,10 @@ class CommentExtensionImplTest {
@Test
void commentProvidingExtension() {
setupContainer(Collections.singletonList(new TestCommentModifyingExtension()));
setupContainer(TestCommentModifyingExtension.class);
configContainer.initialize();
CommentExtension commentExtension = configContainer.extension(CommentExtension.class).orElseThrow();
assertEquals("The comment is:\nIt is an integer\nEND", commentExtension.getFullComment(intEntry));
assertEquals("The comment is:\nIt is a string\nEND", commentExtension.getFullComment(stringEntry));
assertEquals("The comment is:\n\nEND", commentExtension.getFullComment(noCommentEntry));
@@ -88,8 +93,7 @@ class CommentExtensionImplTest {
@Test
void simpleCommentsInHjson() {
ReadWriteExtension readWriteExtension = new ReadWriteExtensionImpl();
setupContainer(Collections.singletonList(readWriteExtension));
setupContainer(ReadWriteExtension.DEFAULT);
setupReadWriteTypes();
configContainer.initialize();
@@ -98,6 +102,7 @@ class CommentExtensionImplTest {
value.put("string", "Hello World");
value.put("noComment", 567L);
ReadWriteExtension readWriteExtension = configContainer.extension(ReadWriteExtension.class).orElseThrow();
StringWriter output = new StringWriter();
assertDoesNotThrow(() -> readWriteExtension.write(
new HjsonWriter(output, new HjsonWriter.Options().multilineCommentType(HjsonCommentType.SLASHES)),
@@ -106,14 +111,23 @@ class CommentExtensionImplTest {
readWriteExtension.createReadWriteContextExtensionsData()
));
assertEquals("// This is the root value.\n// It is the topmost value in the tree.\n" +
"{\n\t// It is an integer\n\tint: 123\n\t// It is a string\n" +
"\tstring: Hello World\n\tnoComment: 567\n}\n", output.toString());
assertEquals(
"""
// This is the root value.
// It is the topmost value in the tree.
{
\t// It is an integer
\tint: 123
\t// It is a string
\tstring: Hello World
\tnoComment: 567
}
""", output.toString());
}
private void setupReadWriteTypes() {
//noinspection unchecked
RegisteredExtensionData<EntryExtensionsData, EntryReaderWriterDefinition> readerWriterData = (RegisteredExtensionData<EntryExtensionsData, EntryReaderWriterDefinition>) configContainer.entryDataExtensions().get(EntryReaderWriterDefinition.class);
var readerWriterData = (RegisteredExtensionData<EntryExtensionsData, EntryReaderWriterDefinition>) configContainer.entryDataExtensions().get(EntryReaderWriterDefinition.class);
readerWriterData.set(rootEntry.extensionsData(), new TrivialEntryReaderWriterDefinition(TweedEntryReaderWriters.compoundReaderWriter()));
readerWriterData.set(intEntry.extensionsData(), new TrivialEntryReaderWriterDefinition(TweedEntryReaderWriters.intReaderWriter()));
@@ -126,7 +140,8 @@ class CommentExtensionImplTest {
String comment;
}
private static class TestCommentModifyingExtension implements TweedExtension, CommentModifyingExtension {
@NoArgsConstructor
public static class TestCommentModifyingExtension implements TweedExtension, CommentModifyingExtension {
@Override
public String getId() {
return "test-extension";
@@ -162,4 +177,4 @@ class CommentExtensionImplTest {
return readerWriter;
}
}
}
}

View File

@@ -8,7 +8,6 @@ import de.siphalor.tweed5.core.impl.entry.SimpleConfigEntryImpl;
import de.siphalor.tweed5.core.impl.entry.StaticMapCompoundConfigEntryImpl;
import de.siphalor.tweed5.defaultextensions.comment.api.CommentExtension;
import de.siphalor.tweed5.defaultextensions.comment.api.EntryComment;
import de.siphalor.tweed5.defaultextensions.comment.impl.CommentExtensionImpl;
import de.siphalor.tweed5.defaultextensions.validation.api.EntrySpecificValidation;
import de.siphalor.tweed5.defaultextensions.validation.api.ValidationExtension;
import de.siphalor.tweed5.defaultextensions.validation.api.result.ValidationIssue;
@@ -30,8 +29,6 @@ import static org.junit.jupiter.api.Assertions.*;
class ValidationExtensionImplTest {
private DefaultConfigContainer<Map<String, Object>> configContainer;
private CommentExtension commentExtension;
private ValidationExtension validationExtension;
private StaticMapCompoundConfigEntryImpl<Map<String, Object>> rootEntry;
private SimpleConfigEntryImpl<Byte> byteEntry;
private SimpleConfigEntryImpl<Integer> intEntry;
@@ -41,10 +38,8 @@ class ValidationExtensionImplTest {
void setUp() {
configContainer = new DefaultConfigContainer<>();
commentExtension = new CommentExtensionImpl();
configContainer.registerExtension(commentExtension);
validationExtension = new ValidationExtensionImpl();
configContainer.registerExtension(validationExtension);
configContainer.registerExtension(CommentExtension.DEFAULT);
configContainer.registerExtension(ValidationExtension.DEFAULT);
configContainer.finishExtensionSetup();
//noinspection unchecked
@@ -90,6 +85,7 @@ class ValidationExtensionImplTest {
value.put("int", i);
value.put("double", d);
ValidationExtension validationExtension = configContainer.extension(ValidationExtension.class).orElseThrow();
ValidationIssues result = validationExtension.validate(rootEntry, value);
assertNotNull(result);
assertNotNull(result.issuesByPath());
@@ -103,6 +99,7 @@ class ValidationExtensionImplTest {
value.put("int", 124);
value.put("double", 0.2);
ValidationExtension validationExtension = configContainer.extension(ValidationExtension.class).orElseThrow();
ValidationIssues result = validationExtension.validate(rootEntry, value);
assertNotNull(result);
assertNotNull(result.issuesByPath());
@@ -127,4 +124,4 @@ class ValidationExtensionImplTest {
assertEquals(expectedIssue, entryIssues.issues().iterator().next(), "Issue must match");
}
}
}

View File

@@ -10,13 +10,11 @@ import de.siphalor.tweed5.data.extension.api.ReadWriteExtension;
import de.siphalor.tweed5.data.extension.api.TweedEntryReader;
import de.siphalor.tweed5.data.extension.api.TweedEntryWriter;
import de.siphalor.tweed5.data.extension.api.readwrite.TweedEntryReaderWriters;
import de.siphalor.tweed5.data.extension.impl.ReadWriteExtensionImpl;
import de.siphalor.tweed5.data.hjson.HjsonCommentType;
import de.siphalor.tweed5.data.hjson.HjsonLexer;
import de.siphalor.tweed5.data.hjson.HjsonReader;
import de.siphalor.tweed5.data.hjson.HjsonWriter;
import de.siphalor.tweed5.defaultextensions.comment.api.CommentExtension;
import de.siphalor.tweed5.defaultextensions.comment.impl.CommentExtensionImpl;
import de.siphalor.tweed5.defaultextensions.validation.api.ConfigEntryValidator;
import de.siphalor.tweed5.defaultextensions.validation.api.EntrySpecificValidation;
import de.siphalor.tweed5.defaultextensions.validation.api.ValidationExtension;
@@ -24,10 +22,10 @@ import de.siphalor.tweed5.defaultextensions.validation.api.result.ValidationIssu
import de.siphalor.tweed5.defaultextensions.validation.api.result.ValidationIssueLevel;
import de.siphalor.tweed5.defaultextensions.validation.api.result.ValidationResult;
import de.siphalor.tweed5.defaultextensions.validation.api.validators.SimpleValidatorMiddleware;
import de.siphalor.tweed5.defaultextensions.validation.impl.ValidationExtensionImpl;
import de.siphalor.tweed5.defaultextensions.validationfallback.api.ValidationFallbackExtension;
import de.siphalor.tweed5.defaultextensions.validationfallback.api.ValidationFallbackValue;
import org.jetbrains.annotations.NotNull;
import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
@@ -44,24 +42,16 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
class ValidationFallbackExtensionImplTest {
private DefaultConfigContainer<Integer> configContainer;
private CommentExtension commentExtension;
private ValidationExtension validationExtension;
private ValidationFallbackExtension validationFallbackExtension;
private ReadWriteExtension readWriteExtension;
private SimpleConfigEntryImpl<Integer> intEntry;
@SuppressWarnings("unchecked")
@BeforeEach
void setUp() {
configContainer = new DefaultConfigContainer<>();
commentExtension = new CommentExtensionImpl();
configContainer.registerExtension(commentExtension);
validationExtension = new ValidationExtensionImpl();
configContainer.registerExtension(validationExtension);
validationFallbackExtension = new ValidationFallbackExtensionImpl();
configContainer.registerExtension(validationFallbackExtension);
readWriteExtension = new ReadWriteExtensionImpl();
configContainer.registerExtension(readWriteExtension);
configContainer.registerExtension(CommentExtension.DEFAULT);
configContainer.registerExtension(ValidationExtension.DEFAULT);
configContainer.registerExtension(ValidationFallbackExtension.DEFAULT);
configContainer.registerExtension(ReadWriteExtension.DEFAULT);
configContainer.finishExtensionSetup();
@@ -73,7 +63,7 @@ class ValidationFallbackExtensionImplTest {
entrySpecificValidation.set(intEntry.extensionsData(), () -> Arrays.asList(
new SimpleValidatorMiddleware("non-null", new ConfigEntryValidator() {
@Override
public <T> ValidationResult<T> validate(ConfigEntry<T> configEntry, T value) {
public <T> ValidationResult<T> validate(ConfigEntry<T> configEntry, @Nullable T value) {
if (value == null) {
return ValidationResult.withIssues(null, Collections.singleton(
new ValidationIssue("Value must not be null", ValidationIssueLevel.ERROR)
@@ -89,7 +79,7 @@ class ValidationFallbackExtensionImplTest {
}),
new SimpleValidatorMiddleware("range", new ConfigEntryValidator() {
@Override
public <T> ValidationResult<T> validate(ConfigEntry<T> configEntry, T value) {
public <T> ValidationResult<T> validate(ConfigEntry<T> configEntry, @Nullable T value) {
Integer intValue = (Integer) value;
if (intValue < 1) {
return ValidationResult.withIssues(value, Collections.singleton(new ValidationIssue("Must be greater or equal to 1", ValidationIssueLevel.ERROR)));
@@ -134,6 +124,7 @@ class ValidationFallbackExtensionImplTest {
@ParameterizedTest
@ValueSource(strings = {"0", "7", "123", "null"})
void fallbackTriggers(String input) {
ReadWriteExtension readWriteExtension = configContainer.extension(ReadWriteExtension.class).orElseThrow();
Integer result = assertDoesNotThrow(() -> readWriteExtension.read(
new HjsonReader(new HjsonLexer(new StringReader(input))),
intEntry,
@@ -144,6 +135,7 @@ class ValidationFallbackExtensionImplTest {
@Test
void description() {
ReadWriteExtension readWriteExtension = configContainer.extension(ReadWriteExtension.class).orElseThrow();
StringWriter stringWriter = new StringWriter();
assertDoesNotThrow(() -> readWriteExtension.write(
new HjsonWriter(stringWriter, new HjsonWriter.Options().multilineCommentType(HjsonCommentType.SLASHES)),
@@ -152,6 +144,13 @@ class ValidationFallbackExtensionImplTest {
readWriteExtension.createReadWriteContextExtensionsData()
));
assertEquals("// Must not be null.\n// Must be between 1 and 6\n// \n// Default/Fallback value: 3\n5\n", stringWriter.toString());
assertEquals(
"""
// Must not be null.
// Must be between 1 and 6
//\s
// Default/Fallback value: 3
5
""", stringWriter.toString());
}
}
}