// Copyright (C) 2011 - Will Glozer. All rights reserved.
package com.lambdaworks.redis.commands;
import static org.assertj.core.api.Assertions.assertThat;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
import org.junit.Test;
import com.lambdaworks.redis.*;
public class SetCommandTest extends AbstractRedisClientTest {
@Test
public void sadd() throws Exception {
assertThat(redis.sadd(key, "a")).isEqualTo(1L);
assertThat(redis.sadd(key, "a")).isEqualTo(0);
assertThat(redis.smembers(key)).isEqualTo(set("a"));
assertThat(redis.sadd(key, "b", "c")).isEqualTo(2);
assertThat(redis.smembers(key)).isEqualTo(set("a", "b", "c"));
}
@Test
public void scard() throws Exception {
assertThat((long) redis.scard(key)).isEqualTo(0);
redis.sadd(key, "a");
assertThat((long) redis.scard(key)).isEqualTo(1);
}
@Test
public void sdiff() throws Exception {
setupSet();
assertThat(redis.sdiff("key1", "key2", "key3")).isEqualTo(set("b", "d"));
}
@Test
public void sdiffStreaming() throws Exception {
setupSet();
ListStreamingAdapter<String> streamingAdapter = new ListStreamingAdapter<String>();
Long count = redis.sdiff(streamingAdapter, "key1", "key2", "key3");
assertThat(count.intValue()).isEqualTo(2);
assertThat(streamingAdapter.getList()).containsOnly("b", "d");
}
@Test
public void sdiffstore() throws Exception {
setupSet();
assertThat(redis.sdiffstore("newset", "key1", "key2", "key3")).isEqualTo(2);
assertThat(redis.smembers("newset")).containsOnly("b", "d");
}
@Test
public void sinter() throws Exception {
setupSet();
assertThat(redis.sinter("key1", "key2", "key3")).isEqualTo(set("c"));
}
@Test
public void sinterStreaming() throws Exception {
setupSet();
ListStreamingAdapter<String> streamingAdapter = new ListStreamingAdapter<String>();
Long count = redis.sinter(streamingAdapter, "key1", "key2", "key3");
assertThat(count.intValue()).isEqualTo(1);
assertThat(streamingAdapter.getList()).containsExactly("c");
}
@Test
public void sinterstore() throws Exception {
setupSet();
assertThat(redis.sinterstore("newset", "key1", "key2", "key3")).isEqualTo(1);
assertThat(redis.smembers("newset")).containsExactly("c");
}
@Test
public void sismember() throws Exception {
assertThat(redis.sismember(key, "a")).isFalse();
redis.sadd(key, "a");
assertThat(redis.sismember(key, "a")).isTrue();
}
@Test
public void smove() throws Exception {
redis.sadd(key, "a", "b", "c");
assertThat(redis.smove(key, "key1", "d")).isFalse();
assertThat(redis.smove(key, "key1", "a")).isTrue();
assertThat(redis.smembers(key)).isEqualTo(set("b", "c"));
assertThat(redis.smembers("key1")).isEqualTo(set("a"));
}
@Test
public void smembers() throws Exception {
setupSet();
assertThat(redis.smembers(key)).isEqualTo(set("a", "b", "c"));
}
@Test
public void smembersStreaming() throws Exception {
setupSet();
ListStreamingAdapter<String> streamingAdapter = new ListStreamingAdapter<String>();
Long count = redis.smembers(streamingAdapter, key);
assertThat(count.longValue()).isEqualTo(3);
assertThat(streamingAdapter.getList()).containsOnly("a", "b", "c");
}
@Test
public void spop() throws Exception {
assertThat(redis.spop(key)).isNull();
redis.sadd(key, "a", "b", "c");
String rand = redis.spop(key);
assertThat(set("a", "b", "c").contains(rand)).isTrue();
assertThat(redis.smembers(key).contains(rand)).isFalse();
}
@Test
public void spopMultiple() throws Exception {
assertThat(redis.spop(key)).isNull();
redis.sadd(key, "a", "b", "c");
Set<String> rand = redis.spop(key, 2);
assertThat(rand).hasSize(2);
assertThat(set("a", "b", "c").containsAll(rand)).isTrue();
}
@Test
public void srandmember() throws Exception {
assertThat(redis.spop(key)).isNull();
redis.sadd(key, "a", "b", "c", "d");
assertThat(set("a", "b", "c", "d").contains(redis.srandmember(key))).isTrue();
assertThat(redis.smembers(key)).isEqualTo(set("a", "b", "c", "d"));
List<String> rand = redis.srandmember(key, 3);
assertThat(rand).hasSize(3);
assertThat(set("a", "b", "c", "d").containsAll(rand)).isTrue();
List<String> randWithDuplicates = redis.srandmember(key, -10);
assertThat(randWithDuplicates).hasSize(10);
}
@Test
public void srandmemberStreaming() throws Exception {
assertThat(redis.spop(key)).isNull();
redis.sadd(key, "a", "b", "c", "d");
ListStreamingAdapter<String> streamingAdapter = new ListStreamingAdapter<String>();
Long count = redis.srandmember(streamingAdapter, key, 2);
assertThat(count.longValue()).isEqualTo(2);
assertThat(set("a", "b", "c", "d").containsAll(streamingAdapter.getList())).isTrue();
}
@Test
public void srem() throws Exception {
redis.sadd(key, "a", "b", "c");
assertThat(redis.srem(key, "d")).isEqualTo(0);
assertThat(redis.srem(key, "b")).isEqualTo(1);
assertThat(redis.smembers(key)).isEqualTo(set("a", "c"));
assertThat(redis.srem(key, "a", "c")).isEqualTo(2);
assertThat(redis.smembers(key)).isEqualTo(set());
}
@Test(expected = IllegalArgumentException.class)
public void sremEmpty() throws Exception {
redis.srem(key);
}
@Test(expected = IllegalArgumentException.class)
public void sremNulls() throws Exception {
redis.srem(key, new String[0]);
}
@Test
public void sunion() throws Exception {
setupSet();
assertThat(redis.sunion("key1", "key2", "key3")).isEqualTo(set("a", "b", "c", "d", "e"));
}
@Test(expected = IllegalArgumentException.class)
public void sunionEmpty() throws Exception {
redis.sunion();
}
@Test
public void sunionStreaming() throws Exception {
setupSet();
ListStreamingAdapter<String> adapter = new ListStreamingAdapter<String>();
Long count = redis.sunion(adapter, "key1", "key2", "key3");
assertThat(count.longValue()).isEqualTo(5);
assertThat(new TreeSet<String>(adapter.getList())).isEqualTo(new TreeSet<String>(list("c", "a", "b", "e", "d")));
}
@Test
public void sunionstore() throws Exception {
setupSet();
assertThat(redis.sunionstore("newset", "key1", "key2", "key3")).isEqualTo(5);
assertThat(redis.smembers("newset")).isEqualTo(set("a", "b", "c", "d", "e"));
}
@Test
public void sscan() throws Exception {
redis.sadd(key, value);
ValueScanCursor<String> cursor = redis.sscan(key);
assertThat(cursor.getCursor()).isEqualTo("0");
assertThat(cursor.isFinished()).isTrue();
assertThat(cursor.getValues()).isEqualTo(list(value));
}
@Test
public void sscanWithCursor() throws Exception {
redis.sadd(key, value);
ValueScanCursor<String> cursor = redis.sscan(key, ScanCursor.INITIAL);
assertThat(cursor.getValues()).hasSize(1);
assertThat(cursor.getCursor()).isEqualTo("0");
assertThat(cursor.isFinished()).isTrue();
}
@Test
public void sscanWithCursorAndArgs() throws Exception {
redis.sadd(key, value);
ValueScanCursor<String> cursor = redis.sscan(key, ScanCursor.INITIAL, ScanArgs.Builder.limit(5));
assertThat(cursor.getValues()).hasSize(1);
assertThat(cursor.getCursor()).isEqualTo("0");
assertThat(cursor.isFinished()).isTrue();
}
@Test
public void sscanStreaming() throws Exception {
redis.sadd(key, value);
ListStreamingAdapter<String> adapter = new ListStreamingAdapter<String>();
StreamScanCursor cursor = redis.sscan(adapter, key);
assertThat(cursor.getCount()).isEqualTo(1);
assertThat(cursor.getCursor()).isEqualTo("0");
assertThat(cursor.isFinished()).isTrue();
assertThat(adapter.getList()).isEqualTo(list(value));
}
@Test
public void sscanStreamingWithCursor() throws Exception {
redis.sadd(key, value);
ListStreamingAdapter<String> adapter = new ListStreamingAdapter<String>();
StreamScanCursor cursor = redis.sscan(adapter, key, ScanCursor.INITIAL);
assertThat(cursor.getCount()).isEqualTo(1);
assertThat(cursor.getCursor()).isEqualTo("0");
assertThat(cursor.isFinished()).isTrue();
}
@Test
public void sscanStreamingWithCursorAndArgs() throws Exception {
redis.sadd(key, value);
ListStreamingAdapter<String> adapter = new ListStreamingAdapter<String>();
StreamScanCursor cursor = redis.sscan(adapter, key, ScanCursor.INITIAL, ScanArgs.Builder.limit(5));
assertThat(cursor.getCount()).isEqualTo(1);
assertThat(cursor.getCursor()).isEqualTo("0");
assertThat(cursor.isFinished()).isTrue();
}
@Test
public void sscanStreamingArgs() throws Exception {
redis.sadd(key, value);
ListStreamingAdapter<String> adapter = new ListStreamingAdapter<String>();
StreamScanCursor cursor = redis.sscan(adapter, key, ScanArgs.Builder.limit(100).match("*"));
assertThat(cursor.getCount()).isEqualTo(1);
assertThat(cursor.getCursor()).isEqualTo("0");
assertThat(cursor.isFinished()).isTrue();
assertThat(adapter.getList()).isEqualTo(list(value));
}
@Test
public void sscanMultiple() throws Exception {
Set<String> expect = new HashSet<>();
Set<String> check = new HashSet<>();
setup100KeyValues(expect);
ValueScanCursor<String> cursor = redis.sscan(key, ScanArgs.Builder.limit(5));
assertThat(cursor.getCursor()).isNotNull().isNotEqualTo("0");
assertThat(cursor.isFinished()).isFalse();
check.addAll(cursor.getValues());
while (!cursor.isFinished()) {
cursor = redis.sscan(key, cursor);
check.addAll(cursor.getValues());
}
assertThat(new TreeSet<String>(check)).isEqualTo(new TreeSet<String>(expect));
}
@Test
public void scanMatch() throws Exception {
Set<String> expect = new HashSet<>();
setup100KeyValues(expect);
ValueScanCursor<String> cursor = redis.sscan(key, ScanArgs.Builder.limit(200).match("value1*"));
assertThat(cursor.getCursor()).isEqualTo("0");
assertThat(cursor.isFinished()).isTrue();
assertThat(cursor.getValues()).hasSize(11);
}
protected void setup100KeyValues(Set<String> expect) {
for (int i = 0; i < 100; i++) {
redis.sadd(key, value + i);
expect.add(value + i);
}
}
private void setupSet() {
redis.sadd(key, "a", "b", "c");
redis.sadd("key1", "a", "b", "c", "d");
redis.sadd("key2", "c");
redis.sadd("key3", "a", "c", "e");
}
}