Link to code: TestTerm.java

import static org.junit.Assert.*;

import java.util.Arrays;
import java.util.Random;

import org.junit.Test;

public class TestTerm {
	private Random rng = new Random(1234);

	private String[] myNames = { "bhut jolokia", "capsaicin", "carolina reaper", "chipotle", "habanero", "jalapeno",
			"jalapeno membrane" };
	private double[] myWeights = { 855000, 16000000, 2200000, 3500, 100000, 3500, 10000 };

	public Term[] getTerms() {
		Term[] terms = new Term[myNames.length];
		for (int i = 0; i < terms.length; i++)
			terms[i] = new Term(myNames[i], myWeights[i]);
		return terms;
	}

	public int indexOf(Term[] arr, Term item) {
		for (int i = 0; i < arr.length; i++)
			if (arr[i].equals(item))
				return i;
		return -1;
	}

	public void shuffle(Object[] arr) {
		for (int i = 0; i < arr.length; i++) {
			int ind = rng.nextInt(arr.length);
			Object temp = arr[i];
			arr[i] = arr[ind];
			arr[ind] = temp;
		}
	}

	/**
	 * This test checks if Term throws a NullPointerException when constructed
	 * with a null argument
	 */
	@Test(timeout = 10000)
	public void testConstructorException() {
		try {
			Term test = new Term(null, 1);
			fail("No exception thrown for null String");
		} catch (NullPointerException e) {
		} catch (Throwable e) {
			fail("Wrong exception thrown");
		}

		try {
			Term test = new Term("test", -1);
			fail("No exception thrown for invalid weight");
		} catch (IllegalArgumentException e) {
		} catch (Throwable e) {
			fail("Wrong exception thrown");
		}
	}

	/**
	 * Tests that sorting terms without comparator is the same as sorting
	 * lexicographically
	 */
	@Test(timeout = 10000)
	public void testNativeSortingOrder() {
		Term[] terms = getTerms();
		Term[] sorted = terms.clone();
		for (int i = 0; i < 10; i++) {
			shuffle(terms);
			Arrays.sort(terms);
			assertArrayEquals(sorted, terms);
		}
	}

	/**
	 * Tests WeightOrder sorts correctly
	 */
	@Test(timeout = 10000)
	public void testWeightSortingOrder() {
		Term[] terms = getTerms();
		Term[] sorted = { terms[3], terms[5], terms[6], terms[4], terms[0], terms[2], terms[1] };
		for (int i = 0; i < 10; i++) {
			// preserve chipotle and jalapeno's order
			shuffle(terms);
			if (indexOf(terms, sorted[0]) > indexOf(terms, sorted[1])) {
				int temp = indexOf(terms, sorted[0]);
				terms[indexOf(terms, sorted[1])] = sorted[0];
				terms[temp] = sorted[1];
			}
			Arrays.sort(terms, new Term.WeightOrder());
			assertArrayEquals(sorted, terms);
		}
	}

	/**
	 * Tests ReverseWeightSortingOrder
	 */
	@Test(timeout = 10000)
	public void testReverseWeightSortingOrder() {
		Term[] terms = getTerms();
		Term[] sorted = { terms[1], terms[2], terms[0], terms[4], terms[6], terms[3], terms[5] };
		for (int i = 0; i < 10; i++) {
			// preserve chipotle and jalapeno's order
			shuffle(terms);
			if (indexOf(terms, sorted[5]) > indexOf(terms, sorted[6])) {
				int temp = indexOf(terms, sorted[5]);
				terms[indexOf(terms, sorted[6])] = sorted[5];
				terms[temp] = sorted[6];
			}
			Arrays.sort(terms, new Term.ReverseWeightOrder());
			assertArrayEquals(sorted, terms);
		}
	}

	/**
	 * This test checks that toString returns the expected value
	 */
	@Test(timeout = 10000)
	public void testToString() {
		Term[] terms = getTerms();
		for (Term t : terms) {
			assertTrue("weight missing", t.toString().contains(String.format("%.1f", t.getWeight())));
			assertTrue("word missing", t.toString().contains(t.getWord()));
			assertTrue("no tab", t.toString().contains("\t"));
		}
	}
}