Skip to content

Commit

Permalink
Increases range of inputs generated by AbstractLexicallyGeneratedTest.
Browse files Browse the repository at this point in the history
Signed-off-by: Werner Randelshofer <werner.randelshofer@fibermail.ch>
  • Loading branch information
wrandelshofer committed Aug 12, 2022
1 parent a4e301c commit cf26337
Show file tree
Hide file tree
Showing 2 changed files with 131 additions and 50 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,6 @@
import org.junit.jupiter.api.DynamicTest;
import org.junit.jupiter.api.TestFactory;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.stream.IntStream;
import java.util.stream.Stream;
Expand Down Expand Up @@ -42,15 +40,15 @@ abstract class AbstractLexicallyGeneratedTest {
* (Make sure to take a note of the seed value if
* tests failed.)
*/
public static final long SEED = 0;//System.nanoTime();
public static final long SEED = System.nanoTime();

@TestFactory
@Disabled
Stream<DynamicTest> dynamicTestsRandomStringFrom10SyntaxRuleWithoutWhitespace() {
Stream<DynamicTest> dynamicTestsRandomStringFrom1SyntaxRuleWithoutWhitespace() {
Random rng = new Random(SEED);
LexicalGenerator gen = new LexicalGenerator(false, true);
return IntStream.range(1, 10_000).mapToObj(i -> {
String str = gen.produceRandomInputStringFromLexicalRuleWithoutWhitespace(10, rng);
return IntStream.range(0, 100).mapToObj(i -> {
String str = gen.produceRandomInputStringFromLexicalRuleWithoutWhitespace(1, rng);
return dynamicTest(i + ": " + str,
() -> testAgainstJdk(str));
}
Expand All @@ -59,11 +57,24 @@ Stream<DynamicTest> dynamicTestsRandomStringFrom10SyntaxRuleWithoutWhitespace()

@TestFactory
@Disabled
Stream<DynamicTest> dynamicTestsRandomStringFrom1SyntaxRuleWithoutWhitespace() {
Stream<DynamicTest> dynamicTestsRandomStringFrom2SyntaxRuleWithoutWhitespace() {
Random rng = new Random(SEED);
LexicalGenerator gen = new LexicalGenerator(false, true);
return IntStream.range(1, 10_000).mapToObj(i -> {
String str = gen.produceRandomInputStringFromLexicalRuleWithoutWhitespace(1, rng);
return IntStream.range(0, 10_000).mapToObj(i -> {
String str = gen.produceRandomInputStringFromLexicalRuleWithoutWhitespace(2, rng);
return dynamicTest(i + ": " + str,
() -> testAgainstJdk(str));
}
);
}

@TestFactory
@Disabled
Stream<DynamicTest> dynamicTestsRandomStringFrom3SyntaxRuleWithoutWhitespace() {
Random rng = new Random(SEED);
LexicalGenerator gen = new LexicalGenerator(false, true);
return IntStream.range(0, 10_000).mapToObj(i -> {
String str = gen.produceRandomInputStringFromLexicalRuleWithoutWhitespace(3, rng);
return dynamicTest(i + ": " + str,
() -> testAgainstJdk(str));
}
Expand All @@ -72,11 +83,24 @@ Stream<DynamicTest> dynamicTestsRandomStringFrom1SyntaxRuleWithoutWhitespace() {

@TestFactory
@Disabled
Stream<DynamicTest> dynamicTestsRandomStringFrom40SyntaxRuleWithoutWhitespace() {
Stream<DynamicTest> dynamicTestsRandomStringFrom4SyntaxRuleWithoutWhitespace() {
Random rng = new Random(SEED);
LexicalGenerator gen = new LexicalGenerator(false, true);
return IntStream.range(1, 10_000).mapToObj(i -> {
String str = gen.produceRandomInputStringFromLexicalRuleWithoutWhitespace(40, rng);
return IntStream.range(0, 10_000).mapToObj(i -> {
String str = gen.produceRandomInputStringFromLexicalRuleWithoutWhitespace(4, rng);
return dynamicTest(i + ": " + str,
() -> testAgainstJdk(str));
}
);
}

@TestFactory
@Disabled
Stream<DynamicTest> dynamicTestsRandomStringFrom10SyntaxRuleWithoutWhitespace() {
Random rng = new Random(SEED);
LexicalGenerator gen = new LexicalGenerator(false, true);
return IntStream.range(0, 10_000).mapToObj(i -> {
String str = gen.produceRandomInputStringFromLexicalRuleWithoutWhitespace(10, rng);
return dynamicTest(i + ": " + str,
() -> testAgainstJdk(str));
}
Expand All @@ -98,13 +122,38 @@ Stream<DynamicTest> dynamicTestsRandomStringsOfIncreasingLengthWithWhitespace()

@TestFactory
@Disabled
List<DynamicNode> dynamicTestsAllSingleCharacterInputs() {
ArrayList<DynamicNode> list = new ArrayList<>();
for (int codePoint = 0; codePoint <= Character.MAX_VALUE; codePoint++) {
String str = "" + (char) codePoint;
list.add(dynamicTest("0x" + Integer.toHexString(codePoint), () -> testAgainstJdk(str)));
}
return list;
Stream<DynamicNode> dynamicTestsAsciiCharacterInputsUpTo4Characters() {
int maxLength = 4;
Random rng = new Random();
return IntStream.range(0, 10_000).mapToObj(i -> {
char[] ch = new char[4];
int n = rng.nextInt(maxLength) + 1;
for (int j = 0; j < n; j++) {
ch[j] = nextAsciiChar(rng);
}
StringBuilder str = new StringBuilder();
StringBuilder title = new StringBuilder(Integer.toString(n));
title.append(':');
for (int j = 0; j < 4; j++) {
char c = ch[j];
if (c >= ' ') {
if (Character.isISOControl(c) || Character.isWhitespace(c)) {
title.append("&#x").append(Integer.toHexString(c)).append(';');
str.append(c);
} else {
title.append((char) c);
str.append(c);
}
}
}
return dynamicTest(title.toString(), () -> testAgainstJdk(str.toString()));
});
}

private static char nextAsciiChar(Random rng) {
//U+0020 SPACE
//U+007F DELETE
return (char) (rng.nextInt(0x7f - 0x20) + 0x20);
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -128,40 +128,46 @@ private int produceRandomDecimalFloatingPointLiteral(int remaining, Random rng,
remaining = produceRandomDigits(remaining, rng, buf);
buf.append('.');
remaining--;
if (rng.nextBoolean()) {
if (remaining > 0 && rng.nextBoolean()) {
remaining = produceRandomDigits(remaining, rng, buf);
}
if (rng.nextBoolean()) {
if (remaining > 0 && rng.nextBoolean()) {
remaining = produceRandomExponentPart(remaining, rng, buf);
}
if (rng.nextBoolean()) {
if (remaining > 0 && rng.nextBoolean()) {
remaining = produceRandomFloatTypeSuffix(remaining, rng, buf);
}
break;
case 1:
buf.append('.');
remaining--;
remaining = produceRandomDigits(remaining, rng, buf);
if (rng.nextBoolean()) {
if (remaining > 0) {
remaining = produceRandomDigits(remaining, rng, buf);
}
if (remaining > 0 && rng.nextBoolean()) {
remaining = produceRandomExponentPart(remaining, rng, buf);
}
if (rng.nextBoolean()) {
if (remaining > 0 && rng.nextBoolean()) {
remaining = produceRandomFloatTypeSuffix(remaining, rng, buf);
}
break;
case 2:
remaining = produceRandomDigits(remaining, rng, buf);
remaining = produceRandomExponentPart(remaining, rng, buf);
if (rng.nextBoolean()) {
if (remaining > 0) {
remaining = produceRandomExponentPart(remaining, rng, buf);
}
if (remaining > 0 && rng.nextBoolean()) {
remaining = produceRandomFloatTypeSuffix(remaining, rng, buf);
}
break;
case 3:
remaining = produceRandomDigits(remaining, rng, buf);
if (rng.nextBoolean()) {
if (remaining > 0 && rng.nextBoolean()) {
remaining = produceRandomExponentPart(remaining, rng, buf);
}
remaining = produceRandomFloatTypeSuffix(remaining, rng, buf);
if (remaining > 0) {
remaining = produceRandomFloatTypeSuffix(remaining, rng, buf);
}
break;
}
return remaining;
Expand Down Expand Up @@ -201,10 +207,12 @@ private int produceRandomDigits(int remaining, Random rng, StringBuilder buf) {
break;
case 1:
remaining = produceRandomDigit(remaining, rng, buf);
if (rng.nextBoolean()) {
if (remaining > 0 && rng.nextBoolean()) {
remaining = produceRandomDigitsAndUnderscores(remaining, rng, buf);
}
remaining = produceRandomDigit(remaining, rng, buf);
if (remaining > 0) {
remaining = produceRandomDigit(remaining, rng, buf);
}
break;
}

Expand All @@ -222,17 +230,21 @@ private int produceRandomDigitsAndUnderscores(int remaining, Random rng, StringB
switch (rng.nextInt(2)) {
case 0:
remaining = produceRandomDigitOrUnderscore(remaining, rng, buf);
int todo = rng.nextInt(Math.max(remaining, 1));
for (int i = 0; i < todo; i++) {
remaining = produceRandomDigitOrUnderscore(remaining, rng, buf);
if (remaining > 0) {
int todo = rng.nextInt(Math.max(remaining, 1));
for (int i = 0; i < todo; i++) {
remaining = produceRandomDigitOrUnderscore(remaining, rng, buf);
}
}
break;
case 1:
remaining = produceRandomDigit(remaining, rng, buf);
if (rng.nextBoolean()) {
if (remaining > 0 && rng.nextBoolean()) {
remaining = produceRandomDigitsAndUnderscores(remaining, rng, buf);
}
remaining = produceRandomDigit(remaining, rng, buf);
if (remaining > 0) {
remaining = produceRandomDigit(remaining, rng, buf);
}
break;
}
return remaining;
Expand Down Expand Up @@ -285,22 +297,28 @@ private int produceRandomFloatTypeSuffix(int remaining, Random rng, StringBuilde
private int produceRandomFloatValue(int remaining, Random rng, StringBuilder buf) {
switch (rng.nextInt(4)) {
case 0:
if (rng.nextBoolean()) {
if (remaining > 0 && rng.nextBoolean()) {
remaining = produceRandomSign(remaining, rng, buf);
}
remaining = produceRandomNaNOrInfinity(remaining, rng, buf);
if (remaining > 0 && remaining > 0) {
remaining = produceRandomNaNOrInfinity(remaining, rng, buf);
}
break;
case 1:
if (rng.nextBoolean()) {
remaining = produceRandomSign(remaining, rng, buf);
}
remaining = produceRandomDecimalFloatingPointLiteral(remaining, rng, buf);
if (remaining > 0) {
remaining = produceRandomDecimalFloatingPointLiteral(remaining, rng, buf);
}
break;
case 2:
if (rng.nextBoolean()) {
remaining = produceRandomSign(remaining, rng, buf);
}
remaining = produceRandomHexFloatingPointLiteral(remaining, rng, buf);
if (remaining > 0) {
remaining = produceRandomHexFloatingPointLiteral(remaining, rng, buf);
}
break;
case 3:
remaining = produceRandomSignedInteger(remaining, rng, buf);
Expand Down Expand Up @@ -344,15 +362,21 @@ private int produceRandomHexDigitsAndUnderscores(int remaining, Random rng, Stri

private int produceRandomHexFloatingPointLiteral(int remaining, Random rng, StringBuilder buf) {
remaining = produceRandomHexSignificand(remaining, rng, buf);
remaining = produceRandomBinaryExponent(remaining, rng, buf);
remaining = produceRandomFloatTypeSuffix(remaining, rng, buf);
if (remaining > 0) {
remaining = produceRandomBinaryExponent(remaining, rng, buf);
}
if (remaining > 0) {
remaining = produceRandomFloatTypeSuffix(remaining, rng, buf);
}
return remaining;
}

private int produceRandomHexNumeral(int remaining, Random rng, StringBuilder buf) {
buf.append(rng.nextBoolean() ? "0x" : "0X");
remaining--;
remaining = produceRandomHexDigits(remaining, rng, buf);
if (remaining > 0) {
remaining = produceRandomHexDigits(remaining, rng, buf);
}
return remaining;
}

Expand All @@ -378,12 +402,14 @@ private int produceRandomHexSignificand(int remaining, Random rng, StringBuilder
case 2:
buf.append(rng.nextBoolean() ? "0x" : "0X");
remaining--;
if (rng.nextBoolean()) {
if (remaining > 0 && rng.nextBoolean()) {
remaining = produceRandomHexDigits(remaining, rng, buf);
}
if (remaining > 0 && rng.nextBoolean()) {
buf.append('.');
remaining--;
remaining = produceRandomHexDigits(remaining, rng, buf);
}
buf.append('.');
remaining--;
remaining = produceRandomHexDigits(remaining, rng, buf);
break;
}
return remaining;
Expand All @@ -399,8 +425,12 @@ private int produceRandomHexSignificand(int remaining, Random rng, StringBuilder
public String produceRandomInputStringFromLexicalRuleWithWhitespace(int remaining, Random rng) {
StringBuilder buf = new StringBuilder();
remaining = produceRandomWhitespaces(remaining, rng, buf);
remaining = produceRandomFloatValue(remaining, rng, buf);
remaining = produceRandomWhitespaces(remaining, rng, buf);
if (remaining > 0) {
remaining = produceRandomFloatValue(remaining, rng, buf);
}
if (remaining > 0) {
remaining = produceRandomWhitespaces(remaining, rng, buf);
}
return buf.toString();
}

Expand Down Expand Up @@ -448,7 +478,9 @@ private int produceRandomSignedInteger(int remaining, Random rng, StringBuilder
if (rng.nextBoolean()) {
remaining = produceRandomSign(remaining, rng, buf);
}
remaining = produceRandomDigits(remaining, rng, buf);
if (remaining > 0) {
remaining = produceRandomDigits(remaining, rng, buf);
}
return remaining;
}

Expand Down

0 comments on commit cf26337

Please sign in to comment.