/* ********************************************************************** ** ** 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 junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertFalse; import static org.junit.Assert.assertTrue; 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.IFeed; import org.rssowl.core.persist.IModelFactory; import org.rssowl.core.persist.INews; import org.rssowl.core.persist.dao.DynamicDAO; import org.rssowl.core.util.Pair; import org.rssowl.ui.internal.EntityGroup; import org.rssowl.ui.internal.editors.feed.NewsBrowserViewModel; import java.net.URI; import java.util.Date; import java.util.List; import java.util.Map; /** * Testing the NewsBrowserViewModel. * * @author bpasero */ public class NewsBrowserViewModelTests { private IModelFactory fFactory; /** * @throws Exception */ @Before public void setUp() throws Exception { ((PersistenceServiceImpl)Owl.getPersistenceService()).recreateSchemaForTests(); fFactory = Owl.getModelFactory(); } /** * @throws Exception */ @Test public void testNullModel() throws Exception { NewsBrowserViewModel model = new NewsBrowserViewModel(null); model.setInput(null, 0); assertEquals(-1L, model.findGroup(5L)); assertFalse(model.isFirstItemUnread()); assertEquals(-1L, model.getExpandedNews()); assertTrue(model.getGroups().isEmpty()); assertEquals(0, model.getGroupSize(5L)); assertTrue(model.getNewsIds(5L).isEmpty()); assertFalse(model.hasGroup(5L)); assertFalse(model.isNewsExpanded(fFactory.createNews(5L, fFactory.createFeed(null, URI.create("rssowl.org")), new Date()))); assertTrue(model.isGroupExpanded(5L)); assertEquals(-1L, model.nextNews(false, -1L)); assertEquals(-1L, model.previousNews(false, -1L)); assertEquals(-1L, model.nextNews(true, -1L)); assertEquals(-1L, model.previousNews(true, -1L)); assertEquals(-1L, model.nextNews(false, 5L)); assertEquals(-1L, model.previousNews(false, 5L)); assertEquals(-1L, model.nextNews(true, 5L)); assertEquals(-1L, model.previousNews(true, 5L)); assertEquals(-1L, model.removeNews(fFactory.createNews(5L, fFactory.createFeed(null, URI.create("rssowl.org")), new Date()))); assertEquals(0, model.getNewsCount()); assertEquals(0, model.getVisibleNewsCount()); assertEquals(-1L, model.getLastVisibleNews()); assertFalse(model.hasHiddenNews()); assertTrue(model.getVisibleUnreadNews().isEmpty()); assertEquals(-1L, model.getLastNews()); Pair<List<Long>, List<Long>> nextPage = model.getNextPage(0); assertTrue(nextPage.getFirst().isEmpty()); assertTrue(nextPage.getSecond().isEmpty()); nextPage = model.getNextPage(5); assertTrue(nextPage.getFirst().isEmpty()); assertTrue(nextPage.getSecond().isEmpty()); Pair<List<Long>, List<Long>> revealed = model.revealPage(5L, 0); assertTrue(revealed.getFirst().isEmpty()); assertTrue(revealed.getSecond().isEmpty()); model.setNewsExpanded(fFactory.createNews(5L, fFactory.createFeed(null, URI.create("rssowl.org")), new Date()), false); model.setGroupExpanded(5L, false); } /** * @throws Exception */ @Test public void testEmptyModel() throws Exception { Object[] elements = new Object[0]; NewsBrowserViewModel model = new NewsBrowserViewModel(null); model.setInput(elements, 0); assertEquals(-1L, model.findGroup(5L)); assertEquals(-1L, model.getExpandedNews()); assertFalse(model.isFirstItemUnread()); assertTrue(model.getGroups().isEmpty()); assertEquals(0, model.getGroupSize(5L)); assertTrue(model.getNewsIds(5L).isEmpty()); assertFalse(model.hasGroup(5L)); assertFalse(model.hasNews(5L)); assertFalse(model.isNewsExpanded(fFactory.createNews(5L, fFactory.createFeed(null, URI.create("rssowl.org")), new Date()))); assertTrue(model.isGroupExpanded(5L)); assertEquals(-1L, model.nextNews(false, -1L)); assertEquals(-1L, model.previousNews(false, -1L)); assertEquals(-1L, model.nextNews(true, -1L)); assertEquals(-1L, model.previousNews(true, -1L)); assertEquals(-1L, model.nextNews(false, 5L)); assertEquals(-1L, model.previousNews(false, 5L)); assertEquals(-1L, model.nextNews(true, 5L)); assertEquals(-1L, model.previousNews(true, 5L)); assertEquals(-1L, model.removeNews(fFactory.createNews(5L, fFactory.createFeed(null, URI.create("rssowl.org")), new Date()))); assertEquals(-1L, model.getLastVisibleNews()); assertFalse(model.hasHiddenNews()); assertTrue(model.getVisibleUnreadNews().isEmpty()); assertEquals(-1L, model.getLastNews()); assertEquals(0, model.getNewsCount()); assertEquals(0, model.getVisibleNewsCount()); Pair<List<Long>, List<Long>> nextPage = model.getNextPage(0); assertTrue(nextPage.getFirst().isEmpty()); assertTrue(nextPage.getSecond().isEmpty()); nextPage = model.getNextPage(5); assertTrue(nextPage.getFirst().isEmpty()); assertTrue(nextPage.getSecond().isEmpty()); Pair<List<Long>, List<Long>> revealed = model.revealPage(5L, 0); assertTrue(revealed.getFirst().isEmpty()); assertTrue(revealed.getSecond().isEmpty()); model.setNewsExpanded(fFactory.createNews(5L, fFactory.createFeed(null, URI.create("rssowl.org")), new Date()), false); model.setGroupExpanded(5L, false); } /** * @throws Exception */ @Test public void testEmptyModelWithPageSize() throws Exception { Object[] elements = new Object[0]; NewsBrowserViewModel model = new NewsBrowserViewModel(null); model.setInput(elements, 5); assertEquals(-1L, model.findGroup(5L)); assertEquals(-1L, model.getExpandedNews()); assertFalse(model.isFirstItemUnread()); assertTrue(model.getGroups().isEmpty()); assertEquals(0, model.getGroupSize(5L)); assertTrue(model.getNewsIds(5L).isEmpty()); assertFalse(model.hasGroup(5L)); assertFalse(model.hasNews(5L)); assertFalse(model.isNewsExpanded(fFactory.createNews(5L, fFactory.createFeed(null, URI.create("rssowl.org")), new Date()))); assertTrue(model.isGroupExpanded(5L)); assertEquals(-1L, model.nextNews(false, -1L)); assertEquals(-1L, model.previousNews(false, -1L)); assertEquals(-1L, model.nextNews(true, -1L)); assertEquals(-1L, model.previousNews(true, -1L)); assertEquals(-1L, model.nextNews(false, 5L)); assertEquals(-1L, model.previousNews(false, 5L)); assertEquals(-1L, model.nextNews(true, 5L)); assertEquals(-1L, model.previousNews(true, 5L)); assertEquals(-1L, model.removeNews(fFactory.createNews(5L, fFactory.createFeed(null, URI.create("rssowl.org")), new Date()))); assertTrue(model.getVisibleUnreadNews().isEmpty()); assertEquals(-1L, model.getLastNews()); assertEquals(0, model.getNewsCount()); assertEquals(0, model.getVisibleNewsCount()); Pair<List<Long>, List<Long>> nextPage = model.getNextPage(0); assertTrue(nextPage.getFirst().isEmpty()); assertTrue(nextPage.getSecond().isEmpty()); nextPage = model.getNextPage(5); assertTrue(nextPage.getFirst().isEmpty()); assertTrue(nextPage.getSecond().isEmpty()); Pair<List<Long>, List<Long>> revealed = model.revealPage(5L, 0); assertTrue(revealed.getFirst().isEmpty()); assertTrue(revealed.getSecond().isEmpty()); model.setNewsExpanded(fFactory.createNews(5L, fFactory.createFeed(null, URI.create("rssowl.org")), new Date()), false); model.setGroupExpanded(5L, false); assertEquals(-1L, model.getLastVisibleNews()); assertFalse(model.hasHiddenNews()); } /** * @throws Exception */ @Test public void testFlatModel() throws Exception { IFeed feed = fFactory.createFeed(null, new URI("rssowl.org")); INews news1 = fFactory.createNews(1L, feed, new Date()); INews news2 = fFactory.createNews(2L, feed, new Date()); news2.setState(INews.State.READ); INews news3 = fFactory.createNews(3L, feed, new Date()); DynamicDAO.save(feed); Object[] elements = new Object[] { news1, news2, news3, feed }; NewsBrowserViewModel model = new NewsBrowserViewModel(null); model.setInput(elements, 0); assertTrue(model.isFirstItemUnread()); assertEquals(-1L, model.findGroup(5L)); assertEquals(-1L, model.getExpandedNews()); model.setNewsExpanded(news3, true); assertEquals(3L, model.getExpandedNews()); assertTrue(model.getGroups().isEmpty()); assertEquals(0, model.getGroupSize(5L)); assertTrue(model.getNewsIds(5L).isEmpty()); assertFalse(model.hasGroup(5L)); assertFalse(model.hasNews(5L)); assertFalse(model.isNewsExpanded(news2)); assertTrue(model.isNewsExpanded(news3)); assertTrue(model.isGroupExpanded(5L)); assertEquals(3, model.getNewsCount()); assertEquals(3, model.getVisibleNewsCount()); assertEquals(news3.getId().longValue(), model.getLastVisibleNews()); assertFalse(model.hasHiddenNews()); assertEquals(2, model.getVisibleUnreadNews().size()); assertEquals(3L, model.getLastNews()); assertTrue(model.hasNews(1L)); assertTrue(model.hasNews(2L)); assertTrue(model.hasNews(3L)); assertEquals(1L, model.nextNews(false, -1L)); assertEquals(1L, model.nextNews(true, -1L)); assertEquals(2L, model.nextNews(false, 1L)); assertEquals(3L, model.nextNews(true, 1L)); assertEquals(-1L, model.nextNews(true, 3L)); assertEquals(1L, model.nextNews(true, 5L)); assertEquals(-1L, model.nextNews(false, 3L)); assertEquals(1L, model.nextNews(false, 5L)); assertEquals(3L, model.previousNews(false, -1L)); assertEquals(3L, model.previousNews(true, -1L)); assertEquals(-1L, model.previousNews(false, 1L)); assertEquals(-1L, model.previousNews(true, 1L)); assertEquals(2L, model.previousNews(false, 3L)); assertEquals(1L, model.previousNews(true, 3L)); assertEquals(3L, model.previousNews(true, 5L)); assertEquals(3L, model.previousNews(false, 5L)); assertEquals(-1L, model.removeNews(news2)); assertEquals(3L, model.nextNews(false, 1L)); assertEquals(3L, model.nextNews(true, 1L)); assertEquals(3L, model.getLastNews()); assertEquals(2, model.getNewsCount()); assertEquals(2, model.getVisibleNewsCount()); assertEquals(2, model.getVisibleUnreadNews().size()); model.setNewsVisible(news1, false); assertEquals(2, model.getNewsCount()); assertEquals(1, model.getVisibleNewsCount()); assertTrue(model.hasHiddenNews()); model.setNewsVisible(news3, false); assertEquals(2, model.getNewsCount()); assertEquals(0, model.getVisibleNewsCount()); assertEquals(0, model.getVisibleUnreadNews().size()); model.setNewsVisible(news1, true); model.setNewsVisible(news3, true); assertEquals(2, model.getNewsCount()); assertEquals(2, model.getVisibleNewsCount()); Pair<List<Long>, List<Long>> nextPage = model.getNextPage(0); assertTrue(nextPage.getFirst().isEmpty()); assertTrue(nextPage.getSecond().isEmpty()); nextPage = model.getNextPage(5); assertTrue(nextPage.getFirst().isEmpty()); assertTrue(nextPage.getSecond().isEmpty()); Pair<List<Long>, List<Long>> revealed = model.revealPage(5L, 5); assertTrue(revealed.getFirst().isEmpty()); assertTrue(revealed.getSecond().isEmpty()); model.setNewsVisible(news1, false); model.setNewsVisible(news3, true); revealed = model.revealPage(news1.getId(), 5); assertTrue(revealed.getFirst().isEmpty()); assertEquals(2, revealed.getSecond().size()); assertEquals(news1.getId(), revealed.getSecond().get(0)); assertEquals(news3.getId(), revealed.getSecond().get(1)); revealed = model.revealPage(news3.getId(), 5); assertTrue(revealed.getFirst().isEmpty()); assertEquals(news1.getId(), revealed.getSecond().get(0)); model.setNewsVisible(news1, false); model.setNewsVisible(news3, false); revealed = model.revealPage(news3.getId(), 5); assertEquals(2, revealed.getSecond().size()); assertEquals(news1.getId(), revealed.getSecond().get(0)); assertEquals(news3.getId(), revealed.getSecond().get(1)); } /** * @throws Exception */ @Test public void testFlatModelWithSmallPage() throws Exception { IFeed feed = fFactory.createFeed(null, new URI("rssowl.org")); INews news1 = fFactory.createNews(1L, feed, new Date()); INews news2 = fFactory.createNews(2L, feed, new Date()); news2.setState(INews.State.READ); INews news3 = fFactory.createNews(3L, feed, new Date()); DynamicDAO.save(feed); Object[] elements = new Object[] { news1, news2, news3, feed }; NewsBrowserViewModel model = new NewsBrowserViewModel(null); model.setInput(elements, 2); assertTrue(model.isFirstItemUnread()); assertEquals(news2.getId().longValue(), model.getLastVisibleNews()); assertEquals(-1L, model.findGroup(5L)); assertEquals(-1L, model.getExpandedNews()); model.setNewsExpanded(news3, true); assertEquals(3L, model.getExpandedNews()); assertTrue(model.getGroups().isEmpty()); assertEquals(0, model.getGroupSize(5L)); assertTrue(model.getNewsIds(5L).isEmpty()); assertFalse(model.hasGroup(5L)); assertFalse(model.hasNews(5L)); assertFalse(model.isNewsExpanded(news2)); assertTrue(model.isNewsExpanded(news3)); assertTrue(model.isGroupExpanded(5L)); assertEquals(3, model.getNewsCount()); assertEquals(2, model.getVisibleNewsCount()); assertEquals(1L, model.nextNews(false, -1L)); assertEquals(1L, model.nextNews(true, -1L)); assertEquals(2L, model.nextNews(false, 1L)); assertEquals(3L, model.nextNews(true, 1L)); assertEquals(-1L, model.nextNews(true, 3L)); assertEquals(1L, model.nextNews(true, 5L)); assertEquals(-1L, model.nextNews(false, 3L)); assertEquals(1L, model.nextNews(false, 5L)); assertEquals(3L, model.previousNews(false, -1L)); assertEquals(3L, model.previousNews(true, -1L)); assertEquals(-1L, model.previousNews(false, 1L)); assertEquals(-1L, model.previousNews(true, 1L)); assertEquals(2L, model.previousNews(false, 3L)); assertEquals(1L, model.previousNews(true, 3L)); assertEquals(3L, model.previousNews(true, 5L)); assertEquals(3L, model.previousNews(false, 5L)); Pair<List<Long>, List<Long>> nextPage = model.getNextPage(2); assertTrue(nextPage.getFirst().isEmpty()); assertEquals(1, nextPage.getSecond().size()); assertEquals(news3.getId(), nextPage.getSecond().get(0)); assertEquals(-1L, model.removeNews(news2)); assertEquals(3L, model.nextNews(false, 1L)); assertEquals(3L, model.nextNews(true, 1L)); assertEquals(2, model.getNewsCount()); assertEquals(1, model.getVisibleNewsCount()); model.setNewsVisible(news1, false); assertEquals(2, model.getNewsCount()); assertEquals(0, model.getVisibleNewsCount()); model.setNewsVisible(news3, false); assertEquals(2, model.getNewsCount()); assertEquals(0, model.getVisibleNewsCount()); model.setNewsVisible(news1, true); model.setNewsVisible(news3, true); assertEquals(news3.getId().longValue(), model.getLastVisibleNews()); assertEquals(2, model.getNewsCount()); assertEquals(2, model.getVisibleNewsCount()); nextPage = model.getNextPage(0); assertTrue(nextPage.getFirst().isEmpty()); assertTrue(nextPage.getSecond().isEmpty()); nextPage = model.getNextPage(5); assertTrue(nextPage.getFirst().isEmpty()); assertTrue(nextPage.getSecond().isEmpty()); Pair<List<Long>, List<Long>> revealed = model.revealPage(5L, 2); assertTrue(revealed.getFirst().isEmpty()); assertTrue(revealed.getSecond().isEmpty()); model.setNewsVisible(news1, false); model.setNewsVisible(news3, true); assertEquals(-1L, model.getLastVisibleNews()); revealed = model.revealPage(news1.getId(), 2); assertTrue(revealed.getFirst().isEmpty()); assertEquals(2, revealed.getSecond().size()); assertEquals(news1.getId(), revealed.getSecond().get(0)); assertEquals(news3.getId(), revealed.getSecond().get(1)); revealed = model.revealPage(news3.getId(), 2); assertTrue(revealed.getFirst().isEmpty()); assertEquals(news1.getId(), revealed.getSecond().get(0)); model.setNewsVisible(news1, false); model.setNewsVisible(news3, false); assertEquals(-1L, model.getLastVisibleNews()); revealed = model.revealPage(news3.getId(), 2); assertEquals(2, revealed.getSecond().size()); assertEquals(news1.getId(), revealed.getSecond().get(0)); assertEquals(news3.getId(), revealed.getSecond().get(1)); } /** * @throws Exception */ @Test public void testFlatModelWithLargePage() throws Exception { IFeed feed = fFactory.createFeed(null, new URI("rssowl.org")); INews news1 = fFactory.createNews(1L, feed, new Date()); INews news2 = fFactory.createNews(2L, feed, new Date()); news2.setState(INews.State.READ); INews news3 = fFactory.createNews(3L, feed, new Date()); DynamicDAO.save(feed); Object[] elements = new Object[] { news1, news2, news3, feed }; NewsBrowserViewModel model = new NewsBrowserViewModel(null); model.setInput(elements, 5); assertTrue(model.isFirstItemUnread()); assertEquals(-1L, model.findGroup(5L)); assertEquals(-1L, model.getExpandedNews()); model.setNewsExpanded(news3, true); assertEquals(3L, model.getExpandedNews()); assertTrue(model.getGroups().isEmpty()); assertEquals(0, model.getGroupSize(5L)); assertTrue(model.getNewsIds(5L).isEmpty()); assertFalse(model.hasGroup(5L)); assertFalse(model.hasNews(5L)); assertFalse(model.isNewsExpanded(news2)); assertTrue(model.isNewsExpanded(news3)); assertTrue(model.isGroupExpanded(5L)); assertEquals(3, model.getNewsCount()); assertEquals(3, model.getVisibleNewsCount()); assertEquals(1L, model.nextNews(false, -1L)); assertEquals(1L, model.nextNews(true, -1L)); assertEquals(2L, model.nextNews(false, 1L)); assertEquals(3L, model.nextNews(true, 1L)); assertEquals(-1L, model.nextNews(true, 3L)); assertEquals(1L, model.nextNews(true, 5L)); assertEquals(-1L, model.nextNews(false, 3L)); assertEquals(1L, model.nextNews(false, 5L)); assertEquals(3L, model.previousNews(false, -1L)); assertEquals(3L, model.previousNews(true, -1L)); assertEquals(-1L, model.previousNews(false, 1L)); assertEquals(-1L, model.previousNews(true, 1L)); assertEquals(2L, model.previousNews(false, 3L)); assertEquals(1L, model.previousNews(true, 3L)); assertEquals(3L, model.previousNews(true, 5L)); assertEquals(3L, model.previousNews(false, 5L)); assertEquals(-1L, model.removeNews(news2)); assertEquals(3L, model.nextNews(false, 1L)); assertEquals(3L, model.nextNews(true, 1L)); assertEquals(2, model.getNewsCount()); assertEquals(2, model.getVisibleNewsCount()); model.setNewsVisible(news1, false); assertEquals(2, model.getNewsCount()); assertEquals(1, model.getVisibleNewsCount()); model.setNewsVisible(news3, false); assertEquals(2, model.getNewsCount()); assertEquals(0, model.getVisibleNewsCount()); model.setNewsVisible(news1, true); model.setNewsVisible(news3, true); assertEquals(2, model.getNewsCount()); assertEquals(2, model.getVisibleNewsCount()); Pair<List<Long>, List<Long>> nextPage = model.getNextPage(0); assertTrue(nextPage.getFirst().isEmpty()); assertTrue(nextPage.getSecond().isEmpty()); nextPage = model.getNextPage(5); assertTrue(nextPage.getFirst().isEmpty()); assertTrue(nextPage.getSecond().isEmpty()); Pair<List<Long>, List<Long>> revealed = model.revealPage(5L, 5); assertTrue(revealed.getFirst().isEmpty()); assertTrue(revealed.getSecond().isEmpty()); model.setNewsVisible(news1, false); model.setNewsVisible(news3, true); revealed = model.revealPage(news1.getId(), 5); assertTrue(revealed.getFirst().isEmpty()); assertEquals(2, revealed.getSecond().size()); assertEquals(news1.getId(), revealed.getSecond().get(0)); assertEquals(news3.getId(), revealed.getSecond().get(1)); revealed = model.revealPage(news3.getId(), 5); assertTrue(revealed.getFirst().isEmpty()); assertEquals(news1.getId(), revealed.getSecond().get(0)); model.setNewsVisible(news1, false); model.setNewsVisible(news3, false); revealed = model.revealPage(news3.getId(), 5); assertEquals(2, revealed.getSecond().size()); assertEquals(news1.getId(), revealed.getSecond().get(0)); assertEquals(news3.getId(), revealed.getSecond().get(1)); } /** * @throws Exception */ @Test public void testGroupedModel() throws Exception { IFeed feed = fFactory.createFeed(null, new URI("rssowl.org")); INews news1 = fFactory.createNews(1L, feed, new Date()); INews news2 = fFactory.createNews(2L, feed, new Date()); news2.setState(INews.State.READ); INews news3 = fFactory.createNews(3L, feed, new Date()); DynamicDAO.save(feed); EntityGroup group1 = new EntityGroup(100, "foo"); EntityGroup group2 = new EntityGroup(101, "foo"); Object[] elements = new Object[] { group1, news1, news2, group2, news3, feed }; NewsBrowserViewModel model = new NewsBrowserViewModel(null); model.setInput(elements, 0); assertFalse(model.isFirstItemUnread()); assertEquals(-1L, model.findGroup(5L)); assertEquals(100L, model.findGroup(1L)); assertEquals(100L, model.findGroup(2L)); assertEquals(101L, model.findGroup(3L)); assertEquals(-1L, model.getExpandedNews()); model.setNewsExpanded(news3, true); assertEquals(3L, model.getExpandedNews()); assertEquals(2, model.getGroups().size()); assertEquals(2, model.getGroupSize(100L)); assertEquals(1, model.getGroupSize(101L)); Map<Long, List<Long>> groups = model.getGroups(); List<Long> group_1 = groups.get(100L); List<Long> group_2 = groups.get(101L); assertEquals(1, group_1.get(0).longValue()); assertEquals(2, group_1.get(1).longValue()); assertEquals(3, group_2.get(0).longValue()); List<Long> newsIds = model.getNewsIds(100L); assertEquals(1, newsIds.get(0).longValue()); assertEquals(2, newsIds.get(1).longValue()); assertFalse(model.hasGroup(5L)); assertTrue(model.hasGroup(100L)); assertTrue(model.hasGroup(101L)); assertFalse(model.isNewsExpanded(news2)); assertTrue(model.isNewsExpanded(news3)); assertTrue(model.isGroupExpanded(5L)); model.setGroupExpanded(100L, false); assertFalse(model.isGroupExpanded(100L)); assertEquals(1L, model.nextNews(false, -1L)); assertEquals(1L, model.nextNews(true, -1L)); assertEquals(2L, model.nextNews(false, 1L)); assertEquals(3L, model.nextNews(true, 1L)); assertEquals(-1L, model.nextNews(true, 3L)); assertEquals(1L, model.nextNews(true, 5L)); assertEquals(-1L, model.nextNews(false, 3L)); assertEquals(1L, model.nextNews(false, 5L)); assertEquals(3L, model.previousNews(false, -1L)); assertEquals(3L, model.previousNews(true, -1L)); assertEquals(-1L, model.previousNews(false, 1L)); assertEquals(-1L, model.previousNews(true, 1L)); assertEquals(2L, model.previousNews(false, 3L)); assertEquals(1L, model.previousNews(true, 3L)); assertEquals(3L, model.previousNews(true, 5L)); assertEquals(3L, model.previousNews(false, 5L)); assertEquals(100L, model.removeNews(news1)); assertTrue(model.hasGroup(100L)); assertEquals(100L, model.removeNews(news2)); assertFalse(model.hasGroup(100L)); assertEquals(101L, model.removeNews(news3)); assertFalse(model.hasGroup(101L)); assertFalse(model.isNewsExpanded(news1)); assertFalse(model.isNewsExpanded(news2)); assertFalse(model.isNewsExpanded(news3)); assertEquals(0, model.getGroups().size()); assertEquals(0, model.getGroupSize(100L)); assertEquals(0, model.getGroupSize(101L)); assertTrue(model.getNewsIds(100L).isEmpty()); Pair<List<Long>, List<Long>> nextPage = model.getNextPage(0); assertTrue(nextPage.getFirst().isEmpty()); assertTrue(nextPage.getSecond().isEmpty()); nextPage = model.getNextPage(5); assertTrue(nextPage.getFirst().isEmpty()); assertTrue(nextPage.getSecond().isEmpty()); Pair<List<Long>, List<Long>> revealed = model.revealPage(5L, 0); assertTrue(revealed.getFirst().isEmpty()); assertTrue(revealed.getSecond().isEmpty()); } /** * @throws Exception */ @Test public void testGroupedModelWithLargePage() throws Exception { IFeed feed = fFactory.createFeed(null, new URI("rssowl.org")); INews news1 = fFactory.createNews(1L, feed, new Date()); INews news2 = fFactory.createNews(2L, feed, new Date()); news2.setState(INews.State.READ); INews news3 = fFactory.createNews(3L, feed, new Date()); DynamicDAO.save(feed); EntityGroup group1 = new EntityGroup(100, "foo"); EntityGroup group2 = new EntityGroup(101, "foo"); Object[] elements = new Object[] { group1, news1, news2, group2, news3, feed }; NewsBrowserViewModel model = new NewsBrowserViewModel(null); model.setInput(elements, 5); assertFalse(model.isFirstItemUnread()); assertEquals(-1L, model.findGroup(5L)); assertEquals(100L, model.findGroup(1L)); assertEquals(100L, model.findGroup(2L)); assertEquals(101L, model.findGroup(3L)); assertEquals(-1L, model.getExpandedNews()); model.setNewsExpanded(news3, true); assertEquals(3L, model.getExpandedNews()); assertEquals(2, model.getGroups().size()); assertEquals(2, model.getGroupSize(100L)); assertEquals(1, model.getGroupSize(101L)); Map<Long, List<Long>> groups = model.getGroups(); List<Long> group_1 = groups.get(100L); List<Long> group_2 = groups.get(101L); assertEquals(1, group_1.get(0).longValue()); assertEquals(2, group_1.get(1).longValue()); assertEquals(3, group_2.get(0).longValue()); List<Long> newsIds = model.getNewsIds(100L); assertEquals(1, newsIds.get(0).longValue()); assertEquals(2, newsIds.get(1).longValue()); assertFalse(model.hasGroup(5L)); assertTrue(model.hasGroup(100L)); assertTrue(model.hasGroup(101L)); assertFalse(model.isNewsExpanded(news2)); assertTrue(model.isNewsExpanded(news3)); assertTrue(model.isGroupExpanded(5L)); model.setGroupExpanded(100L, false); assertFalse(model.isGroupExpanded(100L)); assertEquals(1L, model.nextNews(false, -1L)); assertEquals(1L, model.nextNews(true, -1L)); assertEquals(2L, model.nextNews(false, 1L)); assertEquals(3L, model.nextNews(true, 1L)); assertEquals(-1L, model.nextNews(true, 3L)); assertEquals(1L, model.nextNews(true, 5L)); assertEquals(-1L, model.nextNews(false, 3L)); assertEquals(1L, model.nextNews(false, 5L)); assertEquals(3L, model.previousNews(false, -1L)); assertEquals(3L, model.previousNews(true, -1L)); assertEquals(-1L, model.previousNews(false, 1L)); assertEquals(-1L, model.previousNews(true, 1L)); assertEquals(2L, model.previousNews(false, 3L)); assertEquals(1L, model.previousNews(true, 3L)); assertEquals(3L, model.previousNews(true, 5L)); assertEquals(3L, model.previousNews(false, 5L)); assertEquals(100L, model.removeNews(news1)); assertTrue(model.hasGroup(100L)); assertEquals(100L, model.removeNews(news2)); assertFalse(model.hasGroup(100L)); assertEquals(101L, model.removeNews(news3)); assertFalse(model.hasGroup(101L)); assertFalse(model.isNewsExpanded(news1)); assertFalse(model.isNewsExpanded(news2)); assertFalse(model.isNewsExpanded(news3)); assertEquals(0, model.getGroups().size()); assertEquals(0, model.getGroupSize(100L)); assertEquals(0, model.getGroupSize(101L)); assertTrue(model.getNewsIds(100L).isEmpty()); Pair<List<Long>, List<Long>> nextPage = model.getNextPage(0); assertTrue(nextPage.getFirst().isEmpty()); assertTrue(nextPage.getSecond().isEmpty()); nextPage = model.getNextPage(5); assertTrue(nextPage.getFirst().isEmpty()); assertTrue(nextPage.getSecond().isEmpty()); Pair<List<Long>, List<Long>> revealed = model.revealPage(5L, 0); assertTrue(revealed.getFirst().isEmpty()); assertTrue(revealed.getSecond().isEmpty()); } /** * @throws Exception */ @Test public void testGroupedModelWithSmallPage() throws Exception { IFeed feed = fFactory.createFeed(null, new URI("rssowl.org")); INews news1 = fFactory.createNews(1L, feed, new Date()); INews news2 = fFactory.createNews(2L, feed, new Date()); news2.setState(INews.State.READ); INews news3 = fFactory.createNews(3L, feed, new Date()); DynamicDAO.save(feed); EntityGroup group1 = new EntityGroup(100, "foo"); EntityGroup group2 = new EntityGroup(101, "foo"); Object[] elements = new Object[] { group1, news1, news2, group2, news3, feed }; NewsBrowserViewModel model = new NewsBrowserViewModel(null); model.setInput(elements, 2); assertFalse(model.isFirstItemUnread()); assertEquals(-1L, model.findGroup(5L)); assertEquals(100L, model.findGroup(1L)); assertEquals(100L, model.findGroup(2L)); assertEquals(101L, model.findGroup(3L)); assertEquals(-1L, model.getExpandedNews()); model.setNewsExpanded(news3, true); assertEquals(3L, model.getExpandedNews()); assertEquals(2, model.getGroups().size()); assertEquals(2, model.getGroupSize(100L)); assertEquals(1, model.getGroupSize(101L)); Map<Long, List<Long>> groups = model.getGroups(); List<Long> group_1 = groups.get(100L); List<Long> group_2 = groups.get(101L); assertEquals(1, group_1.get(0).longValue()); assertEquals(2, group_1.get(1).longValue()); assertEquals(3, group_2.get(0).longValue()); List<Long> newsIds = model.getNewsIds(100L); assertEquals(1, newsIds.get(0).longValue()); assertEquals(2, newsIds.get(1).longValue()); assertFalse(model.hasGroup(5L)); assertTrue(model.hasGroup(100L)); assertTrue(model.hasGroup(101L)); assertFalse(model.isNewsExpanded(news2)); assertTrue(model.isNewsExpanded(news3)); assertTrue(model.isGroupExpanded(5L)); model.setGroupExpanded(100L, false); assertFalse(model.isGroupExpanded(100L)); assertEquals(1L, model.nextNews(false, -1L)); assertEquals(1L, model.nextNews(true, -1L)); assertEquals(2L, model.nextNews(false, 1L)); assertEquals(3L, model.nextNews(true, 1L)); assertEquals(-1L, model.nextNews(true, 3L)); assertEquals(1L, model.nextNews(true, 5L)); assertEquals(-1L, model.nextNews(false, 3L)); assertEquals(1L, model.nextNews(false, 5L)); assertEquals(3L, model.previousNews(false, -1L)); assertEquals(3L, model.previousNews(true, -1L)); assertEquals(-1L, model.previousNews(false, 1L)); assertEquals(-1L, model.previousNews(true, 1L)); assertEquals(2L, model.previousNews(false, 3L)); assertEquals(1L, model.previousNews(true, 3L)); assertEquals(3L, model.previousNews(true, 5L)); assertEquals(3L, model.previousNews(false, 5L)); Pair<List<Long>, List<Long>> nextPage = model.getNextPage(2); assertEquals(1, nextPage.getFirst().size()); assertEquals(group2.getId(), nextPage.getFirst().get(0).longValue()); assertEquals(1, nextPage.getSecond().size()); assertEquals(news3.getId(), nextPage.getSecond().get(0)); model.setGroupVisible(group2.getId(), true); model.setNewsVisible(news3, true); nextPage = model.getNextPage(2); assertTrue(nextPage.getFirst().isEmpty()); assertTrue(nextPage.getSecond().isEmpty()); model.setGroupVisible(group2.getId(), false); model.setNewsVisible(news3, false); Pair<List<Long>, List<Long>> revealed = model.revealPage(news3.getId(), 2); assertEquals(1, revealed.getFirst().size()); assertEquals(group2.getId(), revealed.getFirst().get(0).longValue()); assertEquals(1, revealed.getSecond().size()); assertEquals(news3.getId(), revealed.getSecond().get(0)); } /** * @throws Exception */ @Test public void testRevealFlat() throws Exception { IFeed feed = fFactory.createFeed(null, new URI("rssowl.org")); INews news1 = fFactory.createNews(1L, feed, new Date()); INews news2 = fFactory.createNews(2L, feed, new Date()); INews news3 = fFactory.createNews(3L, feed, new Date()); INews news4 = fFactory.createNews(4L, feed, new Date()); INews news5 = fFactory.createNews(5L, feed, new Date()); DynamicDAO.save(feed); Object[] elements = new Object[] { news1, news2, news3, news4, news5 }; NewsBrowserViewModel model = new NewsBrowserViewModel(null); model.setInput(elements, 2); Pair<List<Long>, List<Long>> revealed = model.revealPage(news1.getId(), 2); assertTrue(revealed.getFirst().isEmpty()); assertTrue(revealed.getSecond().isEmpty()); revealed = model.revealPage(news4.getId(), 2); assertTrue(revealed.getFirst().isEmpty()); assertFalse(revealed.getSecond().isEmpty()); assertEquals(2, revealed.getSecond().size()); assertEquals(news3.getId(), revealed.getSecond().get(0)); assertEquals(news4.getId(), revealed.getSecond().get(1)); } /** * @throws Exception */ @Test public void testRevealGroups() throws Exception { IFeed feed = fFactory.createFeed(null, new URI("rssowl.org")); INews news1 = fFactory.createNews(1L, feed, new Date()); INews news2 = fFactory.createNews(2L, feed, new Date()); INews news3 = fFactory.createNews(3L, feed, new Date()); INews news4 = fFactory.createNews(4L, feed, new Date()); INews news5 = fFactory.createNews(5L, feed, new Date()); DynamicDAO.save(feed); EntityGroup group1 = new EntityGroup(100, "foo"); EntityGroup group2 = new EntityGroup(101, "foo"); Object[] elements = new Object[] { group1, news1, news2, news3, group2, news4, news5 }; NewsBrowserViewModel model = new NewsBrowserViewModel(null); model.setInput(elements, 2); Pair<List<Long>, List<Long>> revealed = model.revealPage(news1.getId(), 2); assertTrue(revealed.getFirst().isEmpty()); assertTrue(revealed.getSecond().isEmpty()); assertEquals(2, model.getVisibleUnreadNews().size()); assertEquals(5L, model.getLastNews()); revealed = model.revealPage(news4.getId(), 2); assertFalse(revealed.getFirst().isEmpty()); assertEquals(1, revealed.getFirst().size()); assertEquals(group2.getId(), revealed.getFirst().get(0).longValue()); assertFalse(revealed.getSecond().isEmpty()); assertEquals(2, revealed.getSecond().size()); assertEquals(news3.getId(), revealed.getSecond().get(0)); assertEquals(news4.getId(), revealed.getSecond().get(1)); assertEquals(1, model.indexOfNewsItem(news1.getId())); assertEquals(2, model.indexOfNewsItem(news2.getId())); assertEquals(3, model.indexOfNewsItem(news3.getId())); assertEquals(5, model.indexOfNewsItem(news4.getId())); assertEquals(6, model.indexOfNewsItem(news5.getId())); model.setGroupExpanded(group1.getId(), false); assertEquals(0, model.getVisibleUnreadNews().size()); model.setGroupExpanded(group1.getId(), true); assertEquals(2, model.getVisibleUnreadNews().size()); } }