package recommender.impl.meta;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.util.Iterator;
import java.util.SortedSet;
import org.bibsonomy.recommender.simple.FixedRecommender;
import org.junit.Test;
import recommender.impl.test.util.DummyRecommendationEntity;
import recommender.impl.test.util.DummyRecommendationResult;
/**
* @author rja
*/
public class ResultsFromFirstWeightedBySecondRecommenderTest {
/**
* tests {@link ResultsFromFirstWeightedBySecondRecommender#getRecommendation(recommender.core.interfaces.model.RecommendationEntity)}
*/
@Test
public void testAddRecommendedTags() {
final String[] firstFixedTags = new String[]{"eins", "zwei", "drei", "vier", "fünf", "sechs", "sieben", "eins"};
final SortedSet<DummyRecommendationResult> firstFixedResults = DummyRecommendationResult.getDummyRecommendationResults(firstFixedTags, 0.5);
// FIXME: 3 times "eins" ?
final SortedSet<DummyRecommendationResult> secondFixedResults = DummyRecommendationResult.getDummyRecommendationResults(new String[] {"eins", "drei", "vier", "sieben", "eins", "eins", "semantic", "bar", "foo", "net"}, new double[] { 0.3, 0.2, 0.5, 0.6, 0.5, 0.2, 0.5, 0.6, 0.7, 0.8 }, new double[] { 0.2 });
final FixedRecommender<DummyRecommendationEntity, DummyRecommendationResult> first = new FixedRecommender<DummyRecommendationEntity, DummyRecommendationResult>(firstFixedResults);
final FixedRecommender<DummyRecommendationEntity, DummyRecommendationResult> second = new FixedRecommender<DummyRecommendationEntity, DummyRecommendationResult>(secondFixedResults);
final ResultsFromFirstWeightedBySecondRecommender<DummyRecommendationEntity, DummyRecommendationResult> merger = new ResultsFromFirstWeightedBySecondRecommender<DummyRecommendationEntity, DummyRecommendationResult>();
merger.setFirstRecommender(first);
merger.setSecondRecommender(second);
merger.setNumberOfResultsToRecommend(5);
final SortedSet<DummyRecommendationResult> recommendedTags = merger.getRecommendation(null);
/*
* check containment and order of top tags
*/
final Iterator<DummyRecommendationResult> iterator = recommendedTags.iterator();
assertEquals("sieben", iterator.next().getTitle());
assertEquals("vier", iterator.next().getTitle());
assertEquals("eins", iterator.next().getTitle());
assertEquals("drei", iterator.next().getTitle());
assertEquals("zwei", iterator.next().getTitle());
assertFalse(iterator.hasNext());
}
/**
* tests {@link ResultsFromFirstWeightedBySecondRecommender#getRecommendation(recommender.core.interfaces.model.RecommendationEntity)}
* @throws Exception
*/
@Test
public void test2() throws Exception {
final String[] usersTags = new String[]{"semantic", "web", "social", "net", "graph", "tool", "folksonomy", "holiday"};
final SortedSet<DummyRecommendationResult> firstFixedResults = DummyRecommendationResult.getDummyRecommendationResults(usersTags, 0.5);
final SortedSet<DummyRecommendationResult> titleResult = DummyRecommendationResult.getDummyRecommendationResults(new String[]{"nepomuk", "social", "semantic", "desktop"}, 0.5);
final ResultsFromFirstWeightedBySecondRecommender<DummyRecommendationEntity, DummyRecommendationResult> merger = new ResultsFromFirstWeightedBySecondRecommender<DummyRecommendationEntity, DummyRecommendationResult>();
final FixedRecommender<DummyRecommendationEntity, DummyRecommendationResult> simpleContentBasedTagRecommender = new FixedRecommender<DummyRecommendationEntity, DummyRecommendationResult>(titleResult);
final FixedRecommender<DummyRecommendationEntity, DummyRecommendationResult> fixedTagsTagRecommender = new FixedRecommender<DummyRecommendationEntity, DummyRecommendationResult>(firstFixedResults);
merger.setFirstRecommender(simpleContentBasedTagRecommender);
merger.setSecondRecommender(fixedTagsTagRecommender);
merger.setNumberOfResultsToRecommend(5);
final SortedSet<DummyRecommendationResult> recommendedTags = merger.getRecommendation(null);
/*
* check containment and order of top tags
*/
final Iterator<DummyRecommendationResult> iterator = recommendedTags.iterator();
assertEquals("semantic", iterator.next().getTitle());
assertEquals("social", iterator.next().getTitle());
assertEquals("nepomuk", iterator.next().getTitle());
assertEquals("desktop", iterator.next().getTitle());
assertEquals("web", iterator.next().getTitle());
assertFalse(iterator.hasNext());
}
/**
*
* If no tags from first reco are in second reco, we must ensure proper
* scores for fill-up round.
*
*/
@Test
public void testAddRecommendedTags2() {
final String[] firstFixedTags = new String[]{"eins", "zwei", "drei", "vier", "fünf", "sechs", "sieben", "eins"};
final SortedSet<DummyRecommendationResult> firstFixedResults = DummyRecommendationResult.getDummyRecommendationResults(firstFixedTags, 0.5);
final SortedSet<DummyRecommendationResult> secondFixedResults = DummyRecommendationResult.getDummyRecommendationResults(new String[] {"a", "b", "c", "d"}, new double[] { 0.3, 0.2, 0.5, 0.6 }, new double[] { 0.2 });
final FixedRecommender<DummyRecommendationEntity, DummyRecommendationResult> first = new FixedRecommender<DummyRecommendationEntity, DummyRecommendationResult>(firstFixedResults);
final FixedRecommender<DummyRecommendationEntity, DummyRecommendationResult> second = new FixedRecommender<DummyRecommendationEntity, DummyRecommendationResult>(secondFixedResults);
final ResultsFromFirstWeightedBySecondRecommender<DummyRecommendationEntity, DummyRecommendationResult> merger = new ResultsFromFirstWeightedBySecondRecommender<DummyRecommendationEntity, DummyRecommendationResult>();
merger.setFirstRecommender(first);
merger.setSecondRecommender(second);
merger.setNumberOfResultsToRecommend(5);
final SortedSet<DummyRecommendationResult> recommendedTags = merger.getRecommendation(null);
/*
* check containment and order of top tags
*/
final Iterator<DummyRecommendationResult> iterator = recommendedTags.iterator();
final DummyRecommendationResult tag1 = iterator.next();
final double score = tag1.getScore();
/*
* score should be smaller than 1
*/
assertTrue(score < 1.0);
assertEquals("eins", tag1.getTitle());
assertEquals("zwei", iterator.next().getTitle());
assertEquals("drei", iterator.next().getTitle());
assertEquals("vier", iterator.next().getTitle());
assertEquals("fünf", iterator.next().getTitle());
assertFalse(iterator.hasNext());
}
}