package LongestSequenceGradingCode;
import java.util.Random;
import java.util.concurrent.ForkJoinPool;
/**
* New test class that creates random test cases for the LongestSequence,
* including multiple sequences of the target number. CAC, 4/15/2025
*
*/
public class TestLongestSequence {
static final ForkJoinPool fjPool = new ForkJoinPool();
private TestArrays[] testArrays = { //
new TestArrays(9, 0, 100, 1), //
new TestArrays(9, 0, 100, 50), //
new TestArrays(9, 0, 100, 100), //
new TestArrays(9, 14, 100, 1), //
new TestArrays(9, 14, 100, 50), //
new TestArrays(9, 14, 100, 100), //
new TestArrays(32, 1, 5000, 1), //
new TestArrays(32, 1, 5000, 50), //
new TestArrays(32, 1, 5000, 100), //
new TestArrays(143, 2, 10000, 1), //
new TestArrays(143, 2, 10000, 50), //
new TestArrays(143, 2, 10000, 100), //
new TestArrays(1, 200, 100000, 1), //
new TestArrays(1, 200, 100000, 100), //
new TestArrays(1, 200, 100000, 1000), //
new TestArrays(1, 200, 100000, 5000), //
new TestArrays(2, 3, 1000000, 100), //
new TestArrays(2, 3, 1000000, 10000),
new TestArrays(2, 3, 1000000, 50000), //
new TestArrays(2, 3, 1000000, 50000),
new TestArrays(3, 600, 10000000, 1), //
new TestArrays(3, 600, 10000000, 5000), //
new TestArrays(3, 600, 10000000, 50000), //
new TestArrays(15, 1, 1000000000, 1000), //
new TestArrays(15, 1, 1000000000, 5000), //
new TestArrays(15, 1, 1000000000, 50000), //
new TestArrays(15, 2, 1000000000, 1000), //
new TestArrays(15, 2, 1000000000, 5000), //
new TestArrays(15, 2, 1000000000, 50000), //
new TestArrays(15, 5000, 1000000000, 1000), //
new TestArrays(15, 5000, 1000000000, 5000), //
new TestArrays(15, 5000, 1000000000, 50000), //
};
public static void main(String[] args) {
TestLongestSequence m = new TestLongestSequence();
System.out.println("Size, Answer, Threshold, Time (ms)");
for (TestArrays arr : m.getTestArrays()) {
arr.testArrays();
}
System.out.println("Done");
}
public TestLongestSequence() {
}
public TestArrays[] getTestArrays() {
return testArrays;
}
private class TestArrays {
private int number;
private int answer;
private int size;
private int threshold;
Random rand;
Result result;
public TestArrays(int number, int answer, int size, int threshold) {
this.number = number;
this.answer = answer;
this.size = size;
this.threshold = threshold;
rand = new Random(System.currentTimeMillis());
}
public boolean testArrays() {
long startTime;
int[] array = new int[size];
int target = number;
if (answer == 0) {
// Fill the rest with a mix of values
for (int i = 0; i < size; i++) {
int val;
do {
val = rand.nextInt(100000);
} while (val == target);
array[i] = val;
}
} else {
// Insert a known longest run
int longestRunStart = rand.nextInt(size - answer);
for (int i = longestRunStart; i < longestRunStart + answer; i++) {
array[i] = target;
}
// Insert smaller runs of the target elsewhere
for (int i = 0; i < 5; i++) {
int runLength = 1;
if (answer > 1) {
runLength = rand.nextInt(answer - 1) + 1; // less than answer
}
int start = 1 + rand.nextInt(size - runLength);
// Avoid overlap with longest run
if (array[start - 1] != target) {
int j = start;
while (j < start + runLength && array[j + 1] != target) {
array[j] = target;
j++;
}
}
}
// Fill the rest with a mix of values
for (int i = 0; i < size; i++) {
if (array[i] != target) {
// Random value not equal to target
int val;
do {
val = rand.nextInt(100000);
} while (val == target);
array[i] = val;
}
}
}
startTime = System.nanoTime();
result = fjPool.invoke(new LongestSequence_vachon(array, 0, size - 1, target, threshold));
long elapsed = System.nanoTime() - startTime;
double mseconds = elapsed / 1000000.0;
if (result.getNumLongest() != answer) {
System.out.println("****** INCORRECT for: " + size + "," + answer + "," + threshold + "," + mseconds
+ " ********");
System.out.println(" Answer should be " + answer + " but was " + result.getNumLongest());
return false;
} else {
System.out.println("Correct for: " + size + "," + answer + "," + threshold + "," + mseconds);
return true;
}
}
}
}