diff --git a/random-beans/src/main/java/io/github/benas/randombeans/ArrayPopulator.java b/random-beans/src/main/java/io/github/benas/randombeans/ArrayPopulator.java index e29a94a19..b10f58f5e 100644 --- a/random-beans/src/main/java/io/github/benas/randombeans/ArrayPopulator.java +++ b/random-beans/src/main/java/io/github/benas/randombeans/ArrayPopulator.java @@ -64,7 +64,7 @@ Object getRandomPrimitiveArray(final Class primitiveType, RandomizationContex final int randomSize = abs((byte) enhancedRandom.nextInt()); final Randomizer randomizer = randomizerProvider.getRandomizerByType(primitiveType); if (randomizer instanceof ContextAwareRandomizer) { - ((ContextAwareRandomizer) randomizer).setRandomizerContext(context); + ((ContextAwareRandomizer) randomizer).setRandomizerContext(context); } final Object result = Array.newInstance(primitiveType, randomSize); for (int index = 0; index < randomSize; index++) { diff --git a/random-beans/src/main/java/io/github/benas/randombeans/EnhancedRandomImpl.java b/random-beans/src/main/java/io/github/benas/randombeans/EnhancedRandomImpl.java index 33f7c37b4..374e89302 100644 --- a/random-beans/src/main/java/io/github/benas/randombeans/EnhancedRandomImpl.java +++ b/random-beans/src/main/java/io/github/benas/randombeans/EnhancedRandomImpl.java @@ -93,7 +93,7 @@ T doPopulateBean(final Class type, final RandomizationContext context) { Randomizer randomizer = randomizerProvider.getRandomizerByType(type); if (randomizer != null) { if (randomizer instanceof ContextAwareRandomizer) { - ((ContextAwareRandomizer) randomizer).setRandomizerContext(context); + ((ContextAwareRandomizer) randomizer).setRandomizerContext(context); } return (T) randomizer.getRandomValue(); } diff --git a/random-beans/src/main/java/io/github/benas/randombeans/FieldPopulator.java b/random-beans/src/main/java/io/github/benas/randombeans/FieldPopulator.java index 5729e608d..a0efdb7d6 100644 --- a/random-beans/src/main/java/io/github/benas/randombeans/FieldPopulator.java +++ b/random-beans/src/main/java/io/github/benas/randombeans/FieldPopulator.java @@ -73,7 +73,7 @@ void populateField(final Object target, final Field field, final RandomizationCo return; } if (randomizer instanceof ContextAwareRandomizer) { - ((ContextAwareRandomizer) randomizer).setRandomizerContext(context); + ((ContextAwareRandomizer) randomizer).setRandomizerContext(context); } context.pushStackItem(new RandomizationContextStackItem(target, field)); if(!context.hasExceededRandomizationDepth()) { diff --git a/random-beans/src/main/java/io/github/benas/randombeans/api/ContextAwareRandomizer.java b/random-beans/src/main/java/io/github/benas/randombeans/api/ContextAwareRandomizer.java index 15c074094..0a03dbad8 100644 --- a/random-beans/src/main/java/io/github/benas/randombeans/api/ContextAwareRandomizer.java +++ b/random-beans/src/main/java/io/github/benas/randombeans/api/ContextAwareRandomizer.java @@ -26,11 +26,11 @@ /** * Interface for a {@link Randomizer} that is aware of the {@link RandomizerContext randomization context} it is invoked in. * - * @param the type generated by the randomizer + * @param the type generated by the randomizer + * @param the type of object in the current {@link RandomizerContext}. * @author Mahmoud Ben Hassine (mahmoud.benhassine@icloud.com) */ -public interface ContextAwareRandomizer extends Randomizer { +public interface ContextAwareRandomizer extends Randomizer { - void setRandomizerContext(RandomizerContext context); - -} + void setRandomizerContext(RandomizerContext context); +} \ No newline at end of file diff --git a/random-beans/src/main/java/io/github/benas/randombeans/api/RandomizerContext.java b/random-beans/src/main/java/io/github/benas/randombeans/api/RandomizerContext.java index ce03e5fa9..3cd4d9017 100644 --- a/random-beans/src/main/java/io/github/benas/randombeans/api/RandomizerContext.java +++ b/random-beans/src/main/java/io/github/benas/randombeans/api/RandomizerContext.java @@ -31,13 +31,13 @@ * * @author Mahmoud Ben Hassine (mahmoud.benhassine@icloud.com) */ -public interface RandomizerContext { +public interface RandomizerContext { /** * Return the target type (first parameter of {@link EnhancedRandom#nextObject(Class, String...)}). * @return target type */ - Class getRandomizedType(); + Class getRandomizedType(); /** * Get the set of excluded fields (varargs of {@link EnhancedRandom#nextObject(Class, String...)}). @@ -49,7 +49,7 @@ public interface RandomizerContext { * Return the currently randomized object (instance of the {@link RandomizerContext#getRandomizedType()}). * @return currently randomized object */ - Object getRandomizedObject(); + T getRandomizedObject(); /** * Return the currently used parameters by the enclosing {@link EnhancedRandom}. diff --git a/random-beans/src/test/java/io/github/benas/randombeans/context/ContextAwareRandomizationTests.java b/random-beans/src/test/java/io/github/benas/randombeans/context/ContextAwareRandomizationTests.java index 4fa2173b1..1bb042ae6 100644 --- a/random-beans/src/test/java/io/github/benas/randombeans/context/ContextAwareRandomizationTests.java +++ b/random-beans/src/test/java/io/github/benas/randombeans/context/ContextAwareRandomizationTests.java @@ -57,4 +57,43 @@ void testContextAwareRandomization() { } assertThat(person.getNickname()).isNull(); } + + @Test + void testContextAwareRandomizerWithMultipleTypes() { + // given + String[] names = {"james", "daniel"}; + EnhancedRandom enhancedRandom = new EnhancedRandomBuilder() + .randomize(field().named("firstName").ofType(String.class).get(), new FirstNameRandomizer(names)) + .randomize(field().named("lastName").ofType(String.class).get(), new LastNameRandomizer()) + .build(); + + // when + Person person = enhancedRandom.nextObject(Person.class, "nickname"); + + // then + String firstName = person.getFirstName(); + String lastName = person.getLastName(); + assertThat(firstName).isIn(names); + assertThat(lastName).isNotNull(); + if (firstName.equalsIgnoreCase("james")) { + assertThat(lastName.equalsIgnoreCase("bond")); + } + if (firstName.equalsIgnoreCase("daniel")) { + assertThat(lastName.equalsIgnoreCase("craig")); + } + assertThat(person.getNickname()).isNull(); + + Foo foo = person.getFoo(); + firstName = foo.getFirstName(); + lastName = foo.getLastName(); + assertThat(firstName).isIn(names); + assertThat(lastName).isNotNull(); + if (firstName.equalsIgnoreCase("james")) { + assertThat(lastName.equalsIgnoreCase("bond")); + } + if (firstName.equalsIgnoreCase("daniel")) { + assertThat(lastName.equalsIgnoreCase("craig")); + } + + } } diff --git a/random-beans/src/test/java/io/github/benas/randombeans/context/Foo.java b/random-beans/src/test/java/io/github/benas/randombeans/context/Foo.java new file mode 100644 index 000000000..767e0800e --- /dev/null +++ b/random-beans/src/test/java/io/github/benas/randombeans/context/Foo.java @@ -0,0 +1,32 @@ +/** + * The MIT License + * + * Copyright (c) 2019, Mahmoud Ben Hassine (mahmoud.benhassine@icloud.com) + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package io.github.benas.randombeans.context; + +import lombok.Data; + +@Data +public class Foo { + private String firstName; + private String lastName; +} diff --git a/random-beans/src/test/java/io/github/benas/randombeans/context/LastNameRandomizer.java b/random-beans/src/test/java/io/github/benas/randombeans/context/LastNameRandomizer.java index 9ecde6dc0..66dbebd26 100644 --- a/random-beans/src/test/java/io/github/benas/randombeans/context/LastNameRandomizer.java +++ b/random-beans/src/test/java/io/github/benas/randombeans/context/LastNameRandomizer.java @@ -28,28 +28,26 @@ /** * A last name randomizer that depends on the first name of the currently randomized object. - * The currently randomized object can be retreived from the randomization context. + * The currently randomized object can be retrieved from the randomization context. */ -public class LastNameRandomizer implements ContextAwareRandomizer { +public class LastNameRandomizer implements ContextAwareRandomizer { - private RandomizerContext context; + private RandomizerContext context; @Override - public void setRandomizerContext(RandomizerContext context) { + public void setRandomizerContext(RandomizerContext context) { this.context = context; } @Override public String getRandomValue() { - if (context.getRandomizedType().equals(Person.class)) { - Person randomizedObject = (Person) context.getRandomizedObject(); - String firstName = randomizedObject.getFirstName(); - if (firstName != null && firstName.equalsIgnoreCase("james")) { - return "bond"; - } - if (firstName != null && firstName.equalsIgnoreCase("daniel")) { - return "craig"; - } + Person randomizedObject = context.getRandomizedObject(); + String firstName = randomizedObject.getFirstName(); + if (firstName != null && firstName.equalsIgnoreCase("james")) { + return "bond"; + } + if (firstName != null && firstName.equalsIgnoreCase("daniel")) { + return "craig"; } return null; } diff --git a/random-beans/src/test/java/io/github/benas/randombeans/context/Person.java b/random-beans/src/test/java/io/github/benas/randombeans/context/Person.java index 3cb5bf774..58caa1041 100644 --- a/random-beans/src/test/java/io/github/benas/randombeans/context/Person.java +++ b/random-beans/src/test/java/io/github/benas/randombeans/context/Person.java @@ -31,5 +31,5 @@ public class Person { private String firstName; private String lastName; private String nickname; - + private Foo foo; }