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 );
@@ -152,27 +148,16 @@ public static void addToEnvironment(ConfigurableEnvironment environment) {
152
148
153
149
static final class Range <T extends Number > {
154
150
151
+ private final String value ;
152
+
155
153
private final T min ;
156
154
157
155
private final T max ;
158
156
159
- private Range (T min , T max ) {
157
+ private Range (String value , T min , T max ) {
158
+ this .value = value ;
160
159
this .min = min ;
161
160
this .max = max ;
162
-
163
- }
164
-
165
- static <T extends Number > Range <T > get (String range , Function <String , T > parse , Predicate <T > boundValidator ,
166
- T defaultMin , BiPredicate <T , T > rangeValidator ) {
167
- String [] tokens = StringUtils .commaDelimitedListToStringArray (range );
168
- T token1 = parse .apply (tokens [0 ]);
169
- if (tokens .length == 1 ) {
170
- Assert .isTrue (boundValidator .test (token1 ), "Bound must be positive." );
171
- return new Range <>(defaultMin , token1 );
172
- }
173
- T token2 = parse .apply (tokens [1 ]);
174
- Assert .isTrue (rangeValidator .test (token1 , token2 ), "Lower bound must be less than upper bound." );
175
- return new Range <>(token1 , token2 );
176
161
}
177
162
178
163
T getMin () {
@@ -183,6 +168,24 @@ T getMax() {
183
168
return this .max ;
184
169
}
185
170
171
+ @ Override
172
+ public String toString () {
173
+ return this .value ;
174
+ }
175
+
176
+ static <T extends Number & Comparable <T >> Range <T > of (String value , Function <String , T > parse ) {
177
+ T zero = parse .apply ("0" );
178
+ String [] tokens = StringUtils .commaDelimitedListToStringArray (value );
179
+ T min = parse .apply (tokens [0 ]);
180
+ if (tokens .length == 1 ) {
181
+ Assert .isTrue (min .compareTo (zero ) > 0 , "Bound must be positive." );
182
+ return new Range <>(value , zero , min );
183
+ }
184
+ T max = parse .apply (tokens [1 ]);
185
+ Assert .isTrue (min .compareTo (max ) < 0 , "Lower bound must be less than upper bound." );
186
+ return new Range <>(value , min , max );
187
+ }
188
+
186
189
}
187
190
188
191
}
0 commit comments