/**
*
*/
package photoSpreadUtilities;
import java.util.Iterator;
import java.util.NoSuchElementException;
import java.util.SortedSet;
import junit.framework.TestCase;
import photoSpread.PhotoSpread;
import photoSpreadObjects.PhotoSpreadObject;
import photoSpreadObjects.PhotoSpreadStringObject;
import photoSpreadTable.PhotoSpreadCell;
import photoSpreadTable.PhotoSpreadTableModel;
import photoSpreadUtilities.PhotoSpreadComparatorFactory.MetadataComparator;
import photoSpreadUtilities.PhotoSpreadComparatorFactory.UUIDComparator;
/**
* @author paepcke
*
*/
public class PhotoSpreadComparatorFactoryTest extends TestCase {
PhotoSpreadStringObject psStrObj1;
PhotoSpreadStringObject psStrObj2;
PhotoSpreadStringObject psStrObj3;
PhotoSpreadStringObject psStrObj4;
PhotoSpreadStringObject psStrObj5;
PhotoSpreadStringObject psStrObj6;
UUIDComparator compUUID =
(UUIDComparator) photoSpreadUtilities.PhotoSpreadComparatorFactory.createPSUUIDComparator();
MetadataComparator compMetadata =
(MetadataComparator) photoSpreadUtilities.PhotoSpreadComparatorFactory.createPSMetadataComparator();
TreeSetRandomSubsetIterable<PhotoSpreadObject> objsUUIDTree;
TreeSetRandomSubsetIterable<PhotoSpreadObject> objsMetadataTree;
/* (non-Javadoc)
* @see junit.framework.TestCase#setUp()
*/
protected void setUp() throws Exception {
super.setUp();
PhotoSpread.initDefaultProperties();
// The out-of-context creation of PhotoSpread table cells and models causes
// uninteresting errors. Just ignore them:
try {
psStrObj1 = new PhotoSpreadStringObject(new PhotoSpreadCell(new PhotoSpreadTableModel(), 0, 0), "Obj1");
psStrObj2 = new PhotoSpreadStringObject(new PhotoSpreadCell(new PhotoSpreadTableModel(), 0, 1), "Obj2");
psStrObj3 = new PhotoSpreadStringObject(new PhotoSpreadCell(new PhotoSpreadTableModel(), 0, 2), "Obj3");
psStrObj4 = new PhotoSpreadStringObject(new PhotoSpreadCell(new PhotoSpreadTableModel(), 0, 3), "Obj4");
psStrObj5 = new PhotoSpreadStringObject(new PhotoSpreadCell(new PhotoSpreadTableModel(), 0, 4), "Obj5");
psStrObj6 = new PhotoSpreadStringObject(new PhotoSpreadCell(new PhotoSpreadTableModel(), 0, 5), "Obj6");
} catch (Exception e) {
}
objsUUIDTree = new TreeSetRandomSubsetIterable<PhotoSpreadObject>(compUUID);
objsMetadataTree = new TreeSetRandomSubsetIterable<PhotoSpreadObject>(compMetadata);
objsUUIDTree.add(psStrObj3);
objsUUIDTree.add(psStrObj4);
objsUUIDTree.add(psStrObj1);
objsUUIDTree.add(psStrObj5);
objsUUIDTree.add(psStrObj2);
}
public void testCompareUUID() {
assertEquals("Identity", Const.EQUAL, compUUID.compare(psStrObj1, psStrObj1));
assertEquals("Earlier-created < Later-Created", Const.SMALLER, compUUID.compare(psStrObj1, psStrObj2));
assertEquals("Later-created > Earlier-Created", Const.BIGGER, compUUID.compare(psStrObj2, psStrObj1));
assertEquals("First from TreeSetRandomSubsetIterable", psStrObj1, objsUUIDTree.first());
assertEquals("Last from TreeSetRandomSubsetIterable", psStrObj5, objsUUIDTree.last());
SortedSet<PhotoSpreadObject> head = objsUUIDTree.headSet(psStrObj3);
assertEquals("Size of head set for for objsUUIDTree.headSet(<3rd element>)", 2, head.size());
assertEquals("Contains psStrObj4?", false, head.contains(psStrObj4));
assertEquals("Contains psStrObj2?", true, head.contains(psStrObj2));
assertEquals("Does NOT contain psStrObj6", false, head.contains(psStrObj6));
Iterator<PhotoSpreadObject> it=head.iterator();
assertEquals("First in head set for objsUUIDTree.headSet(<3rd element>)", it.next(), psStrObj1);
assertEquals("Second in head set for objsUUIDTree.headSet(<3rd element>)", it.next(), psStrObj2);
try {
assertEquals("Third in head set for objsUUIDTree.headSet(<3rd element>)", it.next(), psStrObj3);
fail("Expected NoSuchElementException.");
} catch (NoSuchElementException e) {
// expected
}
}
public void testCompareMetadata() {
// Copy items from UUID comparison set to Metadata comparison set:
objsMetadataTree.addAll(objsUUIDTree);
// A person obj:
psStrObj1.setMetaData("Name", "Eric");
psStrObj1.setMetaData("Age", "25");
psStrObj1.setMetaData("DOB", "1975-01-30");
// Identical metadata in different objects:
psStrObj2.setMetaData("Name", "Eric");
psStrObj2.setMetaData("Age", "25");
psStrObj2.setMetaData("DOB", "1975-01-30");
// Different case for key and value; else same:
psStrObj3.setMetaData("name", "eric");
psStrObj3.setMetaData("Age", "25");
psStrObj3.setMetaData("DOB", "1975-01-30");
// Like obj1 in level 1 (Name), but different in level 2:
psStrObj3.setMetaData("Name", "Eric");
psStrObj3.setMetaData("Age", "26");
psStrObj3.setMetaData("DOB", "1975-01-30");
// Missing Level 2
psStrObj5.setMetaData("Name", "eric");
psStrObj5.setMetaData("DOB", "1975-01-30");
assertEquals("Identity", Const.EQUAL, compMetadata.compare(psStrObj1, psStrObj1));
assertEquals("No sort keys; compare by UUID as default", Const.SMALLER, compMetadata.compare(psStrObj2, psStrObj3));
// Add first-tier metadata key 'Name':
compMetadata.addMetadataSortKey("Name");
assertEquals("Equal by first key: Name", Const.EQUAL, compMetadata.compare(psStrObj1, psStrObj2));
assertEquals("Case is ignored", Const.EQUAL, compMetadata.compare(psStrObj1, psStrObj3));
// Add second-tier metadata key 'Age':
compMetadata.addMetadataSortKey("Age");
assertEquals("Comparing numbers in 2nd tier", true, compMetadata.compare(psStrObj1, psStrObj6) < 0);
// Remove Age from sort keys:
compMetadata.removeMetadataSortKey("Age");
assertEquals(
"Equal when unrelated search key missing in one obj ('Age'). Only 'Name' left.",
Const.EQUAL,
compMetadata.compare(psStrObj1, psStrObj5));
// Test obj metadata comparison when one or both objects are
// missing a value for the metadata attribute:
compMetadata.clearMetadataSortKeys();
compMetadata.addMetadataSortKey("Foo");
psStrObj1.setMetaData("Foo", "bar");
assertEquals(
"First obj has field, second does not",
Const.SMALLER, // Obj1 < Obj2, making obj1 appear earlier in a sort
compMetadata.compare(psStrObj1, psStrObj2));
assertEquals(
"First obj does not have field, second does",
Const.BIGGER, // Obj2 < Obj1, making obj2 appear earlier in a sort
compMetadata.compare(psStrObj2, psStrObj1));
assertEquals(
"Neither obj has field. Should default to comparing UUIDs",
Const.SMALLER, // Obj3 < Obj4, making obj3 appear earlier in a sort. (Obj3 created ealier)
compMetadata.compare(psStrObj3, psStrObj4));
}
}