//package org.styloot.hobo.test; import org.junit.*; import static org.junit.Assert.*; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameters; import org.styloot.hobo.*; import org.styloot.hobo.itemfinders.*; import java.util.*; @RunWith(Parameterized.class) public class TestItemFinders { private static final int NUM_ITEMS=20; ItemFinder finder; public TestItemFinders(ItemFinder finder) { this.finder = finder; } private static String itemId(int i) { return "id" + i; } private static Vector<Item> getItemList() { Vector<Item> items = new Vector<Item>(); for (int i=0;i<NUM_ITEMS;i++) { Vector<String> f = new Vector<String>(); f.add("foo"); if (i % 2 == 0) f.add("bar"); if (i % 3 == 0) f.add("baz"); items.add(new Item(itemId(i), "/baz", f, i, CIELabColor.CIELabFromRGB(0, i, 0), i % 5 + 1)); } return items; } private static Vector<Item> iteratorToVector(Iterator<Item> iter) { Vector<Item> result = new Vector<Item>(); while (iter.hasNext()) { result.add(iter.next()); } return result; } @Parameters public static Collection<Object[]> generateData() { Vector<Item> items = getItemList(); return Arrays.asList(new Object[][] { new Object[]{ new VectorItemFinder(items, "/baz") }, new Object[]{ new ShallowIndexItemFinder(items, "/baz") }, new Object[]{ new SubsetIndexItemFinder(items, "/baz") }, }); } public static void testResults(Iterator<Item> iterator, int[] expectedResultIds) { Vector<Item> results = iteratorToVector( iterator ); int numResults = expectedResultIds.length; assertEquals( "Result had wrong number of elements.", numResults, results.size() ); String[] expectedResultIdStr = new String[expectedResultIds.length]; String[] actualResultIdStr = new String[expectedResultIds.length]; for (int i=0;i<expectedResultIds.length;i++) { expectedResultIdStr[i] = itemId(expectedResultIds[i]); actualResultIdStr[i] = results.get(i).id; } assertArrayEquals("Item Id's incorrect", expectedResultIdStr, actualResultIdStr); } @Test public void testFindFoo() { Vector<String> features = new Vector<String>(); features.add("foo"); int[] resultIds = new int[20]; for (int i=0;i<20;i++) { resultIds[i] = 19-i; } testResults( finder.find( features, null, -1, 0, Integer.MAX_VALUE), resultIds); } @Test public void testFind2() { Vector<String> features = new Vector<String>(); features.add("buz"); //Nonexistent feature testResults( finder.find( features, null, -1, 0, Integer.MAX_VALUE), new int[]{} ); } @Test public void testFindBaz() { Vector<String> features = new Vector<String>(); features.add("baz"); testResults( finder.find( features, null, -1, 0, Integer.MAX_VALUE), new int[]{ 18, 15, 12, 9, 6, 3, 0 }); } @Test public void testFindBarBaz() { Vector<String> features = new Vector<String>(); features.add("baz"); features.add("bar"); testResults( finder.find( features, null, -1, 0, Integer.MAX_VALUE), new int[] { 18, 12, 6, 0 } ); } @Test public void testFindByColor() { Vector<String> features = new Vector<String>(); CIELabColor baseColor = CIELabColor.CIELabFromRGB(0, 0, 0); double maxColorDist = 4; Iterator<Item> iterator = finder.find( features, baseColor, maxColorDist, 0, Integer.MAX_VALUE); testResults(iterator, new int[] { 8, 7, 6, 5, 4, 3, 2, 1, 0}); } @Test public void testFindByColorFeature() { Vector<String> features = new Vector<String>(); features.add("bar"); CIELabColor baseColor = CIELabColor.CIELabFromRGB(0, 0, 0); double maxColorDist = 4; Iterator<Item> iterator = finder.find( features, baseColor, maxColorDist, 0, Integer.MAX_VALUE); testResults(iterator, new int[] { 8, 6, 4, 2, 0}); } @Test public void testFindByColorFeatureCost() { Vector<String> features = new Vector<String>(); features.add("bar"); CIELabColor baseColor = CIELabColor.CIELabFromRGB(0, 0, 0); double maxColorDist = 4; Iterator<Item> iterator = finder.find( features, baseColor, maxColorDist, 0, 3); testResults(iterator, new int[] { 6, 2, 0}); //Just like testFindByColorFeature, but items[8].cost = 4, and items[4].cost = 5, so they are eliminated } @Test public void testFindByColorFeatureCost2() { Vector<String> features = new Vector<String>(); features.add("bar"); CIELabColor baseColor = CIELabColor.CIELabFromRGB(0, 0, 0); double maxColorDist = 4; Iterator<Item> iterator = finder.find( features, baseColor, maxColorDist, 4, Integer.MAX_VALUE); testResults(iterator, new int[] { 8, 4 }); //Just like testFindByColorFeature, but items[8].cost = 4, and items[4].cost = 5, so they are eliminated } @Test public void testSize() { assertEquals(finder.size(), NUM_ITEMS); assertEquals(iteratorToVector(finder.getItems()).size(), NUM_ITEMS); } }