diff --git a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/connection/jedis/JedisConnection.java b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/connection/jedis/JedisConnection.java index f1e483e13..4bb710827 100644 --- a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/connection/jedis/JedisConnection.java +++ b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/connection/jedis/JedisConnection.java @@ -670,7 +670,7 @@ public class JedisConnection implements RedisConnection { transaction.rpop(key); return null; } - return jedis.lpop(key); + return jedis.rpop(key); } catch (Exception ex) { throw convertJedisAccessException(ex); } diff --git a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/util/DefaultRedisList.java b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/util/DefaultRedisList.java index 773626536..767c65bd4 100644 --- a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/util/DefaultRedisList.java +++ b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/util/DefaultRedisList.java @@ -16,6 +16,7 @@ package org.springframework.data.keyvalue.redis.util; import java.util.Collection; +import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.ListIterator; @@ -45,7 +46,7 @@ public class DefaultRedisList extends AbstractRedisCollection implements R private volatile long defaultWait = 0; - private class DefaultRedisListIterator extends RedisIterator { + private class DefaultRedisListIterator extends RedisIterator { public DefaultRedisListIterator(Iterator delegate) { super(delegate); @@ -122,7 +123,7 @@ public class DefaultRedisList extends AbstractRedisCollection implements R @Override public Iterator iterator() { - return content().iterator(); + return new DefaultRedisListIterator(content().iterator()); } @Override @@ -308,7 +309,9 @@ public class DefaultRedisList extends AbstractRedisCollection implements R @Override public Iterator descendingIterator() { - throw new UnsupportedOperationException(); + List content = content(); + Collections.reverse(content); + return new DefaultRedisListIterator(content.iterator()); } @Override @@ -359,7 +362,7 @@ public class DefaultRedisList extends AbstractRedisCollection implements R @Override public E pop() { - E e = pollFirst(); + E e = poll(); if (e == null) { throw new NoSuchElementException(); } diff --git a/spring-data-redis/src/test/java/org/springframework/data/keyvalue/redis/util/AbstractRedisListTests.java b/spring-data-redis/src/test/java/org/springframework/data/keyvalue/redis/util/AbstractRedisListTests.java index c8df2b3e9..20968b629 100644 --- a/spring-data-redis/src/test/java/org/springframework/data/keyvalue/redis/util/AbstractRedisListTests.java +++ b/spring-data-redis/src/test/java/org/springframework/data/keyvalue/redis/util/AbstractRedisListTests.java @@ -16,8 +16,11 @@ package org.springframework.data.keyvalue.redis.util; import static org.junit.Assert.*; +import static org.junit.matchers.JUnitMatchers.*; +import java.util.ArrayList; import java.util.Arrays; +import java.util.Iterator; import java.util.List; import java.util.NoSuchElementException; @@ -151,11 +154,11 @@ public abstract class AbstractRedisListTests extends AbstractRedisCollectionT public void testIndexOfObject() { T t1 = getT(); T t2 = getT(); - + assertEquals(-1, list.indexOf(t1)); list.add(t1); assertEquals(0, list.indexOf(t1)); - + assertEquals(-1, list.indexOf(t2)); list.add(t2); assertEquals(1, list.indexOf(t1)); @@ -200,6 +203,11 @@ public abstract class AbstractRedisListTests extends AbstractRedisCollectionT } } + @Test + public void testPop() { + testPoll(); + } + @Test public void testPoll() { assertNull(list.poll()); @@ -282,4 +290,209 @@ public abstract class AbstractRedisListTests extends AbstractRedisCollectionT assertEquals(1, cappedList.size()); assertEquals(first, cappedList.get(0)); } + + @Test + public void testAddFirst() { + T t1 = getT(); + T t2 = getT(); + T t3 = getT(); + + list.addFirst(t1); + list.addFirst(t2); + list.addFirst(t3); + + Iterator iterator = list.iterator(); + assertEquals(t3, iterator.next()); + assertEquals(t2, iterator.next()); + assertEquals(t1, iterator.next()); + } + + @Test + public void testAddLast() { + testAdd(); + } + + @Test + public void testDescendingIterator() { + T t1 = getT(); + T t2 = getT(); + T t3 = getT(); + + list.add(t1); + list.add(t2); + list.add(t3); + + Iterator iterator = list.descendingIterator(); + assertEquals(t3, iterator.next()); + assertEquals(t2, iterator.next()); + assertEquals(t1, iterator.next()); + + } + + @Test + public void testDrainToCollectionWithMaxElements() { + T t1 = getT(); + T t2 = getT(); + T t3 = getT(); + + list.add(t1); + list.add(t2); + list.add(t3); + + List c = new ArrayList(); + + list.drainTo(c, 2); + assertEquals(1, list.size()); + assertThat(list, hasItem(t3)); + assertEquals(2, c.size()); + assertThat(c, hasItems(t1, t2)); + } + + @Test + public void testDrainToCollection() { + T t1 = getT(); + T t2 = getT(); + T t3 = getT(); + + list.add(t1); + list.add(t2); + list.add(t3); + + List c = new ArrayList(); + + list.drainTo(c); + assertTrue(list.isEmpty()); + assertEquals(3, c.size()); + assertThat(c, hasItems(t1, t2, t3)); + } + + @Test + public void testGetFirst() { + T t1 = getT(); + T t2 = getT(); + + list.add(t1); + list.add(t2); + + assertEquals(t1, list.getFirst()); + } + + @Test + public void testLast() { + testAdd(); + } + + @Test + public void testOfferFirst() { + testAddFirst(); + } + + @Test + public void testOfferLast() { + testAddLast(); + } + + @Test + public void testPeekFirst() { + testPeek(); + } + + @Test + public void testPeekLast() { + T t1 = getT(); + T t2 = getT(); + + list.add(t1); + list.add(t2); + + assertEquals(t2, list.peekLast()); + assertEquals(2, list.size()); + } + + @Test + public void testPollFirst() { + testPoll(); + } + + @Test + public void testPollLast() { + T t1 = getT(); + T t2 = getT(); + + list.add(t1); + list.add(t2); + + T last = list.pollLast(); + assertEquals(t2, last); + assertEquals(1, list.size()); + assertThat(list, hasItem(t1)); + } + + @Test + public void testPut() { + testOffer(); + } + + @Test + public void testPutFirst() { + testAdd(); + } + + @Test + public void testPutLast() { + testPut(); + } + + @Test + public void testRemainingCapacity() { + assertEquals(Integer.MAX_VALUE, list.remainingCapacity()); + } + + @Test + public void testRemoveFirst() { + testPop(); + } + + @Test + public void testRemoveFirstOccurrence() { + testRemove(); + } + + @Test + public void testRemoveLast() { + testPollLast(); + } + + @Test + public void testRmoveLastOccurrence() { + T t1 = getT(); + T t2 = getT(); + + list.add(t1); + list.add(t2); + list.add(t1); + list.add(t2); + + list.removeLastOccurrence(t2); + assertEquals(3, list.size()); + Iterator iterator = list.iterator(); + assertEquals(t1, iterator.next()); + assertEquals(t2, iterator.next()); + assertEquals(t1, iterator.next()); + } + + @Test + public void testTake() { + testPoll(); + } + + @Test + public void testTakeFirst() { + testTake(); + } + + @Test + public void testTakeLast() { + testPollLast(); + } } \ No newline at end of file