Programming Resources
For Fun and Learning
Charles Cusack
Computer Science
Hope College
main

Python
C++

JAVA


PHP
SQL
Assignments

LongestSequence


TestLongestSequence.java

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;
			}
		}

	}

}