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);