diff --git a/src/main/java/com/fiftyonred/mock_jedis/MockJedis.java b/src/main/java/com/fiftyonred/mock_jedis/MockJedis.java index 98022f0..a8913c4 100644 --- a/src/main/java/com/fiftyonred/mock_jedis/MockJedis.java +++ b/src/main/java/com/fiftyonred/mock_jedis/MockJedis.java @@ -805,8 +805,8 @@ public String substr(String key, int start, int end) { @Override public Long rpush(String key, String... strings) { - throw new UnsupportedOperationException(NOT_IMPLEMENTED); - } + return pipeline.rpush(key, strings).get(); + } @Override public String ltrim(String key, long start, long end) { @@ -830,8 +830,8 @@ public Long lrem(String key, long count, String value) { @Override public String rpop(String key) { - throw new UnsupportedOperationException(NOT_IMPLEMENTED); - } + return pipeline.rpop(key).get(); + } @Override public String rpoplpush(String srckey, String dstkey) { @@ -1515,8 +1515,8 @@ public Double hincrByFloat(byte[] key, byte[] field, double value) { @Override public Long rpush(byte[] key, byte[]... strings) { - throw new UnsupportedOperationException(NOT_IMPLEMENTED); - } + return pipeline.rpush(key, strings).get(); + } @Override public String ltrim(byte[] key, long start, long end) { @@ -1540,8 +1540,8 @@ public Long lrem(byte[] key, long count, byte[] value) { @Override public byte[] rpop(byte[] key) { - throw new UnsupportedOperationException(NOT_IMPLEMENTED); - } + return pipeline.rpop(key).get(); + } @Override public byte[] rpoplpush(byte[] srckey, byte[] dstkey) { diff --git a/src/main/java/com/fiftyonred/mock_jedis/MockPipeline.java b/src/main/java/com/fiftyonred/mock_jedis/MockPipeline.java index d7588e2..7f7b0e3 100644 --- a/src/main/java/com/fiftyonred/mock_jedis/MockPipeline.java +++ b/src/main/java/com/fiftyonred/mock_jedis/MockPipeline.java @@ -913,6 +913,20 @@ public Response lpush(final byte[] key, final byte[]... string) { return response; } + @Override + public Response rpush(final String key, final String... string) { + final Response response = new Response(BuilderFactory.LONG); + response.set((long) mockStorage.rpush(DataContainer.from(key), DataContainer.from(string))); + return response; + } + + @Override + public Response rpush(final byte[] key, final byte[]... string) { + final Response response = new Response(BuilderFactory.LONG); + response.set((long) mockStorage.rpush(DataContainer.from(key), DataContainer.from(string))); + return response; + } + @Override public Response lpop(final String key) { final Response response = new Response(BuilderFactory.STRING); @@ -929,6 +943,22 @@ public Response lpop(final byte[] key) { return response; } + @Override + public Response rpop(final String key) { + final Response response = new Response(BuilderFactory.STRING); + final DataContainer result = mockStorage.rpop(DataContainer.from(key)); + response.set(result == null ? null : result.getBytes()); + return response; + } + + @Override + public Response rpop(final byte[] key) { + final Response response = new Response(BuilderFactory.BYTE_ARRAY); + final DataContainer result = mockStorage.rpop(DataContainer.from(key)); + response.set(result == null ? null : result.getBytes()); + return response; + } + @Override public Response llen(final String key) { final Response response = new Response(BuilderFactory.LONG); diff --git a/src/main/java/com/fiftyonred/mock_jedis/MockStorage.java b/src/main/java/com/fiftyonred/mock_jedis/MockStorage.java index e3d5ad4..a96bdb6 100644 --- a/src/main/java/com/fiftyonred/mock_jedis/MockStorage.java +++ b/src/main/java/com/fiftyonred/mock_jedis/MockStorage.java @@ -555,11 +555,32 @@ public synchronized int lpush(final DataContainer key, final DataContainer... st return list.size(); } + public synchronized int rpush(final DataContainer key, final DataContainer... string) { + List list = getListFromStorage(key, true); + if (list == null) { + list = new ArrayList(); + listStorage.put(key, list); + } + + List elems = Arrays.asList(string); + for (int i = elems.size() -1; i > -1; i--) { + DataContainer elem = elems.get(i); + list.add(0, elem); + } + + return list.size(); + } + public synchronized DataContainer lpop(final DataContainer key) { final List list = getListFromStorage(key, true); return list == null || list.isEmpty() ? null : list.remove(list.size() - 1); } + public synchronized DataContainer rpop(final DataContainer key) { + final List list = getListFromStorage(key, true); + return list == null || list.isEmpty() ? null : list.remove(0); + } + public synchronized int llen(final DataContainer key) { final List list = getListFromStorage(key, false); return list == null ? 0 : list.size(); diff --git a/src/test/java/com/fiftyonred/mock_jedis/MockJedisTest.java b/src/test/java/com/fiftyonred/mock_jedis/MockJedisTest.java index 74ecb24..b03a508 100644 --- a/src/test/java/com/fiftyonred/mock_jedis/MockJedisTest.java +++ b/src/test/java/com/fiftyonred/mock_jedis/MockJedisTest.java @@ -106,8 +106,103 @@ public void testList() { assertEquals("a", j.lpop("test")); assertEquals(Long.valueOf(0), j.llen("test")); + + j.lpush("test", "a"); + j.lpush("test", "b"); + j.lpush("test", "c"); + + assertEquals(Long.valueOf(3), j.llen("test")); + + assertEquals("a", j.rpop("test")); + assertEquals("b", j.rpop("test")); + assertEquals("c", j.rpop("test")); + + assertEquals(Long.valueOf(0), j.llen("test")); + + j.rpush("test", "x"); + j.rpush("test", "y"); + j.rpush("test", "z"); + + assertEquals(Long.valueOf(3), j.llen("test")); + + assertEquals("x", j.lpop("test")); + assertEquals("y", j.lpop("test")); + assertEquals("z", j.lpop("test")); + + assertEquals(Long.valueOf(0), j.llen("test")); + + j.rpush("test", "x"); + j.rpush("test", "y"); + j.rpush("test", "z"); + + assertEquals(Long.valueOf(3), j.llen("test")); + + assertEquals("z", j.rpop("test")); + assertEquals("y", j.rpop("test")); + assertEquals("x", j.rpop("test")); + + assertEquals(Long.valueOf(0), j.llen("test")); } + @Test + public void testMixedListPush() { + assertEquals(Long.valueOf(0), j.llen("test")); + + j.lpush("test", "a"); + j.rpush("test", "x"); + j.lpush("test", "b"); + j.rpush("test", "y"); + j.lpush("test", "c"); + j.rpush("test", "z"); + + assertEquals(Long.valueOf(6), j.llen("test")); + + assertEquals("c", j.lpop("test")); + assertEquals("b", j.lpop("test")); + assertEquals("a", j.lpop("test")); + assertEquals("x", j.lpop("test")); + assertEquals("y", j.lpop("test")); + assertEquals("z", j.lpop("test")); + + assertEquals(Long.valueOf(0), j.llen("test")); + + j.lpush("test", "a"); + j.rpush("test", "x"); + j.lpush("test", "b"); + j.rpush("test", "y"); + j.lpush("test", "c"); + j.rpush("test", "z"); + + assertEquals(Long.valueOf(6), j.llen("test")); + + assertEquals("z", j.rpop("test")); + assertEquals("y", j.rpop("test")); + assertEquals("x", j.rpop("test")); + assertEquals("a", j.rpop("test")); + assertEquals("b", j.rpop("test")); + assertEquals("c", j.rpop("test")); + + assertEquals(Long.valueOf(0), j.llen("test")); + + j.lpush("test", "a"); + j.rpush("test", "x"); + j.lpush("test", "b"); + j.rpush("test", "y"); + j.lpush("test", "c"); + j.rpush("test", "z"); + + assertEquals(Long.valueOf(6), j.llen("test")); + + assertEquals("z", j.rpop("test")); + assertEquals("c", j.lpop("test")); + assertEquals("y", j.rpop("test")); + assertEquals("b", j.lpop("test")); + assertEquals("x", j.rpop("test")); + assertEquals("a", j.lpop("test")); + + assertEquals(Long.valueOf(0), j.llen("test")); + } + @Test public void testLRange() { j.lpush("test", "a");