[*] Rework registration of TweedExtensions
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user