@@ -132,40 +132,46 @@ private int produceRandomDecimalFloatingPointLiteral(int remaining, Random rng,
132
132
remaining = produceRandomDigits (remaining , rng , buf );
133
133
buf .append ('.' );
134
134
remaining --;
135
- if (rng .nextBoolean ()) {
135
+ if (remaining > 0 && rng .nextBoolean ()) {
136
136
remaining = produceRandomDigits (remaining , rng , buf );
137
137
}
138
- if (rng .nextBoolean ()) {
138
+ if (remaining > 0 && rng .nextBoolean ()) {
139
139
remaining = produceRandomExponentPart (remaining , rng , buf );
140
140
}
141
- if (rng .nextBoolean ()) {
141
+ if (remaining > 0 && rng .nextBoolean ()) {
142
142
remaining = produceRandomFloatTypeSuffix (remaining , rng , buf );
143
143
}
144
144
break ;
145
145
case 1 :
146
146
buf .append ('.' );
147
147
remaining --;
148
- remaining = produceRandomDigits (remaining , rng , buf );
149
- if (rng .nextBoolean ()) {
148
+ if (remaining > 0 ) {
149
+ remaining = produceRandomDigits (remaining , rng , buf );
150
+ }
151
+ if (remaining > 0 && rng .nextBoolean ()) {
150
152
remaining = produceRandomExponentPart (remaining , rng , buf );
151
153
}
152
- if (rng .nextBoolean ()) {
154
+ if (remaining > 0 && rng .nextBoolean ()) {
153
155
remaining = produceRandomFloatTypeSuffix (remaining , rng , buf );
154
156
}
155
157
break ;
156
158
case 2 :
157
159
remaining = produceRandomDigits (remaining , rng , buf );
158
- remaining = produceRandomExponentPart (remaining , rng , buf );
159
- if (rng .nextBoolean ()) {
160
+ if (remaining > 0 ) {
161
+ remaining = produceRandomExponentPart (remaining , rng , buf );
162
+ }
163
+ if (remaining > 0 && rng .nextBoolean ()) {
160
164
remaining = produceRandomFloatTypeSuffix (remaining , rng , buf );
161
165
}
162
166
break ;
163
167
case 3 :
164
168
remaining = produceRandomDigits (remaining , rng , buf );
165
- if (rng .nextBoolean ()) {
169
+ if (remaining > 0 && rng .nextBoolean ()) {
166
170
remaining = produceRandomExponentPart (remaining , rng , buf );
167
171
}
168
- remaining = produceRandomFloatTypeSuffix (remaining , rng , buf );
172
+ if (remaining > 0 ) {
173
+ remaining = produceRandomFloatTypeSuffix (remaining , rng , buf );
174
+ }
169
175
break ;
170
176
}
171
177
return remaining ;
@@ -205,10 +211,12 @@ private int produceRandomDigits(int remaining, Random rng, StringBuilder buf) {
205
211
break ;
206
212
case 1 :
207
213
remaining = produceRandomDigit (remaining , rng , buf );
208
- if (rng .nextBoolean ()) {
214
+ if (remaining > 0 && rng .nextBoolean ()) {
209
215
remaining = produceRandomDigitsAndUnderscores (remaining , rng , buf );
210
216
}
211
- remaining = produceRandomDigit (remaining , rng , buf );
217
+ if (remaining > 0 ) {
218
+ remaining = produceRandomDigit (remaining , rng , buf );
219
+ }
212
220
break ;
213
221
}
214
222
@@ -226,17 +234,21 @@ private int produceRandomDigitsAndUnderscores(int remaining, Random rng, StringB
226
234
switch (rng .nextInt (2 )) {
227
235
case 0 :
228
236
remaining = produceRandomDigitOrUnderscore (remaining , rng , buf );
229
- int todo = rng .nextInt (Math .max (remaining , 1 ));
230
- for (int i = 0 ; i < todo ; i ++) {
231
- remaining = produceRandomDigitOrUnderscore (remaining , rng , buf );
237
+ if (remaining > 0 ) {
238
+ int todo = rng .nextInt (Math .max (remaining , 1 ));
239
+ for (int i = 0 ; i < todo ; i ++) {
240
+ remaining = produceRandomDigitOrUnderscore (remaining , rng , buf );
241
+ }
232
242
}
233
243
break ;
234
244
case 1 :
235
245
remaining = produceRandomDigit (remaining , rng , buf );
236
- if (rng .nextBoolean ()) {
246
+ if (remaining > 0 && rng .nextBoolean ()) {
237
247
remaining = produceRandomDigitsAndUnderscores (remaining , rng , buf );
238
248
}
239
- remaining = produceRandomDigit (remaining , rng , buf );
249
+ if (remaining > 0 ) {
250
+ remaining = produceRandomDigit (remaining , rng , buf );
251
+ }
240
252
break ;
241
253
}
242
254
return remaining ;
@@ -289,22 +301,28 @@ private int produceRandomFloatTypeSuffix(int remaining, Random rng, StringBuilde
289
301
private int produceRandomFloatValue (int remaining , Random rng , StringBuilder buf ) {
290
302
switch (rng .nextInt (4 )) {
291
303
case 0 :
292
- if (rng .nextBoolean ()) {
304
+ if (remaining > 0 && rng .nextBoolean ()) {
293
305
remaining = produceRandomSign (remaining , rng , buf );
294
306
}
295
- remaining = produceRandomNaNOrInfinity (remaining , rng , buf );
307
+ if (remaining > 0 && remaining > 0 ) {
308
+ remaining = produceRandomNaNOrInfinity (remaining , rng , buf );
309
+ }
296
310
break ;
297
311
case 1 :
298
312
if (rng .nextBoolean ()) {
299
313
remaining = produceRandomSign (remaining , rng , buf );
300
314
}
301
- remaining = produceRandomDecimalFloatingPointLiteral (remaining , rng , buf );
315
+ if (remaining > 0 ) {
316
+ remaining = produceRandomDecimalFloatingPointLiteral (remaining , rng , buf );
317
+ }
302
318
break ;
303
319
case 2 :
304
320
if (rng .nextBoolean ()) {
305
321
remaining = produceRandomSign (remaining , rng , buf );
306
322
}
307
- remaining = produceRandomHexFloatingPointLiteral (remaining , rng , buf );
323
+ if (remaining > 0 ) {
324
+ remaining = produceRandomHexFloatingPointLiteral (remaining , rng , buf );
325
+ }
308
326
break ;
309
327
case 3 :
310
328
remaining = produceRandomSignedInteger (remaining , rng , buf );
@@ -348,15 +366,21 @@ private int produceRandomHexDigitsAndUnderscores(int remaining, Random rng, Stri
348
366
349
367
private int produceRandomHexFloatingPointLiteral (int remaining , Random rng , StringBuilder buf ) {
350
368
remaining = produceRandomHexSignificand (remaining , rng , buf );
351
- remaining = produceRandomBinaryExponent (remaining , rng , buf );
352
- remaining = produceRandomFloatTypeSuffix (remaining , rng , buf );
369
+ if (remaining > 0 ) {
370
+ remaining = produceRandomBinaryExponent (remaining , rng , buf );
371
+ }
372
+ if (remaining > 0 ) {
373
+ remaining = produceRandomFloatTypeSuffix (remaining , rng , buf );
374
+ }
353
375
return remaining ;
354
376
}
355
377
356
378
private int produceRandomHexNumeral (int remaining , Random rng , StringBuilder buf ) {
357
379
buf .append (rng .nextBoolean () ? "0x" : "0X" );
358
380
remaining --;
359
- remaining = produceRandomHexDigits (remaining , rng , buf );
381
+ if (remaining > 0 ) {
382
+ remaining = produceRandomHexDigits (remaining , rng , buf );
383
+ }
360
384
return remaining ;
361
385
}
362
386
@@ -382,12 +406,14 @@ private int produceRandomHexSignificand(int remaining, Random rng, StringBuilder
382
406
case 2 :
383
407
buf .append (rng .nextBoolean () ? "0x" : "0X" );
384
408
remaining --;
385
- if (rng .nextBoolean ()) {
409
+ if (remaining > 0 && rng .nextBoolean ()) {
410
+ remaining = produceRandomHexDigits (remaining , rng , buf );
411
+ }
412
+ if (remaining > 0 && rng .nextBoolean ()) {
413
+ buf .append ('.' );
414
+ remaining --;
386
415
remaining = produceRandomHexDigits (remaining , rng , buf );
387
416
}
388
- buf .append ('.' );
389
- remaining --;
390
- remaining = produceRandomHexDigits (remaining , rng , buf );
391
417
break ;
392
418
}
393
419
return remaining ;
@@ -403,8 +429,12 @@ private int produceRandomHexSignificand(int remaining, Random rng, StringBuilder
403
429
public String produceRandomInputStringFromLexicalRuleWithWhitespace (int remaining , Random rng ) {
404
430
StringBuilder buf = new StringBuilder ();
405
431
remaining = produceRandomWhitespaces (remaining , rng , buf );
406
- remaining = produceRandomFloatValue (remaining , rng , buf );
407
- remaining = produceRandomWhitespaces (remaining , rng , buf );
432
+ if (remaining > 0 ) {
433
+ remaining = produceRandomFloatValue (remaining , rng , buf );
434
+ }
435
+ if (remaining > 0 ) {
436
+ remaining = produceRandomWhitespaces (remaining , rng , buf );
437
+ }
408
438
return buf .toString ();
409
439
}
410
440
@@ -452,7 +482,9 @@ private int produceRandomSignedInteger(int remaining, Random rng, StringBuilder
452
482
if (rng .nextBoolean ()) {
453
483
remaining = produceRandomSign (remaining , rng , buf );
454
484
}
455
- remaining = produceRandomDigits (remaining , rng , buf );
485
+ if (remaining > 0 ) {
486
+ remaining = produceRandomDigits (remaining , rng , buf );
487
+ }
456
488
return remaining ;
457
489
}
458
490
0 commit comments