From cba6521c54d7568319897d6077c370117db1ae4a Mon Sep 17 00:00:00 2001
From: Stefan Hechtl
Date: Fri, 4 Feb 2022 11:10:40 +0100
Subject: [PATCH 01/10] fix typo
Signed-off-by: Stefan Hechtl
---
.../java/com/tngtech/valueprovider/ValueProviderTest.java | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/core/src/test/java/com/tngtech/valueprovider/ValueProviderTest.java b/core/src/test/java/com/tngtech/valueprovider/ValueProviderTest.java
index e45ac7b..90f2340 100644
--- a/core/src/test/java/com/tngtech/valueprovider/ValueProviderTest.java
+++ b/core/src/test/java/com/tngtech/valueprovider/ValueProviderTest.java
@@ -42,7 +42,7 @@
import static com.tngtech.valueprovider.ValueProviderTest.TestEnum.SIX;
import static com.tngtech.valueprovider.ValueProviderTest.TestEnum.TEN;
import static com.tngtech.valueprovider.ValueProviderTest.TestEnum.THREE;
-import static com.tngtech.valueprovider.ValueProviderTest.TestEnum.TWELFE;
+import static com.tngtech.valueprovider.ValueProviderTest.TestEnum.TWELVE;
import static com.tngtech.valueprovider.ValueProviderTest.TestEnum.TWO;
import static java.time.LocalDateTime.now;
import static java.util.Arrays.stream;
@@ -481,7 +481,7 @@ void oneOfExcluding_should_return_allowed_values_only() {
assertThat(random.oneOfExcluding(newArrayList("1", "2", "3", "4"), "3", "4")).isIn("1", "2").isNotIn("3", "4");
assertThat(random.oneOfExcluding(ONE, THREE, FIVE, SEVEN, NINE, ELEVEN))
- .isIn(TWO, FOUR, SIX, EIGHT, TEN, TWELFE)
+ .isIn(TWO, FOUR, SIX, EIGHT, TEN, TWELVE)
.isNotIn(ONE, THREE, FIVE, SEVEN, NINE, ELEVEN);
}
@@ -611,7 +611,7 @@ private ValueProvider withFixedValues(long seed) {
}
enum TestEnum {
- ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, ELEVEN, TWELFE
+ ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, ELEVEN, TWELVE
}
enum EmptyTestEnum {
From 18a70eed768d7c1171e0e8e678bfe1d02c82f57e Mon Sep 17 00:00:00 2001
From: Stefan Hechtl
Date: Fri, 18 Mar 2022 10:45:14 +0100
Subject: [PATCH 02/10] Add methods to (randomly) generate lists of beans
Issue: #4
Signed-off-by: Stefan Hechtl
---
core/build.gradle | 1 +
.../tngtech/valueprovider/ValueProvider.java | 134 +++++++++++++++++-
.../valueprovider/ValueProviderTest.java | 71 ++++++++++
3 files changed, 205 insertions(+), 1 deletion(-)
diff --git a/core/build.gradle b/core/build.gradle
index 28551f0..b4a6eb3 100644
--- a/core/build.gradle
+++ b/core/build.gradle
@@ -1,5 +1,6 @@
dependencies {
testImplementation dependency.junit_jupiter_api
+ testImplementation dependency.lombok
testRuntimeOnly dependency.junit_jupiter_engine
}
diff --git a/core/src/main/java/com/tngtech/valueprovider/ValueProvider.java b/core/src/main/java/com/tngtech/valueprovider/ValueProvider.java
index 51187c4..eb59e71 100644
--- a/core/src/main/java/com/tngtech/valueprovider/ValueProvider.java
+++ b/core/src/main/java/com/tngtech/valueprovider/ValueProvider.java
@@ -12,6 +12,7 @@
import java.time.LocalTime;
import java.time.Month;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collection;
import java.util.EnumSet;
import java.util.List;
@@ -735,7 +736,8 @@ public > Set someOf(Class enumClass, int numberOfElement
* @param elements the elements to draw from.
* @return the drawn elements (none / some / all).
*/
- @SafeVarargs final public Collection someOf(T... elements) {
+ @SafeVarargs
+ final public Collection someOf(T... elements) {
return someOf(asList(elements));
}
@@ -829,6 +831,136 @@ public final T oneOfExcluding(Iterable elements, T... elementsToExclude)
return oneOf(allElements);
}
+ /**
+ * Generates a {@link List} of <T> (by means of {@code generator}) and includes {@code containedElements} in the {@link List}.
+ *
+ * Example:
+ *
+ * static class MyBeanTestData {
+ * public static MyBean myBean(ValueProvider valueProvider) {
+ * // builds and returns your bean
+ * }
+ * }
+ *
+ * ValueProvider vp = ValueProviderFactory.createRandomValueProvider();
+ * vp.listOfContaining(MyBeanTestData::myBean, myBean(), myBean(), myBean()); // -> List[myBean_1, myBean_2, myBean_random, myBean_3, myBean_random]
+ *
+ *
+ *
+ * @param generator a generator {@link Function} to generate T given a {@link ValueProvider}.
+ * @param containedElements elements that should be contained in the generated list.
+ *
+ * @return the generated {@link List}.
+ *
+ * @see #listOf(Function)
+ */
+ @SafeVarargs
+ public final List listOfContaining(Function generator, T... containedElements) {
+ return listOfContaining(generator, Arrays.asList(containedElements));
+ }
+
+ /**
+ * see {@link #listOfContaining(Function, Object[])}
+ */
+ public final List listOfContaining(Function generator, Collection containedElements) {
+ int maxNumberOfRandomElements = maxNumberOfRandomElements(containedElements);
+
+ List generatedElements = new ArrayList<>();
+ for (T containedValue : containedElements) {
+ generatedElements.addAll(listOf(intNumber(0, maxNumberOfRandomElements), generator));
+ generatedElements.add(containedValue);
+ }
+ generatedElements.addAll(listOf(intNumber(0, maxNumberOfRandomElements), generator));
+ return generatedElements;
+ }
+
+ private int maxNumberOfRandomElements(Collection containedElements) {
+ if (containedElements.size() == 0) {
+ return 5;
+ }
+ if (containedElements.size() == 1) {
+ return 2;
+ }
+ return 1;
+ }
+
+ /**
+ * Generates a {@link List} of <T> (by means of {@code generator}). Ensures that the {@link List} contains at least one element.
+ *
+ * Example:
+ *
+ * static class MyBeanTestData {
+ * public static MyBean myBean(ValueProvider valueProvider) {
+ * // builds and returns your bean
+ * }
+ * }
+ *
+ * ValueProvider vp = ValueProviderFactory.createRandomValueProvider();
+ * vp.nonEmptyListOf(MyBeanTestData::myBean); // -> List[myBean_generated_1, myBean_generated_2]
+ *
+ *
+ *
+ * @param generator a generator {@link Function} to generate T given a {@link ValueProvider}.
+ *
+ * @return the generated {@link List}.
+ */
+ public List nonEmptyListOf(Function generator) {
+ return listOf(intNumber(1, 5), generator);
+ }
+
+ /**
+ * Generates a {@link List} of <T> (by means of {@code generator}). Might return the empty list.
+ *
+ * Example:
+ *
+ * static class MyBeanTestData {
+ * public static MyBean myBean(ValueProvider valueProvider) {
+ * // builds and returns your bean
+ * }
+ * }
+ *
+ * ValueProvider vp = ValueProviderFactory.createRandomValueProvider();
+ * vp.listOf(MyBeanTestData::myBean); // -> List[myBean_generated_1, myBean_generated_2]
+ * vp.listOf(MyBeanTestData::myBean); // -> List[]
+ *
+ *
+ *
+ * @param generator a generator {@link Function} to generate T given a {@link ValueProvider}.
+ *
+ * @return the generated {@link List}.
+ */
+ public List listOf(Function generator) {
+ return listOf(intNumber(0, 5), generator);
+ }
+
+ /**
+ * Generates a {@link List} of <T> (by means of {@code generator}). Containing exactly {@code numberOfElements} elements.
+ *
+ * Example:
+ *
+ * static class MyBeanTestData {
+ * public static MyBean myBean(ValueProvider valueProvider) {
+ * // builds and returns your bean
+ * }
+ * }
+ *
+ * ValueProvider vp = ValueProviderFactory.createRandomValueProvider();
+ * vp.listOf(4, MyBeanTestData::myBean); // -> List[myBean_generated_1, myBean_generated_2, myBean_generated_3, myBean_generated_4]
+ *
+ *
+ *
+ * @param generator a generator {@link Function} to generate T given a {@link ValueProvider}.
+ *
+ * @return the generated {@link List}.
+ */
+ public List listOf(int numberOfElements, Function generator) {
+ List generatedElements = new ArrayList<>();
+ for (int i = 0; i < numberOfElements; i++) {
+ generatedElements.add(generator.apply((V) this));
+ }
+ return generatedElements;
+ }
+
/**
* Randomly draws true or false.
*
diff --git a/core/src/test/java/com/tngtech/valueprovider/ValueProviderTest.java b/core/src/test/java/com/tngtech/valueprovider/ValueProviderTest.java
index 90f2340..f9a7cee 100644
--- a/core/src/test/java/com/tngtech/valueprovider/ValueProviderTest.java
+++ b/core/src/test/java/com/tngtech/valueprovider/ValueProviderTest.java
@@ -20,6 +20,9 @@
import java.util.stream.LongStream;
import java.util.stream.Stream;
+import lombok.Data;
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.junit.jupiter.api.DynamicTest;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestFactory;
@@ -32,6 +35,7 @@
import static com.tngtech.valueprovider.ValueProviderTest.MethodInvocation.assertDifferentResultAsFarAsPossible;
import static com.tngtech.valueprovider.ValueProviderTest.MethodInvocation.assertEqualResult;
import static com.tngtech.valueprovider.ValueProviderTest.MethodInvocation.invoke;
+import static com.tngtech.valueprovider.ValueProviderTest.MyBeanTestData.myBeanContained;
import static com.tngtech.valueprovider.ValueProviderTest.TestEnum.EIGHT;
import static com.tngtech.valueprovider.ValueProviderTest.TestEnum.ELEVEN;
import static com.tngtech.valueprovider.ValueProviderTest.TestEnum.FIVE;
@@ -573,6 +577,44 @@ void someOf_should_return_duplicates_if_input_contains_duplicates() {
.hasSize(valueList.size());
}
+ @Test
+ void listOf_should_return_a_sensible_number_of_elements() {
+ // given
+ ValueProvider random = withRandomValues();
+
+ // when
+ List myBeans = random.listOf(MyBeanTestData::myBean);
+
+ // then
+ assertThat(myBeans).size().isLessThanOrEqualTo(5); // 5 is the default
+ }
+
+ @Test
+ void nonEmptyListOf_should_return_at_least_one_element() {
+ // given
+ ValueProvider random = withRandomValues();
+
+ // when
+ List myBeans = random.nonEmptyListOf(MyBeanTestData::myBean);
+
+ // then
+ assertThat(myBeans).size().isGreaterThanOrEqualTo(1);
+ assertThat(myBeans).size().isLessThanOrEqualTo(5); // 5 is the default
+ }
+
+ @Test
+ void listOfContaining_should_return_the_provided_elements_plus_some_randomly_generated_elements() {
+ // given
+ ValueProvider random = withRandomValues();
+
+ // when
+ List myBeans = random.listOfContaining(MyBeanTestData::myBean, myBeanContained(1), myBeanContained(2), myBeanContained(3));
+
+ // then
+ assertThat(myBeans).size().isLessThanOrEqualTo(7); // 3 contained beans + max. 1 random 'spacing' bean between each + max. 1 random bean at the beginning/end
+ assertThat(myBeans).contains(myBeanContained(1), myBeanContained(2), myBeanContained(3));
+ }
+
@Test
void ipV6Address_should_return_valid_IPv6_address() throws UnknownHostException {
ValueProvider random = withRandomValues();
@@ -673,4 +715,33 @@ private void assertBigDecimalNumberWithScale2(ValueProvider provider, Number min
.isGreaterThanOrEqualTo(new BigDecimal(min.doubleValue() - 0.01))
.isLessThanOrEqualTo(new BigDecimal(max.doubleValue() + 0.01));
}
+
+ static class MyBeanTestData {
+ public static MyBean myBean(ValueProvider valueProvider) {
+ return new MyBean("randomly generated");
+ }
+
+ public static MyBean myBeanContained(int counter) {
+ return new MyBean("contained" + counter);
+ }
+ }
+
+ @Data
+ static class MyBean {
+ String value;
+
+ public MyBean(String value) {
+ this.value = value;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ return EqualsBuilder.reflectionEquals(this, o, true);
+ }
+
+ @Override
+ public int hashCode() {
+ return HashCodeBuilder.reflectionHashCode(this, true);
+ }
+ }
}
From 9d8fd8c407c4c70f449acf5fc57c0bcf46a14974 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonas=20H=C3=B6f?=
Date: Tue, 17 May 2022 18:29:43 +0200
Subject: [PATCH 03/10] enable lombok annotation processor for test code
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: Jonas Höf
---
core/build.gradle | 3 ++-
.../valueprovider/ValueProviderTest.java | 23 ++++---------------
2 files changed, 6 insertions(+), 20 deletions(-)
diff --git a/core/build.gradle b/core/build.gradle
index b4a6eb3..09bfc2d 100644
--- a/core/build.gradle
+++ b/core/build.gradle
@@ -1,6 +1,7 @@
dependencies {
testImplementation dependency.junit_jupiter_api
- testImplementation dependency.lombok
+ testCompileOnly dependency.lombok
+ testAnnotationProcessor dependency.lombok
testRuntimeOnly dependency.junit_jupiter_engine
}
diff --git a/core/src/test/java/com/tngtech/valueprovider/ValueProviderTest.java b/core/src/test/java/com/tngtech/valueprovider/ValueProviderTest.java
index f9a7cee..0c9b071 100644
--- a/core/src/test/java/com/tngtech/valueprovider/ValueProviderTest.java
+++ b/core/src/test/java/com/tngtech/valueprovider/ValueProviderTest.java
@@ -21,8 +21,6 @@
import java.util.stream.Stream;
import lombok.Data;
-import org.apache.commons.lang3.builder.EqualsBuilder;
-import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.junit.jupiter.api.DynamicTest;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestFactory;
@@ -408,8 +406,9 @@ private static DynamicTest lengthMinMax(String name, int length, int min, int ma
return DynamicTest.dynamicTest(name, () -> {
String numericString = withRandomValues().numericString(length, min, max);
- assertThat(Integer.valueOf(numericString)).isGreaterThanOrEqualTo(min);
- assertThat(Integer.valueOf(numericString)).isLessThanOrEqualTo(max);
+ assertThat(Integer.valueOf(numericString))
+ .isGreaterThanOrEqualTo(min)
+ .isLessThanOrEqualTo(max);
});
}
@@ -728,20 +727,6 @@ public static MyBean myBeanContained(int counter) {
@Data
static class MyBean {
- String value;
-
- public MyBean(String value) {
- this.value = value;
- }
-
- @Override
- public boolean equals(Object o) {
- return EqualsBuilder.reflectionEquals(this, o, true);
- }
-
- @Override
- public int hashCode() {
- return HashCodeBuilder.reflectionHashCode(this, true);
- }
+ private final String value;
}
}
From 9c344894749bc8f2256c850e04ee57f1c834d549 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonas=20H=C3=B6f?=
Date: Tue, 17 May 2022 18:32:04 +0200
Subject: [PATCH 04/10] ensure that list content is shown on test failure
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: Jonas Höf
---
.../com/tngtech/valueprovider/ValueProviderTest.java | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)
diff --git a/core/src/test/java/com/tngtech/valueprovider/ValueProviderTest.java b/core/src/test/java/com/tngtech/valueprovider/ValueProviderTest.java
index 0c9b071..660efcd 100644
--- a/core/src/test/java/com/tngtech/valueprovider/ValueProviderTest.java
+++ b/core/src/test/java/com/tngtech/valueprovider/ValueProviderTest.java
@@ -585,7 +585,7 @@ void listOf_should_return_a_sensible_number_of_elements() {
List myBeans = random.listOf(MyBeanTestData::myBean);
// then
- assertThat(myBeans).size().isLessThanOrEqualTo(5); // 5 is the default
+ assertThat(myBeans).hasSizeLessThanOrEqualTo(5); // 5 is the default
}
@Test
@@ -597,8 +597,8 @@ void nonEmptyListOf_should_return_at_least_one_element() {
List myBeans = random.nonEmptyListOf(MyBeanTestData::myBean);
// then
- assertThat(myBeans).size().isGreaterThanOrEqualTo(1);
- assertThat(myBeans).size().isLessThanOrEqualTo(5); // 5 is the default
+ assertThat(myBeans).isNotEmpty()
+ .hasSizeLessThanOrEqualTo(5); // 5 is the default
}
@Test
@@ -610,8 +610,9 @@ void listOfContaining_should_return_the_provided_elements_plus_some_randomly_gen
List myBeans = random.listOfContaining(MyBeanTestData::myBean, myBeanContained(1), myBeanContained(2), myBeanContained(3));
// then
- assertThat(myBeans).size().isLessThanOrEqualTo(7); // 3 contained beans + max. 1 random 'spacing' bean between each + max. 1 random bean at the beginning/end
- assertThat(myBeans).contains(myBeanContained(1), myBeanContained(2), myBeanContained(3));
+ assertThat(myBeans).hasSizeLessThanOrEqualTo(7)
+ // 3 contained beans + max. 1 random 'spacing' bean between each + max. 1 random bean at the beginning/end
+ .contains(myBeanContained(1), myBeanContained(2), myBeanContained(3));
}
@Test
From d1147ad477448802a3d410ba07f5d6a337306851 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonas=20H=C3=B6f?=
Date: Tue, 17 May 2022 18:39:28 +0200
Subject: [PATCH 05/10] ensure random data
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: Jonas Höf
---
.../test/java/com/tngtech/valueprovider/ValueProviderTest.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/core/src/test/java/com/tngtech/valueprovider/ValueProviderTest.java b/core/src/test/java/com/tngtech/valueprovider/ValueProviderTest.java
index 660efcd..997da3d 100644
--- a/core/src/test/java/com/tngtech/valueprovider/ValueProviderTest.java
+++ b/core/src/test/java/com/tngtech/valueprovider/ValueProviderTest.java
@@ -718,7 +718,7 @@ private void assertBigDecimalNumberWithScale2(ValueProvider provider, Number min
static class MyBeanTestData {
public static MyBean myBean(ValueProvider valueProvider) {
- return new MyBean("randomly generated");
+ return new MyBean("randomly generated" + valueProvider.intNumber(0, Integer.MAX_VALUE));
}
public static MyBean myBeanContained(int counter) {
From 39c28c003d0513228561715a5dbe4884d50f4f68 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonas=20H=C3=B6f?=
Date: Wed, 18 May 2022 07:41:05 +0200
Subject: [PATCH 06/10] fix warnings and consolidate assertions
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* move private methods to using tests
Signed-off-by: Jonas Höf
---
.../valueprovider/ValueProviderTest.java | 124 ++++++++----------
1 file changed, 56 insertions(+), 68 deletions(-)
diff --git a/core/src/test/java/com/tngtech/valueprovider/ValueProviderTest.java b/core/src/test/java/com/tngtech/valueprovider/ValueProviderTest.java
index 997da3d..10866e0 100644
--- a/core/src/test/java/com/tngtech/valueprovider/ValueProviderTest.java
+++ b/core/src/test/java/com/tngtech/valueprovider/ValueProviderTest.java
@@ -220,6 +220,17 @@ void intNumber_should_create_correct_numbers_for_the_limits_of_the_integer_range
assertIntNumber(Integer.MAX_VALUE, Integer.MAX_VALUE);
}
+ private void assertIntNumber(int min, int max) {
+ assertIntNumber(withRandomValues(), min, max);
+ assertIntNumber(withFixedValues(), min, max);
+ }
+
+ private void assertIntNumber(ValueProvider provider, int min, int max) {
+ assertThat(provider.intNumber(min, max))
+ .isGreaterThanOrEqualTo(min)
+ .isLessThanOrEqualTo(max);
+ }
+
@Test
void longNumber_should_create_number_between_min_and_max_and_outside_integer_range() {
for (long i = 0; i < 1000; i++) {
@@ -245,6 +256,18 @@ void longNumber_should_create_correct_numbers_for_the_limits_of_the_long_range()
assertLongNumber(Long.MAX_VALUE, Long.MAX_VALUE);
}
+ private void assertLongNumber(long min, long max) {
+ assertLongNumber(withRandomValues(), min, max);
+ assertLongNumber(withFixedValues(), min, max);
+ }
+
+ private void assertLongNumber(ValueProvider provider, long min, long max) {
+ long longNumber = provider.longNumber(min, max);
+ assertThat(longNumber)
+ .isGreaterThanOrEqualTo(min)
+ .isLessThanOrEqualTo(max);
+ }
+
@Test
void longNumber_should_create_random_numbers_for_the_entire_long_range() {
long min = 0L;
@@ -292,6 +315,16 @@ void bigIntegerNumber_should_create_number_between_min_and_max_and_exceeding_lon
}
}
+ private void assertBigIntegerNumber(BigInteger min, BigInteger max) {
+ assertBigIntegerNumber(withRandomValues(), min, max);
+ assertBigIntegerNumber(withFixedValues(), min, max);
+ }
+
+ private void assertBigIntegerNumber(ValueProvider provider, BigInteger min, BigInteger max) {
+ assertThat(provider.bigIntegerNumber(min, max))
+ .isBetween(min, max);
+ }
+
@SuppressWarnings("unchecked")
@Test
void integer_number_methods_should_handle_range_zero_to_one_properly() {
@@ -388,9 +421,27 @@ void bigDecimalNumber_should_create_number_between_min_and_max() {
}
}
+ private void assertBigDecimalNumber(double min, double max) {
+ assertBigDecimalNumber(withRandomValues(), min, max);
+ assertBigDecimalNumber(withFixedValues(), min, max);
+ }
+
+ private void assertBigDecimalNumber(ValueProvider provider, double min, double max) {
+ assertThat(provider.bigDecimalNumber(min, max))
+ .isBetween(BigDecimal.valueOf(min), BigDecimal.valueOf(max));
+ }
+
@Test
void bigDecimalNumberWithScale_should_return_numbers_within_specified_range_as_long_as_scale_allows_it() {
- assertBigDecimalNumberWithScale2(1.001, 1.004);
+ double min = 1.001;
+ double max = 1.004;
+ int scale = 2;
+ double offsetForScale = 0.01;
+
+ assertThat(withRandomValues().bigDecimalNumberWithScale(min, max, scale))
+ .isBetween(BigDecimal.valueOf(min - offsetForScale), BigDecimal.valueOf(max + offsetForScale));
+ assertThat(withFixedValues().bigDecimalNumberWithScale(min, max, scale))
+ .isBetween(BigDecimal.valueOf(min - offsetForScale), BigDecimal.valueOf(max + offsetForScale));
}
@TestFactory
@@ -398,7 +449,7 @@ List numericString_should_allow_restricting_min_and_max_in_addition
return newArrayList(
lengthMinMax("unrestricted", 3, 100, 200),
lengthMinMax("restricted to range", 3, 120, 180),
- lengthMinMax("restricted to single value", 3, 150, 150)
+ lengthMinMax("restricted to single value", 4, 1234, 1234)
);
}
@@ -406,9 +457,7 @@ private static DynamicTest lengthMinMax(String name, int length, int min, int ma
return DynamicTest.dynamicTest(name, () -> {
String numericString = withRandomValues().numericString(length, min, max);
- assertThat(Integer.valueOf(numericString))
- .isGreaterThanOrEqualTo(min)
- .isLessThanOrEqualTo(max);
+ assertThat(Integer.valueOf(numericString)).isBetween(min, max);
});
}
@@ -573,7 +622,7 @@ void someOf_should_return_duplicates_if_input_contains_duplicates() {
assertThat(random.someOf(valueList, valueList.size()))
.isSubsetOf(valueSet)
- .hasSize(valueList.size());
+ .hasSameSizeAs(valueList);
}
@Test
@@ -645,11 +694,7 @@ private static ValueProvider withRandomValues() {
}
private ValueProvider withFixedValues() {
- return withFixedValues(0L);
- }
-
- private ValueProvider withFixedValues(long seed) {
- return new ValueProvider(createReproducibleInitialization(seed));
+ return new ValueProvider(createReproducibleInitialization(0L));
}
enum TestEnum {
@@ -657,63 +702,6 @@ enum TestEnum {
}
enum EmptyTestEnum {
-
- }
-
- private void assertIntNumber(int min, int max) {
- assertIntNumber(withRandomValues(), min, max);
- assertIntNumber(withFixedValues(), min, max);
- }
-
- private void assertIntNumber(ValueProvider provider, int min, int max) {
- assertThat(provider.intNumber(min, max))
- .isGreaterThanOrEqualTo(min)
- .isLessThanOrEqualTo(max);
- }
-
- private void assertLongNumber(long min, long max) {
- assertLongNumber(withRandomValues(), min, max);
- assertLongNumber(withFixedValues(), min, max);
- }
-
- private void assertLongNumber(ValueProvider provider, long min, long max) {
- long longNumber = provider.longNumber(min, max);
- assertThat(longNumber)
- .isGreaterThanOrEqualTo(min)
- .isLessThanOrEqualTo(max);
- }
-
- private void assertBigIntegerNumber(BigInteger min, BigInteger max) {
- assertBigIntegerNumber(withRandomValues(), min, max);
- assertBigIntegerNumber(withFixedValues(), min, max);
- }
-
- private void assertBigIntegerNumber(ValueProvider provider, BigInteger min, BigInteger max) {
- assertThat(provider.bigIntegerNumber(min, max))
- .isGreaterThanOrEqualTo(min)
- .isLessThanOrEqualTo(max);
- }
-
- private void assertBigDecimalNumber(Number min, Number max) {
- assertBigDecimalNumber(withRandomValues(), min, max);
- assertBigDecimalNumber(withFixedValues(), min, max);
- }
-
- private void assertBigDecimalNumber(ValueProvider provider, Number min, Number max) {
- assertThat(provider.bigDecimalNumber(min, max))
- .isGreaterThanOrEqualTo(new BigDecimal(min.doubleValue()))
- .isLessThanOrEqualTo(new BigDecimal(max.doubleValue()));
- }
-
- private void assertBigDecimalNumberWithScale2(Number min, Number max) {
- assertBigDecimalNumberWithScale2(withRandomValues(), min, max);
- assertBigDecimalNumberWithScale2(withFixedValues(), min, max);
- }
-
- private void assertBigDecimalNumberWithScale2(ValueProvider provider, Number min, Number max) {
- assertThat(provider.bigDecimalNumberWithScale(min, max, 2))
- .isGreaterThanOrEqualTo(new BigDecimal(min.doubleValue() - 0.01))
- .isLessThanOrEqualTo(new BigDecimal(max.doubleValue() + 0.01));
}
static class MyBeanTestData {
From 4a00ecfec412c8263470fd8de1ef9db0b7aae8de Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonas=20H=C3=B6f?=
Date: Wed, 18 May 2022 07:50:26 +0200
Subject: [PATCH 07/10] consolidate method signature
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: Jonas Höf
---
.../com/tngtech/valueprovider/ValueProvider.java | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/core/src/main/java/com/tngtech/valueprovider/ValueProvider.java b/core/src/main/java/com/tngtech/valueprovider/ValueProvider.java
index eb59e71..4b26429 100644
--- a/core/src/main/java/com/tngtech/valueprovider/ValueProvider.java
+++ b/core/src/main/java/com/tngtech/valueprovider/ValueProvider.java
@@ -867,10 +867,10 @@ public final List listOfContaining(Function generatedElements = new ArrayList<>();
for (T containedValue : containedElements) {
- generatedElements.addAll(listOf(intNumber(0, maxNumberOfRandomElements), generator));
+ generatedElements.addAll(listOf(generator, intNumber(0, maxNumberOfRandomElements)));
generatedElements.add(containedValue);
}
- generatedElements.addAll(listOf(intNumber(0, maxNumberOfRandomElements), generator));
+ generatedElements.addAll(listOf(generator, intNumber(0, maxNumberOfRandomElements)));
return generatedElements;
}
@@ -905,7 +905,7 @@ private int maxNumberOfRandomElements(Collection containedElements) {
* @return the generated {@link List}.
*/
public List nonEmptyListOf(Function generator) {
- return listOf(intNumber(1, 5), generator);
+ return listOf(generator, intNumber(1, 5));
}
/**
@@ -930,7 +930,7 @@ public List nonEmptyListOf(Function genera
* @return the generated {@link List}.
*/
public List listOf(Function generator) {
- return listOf(intNumber(0, 5), generator);
+ return listOf(generator, intNumber(0, 5));
}
/**
@@ -945,7 +945,7 @@ public List listOf(Function generator) {
* }
*
* ValueProvider vp = ValueProviderFactory.createRandomValueProvider();
- * vp.listOf(4, MyBeanTestData::myBean); // -> List[myBean_generated_1, myBean_generated_2, myBean_generated_3, myBean_generated_4]
+ * vp.listOf(MyBeanTestData::myBean, 4); // -> List[myBean_generated_1, myBean_generated_2, myBean_generated_3, myBean_generated_4]
*
*
*
@@ -953,7 +953,7 @@ public List listOf(Function generator) {
*
* @return the generated {@link List}.
*/
- public List listOf(int numberOfElements, Function generator) {
+ public List listOf(Function generator, int numberOfElements) {
List generatedElements = new ArrayList<>();
for (int i = 0; i < numberOfElements; i++) {
generatedElements.add(generator.apply((V) this));
From 725109b14c8939022a60d26824da0a23c3742f66 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonas=20H=C3=B6f?=
Date: Wed, 18 May 2022 07:50:56 +0200
Subject: [PATCH 08/10] suppress warning
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: Jonas Höf
---
core/src/main/java/com/tngtech/valueprovider/ValueProvider.java | 1 +
1 file changed, 1 insertion(+)
diff --git a/core/src/main/java/com/tngtech/valueprovider/ValueProvider.java b/core/src/main/java/com/tngtech/valueprovider/ValueProvider.java
index 4b26429..6fa544f 100644
--- a/core/src/main/java/com/tngtech/valueprovider/ValueProvider.java
+++ b/core/src/main/java/com/tngtech/valueprovider/ValueProvider.java
@@ -956,6 +956,7 @@ public List listOf(Function generator) {
public List listOf(Function generator, int numberOfElements) {
List generatedElements = new ArrayList<>();
for (int i = 0; i < numberOfElements; i++) {
+ //noinspection unchecked
generatedElements.add(generator.apply((V) this));
}
return generatedElements;
From 075403d0507b004f526cbcbae163ab2219e09dd2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonas=20H=C3=B6f?=
Date: Wed, 18 May 2022 07:57:01 +0200
Subject: [PATCH 09/10] streamline listOf implementation and add test
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: Jonas Höf
---
.../tngtech/valueprovider/ValueProvider.java | 17 ++++++++---------
.../valueprovider/ValueProviderTest.java | 13 +++++++++++++
2 files changed, 21 insertions(+), 9 deletions(-)
diff --git a/core/src/main/java/com/tngtech/valueprovider/ValueProvider.java b/core/src/main/java/com/tngtech/valueprovider/ValueProvider.java
index 6fa544f..1c86fdf 100644
--- a/core/src/main/java/com/tngtech/valueprovider/ValueProvider.java
+++ b/core/src/main/java/com/tngtech/valueprovider/ValueProvider.java
@@ -21,6 +21,7 @@
import java.util.UUID;
import java.util.function.Function;
import java.util.stream.Collectors;
+import java.util.stream.IntStream;
import com.google.common.collect.Iterables;
@@ -35,6 +36,7 @@
import static java.time.temporal.ChronoUnit.DAYS;
import static java.time.temporal.ChronoUnit.SECONDS;
import static java.util.Arrays.asList;
+import static java.util.stream.Collectors.toList;
@SuppressWarnings("WeakerAccess")
public class ValueProvider {
@@ -736,8 +738,7 @@ public > Set someOf(Class enumClass, int numberOfElement
* @param elements the elements to draw from.
* @return the drawn elements (none / some / all).
*/
- @SafeVarargs
- final public Collection someOf(T... elements) {
+ @SafeVarargs final public Collection someOf(T... elements) {
return someOf(asList(elements));
}
@@ -954,12 +955,10 @@ public List listOf(Function generator) {
* @return the generated {@link List}.
*/
public List listOf(Function generator, int numberOfElements) {
- List generatedElements = new ArrayList<>();
- for (int i = 0; i < numberOfElements; i++) {
- //noinspection unchecked
- generatedElements.add(generator.apply((V) this));
- }
- return generatedElements;
+ //noinspection unchecked
+ return IntStream.range(0, numberOfElements)
+ .mapToObj(i -> generator.apply((V) this))
+ .collect(toList());
}
/**
@@ -1040,7 +1039,7 @@ private String createIPv6Block() {
}
private List truncateLeadingZerosFromBlocks(List blocks) {
- return blocks.stream().map(this::truncateLeadingZerosFromBlock).collect(Collectors.toList());
+ return blocks.stream().map(this::truncateLeadingZerosFromBlock).collect(toList());
}
private String truncateLeadingZerosFromBlock(String block) {
diff --git a/core/src/test/java/com/tngtech/valueprovider/ValueProviderTest.java b/core/src/test/java/com/tngtech/valueprovider/ValueProviderTest.java
index 10866e0..c709d17 100644
--- a/core/src/test/java/com/tngtech/valueprovider/ValueProviderTest.java
+++ b/core/src/test/java/com/tngtech/valueprovider/ValueProviderTest.java
@@ -625,6 +625,19 @@ void someOf_should_return_duplicates_if_input_contains_duplicates() {
.hasSameSizeAs(valueList);
}
+ @Test
+ void listOf_should_return_provided_number_of_elements() {
+ // given
+ ValueProvider random = withRandomValues();
+ int numberOfElements = random.intNumber(5, 10);
+
+ // when
+ List myBeans = random.listOf(MyBeanTestData::myBean, numberOfElements);
+
+ // then
+ assertThat(myBeans).hasSize(numberOfElements);
+ }
+
@Test
void listOf_should_return_a_sensible_number_of_elements() {
// given
From 9f0fc80569a9ec6aff4db43e816d1bf88268c893 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonas=20H=C3=B6f?=
Date: Wed, 18 May 2022 08:02:25 +0200
Subject: [PATCH 10/10] avoid empty array
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: Jonas Höf
---
.../com/tngtech/valueprovider/ValueProvider.java | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/core/src/main/java/com/tngtech/valueprovider/ValueProvider.java b/core/src/main/java/com/tngtech/valueprovider/ValueProvider.java
index 1c86fdf..7a49ead 100644
--- a/core/src/main/java/com/tngtech/valueprovider/ValueProvider.java
+++ b/core/src/main/java/com/tngtech/valueprovider/ValueProvider.java
@@ -12,7 +12,6 @@
import java.time.LocalTime;
import java.time.Month;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.Collection;
import java.util.EnumSet;
import java.util.List;
@@ -833,7 +832,7 @@ public final T oneOfExcluding(Iterable elements, T... elementsToExclude)
}
/**
- * Generates a {@link List} of <T> (by means of {@code generator}) and includes {@code containedElements} in the {@link List}.
+ * Generates a {@link List} of <T> (by means of {@code generator}) and includes {@code furtherContainedElements} in the {@link List}.
*
* Example:
*
@@ -849,19 +848,20 @@ public final T oneOfExcluding(Iterable elements, T... elementsToExclude)
*
*
* @param generator a generator {@link Function} to generate T given a {@link ValueProvider}.
- * @param containedElements elements that should be contained in the generated list.
+ * @param firstContainedElement first element that should be contained in the generated list.
+ * @param furtherContainedElements further elements that should be contained in the generated list.
*
* @return the generated {@link List}.
*
* @see #listOf(Function)
*/
@SafeVarargs
- public final List listOfContaining(Function generator, T... containedElements) {
- return listOfContaining(generator, Arrays.asList(containedElements));
+ public final List listOfContaining(Function generator, T firstContainedElement, T... furtherContainedElements) {
+ return listOfContaining(generator, asList(firstContainedElement, furtherContainedElements));
}
/**
- * see {@link #listOfContaining(Function, Object[])}
+ * see {@link #listOfContaining(Function, Object, Object[])}
*/
public final List listOfContaining(Function generator, Collection containedElements) {
int maxNumberOfRandomElements = maxNumberOfRandomElements(containedElements);