/** * Copyright (c) 2002-2012 "Neo Technology," * Network Engine for Objects in Lund AB [http://neotechnology.com] * * This file is part of Neo4j. * * Neo4j is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.neo4j.consistency.store.paging; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertSame; import org.junit.Test; public class CachedPageListTest { @Test public void insertPagesByMovingThemFromNullListToTailOfARealList() throws Exception { // given CachedPageList list = new CachedPageList(); Page page1 = new BasicPage(); Page page2 = new BasicPage(); Page page3 = new BasicPage(); Page page4 = new BasicPage(); Page page5 = new BasicPage(); // when page1.moveToTailOf( list ); page2.moveToTailOf( list ); page3.moveToTailOf( list ); page4.moveToTailOf( list ); page5.moveToTailOf( list ); // then assertEquals( 5, list.size() ); assertSame( page1, list.head ); assertSame( page5, list.tail ); assertSame( list, page1.currentList ); assertSame( list, page2.currentList ); assertSame( list, page3.currentList ); assertSame( list, page4.currentList ); assertSame( list, page5.currentList ); assertNull( page1.prevPage ); assertSame( page1, page2.prevPage ); assertSame( page2, page3.prevPage ); assertSame( page3, page4.prevPage ); assertSame( page4, page5.prevPage ); assertSame( page2, page1.nextPage ); assertSame( page3, page2.nextPage ); assertSame( page4, page3.nextPage ); assertSame( page5, page4.nextPage ); assertNull( page5.nextPage ); } @Test public void moveSingletonToEmptyList() throws Exception { // given CachedPageList list1 = new CachedPageList(); CachedPageList list2 = new CachedPageList(); Page page = new BasicPage(); page.moveToTailOf( list1 ); // when page.moveToTailOf( list2 ); // then assertEquals( 0, list1.size() ); assertNull( list1.head ); assertNull( list1.tail ); assertEquals( 1, list2.size() ); assertSame( page, list2.head ); assertSame( page, list2.tail ); assertSame( list2, page.currentList ); assertNull( page.prevPage ); assertNull( page.nextPage ); } @Test public void moveHeadOfTwoPageListToEmptyList() throws Exception { // given CachedPageList list1 = new CachedPageList(); CachedPageList list2 = new CachedPageList(); Page page1 = new BasicPage(); Page page2 = new BasicPage(); page1.moveToTailOf( list1 ); page2.moveToTailOf( list1 ); // when page1.moveToTailOf( list2 ); // then assertEquals( 1, list1.size() ); assertSame( page2, list1.head ); assertSame( page2, list1.tail ); assertSame( list1, page2.currentList ); assertNull( page2.prevPage ); assertNull( page2.nextPage ); assertEquals( 1, list2.size() ); assertSame( page1, list2.head ); assertSame( page1, list2.tail ); assertSame( list2, page1.currentList ); assertNull( page1.prevPage ); assertNull( page1.nextPage ); } @Test public void moveTailOfTwoPageListToEmptyList() throws Exception { // given CachedPageList list1 = new CachedPageList(); CachedPageList list2 = new CachedPageList(); Page page1 = new BasicPage(); Page page2 = new BasicPage(); page1.moveToTailOf( list1 ); page2.moveToTailOf( list1 ); // when page2.moveToTailOf( list2 ); // then assertEquals( 1, list1.size() ); assertSame( page1, list1.head ); assertSame( page1, list1.tail ); assertSame( list1, page1.currentList ); assertNull( page1.prevPage ); assertNull( page1.nextPage ); assertEquals( 1, list2.size() ); assertSame( page2, list2.head ); assertSame( page2, list2.tail ); assertSame( list2, page2.currentList ); assertNull( page2.prevPage ); assertNull( page2.nextPage ); } @Test public void moveMiddleOfThreePageListToEmptyList() throws Exception { // given CachedPageList list1 = new CachedPageList(); CachedPageList list2 = new CachedPageList(); Page page1 = new BasicPage(); Page page2 = new BasicPage(); Page page3 = new BasicPage(); page1.moveToTailOf( list1 ); page2.moveToTailOf( list1 ); page3.moveToTailOf( list1 ); // when page2.moveToTailOf( list2 ); // then assertEquals( 2, list1.size() ); assertSame( page1, list1.head ); assertSame( page3, list1.tail ); assertSame( list1, page1.currentList ); assertSame( list1, page3.currentList ); assertNull( page1.prevPage ); assertSame( page1, page3.prevPage ); assertSame( page3, page1.nextPage ); assertNull( page3.nextPage ); assertEquals( 1, list2.size() ); assertSame( page2, list2.head ); assertSame( page2, list2.tail ); assertSame( list2, page2.currentList ); assertNull( page2.prevPage ); assertNull( page2.nextPage ); } @Test public void moveMiddleOfLongListToEmptyList() throws Exception { // given CachedPageList list1 = new CachedPageList(); CachedPageList list2 = new CachedPageList(); Page page1 = new BasicPage(); Page page2 = new BasicPage(); Page page3 = new BasicPage(); Page page4 = new BasicPage(); Page page5 = new BasicPage(); page1.moveToTailOf( list1 ); page2.moveToTailOf( list1 ); page3.moveToTailOf( list1 ); page4.moveToTailOf( list1 ); page5.moveToTailOf( list1 ); // when page3.moveToTailOf( list2 ); // then assertEquals( 4, list1.size() ); assertSame( page1, list1.head ); assertSame( page5, list1.tail ); assertSame( list1, page1.currentList ); assertSame( list1, page2.currentList ); assertSame( list1, page4.currentList ); assertSame( list1, page5.currentList ); assertNull( page1.prevPage ); assertSame( page1, page2.prevPage ); assertSame( page2, page4.prevPage ); assertSame( page4, page5.prevPage ); assertSame( page2, page1.nextPage ); assertSame( page4, page2.nextPage ); assertSame( page5, page4.nextPage ); assertNull( page5.nextPage ); assertEquals( 1, list2.size() ); assertSame( page3, list2.head ); assertSame( page3, list2.tail ); assertSame( list2, page3.currentList ); assertNull( page3.prevPage ); assertNull( page3.nextPage ); } @Test public void moveMiddleOfLongListToNonEmptyList() throws Exception { // given CachedPageList list1 = new CachedPageList(); CachedPageList list2 = new CachedPageList(); Page page1 = new BasicPage(); Page page2 = new BasicPage(); Page page3 = new BasicPage(); Page page4 = new BasicPage(); Page page5 = new BasicPage(); page1.moveToTailOf( list1 ); page2.moveToTailOf( list1 ); page3.moveToTailOf( list1 ); page4.moveToTailOf( list1 ); page5.moveToTailOf( list1 ); Page page6 = new BasicPage(); Page page7 = new BasicPage(); page6.moveToTailOf( list2 ); page7.moveToTailOf( list2 ); // when page3.moveToTailOf( list2 ); // then assertEquals( 4, list1.size() ); assertSame( page1, list1.head ); assertSame( page5, list1.tail ); assertSame( list1, page1.currentList ); assertSame( list1, page2.currentList ); assertSame( list1, page4.currentList ); assertSame( list1, page5.currentList ); assertNull( page1.prevPage ); assertSame( page1, page2.prevPage ); assertSame( page2, page4.prevPage ); assertSame( page4, page5.prevPage ); assertSame( page2, page1.nextPage ); assertSame( page4, page2.nextPage ); assertSame( page5, page4.nextPage ); assertNull( page5.nextPage ); assertEquals( 3, list2.size() ); assertSame( page6, list2.head ); assertSame( page3, list2.tail ); assertSame( list2, page6.currentList ); assertSame( list2, page7.currentList ); assertSame( list2, page3.currentList ); assertNull( page6.prevPage ); assertSame( page6, page7.prevPage ); assertSame( page7, page3.prevPage ); assertSame( page7, page6.nextPage ); assertSame( page3, page7.nextPage ); assertNull( page3.nextPage ); } @Test public void shouldRemoveHeadOfSingletonList() throws Exception { // given CachedPageList list = new CachedPageList(); Page page = new BasicPage(); page.moveToTailOf( list ); // when Page removedPage = list.removeHead(); // then assertSame( page, removedPage ); assertEquals( 0, list.size() ); assertNull( list.head ); assertNull( list.tail ); assertNull( page.currentList ); assertNull( page.prevPage ); assertNull( page.nextPage ); } @Test public void shouldRemoveHeadOfTwoPageList() throws Exception { // given CachedPageList list = new CachedPageList(); Page page1 = new BasicPage(); Page page2 = new BasicPage(); page1.moveToTailOf( list ); page2.moveToTailOf( list ); // when Page removedPage = list.removeHead(); // then assertSame( page1, removedPage ); assertEquals( 1, list.size() ); assertSame( page2, list.head ); assertSame( page2, list.tail ); assertNull( page1.currentList ); assertNull( page1.prevPage ); assertNull( page1.nextPage ); assertSame( list, page2.currentList ); assertNull( page2.prevPage ); assertNull( page2.nextPage ); } @Test public void shouldRemoveHeadOfLongList() throws Exception { // given CachedPageList list = new CachedPageList(); Page page1 = new BasicPage(); Page page2 = new BasicPage(); Page page3 = new BasicPage(); page1.moveToTailOf( list ); page2.moveToTailOf( list ); page3.moveToTailOf( list ); // when Page removedPage = list.removeHead(); // then assertSame( page1, removedPage ); assertEquals( 2, list.size() ); assertSame( page2, list.head ); assertSame( page3, list.tail ); assertNull( page1.currentList ); assertNull( page1.prevPage ); assertNull( page1.nextPage ); assertSame( list, page2.currentList ); assertSame( list, page3.currentList ); assertNull( page2.prevPage ); assertSame( page2, page3.prevPage ); assertSame( page3, page2.nextPage ); assertNull( page3.nextPage ); } static class BasicPage extends Page<Integer> { @Override protected void evict( Integer payload ) { } @Override protected void hit() { } } }