Skip to content

Commit c5fb823

Browse files
authored
[refactor] extract picking a random enum value to method RandomService.nextEnum() (#1530)
* [refactor] extract picking a random enum value to method RandomService.nextEnum() * add test for new method RandomService.nextEnum() * reuse the new method `RandomService.nextEnum()` in `Options.option()` the name "option" was not clearly indicating that it works with Enum.
1 parent 1f8e110 commit c5fb823

File tree

4 files changed

+45
-3
lines changed

4 files changed

+45
-3
lines changed

src/main/java/net/datafaker/providers/base/Finance.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ public String usRoutingNumber() {
148148
}
149149

150150
private CreditCardType randomCreditCardType() {
151-
return CreditCardType.values()[this.faker.random().nextInt(CreditCardType.values().length)];
151+
return faker.random().nextEnum(CreditCardType.class);
152152
}
153153

154154
private static String calculateIbanChecksum(String countryCode, String basicBankAccountNumber) {

src/main/java/net/datafaker/providers/base/Options.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,8 +144,7 @@ public final Set<String> subset(int size, String... options) {
144144
* @return A randomly selected element from the enum.
145145
*/
146146
public <E extends Enum<E>> E option(Class<E> enumeration) {
147-
E[] enumConstants = enumeration.getEnumConstants();
148-
return enumConstants[faker.random().nextInt(enumConstants.length)];
147+
return faker.random().nextEnum(enumeration);
149148
}
150149

151150
/**

src/main/java/net/datafaker/service/RandomService.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,11 @@ public byte[] nextRandomBytes(int numberOfBytes) {
116116
return randomBytes;
117117
}
118118

119+
public <T extends Enum<T>> T nextEnum(Class<T> klass) {
120+
T[] enumConstants = klass.getEnumConstants();
121+
return enumConstants[nextInt(enumConstants.length)];
122+
}
123+
119124
public String hex() {
120125
return hex(8);
121126
}

src/test/java/net/datafaker/service/RandomServiceTest.java

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,19 @@
66
import org.junit.jupiter.api.Test;
77
import org.junit.jupiter.params.ParameterizedTest;
88
import org.junit.jupiter.params.provider.Arguments;
9+
import org.junit.jupiter.params.provider.CsvSource;
910
import org.junit.jupiter.params.provider.MethodSource;
1011

12+
import java.util.EnumSet;
13+
import java.util.List;
1114
import java.util.Random;
15+
import java.util.Set;
1216
import java.util.stream.Stream;
1317

18+
import static net.datafaker.service.RandomServiceTest.Ring.DWARVES;
19+
import static net.datafaker.service.RandomServiceTest.Ring.ELVES;
20+
import static net.datafaker.service.RandomServiceTest.Ring.MEN;
21+
import static net.datafaker.service.RandomServiceTest.Ring.LORD;
1422
import static org.assertj.core.api.Assertions.allOf;
1523
import static org.assertj.core.api.Assertions.assertThat;
1624
import static org.assertj.core.api.Assertions.assertThatThrownBy;
@@ -145,6 +153,36 @@ void testDefaultHex(RandomService randomService) {
145153
assertThat(randomService.hex()).matches("^[0-9A-F]{8}$");
146154
}
147155

156+
@Test
157+
void nextEnum() {
158+
RandomService randomService = new RandomService();
159+
Set<Ring> all = EnumSet.noneOf(Ring.class);
160+
for (int i = 1; i < 200; i++) {
161+
Ring actual = randomService.nextEnum(Ring.class);
162+
all.add(actual);
163+
assertThat(actual).isIn(ELVES, DWARVES, MEN, LORD);
164+
}
165+
assertThat(all).containsExactly(Ring.values());
166+
}
167+
168+
@ParameterizedTest
169+
@CsvSource({
170+
"12345, DWARVES, MEN, LORD, LORD, LORD",
171+
"42, MEN, ELVES, MEN, ELVES, DWARVES",
172+
})
173+
void predictableEnum(int seed, Ring expected1, Ring expected2, Ring expected3, Ring expected4, Ring expected5) {
174+
RandomService randomService = new RandomService(new Random(seed));
175+
assertThat(List.of(
176+
randomService.nextEnum(Ring.class),
177+
randomService.nextEnum(Ring.class),
178+
randomService.nextEnum(Ring.class),
179+
randomService.nextEnum(Ring.class),
180+
randomService.nextEnum(Ring.class)
181+
)).containsExactly(expected1, expected2, expected3, expected4, expected5);
182+
}
183+
184+
enum Ring {ELVES, DWARVES, MEN, LORD}
185+
148186
private static Stream<Arguments> randomServiceProvider() {
149187
return Stream.of(
150188
Arguments.of(new RandomService(), new RandomService(new Random()))

0 commit comments

Comments
 (0)