/* ********************************************************************** **
** Copyright notice **
** **
** (c) 2005-2009 RSSOwl Development Team **
** http://www.rssowl.org/ **
** **
** All rights reserved **
** **
** This program and the accompanying materials are made available under **
** the terms of the Eclipse Public License v1.0 which accompanies this **
** distribution, and is available at: **
** http://www.rssowl.org/legal/epl-v10.html **
** **
** A copy is found in the file epl-v10.html and important notices to the **
** license from the team is found in the textfile LICENSE.txt distributed **
** in this package. **
** **
** This copyright notice MUST APPEAR in all copies of the file! **
** **
** Contributors: **
** RSSOwl Development Team - initial API and implementation **
** **
** ********************************************************************** */
package org.rssowl.core.tests.ui;
import static org.junit.Assert.assertEquals;
import org.eclipse.jface.viewers.Viewer;
import org.junit.Before;
import org.junit.Test;
import org.rssowl.core.Owl;
import org.rssowl.core.internal.persist.service.PersistenceServiceImpl;
import org.rssowl.core.persist.IAttachment;
import org.rssowl.core.persist.IBookMark;
import org.rssowl.core.persist.IEntity;
import org.rssowl.core.persist.IFeed;
import org.rssowl.core.persist.IFolder;
import org.rssowl.core.persist.ILabel;
import org.rssowl.core.persist.IModelFactory;
import org.rssowl.core.persist.INews;
import org.rssowl.core.persist.IPerson;
import org.rssowl.core.persist.dao.DynamicDAO;
import org.rssowl.core.persist.reference.FeedLinkReference;
import org.rssowl.core.util.DateUtils;
import org.rssowl.ui.internal.EntityGroup;
import org.rssowl.ui.internal.editors.feed.NewsFilter;
import org.rssowl.ui.internal.editors.feed.NewsGrouping;
import java.net.URI;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
import java.util.List;
/**
* Test the News-Grouping and News-Filter of the FeedView.
*
* @author bpasero
*/
public class NewsGroupFilterTest {
/* Some Date Constants */
private static final long DAY = 24 * 60 * 60 * 1000;
private static final long WEEK = 7 * DAY;
private IModelFactory fFactory;
private NewsGrouping fGrouping;
private NewsFilter fFiltering;
private Date fToday;
private Date fYesterday;
private Date fEarlierThisWeek;
private Date fLastWeek;
private Viewer fNullViewer = new NullViewer();
private boolean fTodayIsFirstDayOfWeek;
private boolean fYesterdayIsFirstDayOfWeek;
/**
* @throws Exception
*/
@Before
public void setUp() throws Exception {
fFactory = Owl.getModelFactory();
fGrouping = new NewsGrouping();
fFiltering = new NewsFilter();
fToday = new Date(DateUtils.getToday().getTimeInMillis());
fYesterday = new Date(fToday.getTime() - DAY);
Calendar today = DateUtils.getToday();
fTodayIsFirstDayOfWeek = today.get(Calendar.DAY_OF_WEEK) == today.getFirstDayOfWeek();
fYesterdayIsFirstDayOfWeek = today.get(Calendar.DAY_OF_WEEK) == today.getFirstDayOfWeek() + 1;
today.set(Calendar.DAY_OF_WEEK, today.getFirstDayOfWeek());
fEarlierThisWeek = new Date(today.getTimeInMillis() + 1000);
fLastWeek = new Date(fEarlierThisWeek.getTime() - WEEK);
((PersistenceServiceImpl)Owl.getPersistenceService()).recreateSchemaForTests();
}
private void waitForIndexer() throws InterruptedException {
Thread.sleep(500);
}
/**
* @throws Exception
*/
@Test
public void testNewsGrouping() throws Exception {
IFolder folder= fFactory.createFolder(null, null, "Root");
DynamicDAO.save(folder);
IFeed feed = fFactory.createFeed(null, new URI("http://www.link.com"));
feed.setTitle("Feed Name");
DynamicDAO.save(feed);
IBookMark bookmark= fFactory.createBookMark(null, folder, new FeedLinkReference(feed.getLink()), "Feed Name");
DynamicDAO.save(bookmark);
INews news1 = fFactory.createNews(null, feed, new Date());
news1.setTitle("News 1");
news1.setPublishDate(fToday);
INews news2 = fFactory.createNews(null, feed, new Date());
news2.setTitle("News 2");
news2.setPublishDate(fYesterday);
INews news3 = fFactory.createNews(null, feed, new Date());
news3.setTitle("News 3");
news3.setPublishDate(fEarlierThisWeek);
INews news4 = fFactory.createNews(null, feed, new Date());
news4.setTitle("News 4");
news4.setPublishDate(fLastWeek);
INews news5 = fFactory.createNews(null, feed, new Date());
news5.setTitle("News 5");
news5.setPublishDate(new Date(0));
INews news6 = fFactory.createNews(null, feed, new Date());
news6.setTitle("News 6");
news6.setPublishDate(new Date(0));
INews news7 = fFactory.createNews(null, feed, new Date());
news7.setTitle("News 7");
news7.setPublishDate(new Date(0));
List<INews> input = new ArrayList<INews>();
input.add(news1);
input.add(news2);
input.add(news3);
input.add(news4);
input.add(news5);
input.add(news6);
input.add(news7);
/* Group by Date */
{
fGrouping.setType(NewsGrouping.Type.GROUP_BY_DATE);
Collection<EntityGroup> group = fGrouping.group(input);
assertEquals(fTodayIsFirstDayOfWeek || fYesterdayIsFirstDayOfWeek ? 4 : 5, group.size());
assertEquals(input.size(), countEntities(group));
for (EntityGroup entityGroup : group) {
if (entityGroup.getId() == NewsGrouping.Group.TODAY.ordinal()) {
List<IEntity> entities = entityGroup.getEntities();
assertEquals(fTodayIsFirstDayOfWeek ? 2 : 1, entities.size());
if (!fTodayIsFirstDayOfWeek)
assertEquals(true, entities.containsAll(Arrays.asList(new IEntity[] { news1 })));
else
assertEquals(true, entities.containsAll(Arrays.asList(new IEntity[] { news1, news3 })));
}
else if (entityGroup.getId() == NewsGrouping.Group.YESTERDAY.ordinal()) {
List<IEntity> entities = entityGroup.getEntities();
assertEquals(fYesterdayIsFirstDayOfWeek ? 2 : 1, entities.size());
if (!fYesterdayIsFirstDayOfWeek)
assertEquals(true, entities.containsAll(Arrays.asList(new IEntity[] { news2 })));
else
assertEquals(true, entities.containsAll(Arrays.asList(new IEntity[] { news2, news3 })));
}
else if (!fTodayIsFirstDayOfWeek && !fYesterdayIsFirstDayOfWeek && entityGroup.getId() == NewsGrouping.Group.EARLIER_THIS_WEEK.ordinal()) {
List<IEntity> entities = entityGroup.getEntities();
assertEquals(1, entities.size());
assertEquals(true, entities.containsAll(Arrays.asList(new IEntity[] { news3 })));
}
else if (entityGroup.getId() == NewsGrouping.Group.LAST_WEEK.ordinal()) {
List<IEntity> entities = entityGroup.getEntities();
assertEquals(1, entities.size());
assertEquals(true, entities.containsAll(Arrays.asList(new IEntity[] { news4 })));
}
else if (entityGroup.getId() == NewsGrouping.Group.OLDER.ordinal()) {
List<IEntity> entities = entityGroup.getEntities();
assertEquals(3, entities.size());
assertEquals(true, entities.containsAll(Arrays.asList(new IEntity[] { news5, news6, news7 })));
}
}
}
/* Group by State */
{
news1.setState(INews.State.UNREAD);
news2.setState(INews.State.READ);
news3.setState(INews.State.HIDDEN);
news4.setState(INews.State.DELETED);
news5.setState(INews.State.UPDATED);
fGrouping.setType(NewsGrouping.Type.GROUP_BY_STATE);
Collection<EntityGroup> group = fGrouping.group(input);
assertEquals(4, group.size());
assertEquals(5, countEntities(group));
for (EntityGroup entityGroup : group) {
if (entityGroup.getId() == NewsGrouping.Group.NEW.ordinal()) {
List<IEntity> entities = entityGroup.getEntities();
assertEquals(2, entities.size());
assertEquals(true, entities.containsAll(Arrays.asList(new IEntity[] { news6, news7 })));
}
else if (entityGroup.getId() == NewsGrouping.Group.UNREAD.ordinal()) {
List<IEntity> entities = entityGroup.getEntities();
assertEquals(1, entities.size());
assertEquals(true, entities.containsAll(Arrays.asList(new IEntity[] { news1 })));
}
else if (entityGroup.getId() == NewsGrouping.Group.UPDATED.ordinal()) {
List<IEntity> entities = entityGroup.getEntities();
assertEquals(1, entities.size());
assertEquals(true, entities.containsAll(Arrays.asList(new IEntity[] { news5 })));
}
else if (entityGroup.getId() == NewsGrouping.Group.READ.ordinal()) {
List<IEntity> entities = entityGroup.getEntities();
assertEquals(1, entities.size());
assertEquals(true, entities.containsAll(Arrays.asList(new IEntity[] { news2 })));
}
}
news3.setState(INews.State.NEW);
news4.setState(INews.State.NEW);
}
/* Group by Author */
{
IPerson author1 = fFactory.createPerson(null, news1);
author1.setName("Author 1");
IPerson author2 = fFactory.createPerson(null, news2);
author2.setName("Author 2");
fGrouping.setType(NewsGrouping.Type.GROUP_BY_AUTHOR);
Collection<EntityGroup> group = fGrouping.group(input);
assertEquals(3, group.size());
assertEquals(input.size(), countEntities(group));
for (EntityGroup entityGroup : group) {
if (entityGroup.getId() == NewsGrouping.Group.UNKNOWN_AUTHOR.ordinal()) {
List<IEntity> entities = entityGroup.getEntities();
assertEquals(5, entities.size());
assertEquals(true, entities.containsAll(Arrays.asList(new IEntity[] { news3, news4, news5, news6, news7 })));
}
else if (entityGroup.getName().equals("Author 1")) {
List<IEntity> entities = entityGroup.getEntities();
assertEquals(1, entities.size());
assertEquals(true, entities.containsAll(Arrays.asList(new IEntity[] { news1 })));
}
else if (entityGroup.getName().equals("Author 2")) {
List<IEntity> entities = entityGroup.getEntities();
assertEquals(1, entities.size());
assertEquals(true, entities.containsAll(Arrays.asList(new IEntity[] { news2 })));
}
}
}
/* Group by Category */
{
fFactory.createCategory(null, news1).setName("Category 1");
fFactory.createCategory(null, news2).setName("Category 2");
fGrouping.setType(NewsGrouping.Type.GROUP_BY_CATEGORY);
Collection<EntityGroup> group = fGrouping.group(input);
assertEquals(3, group.size());
assertEquals(input.size(), countEntities(group));
for (EntityGroup entityGroup : group) {
if (entityGroup.getId() == NewsGrouping.Group.UNKNOWN_CATEGORY.ordinal()) {
List<IEntity> entities = entityGroup.getEntities();
assertEquals(5, entities.size());
assertEquals(true, entities.containsAll(Arrays.asList(new IEntity[] { news3, news4, news5, news6, news7 })));
}
else if (entityGroup.getName().equals("Category 1")) {
List<IEntity> entities = entityGroup.getEntities();
assertEquals(1, entities.size());
assertEquals(true, entities.containsAll(Arrays.asList(new IEntity[] { news1 })));
}
else if (entityGroup.getName().equals("Category 2")) {
List<IEntity> entities = entityGroup.getEntities();
assertEquals(1, entities.size());
assertEquals(true, entities.containsAll(Arrays.asList(new IEntity[] { news2 })));
}
}
}
/* Group by Label */
{
ILabel label1 = fFactory.createLabel(null, "Label 1");
ILabel label2 = fFactory.createLabel(null, "Label 2");
news6.addLabel(label1);
news7.addLabel(label2);
fGrouping.setType(NewsGrouping.Type.GROUP_BY_LABEL);
Collection<EntityGroup> group = fGrouping.group(input);
assertEquals(3, group.size());
assertEquals(input.size(), countEntities(group));
for (EntityGroup entityGroup : group) {
if (entityGroup.getId() == NewsGrouping.Group.NONE.ordinal()) {
List<IEntity> entities = entityGroup.getEntities();
assertEquals(5, entities.size());
assertEquals(true, entities.containsAll(Arrays.asList(new IEntity[] { news1, news2, news3, news4, news5 })));
}
else if (entityGroup.getName().equals("Label 1")) {
List<IEntity> entities = entityGroup.getEntities();
assertEquals(1, entities.size());
assertEquals(true, entities.containsAll(Arrays.asList(new IEntity[] { news6 })));
}
else if (entityGroup.getName().equals("Label 2")) {
List<IEntity> entities = entityGroup.getEntities();
assertEquals(1, entities.size());
assertEquals(true, entities.containsAll(Arrays.asList(new IEntity[] { news7 })));
}
}
}
/* Group by Rating */
{
news1.setRating(0);
news2.setRating(20);
news3.setRating(40);
news4.setRating(60);
news5.setRating(80);
fGrouping.setType(NewsGrouping.Type.GROUP_BY_RATING);
Collection<EntityGroup> group = fGrouping.group(input);
assertEquals(5, group.size());
assertEquals(input.size(), countEntities(group));
for (EntityGroup entityGroup : group) {
if (entityGroup.getId() == NewsGrouping.Group.FANTASTIC.ordinal()) {
List<IEntity> entities = entityGroup.getEntities();
assertEquals(1, entities.size());
assertEquals(true, entities.containsAll(Arrays.asList(new IEntity[] { news5 })));
}
else if (entityGroup.getId() == NewsGrouping.Group.GOOD.ordinal()) {
List<IEntity> entities = entityGroup.getEntities();
assertEquals(1, entities.size());
assertEquals(true, entities.containsAll(Arrays.asList(new IEntity[] { news4 })));
}
else if (entityGroup.getId() == NewsGrouping.Group.MODERATE.ordinal()) {
List<IEntity> entities = entityGroup.getEntities();
assertEquals(1, entities.size());
assertEquals(true, entities.containsAll(Arrays.asList(new IEntity[] { news3 })));
}
else if (entityGroup.getId() == NewsGrouping.Group.BAD.ordinal()) {
List<IEntity> entities = entityGroup.getEntities();
assertEquals(1, entities.size());
assertEquals(true, entities.containsAll(Arrays.asList(new IEntity[] { news2 })));
}
else if (entityGroup.getId() == NewsGrouping.Group.VERY_BAD.ordinal()) {
List<IEntity> entities = entityGroup.getEntities();
assertEquals(3, entities.size());
assertEquals(true, entities.containsAll(Arrays.asList(new IEntity[] { news1, news6, news7 })));
}
}
}
/* Group by Feed */
{
fGrouping.setType(NewsGrouping.Type.GROUP_BY_FEED);
Collection<EntityGroup> group = fGrouping.group(input);
assertEquals(1, group.size());
assertEquals(input.size(), countEntities(group));
for (EntityGroup entityGroup : group) {
if (entityGroup.getName().equals("Feed Name")) {
List<IEntity> entities = entityGroup.getEntities();
assertEquals(7, entities.size());
assertEquals(true, entities.containsAll(Arrays.asList(new IEntity[] { news1, news2, news3, news4, news5, news6, news7 })));
}
}
}
/* Group by Flagged */
{
news1.setFlagged(true);
news2.setFlagged(true);
fGrouping.setType(NewsGrouping.Type.GROUP_BY_STICKY);
Collection<EntityGroup> group = fGrouping.group(input);
assertEquals(2, group.size());
assertEquals(input.size(), countEntities(group));
for (EntityGroup entityGroup : group) {
if (entityGroup.getId() == NewsGrouping.Group.STICKY.ordinal()) {
List<IEntity> entities = entityGroup.getEntities();
assertEquals(2, entities.size());
assertEquals(true, entities.containsAll(Arrays.asList(new IEntity[] { news1, news2 })));
}
else if (entityGroup.getId() == NewsGrouping.Group.NOT_STICKY.ordinal()) {
List<IEntity> entities = entityGroup.getEntities();
assertEquals(5, entities.size());
assertEquals(true, entities.containsAll(Arrays.asList(new IEntity[] { news3, news4, news5, news6, news7 })));
}
}
}
/* Group by Title */
{
news2.setTitle(news1.getTitle());
fGrouping.setType(NewsGrouping.Type.GROUP_BY_TOPIC);
Collection<EntityGroup> group = fGrouping.group(input);
assertEquals(6, group.size());
assertEquals(input.size(), countEntities(group));
for (EntityGroup entityGroup : group) {
if (entityGroup.getName().equals(news1.getTitle())) {
List<IEntity> entities = entityGroup.getEntities();
assertEquals(2, entities.size());
assertEquals(true, entities.containsAll(Arrays.asList(new IEntity[] { news1, news2 })));
}
}
}
}
/**
* @throws Exception
*/
@Test
public void testNewsFiltering() throws Exception {
IFeed feed = fFactory.createFeed(null, new URI("http://www.link.com"));
feed.setTitle("Feed Name");
INews news1 = fFactory.createNews(null, feed, new Date());
news1.setTitle("News 1");
news1.setPublishDate(fToday);
INews news2 = fFactory.createNews(null, feed, new Date());
news2.setTitle("News 2");
news2.setPublishDate(fYesterday);
INews news3 = fFactory.createNews(null, feed, new Date());
news3.setTitle("News 3");
news3.setPublishDate(new Date(0));
INews news4 = fFactory.createNews(null, feed, new Date());
news4.setTitle("News 4");
news4.setPublishDate(new Date(0));
INews news5 = fFactory.createNews(null, feed, new Date());
news5.setTitle("News 5");
news5.setPublishDate(new Date(0));
DynamicDAO.save(news1);
DynamicDAO.save(news2);
DynamicDAO.save(news3);
DynamicDAO.save(news4);
DynamicDAO.save(news5);
waitForIndexer();
/* Fill into Array */
Object elements[] = new Object[] { news1, news2, news3, news4, news5 };
/* Filter: Show All */
{
fFiltering.setType(NewsFilter.Type.SHOW_ALL);
List<?> result = Arrays.asList(fFiltering.filter(fNullViewer, (Object) null, elements));
assertEquals(elements.length, result.size());
assertEquals(true, result.containsAll(Arrays.asList(new IEntity[] { news1, news2, news3, news4, news5 })));
}
/* Filter: Show New */
{
news2.setState(INews.State.UNREAD);
news3.setState(INews.State.READ);
news4.setState(INews.State.HIDDEN);
news5.setState(INews.State.DELETED);
fFiltering.setType(NewsFilter.Type.SHOW_NEW);
List<?> result = Arrays.asList(fFiltering.filter(fNullViewer, (Object) null, elements));
assertEquals(1, result.size());
assertEquals(true, result.containsAll(Arrays.asList(new IEntity[] { news1 })));
news4.setState(INews.State.UNREAD);
news5.setState(INews.State.NEW);
}
/* Filter: Show Unread */
{
fFiltering.setType(NewsFilter.Type.SHOW_UNREAD);
List<?> result = Arrays.asList(fFiltering.filter(fNullViewer, (Object) null, elements));
assertEquals(4, result.size());
assertEquals(true, result.containsAll(Arrays.asList(new IEntity[] { news2, news4 })));
}
/* Filter: Show Flagged */
{
news1.setFlagged(true);
news2.setFlagged(true);
fFiltering.setType(NewsFilter.Type.SHOW_STICKY);
List<?> result = Arrays.asList(fFiltering.filter(fNullViewer, (Object) null, elements));
assertEquals(2, result.size());
assertEquals(true, result.containsAll(Arrays.asList(new IEntity[] { news1, news2 })));
}
/* Filter: Show Labeled */
{
news1.addLabel(fFactory.createLabel(null, "Foo"));
news2.addLabel(fFactory.createLabel(null, "Bar"));
fFiltering.setType(NewsFilter.Type.SHOW_LABELED);
List<?> result = Arrays.asList(fFiltering.filter(fNullViewer, (Object) null, elements));
assertEquals(2, result.size());
assertEquals(true, result.containsAll(Arrays.asList(new IEntity[] { news1, news2 })));
}
/* Filter: Show Recent */
{
fFiltering.setType(NewsFilter.Type.SHOW_RECENT);
List<?> result = Arrays.asList(fFiltering.filter(fNullViewer, (Object) null, elements));
assertEquals(2, result.size());
assertEquals(true, result.containsAll(Arrays.asList(new IEntity[] { news1, news2 })));
}
/* Filter: Text Pattern (Headline) */
{
news1.setTitle("Foo Bar");
news2.setTitle("Bar foo");
DynamicDAO.save(news1);
DynamicDAO.save(news2);
waitForIndexer();
fFiltering.setType(NewsFilter.Type.SHOW_ALL);
fFiltering.setPattern("*foo*");
fFiltering.setSearchTarget(NewsFilter.SearchTarget.HEADLINE);
List<?> result = Arrays.asList(fFiltering.filter(fNullViewer, (Object) null, elements));
assertEquals(2, result.size());
assertEquals(true, result.containsAll(Arrays.asList(new IEntity[] { news1, news2 })));
news1.setTitle("News 1");
news2.setTitle("News 2");
}
/* Filter: Text Pattern (Entire News) */
{
news1.setDescription("Foo bar");
news2.setTitle("Foo bar");
news3.setComments("Foo bar");
fFactory.createAttachment(null, news4).setLink(new URI("http://www.foo.com"));
fFactory.createPerson(null, news5).setName("Foo bar");
DynamicDAO.save(news1);
DynamicDAO.save(news2);
DynamicDAO.save(news3);
DynamicDAO.save(news4);
DynamicDAO.save(news5);
waitForIndexer();
fFiltering.setPattern("foo");
fFiltering.setSearchTarget(NewsFilter.SearchTarget.ALL);
List<?> result = Arrays.asList(fFiltering.filter(fNullViewer, (Object) null, elements));
assertEquals(3, result.size());
assertEquals(true, result.containsAll(Arrays.asList(new IEntity[] { news1, news2, news5 })));
}
/* Filter: Text Pattern (Author) */
{
fFiltering.setSearchTarget(NewsFilter.SearchTarget.AUTHOR);
List<?> result = Arrays.asList(fFiltering.filter(fNullViewer, (Object) null, elements));
assertEquals(1, result.size());
assertEquals(true, result.containsAll(Arrays.asList(new IEntity[] { news5 })));
}
/* Filter: Text Pattern (Category) */
{
fFactory.createCategory(null, news1).setName("Foo bar");
fFactory.createCategory(null, news2).setName("Bar Foo");
DynamicDAO.save(news1);
DynamicDAO.save(news2);
waitForIndexer();
fFiltering.setPattern("*foo*");
fFiltering.setSearchTarget(NewsFilter.SearchTarget.CATEGORY);
List<?> result = Arrays.asList(fFiltering.filter(fNullViewer, (Object) null, elements));
assertEquals(2, result.size());
assertEquals(true, result.containsAll(Arrays.asList(new IEntity[] { news1, news2 })));
}
/* Filter: Text Pattern (Source) */
{
fFactory.createSource(news4).setLink(new URI("http://www.foo.com"));
fFactory.createSource(news5).setLink(new URI("http://www.foo.com"));
DynamicDAO.save(news4);
DynamicDAO.save(news5);
waitForIndexer();
fFiltering.setPattern("*foo*");
fFiltering.setSearchTarget(NewsFilter.SearchTarget.SOURCE);
List<?> result = Arrays.asList(fFiltering.filter(fNullViewer, (Object) null, elements));
assertEquals(2, result.size());
assertEquals(true, result.containsAll(Arrays.asList(new IEntity[] { news4, news5 })));
}
/* Filter: Text Pattern (Attachments) */
{
IAttachment a1 = fFactory.createAttachment(null, news1);
a1.setLink(new URI("http://www.link1.com"));
a1.setType("Foo bar");
fFactory.createAttachment(null, news2).setLink(new URI("http://www.foo.com"));
DynamicDAO.save(news1);
DynamicDAO.save(news2);
waitForIndexer();
fFiltering.setPattern("*foo*");
fFiltering.setSearchTarget(NewsFilter.SearchTarget.ATTACHMENTS);
List<?> result = Arrays.asList(fFiltering.filter(fNullViewer, (Object) null, elements));
assertEquals(3, result.size());
assertEquals(true, result.containsAll(Arrays.asList(new IEntity[] { news1, news2, news4 })));
}
}
private int countEntities(Collection<EntityGroup> group) {
int count = 0;
for (EntityGroup entityGroup : group) {
count += entityGroup.getEntities().size();
}
return count;
}
}