package rebelsky.exam4; import java.io.PrintWriter; import java.math.BigInteger; import java.util.Random; import java.util.Vector; /** * Something that knows how to test mergesorters. * * @author Samuel A. Rebelsky * @version 1.0 of December 2005 */ public class MSTester { /** * How many tests do we do per size? */ static final int TESTS = 5; // +------+---------------------------------------------------- // | Main | // +------+ public static void main(String[] args) { PrintWriter pen = new PrintWriter(System.out, true); MergeSorter sorter = new MergeSorter(); for (int i = 1; i <= 2048; i *= 2) { pen.println("Testing for size " + i); // Do the appropriate number of tests. for (int test = 0; test < TESTS; test++) { pen.print(" Test " + test + ": "); System.gc(); sorter.reset(); boolean result = onetest(sorter, i, pen); pen.println(sorter.steps() + " steps."); // Give up for bad results if (!result) { return; } } // for (test) } // for } // main(String[]) // +----------------+------------------------------------------ // | Helper Methods | // +----------------+ /** * Run a test with a vector of size n on sorter, using log to report * errors. Returns true if the test succeeded and false otherwise. */ static boolean onetest(OutOfPlaceVectorSorter sorter, int n, PrintWriter log) { // Problems encountered String problem = null; // Build a sorted vector (which makes it easy to check whether the // result is correct). Vector original = VectorUtils.randomSortedVector(n); Vector sortme = VectorUtils.duplicate(original); VectorUtils.permute(sortme); // Try to sort it sortme = sorter.sort(sortme, new BigIntegerComparator()); // Make sure the sorted thing is the right size. if (sortme.size() != n) { problem = "result vector has incorrect size"; } int i = 0; while ((problem == null) && (i < n)) { if (!original.get(i).equals(sortme.get(i))) { problem = "mismatch in position " + Integer.toString(i); } // if ++i; } if (problem == null) { return true; } else { log.println("Failed to correctly sort a vector of size " + n + " because " + problem + "."); log.println(" Original: " + original); log.println(" 'Sorted': " + sortme); return false; } } // onetest(OutOfPlaceVectorSorter, int, PrintWriter) } // MSTester