Skip to content
Merged
Show file tree
Hide file tree
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions pom.xml
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<parent>
Expand All @@ -25,12 +26,12 @@
<dependency>
<groupId>it.aboutbits</groupId>
<artifactId>spring-boot-toolbox</artifactId>
<version>2.1.0</version>
<version>2.4.1</version>
</dependency>
<dependency>
<groupId>it.aboutbits</groupId>
<artifactId>archunit-toolbox</artifactId>
<version>1.0.0-RC1</version>
<version>1.1.0</version>
</dependency>
</dependencies>
</dependencyManagement>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
package it.aboutbits.springboot.testing.testdata;

import it.aboutbits.springboot.toolbox.type.ScaledBigDecimal;
import it.aboutbits.springboot.toolbox.type.identity.EntityId;
import net.datafaker.Faker;
import net.datafaker.service.FakeValuesService;
import net.datafaker.service.FakerContext;
import net.datafaker.service.RandomService;
import org.jspecify.annotations.NullMarked;

import java.util.Locale;
import java.util.Random;
import java.util.function.Function;
import java.util.function.LongFunction;

@NullMarked
public class FakerExtended extends Faker {
public FakerExtended() {
super();
}

public FakerExtended(Locale locale) {
super(locale);
}

public FakerExtended(Random random) {
super(random);
}

public FakerExtended(Locale locale, Random random) {
super(locale, random);
}

public FakerExtended(Locale locale, RandomService randomService) {
super(locale, randomService);
}

public FakerExtended(FakeValuesService fakeValuesService, FakerContext context) {
super(fakeValuesService, context);
}

public <T extends Enum<?>> T randomEnumValue(Class<T> enumClass) {
var values = enumClass.getEnumConstants();
if (values.length == 0) {
throw new IllegalArgumentException("Enum class must have at least one value");
}
return values[this.random().nextInt(values.length)];
}

public <T extends EntityId<Long>> T randomEntityId(LongFunction<T> constructor) {
return constructor.apply(
super.random().nextInt(9999999)
);
}

public <T extends EntityId<String>> T randomEntityId(Function<String, T> constructor) {
return constructor.apply(
super.internet().uuid()
);
}

public String unique(String value) {
return value + "_" + super.random().nextInt(9999999);
}

public RandomNumericRange numericRange() {
return new RandomNumericRange(
super.getFaker()
);
}

public static final class RandomNumericRange {
private final Faker parent;

private RandomNumericRange(Faker parent) {
this.parent = parent;
}

public NumericRange random() {
return random(-999999999, 999999999);
}

public NumericRange positive() {
return random(1, 999999999);
}

public NumericRange positiveOrZero() {
return random(0, 999999999);
}

public NumericRange negative() {
return random(-999999999, -1);
}

public NumericRange negativeOrZero() {
return random(-999999999, 0);
}

public NumericRange random(double min, double max) {
var lower = parent.random().nextDouble(min, max - 1);
var upper = parent.random().nextDouble(lower, max);

return new NumericRange(
ScaledBigDecimal.valueOf(lower),
ScaledBigDecimal.valueOf(upper)
);
}

public record NumericRange(ScaledBigDecimal lower, ScaledBigDecimal upper) {

}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,10 @@
import java.util.function.Function;
import java.util.function.LongFunction;

/**
* @deprecated Moved. Use {@link it.aboutbits.springboot.testing.testdata.FakerExtended} instead. This class will be removed in a future release.
*/
@Deprecated(forRemoval = true)
@NullMarked
public class FakerExtended extends Faker {
public FakerExtended() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import lombok.extern.slf4j.Slf4j;
import org.jspecify.annotations.NullMarked;
import org.jspecify.annotations.Nullable;

import java.util.ArrayList;
import java.util.List;
Expand All @@ -14,9 +15,6 @@
@Slf4j
@NullMarked
public abstract class ModifiableTestDataCreator<CREATOR extends ModifiableTestDataCreator<CREATOR, ITEM, PARAMETER>, ITEM, PARAMETER> extends TestDataCreator<ITEM> {
@SuppressWarnings("unused")
protected static final FakerExtended FAKER = new FakerExtended();

Comment thread
SirCotare marked this conversation as resolved.
private boolean mutatorSet = false;
private boolean mutatorCalled = false;

Expand All @@ -25,8 +23,8 @@ public abstract class ModifiableTestDataCreator<CREATOR extends ModifiableTestDa
return parameter;
};

protected ObjIntConsumer<ITEM> resultMutator = (_, _) -> {
};
@Nullable
protected ObjIntConsumer<ITEM> resultMutator = null;

protected ModifiableTestDataCreator(int count) {
super(count);
Expand Down Expand Up @@ -71,11 +69,15 @@ protected List<ITEM> create() {
for (var index = 0; index < numberOfItems; index++) {
var item = create(index);

resultMutator.accept(item, index);
if (resultMutator != null) {
resultMutator.accept(item, index);

result.add(
saveMutation(item)
);
result.add(
saveMutation(item)
);
} else {
result.add(item);
}
}

if (mutatorSet && !mutatorCalled) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package it.aboutbits.springboot.testing.testdata.base;

import it.aboutbits.springboot.testing.testdata.FakerExtended;
import org.jspecify.annotations.NullMarked;

import java.util.ArrayList;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
package it.aboutbits.springboot.testing.validation.core;

import org.jspecify.annotations.NullMarked;
import org.jspecify.annotations.Nullable;

import java.util.stream.Stream;

@NullMarked
public interface ValueSource {
<T> Stream<T> values(Class<T> propertyClass, Object... args);
<T> Stream<@Nullable T> values(Class<T> propertyClass, Object... args);
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import it.aboutbits.springboot.testing.validation.core.ValueSource;
import it.aboutbits.springboot.toolbox.type.ScaledBigDecimal;
import org.jspecify.annotations.NullMarked;
import org.jspecify.annotations.Nullable;

import java.math.BigDecimal;
import java.math.BigInteger;
Expand Down Expand Up @@ -48,10 +49,10 @@ public static void registerType(Class<?> type, Function<Object[], Stream<?>> sou

@Override
@SuppressWarnings("unchecked")
public <T> Stream<T> values(Class<T> propertyClass, Object... args) {
public <T> Stream<@Nullable T> values(Class<T> propertyClass, Object... args) {
var sourceFunction = TYPE_SOURCES.get(propertyClass);
if (sourceFunction != null) {
return (Stream<T>) sourceFunction.apply(args);
return (Stream<@Nullable T>) sourceFunction.apply(args);
}

throw new IllegalArgumentException("Property class not supported!");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import it.aboutbits.springboot.testing.validation.core.ValueSource;
import org.jspecify.annotations.NullMarked;
import org.jspecify.annotations.Nullable;

import java.util.HashMap;
import java.util.Map;
Expand All @@ -26,10 +27,10 @@ public static void registerType(Class<?> type, Function<Object[], Stream<?>> sou

@Override
@SuppressWarnings("unchecked")
public <T> Stream<T> values(Class<T> propertyClass, Object... args) {
public <T> Stream<@Nullable T> values(Class<T> propertyClass, Object... args) {
var sourceFunction = TYPE_SOURCES.get(propertyClass);
if (sourceFunction != null) {
return (Stream<T>) sourceFunction.apply(args);
return (Stream<@Nullable T>) sourceFunction.apply(args);
}

throw new IllegalArgumentException("Property class not supported!");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import it.aboutbits.springboot.testing.validation.core.ValueSource;
import org.jspecify.annotations.NullMarked;
import org.jspecify.annotations.Nullable;

import java.util.ArrayList;
import java.util.HashMap;
Expand Down Expand Up @@ -38,10 +39,10 @@ public static void registerType(Class<?> type, Function<Object[], Stream<?>> sou

@Override
@SuppressWarnings("unchecked")
public <T> Stream<T> values(Class<T> propertyClass, Object... args) {
public <T> Stream<@Nullable T> values(Class<T> propertyClass, Object... args) {
var sourceFunction = TYPE_SOURCES.get(propertyClass);
if (sourceFunction != null) {
return (Stream<T>) sourceFunction.apply(args);
return (Stream<@Nullable T>) sourceFunction.apply(args);
}

throw new IllegalArgumentException("Property class not supported!");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import it.aboutbits.springboot.testing.validation.core.ValueSource;
import org.jspecify.annotations.NullMarked;
import org.jspecify.annotations.Nullable;

import java.time.Instant;
import java.time.LocalDate;
Expand Down Expand Up @@ -43,10 +44,10 @@ public static void registerType(Class<?> type, Function<Object[], Stream<?>> sou

@Override
@SuppressWarnings("unchecked")
public <T> Stream<T> values(Class<T> propertyClass, Object... args) {
public <T> Stream<@Nullable T> values(Class<T> propertyClass, Object... args) {
var sourceFunction = TYPE_SOURCES.get(propertyClass);
if (sourceFunction != null) {
return (Stream<T>) sourceFunction.apply(args);
return (Stream<@Nullable T>) sourceFunction.apply(args);
}

throw new IllegalArgumentException("Property class not supported!");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,14 @@

import it.aboutbits.springboot.testing.validation.core.ValueSource;
import org.jspecify.annotations.NullMarked;
import org.jspecify.annotations.Nullable;

import java.util.stream.Stream;

@NullMarked
public class InertValueSource implements ValueSource {
@Override
public <T> Stream<T> values(Class<T> propertyClass, Object... args) {
public <T> Stream<@Nullable T> values(Class<T> propertyClass, Object... args) {
return Stream.empty();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import it.aboutbits.springboot.testing.validation.core.ValueSource;
import it.aboutbits.springboot.toolbox.type.ScaledBigDecimal;
import org.jspecify.annotations.NullMarked;
import org.jspecify.annotations.Nullable;

import java.math.BigDecimal;
import java.math.BigInteger;
Expand Down Expand Up @@ -49,10 +50,10 @@ public static void registerType(Class<?> type, Function<Object[], Stream<?>> sou

@Override
@SuppressWarnings("unchecked")
public <T> Stream<T> values(Class<T> propertyClass, Object... args) {
public <T> Stream<@Nullable T> values(Class<T> propertyClass, Object... args) {
var sourceFunction = TYPE_SOURCES.get(propertyClass);
if (sourceFunction != null) {
return (Stream<T>) sourceFunction.apply(args);
return (Stream<@Nullable T>) sourceFunction.apply(args);
}

throw new IllegalArgumentException("Property class not supported!");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import it.aboutbits.springboot.testing.validation.core.ValueSource;
import org.jspecify.annotations.NullMarked;
import org.jspecify.annotations.Nullable;

import java.util.HashMap;
import java.util.Map;
Expand All @@ -25,10 +26,10 @@ public static void registerType(Class<?> type, Function<Object[], Stream<?>> sou

@Override
@SuppressWarnings("unchecked")
public <T> Stream<T> values(Class<T> propertyClass, Object... args) {
public <T> Stream<@Nullable T> values(Class<T> propertyClass, Object... args) {
var sourceFunction = TYPE_SOURCES.get(propertyClass);
if (sourceFunction != null) {
return (Stream<T>) sourceFunction.apply(args);
return (Stream<@Nullable T>) sourceFunction.apply(args);
}

throw new IllegalArgumentException("Property class not supported!");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import it.aboutbits.springboot.testing.validation.core.ValueSource;
import org.jspecify.annotations.NullMarked;
import org.jspecify.annotations.Nullable;

import java.util.HashMap;
import java.util.Map;
Expand All @@ -19,10 +20,10 @@ public static void registerType(Class<?> type, Function<Object[], Stream<?>> sou

@Override
@SuppressWarnings("unchecked")
public <T> Stream<T> values(Class<T> propertyClass, Object... args) {
public <T> Stream<@Nullable T> values(Class<T> propertyClass, Object... args) {
var sourceFunction = TYPE_SOURCES.get(propertyClass);
if (sourceFunction != null) {
return (Stream<T>) sourceFunction.apply(args);
return (Stream<@Nullable T>) sourceFunction.apply(args);
}

return Stream.of((T) null);
Expand Down
Loading