import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Iterator;
import java.util.StringTokenizer;


public class SearchTest {
	private static void performTest(String fileName, AssociativeArray<String, Integer> counts, boolean verbose) {
		final int threshold = 3;
		BufferedReader buf = null;
		try {
			buf = new BufferedReader(new FileReader(fileName));
		} catch (FileNotFoundException e) {
			e.printStackTrace();
			System.exit(0);
		}
		long start = System.currentTimeMillis();
		long nToks = 0;
		try {
			for (String line = buf.readLine(); line != null; line = buf.readLine()) {
				StringTokenizer toks = new StringTokenizer(line, "#@&\"'(!)_-*$%><?,.;/:+= \t\n\r\f");
				while (toks.hasMoreTokens()) {
					String tok = toks.nextToken();
					if (tok.length() > threshold) {
						nToks ++;
						Integer count = counts.get(tok);
						if (count == null) {
							counts.put(tok, 1);
						} else {
							counts.put(tok,  count + 1);
						}
					}
				}
			}
			buf.close();
		} catch (IOException e) {
			e.printStackTrace();
			System.exit(0);
		}
		
		Iterator<String> k = counts.keys();
		while (k.hasNext()) {
			String w = k.next();
			if (verbose) {
				System.out.println(w + " : " + counts.get(w));
			} else {
				counts.get(w);
			}
		}
		
		if (verbose) {
			System.out.println();
		}
		System.out.println(nToks + " tokens processed, " + counts.nbComparison() + " comparisons in " + (System.currentTimeMillis() - start) + " ms");

	}
	public static void main(String [] args) {
		final boolean verbose = false;
		
		System.out.println("List");
		performTest("./src/AssociativeArray.java", new ListAssocArray<String, Integer>(), verbose);
		performTest("./src/ListAssocArray.java", new ListAssocArray<String, Integer>(), verbose);
		performTest("./src/LinkedQueue.java", new ListAssocArray<String, Integer>(), verbose);
		performTest("./src/BufferQueue.java", new ListAssocArray<String, Integer>(), verbose);

		System.out.println();
		System.out.println("Tree");
		performTest("./src/AssociativeArray.java", new BTreeAssocArray<String, Integer>(), verbose);
		performTest("./src/ListAssocArray.java", new BTreeAssocArray<String, Integer>(), verbose);
		performTest("./src/LinkedQueue.java", new BTreeAssocArray<String, Integer>(), verbose);
		performTest("./src/BufferQueue.java", new BTreeAssocArray<String, Integer>(), verbose);
	}

}
