20
20
import java .util .OptionalLong ;
21
21
import java .util .Random ;
22
22
import java .util .UUID ;
23
- import java .util .function .BiPredicate ;
24
23
import java .util .function .Function ;
25
- import java .util .function .Predicate ;
26
24
27
25
import org .apache .commons .logging .Log ;
28
26
import org .apache .commons .logging .LogFactory ;
@@ -98,11 +96,11 @@ private Object getRandomValue(String type) {
98
96
}
99
97
String range = getRange (type , "int" );
100
98
if (range != null ) {
101
- return getNextIntInRange (range );
99
+ return getNextIntInRange (Range . of ( range , Integer :: parseInt ) );
102
100
}
103
101
range = getRange (type , "long" );
104
102
if (range != null ) {
105
- return getNextLongInRange (range );
103
+ return getNextLongInRange (Range . of ( range , Long :: parseLong ) );
106
104
}
107
105
if (type .equals ("uuid" )) {
108
106
return UUID .randomUUID ().toString ();
@@ -120,24 +118,22 @@ private String getRange(String type, String prefix) {
120
118
return null ;
121
119
}
122
120
123
- private int getNextIntInRange (String range ) {
124
- Range <Integer > intRange = Range .get (range , Integer ::parseInt , (t ) -> t > 0 , 0 , (t1 , t2 ) -> t1 < t2 );
125
- OptionalInt first = getSource ().ints (1 , intRange .getMin (), intRange .getMax ()).findFirst ();
126
- if (!first .isPresent ()) {
127
- throw new RuntimeException ("Could not get random number for range '" + range + "'" );
128
- }
121
+ private int getNextIntInRange (Range <Integer > range ) {
122
+ OptionalInt first = getSource ().ints (1 , range .getMin (), range .getMax ()).findFirst ();
123
+ assertPresent (first .isPresent (), range );
129
124
return first .getAsInt ();
130
125
}
131
126
132
- private long getNextLongInRange (String range ) {
133
- Range <Long > longRange = Range .get (range , Long ::parseLong , (t ) -> t > 0L , 0L , (t1 , t2 ) -> t1 < t2 );
134
- OptionalLong first = getSource ().longs (1 , longRange .getMin (), longRange .getMax ()).findFirst ();
135
- if (!first .isPresent ()) {
136
- throw new RuntimeException ("Could not get random number for range '" + range + "'" );
137
- }
127
+ private long getNextLongInRange (Range <Long > range ) {
128
+ OptionalLong first = getSource ().longs (1 , range .getMin (), range .getMax ()).findFirst ();
129
+ assertPresent (first .isPresent (), range );
138
130
return first .getAsLong ();
139
131
}
140
132
133
+ private void assertPresent (boolean present , Range <?> range ) {
134
+ Assert .state (present , () -> "Could not get random number for range '" + range + "'" );
135
+ }
136
+
141
137
private Object getRandomBytes () {
142
138
byte [] bytes = new byte [32 ];
143
139
getSource ().nextBytes (bytes );
@@ -167,27 +163,16 @@ static void addToEnvironment(ConfigurableEnvironment environment, Log logger) {
167
163
168
164
static final class Range <T extends Number > {
169
165
166
+ private final String value ;
167
+
170
168
private final T min ;
171
169
172
170
private final T max ;
173
171
174
- private Range (T min , T max ) {
172
+ private Range (String value , T min , T max ) {
173
+ this .value = value ;
175
174
this .min = min ;
176
175
this .max = max ;
177
-
178
- }
179
-
180
- static <T extends Number > Range <T > get (String range , Function <String , T > parse , Predicate <T > boundValidator ,
181
- T defaultMin , BiPredicate <T , T > rangeValidator ) {
182
- String [] tokens = StringUtils .commaDelimitedListToStringArray (range );
183
- T token1 = parse .apply (tokens [0 ]);
184
- if (tokens .length == 1 ) {
185
- Assert .isTrue (boundValidator .test (token1 ), "Bound must be positive." );
186
- return new Range <>(defaultMin , token1 );
187
- }
188
- T token2 = parse .apply (tokens [1 ]);
189
- Assert .isTrue (rangeValidator .test (token1 , token2 ), "Lower bound must be less than upper bound." );
190
- return new Range <>(token1 , token2 );
191
176
}
192
177
193
178
T getMin () {
@@ -198,6 +183,24 @@ T getMax() {
198
183
return this .max ;
199
184
}
200
185
186
+ @ Override
187
+ public String toString () {
188
+ return this .value ;
189
+ }
190
+
191
+ static <T extends Number & Comparable <T >> Range <T > of (String value , Function <String , T > parse ) {
192
+ T zero = parse .apply ("0" );
193
+ String [] tokens = StringUtils .commaDelimitedListToStringArray (value );
194
+ T min = parse .apply (tokens [0 ]);
195
+ if (tokens .length == 1 ) {
196
+ Assert .isTrue (min .compareTo (zero ) > 0 , "Bound must be positive." );
197
+ return new Range <>(value , zero , min );
198
+ }
199
+ T max = parse .apply (tokens [1 ]);
200
+ Assert .isTrue (min .compareTo (max ) < 0 , "Lower bound must be less than upper bound." );
201
+ return new Range <>(value , min , max );
202
+ }
203
+
201
204
}
202
205
203
206
}
0 commit comments