package com.orientechnologies.common.collection.closabledictionary; import org.testng.Assert; import org.testng.annotations.Test; import java.util.*; @Test public class OClosableLRUListTest { public void tesMoveToTail() { OClosableLRUList<Long, CIItem> lruList = new OClosableLRUList<Long, CIItem>(); OClosableEntry<Long, CIItem> firstEntry = new OClosableEntry<Long, CIItem>(new CIItem()); Assert.assertTrue(!lruList.contains(firstEntry)); Assert.assertEquals(lruList.size(), 0); lruList.moveToTheTail(firstEntry); Assert.assertEquals(lruList.size(), 1); Assert.assertTrue(lruList.contains(firstEntry)); assertContent(lruList, new OClosableEntry[] { firstEntry }); Assert.assertTrue(lruList.assertBackwardStructure()); Assert.assertTrue(lruList.assertForwardStructure()); OClosableEntry<Long, CIItem> secondEntry = new OClosableEntry<Long, CIItem>(new CIItem()); lruList.moveToTheTail(secondEntry); Assert.assertEquals(lruList.size(), 2); Assert.assertTrue(lruList.contains(firstEntry)); Assert.assertTrue(lruList.contains(secondEntry)); assertContent(lruList, new OClosableEntry[] { firstEntry, secondEntry }); Assert.assertTrue(lruList.assertBackwardStructure()); Assert.assertTrue(lruList.assertForwardStructure()); OClosableEntry<Long, CIItem> thirdEntry = new OClosableEntry<Long, CIItem>(new CIItem()); lruList.moveToTheTail(thirdEntry); Assert.assertEquals(lruList.size(), 3); Assert.assertTrue(lruList.contains(firstEntry)); Assert.assertTrue(lruList.contains(secondEntry)); Assert.assertTrue(lruList.contains(thirdEntry)); assertContent(lruList, new OClosableEntry[] { firstEntry, secondEntry, thirdEntry }); Assert.assertTrue(lruList.assertBackwardStructure()); Assert.assertTrue(lruList.assertForwardStructure()); lruList.moveToTheTail(secondEntry); Assert.assertEquals(lruList.size(), 3); Assert.assertTrue(lruList.contains(firstEntry)); Assert.assertTrue(lruList.contains(secondEntry)); Assert.assertTrue(lruList.contains(thirdEntry)); assertContent(lruList, new OClosableEntry[] { firstEntry, thirdEntry, secondEntry }); Assert.assertTrue(lruList.assertBackwardStructure()); Assert.assertTrue(lruList.assertForwardStructure()); lruList.moveToTheTail(firstEntry); Assert.assertEquals(lruList.size(), 3); Assert.assertTrue(lruList.contains(firstEntry)); Assert.assertTrue(lruList.contains(secondEntry)); Assert.assertTrue(lruList.contains(thirdEntry)); assertContent(lruList, new OClosableEntry[] { thirdEntry, secondEntry, firstEntry }); Assert.assertTrue(lruList.assertBackwardStructure()); Assert.assertTrue(lruList.assertForwardStructure()); lruList.moveToTheTail(firstEntry); Assert.assertEquals(lruList.size(), 3); Assert.assertTrue(lruList.contains(firstEntry)); Assert.assertTrue(lruList.contains(secondEntry)); Assert.assertTrue(lruList.contains(thirdEntry)); assertContent(lruList, new OClosableEntry[] { thirdEntry, secondEntry, firstEntry }); Assert.assertTrue(lruList.assertBackwardStructure()); Assert.assertTrue(lruList.assertForwardStructure()); } public void tesRemove() { OClosableLRUList<Long, CIItem> lruList = new OClosableLRUList<Long, CIItem>(); OClosableEntry<Long, CIItem> firstEntry = new OClosableEntry<Long, CIItem>(new CIItem()); OClosableEntry<Long, CIItem> secondEntry = new OClosableEntry<Long, CIItem>(new CIItem()); OClosableEntry<Long, CIItem> thirdEntry = new OClosableEntry<Long, CIItem>(new CIItem()); lruList.moveToTheTail(firstEntry); lruList.moveToTheTail(secondEntry); lruList.moveToTheTail(thirdEntry); lruList.remove(firstEntry); assertContent(lruList, new OClosableEntry[] { secondEntry, thirdEntry }); Assert.assertEquals(lruList.size(), 2); Assert.assertTrue(!lruList.contains(firstEntry)); Assert.assertTrue(lruList.contains(secondEntry)); Assert.assertTrue(lruList.contains(thirdEntry)); Assert.assertTrue(lruList.assertBackwardStructure()); Assert.assertTrue(lruList.assertForwardStructure()); lruList.remove(thirdEntry); assertContent(lruList, new OClosableEntry[] { secondEntry }); Assert.assertEquals(lruList.size(), 1); Assert.assertTrue(!lruList.contains(firstEntry)); Assert.assertTrue(lruList.contains(secondEntry)); Assert.assertTrue(!lruList.contains(thirdEntry)); Assert.assertTrue(lruList.assertBackwardStructure()); Assert.assertTrue(lruList.assertForwardStructure()); lruList.remove(secondEntry); assertContent(lruList, new OClosableEntry[] {}); Assert.assertEquals(lruList.size(), 0); Assert.assertTrue(!lruList.contains(firstEntry)); Assert.assertTrue(!lruList.contains(secondEntry)); Assert.assertTrue(!lruList.contains(thirdEntry)); Assert.assertTrue(lruList.assertBackwardStructure()); Assert.assertTrue(lruList.assertForwardStructure()); lruList.remove(secondEntry); assertContent(lruList, new OClosableEntry[] {}); Assert.assertEquals(lruList.size(), 0); Assert.assertTrue(!lruList.contains(firstEntry)); Assert.assertTrue(!lruList.contains(secondEntry)); Assert.assertTrue(!lruList.contains(thirdEntry)); Assert.assertTrue(lruList.assertBackwardStructure()); Assert.assertTrue(lruList.assertForwardStructure()); lruList.moveToTheTail(firstEntry); lruList.moveToTheTail(secondEntry); lruList.moveToTheTail(thirdEntry); lruList.remove(secondEntry); assertContent(lruList, new OClosableEntry[] { firstEntry, thirdEntry }); Assert.assertEquals(lruList.size(), 2); Assert.assertTrue(lruList.contains(firstEntry)); Assert.assertTrue(!lruList.contains(secondEntry)); Assert.assertTrue(lruList.contains(thirdEntry)); Assert.assertTrue(lruList.assertBackwardStructure()); Assert.assertTrue(lruList.assertForwardStructure()); lruList.moveToTheTail(secondEntry); assertContent(lruList, new OClosableEntry[] { firstEntry, thirdEntry, secondEntry }); Assert.assertEquals(lruList.size(), 3); lruList.remove(secondEntry); assertContent(lruList, new OClosableEntry[] { firstEntry, thirdEntry }); Assert.assertEquals(lruList.size(), 2); Assert.assertTrue(lruList.contains(firstEntry)); Assert.assertTrue(!lruList.contains(secondEntry)); Assert.assertTrue(lruList.contains(thirdEntry)); Assert.assertTrue(lruList.assertBackwardStructure()); Assert.assertTrue(lruList.assertForwardStructure()); } public void testPool() { OClosableLRUList<Long, CIItem> lruList = new OClosableLRUList<Long, CIItem>(); OClosableEntry<Long, CIItem> firstEntry = new OClosableEntry<Long, CIItem>(new CIItem()); OClosableEntry<Long, CIItem> secondEntry = new OClosableEntry<Long, CIItem>(new CIItem()); OClosableEntry<Long, CIItem> thirdEntry = new OClosableEntry<Long, CIItem>(new CIItem()); lruList.moveToTheTail(firstEntry); lruList.moveToTheTail(secondEntry); lruList.moveToTheTail(thirdEntry); OClosableEntry<Long, CIItem> removed = lruList.poll(); Assert.assertTrue(removed == firstEntry); Assert.assertEquals(lruList.size(), 2); Assert.assertTrue(!lruList.contains(firstEntry)); Assert.assertTrue(lruList.contains(secondEntry)); Assert.assertTrue(lruList.contains(thirdEntry)); assertContent(lruList, new OClosableEntry[]{secondEntry, thirdEntry}); Assert.assertTrue(lruList.assertBackwardStructure()); Assert.assertTrue(lruList.assertForwardStructure()); removed = lruList.poll(); Assert.assertTrue(removed == secondEntry); Assert.assertEquals(lruList.size(), 1); Assert.assertTrue(!lruList.contains(firstEntry)); Assert.assertTrue(!lruList.contains(secondEntry)); Assert.assertTrue(lruList.contains(thirdEntry)); assertContent(lruList, new OClosableEntry[]{thirdEntry}); Assert.assertTrue(lruList.assertBackwardStructure()); Assert.assertTrue(lruList.assertForwardStructure()); removed = lruList.poll(); Assert.assertTrue(removed == thirdEntry); Assert.assertEquals(lruList.size(), 0); Assert.assertTrue(!lruList.contains(firstEntry)); Assert.assertTrue(!lruList.contains(secondEntry)); Assert.assertTrue(!lruList.contains(thirdEntry)); assertContent(lruList, new OClosableEntry[]{}); Assert.assertTrue(lruList.assertBackwardStructure()); Assert.assertTrue(lruList.assertForwardStructure()); removed = lruList.poll(); Assert.assertTrue(removed == null); } public class CIItem implements OClosableItem { private volatile boolean open = true; @Override public boolean isOpen() { return open; } @Override public void close() { open = false; } @Override public void open() { open = true; } } private void assertContent(OClosableLRUList<Long, CIItem> lruList, OClosableEntry<Long, CIItem>[] entries) { final List<OClosableEntry<Long, CIItem>> entryList = Arrays.asList(entries); final Iterator<OClosableEntry<Long, CIItem>> iterator = entryList.iterator(); for (OClosableEntry<Long, CIItem> entry : lruList) { Assert.assertTrue(iterator.hasNext()); Assert.assertTrue(entry == iterator.next()); } Assert.assertTrue(!iterator.hasNext()); } }