package edu.brown.utils;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.SortedMap;
import java.util.TreeMap;
import junit.framework.TestCase;
import org.junit.Test;
import edu.brown.logging.LoggerUtil;
/**
*
* @author pavlo
*/
public class TestUniqueCombinationIterator extends TestCase {
private static final int BASE_COMBO_SIZE = 1;
private static final SortedMap<Integer, Integer> EXPECTED_NUM_COMBOS = new TreeMap<Integer, Integer>();
static {
// These values were calculated using the Python script found here:
// http://code.activestate.com/recipes/190465/
EXPECTED_NUM_COMBOS.put(1, 10);
EXPECTED_NUM_COMBOS.put(2, 45);
EXPECTED_NUM_COMBOS.put(3, 120);
EXPECTED_NUM_COMBOS.put(4, 210);
EXPECTED_NUM_COMBOS.put(5, 252);
EXPECTED_NUM_COMBOS.put(6, 210);
EXPECTED_NUM_COMBOS.put(7, 120);
EXPECTED_NUM_COMBOS.put(8, 45);
EXPECTED_NUM_COMBOS.put(9, 10);
}
private static final int NUM_LETTERS = 10;
private static final List<String> LETTERS = new ArrayList<String>();
static {
for (int i = 0; i < NUM_LETTERS; i++) {
LETTERS.add(String.valueOf((char)(i + 97)));
}
LoggerUtil.setupLogging();
}
/**
* testIterator
*/
@Test
public void testIterator() {
for (int combo_size = BASE_COMBO_SIZE; combo_size <= EXPECTED_NUM_COMBOS.lastKey(); combo_size++) {
UniqueCombinationIterator<String> it = new UniqueCombinationIterator<String>(LETTERS, combo_size);
boolean debug = false; // combo_size == 4;
int i = 0;
Set<Set<String>> seen = new HashSet<Set<String>>();
while (it.hasNext()) {
Set<String> s = it.next();
// System.err.println(it);
if (debug) System.err.println(String.format("[%03d] %s", i, s));
i+=1;
// System.err.println();
assertNotNull(s);
assertEquals(combo_size, s.size());
assertFalse("Duplicate: " + s, seen.contains(s));
seen.add(s);
} // WHILE
assert(i > 0);
assertEquals("ComboSize="+combo_size, EXPECTED_NUM_COMBOS.get(combo_size).intValue(), i);
} // FOR
}
}