content: package redis.clients.jedis.tests.collections;
  
  import static org.junit.Assert.*;
  
  import java.lang.reflect.Method;
  import java.util.ArrayList;
  import java.util.Arrays;
  import java.util.HashSet;
  import java.util.List;
  import java.util.Set;
  
  import org.junit.BeforeClass;
  import org.junit.Test;
  
  public class SetFromListTest {
  
    private static Method method;
  
    @BeforeClass
    public static void beforeClass() throws Exception {
      Class<?> clazz = Class.forName("redis.clients.jedis.BinaryJedis$SetFromList");
      method = clazz.getDeclaredMethod("of", List.class);
      method.setAccessible(true);
    }
  
    /**
     * Instantiate SetFromList class by reflection because it is protected static inner class of
     * BinaryJedis.
     */
    @SuppressWarnings("unchecked")
    private <E> Set<E> setFromList(List<E> list) throws Exception {
      return (Set<E>) method.invoke(null, list);
    }
  
    @Test
    public void setOperations() throws Exception {
  
      // add
      Set<String> cut = setFromList(new ArrayList<String>());
      cut.add("A");
      cut.add("B");
      cut.add("A");
  
      assertEquals(2, cut.size());
  
      // remove
      cut.remove("A");
      assertEquals(1, cut.size());
  
      cut.remove("C");
      assertEquals(1, cut.size());
  
      // contains
      assertTrue(cut.contains("B"));
      assertFalse(cut.contains("A"));
  
      cut.add("C");
      cut.add("D");
  
      // containsAll
      assertTrue(cut.containsAll(cut));
  
      // retainAll
      cut.retainAll(Arrays.asList("C", "D"));
      assertEquals(2, cut.size());
      assertTrue(cut.contains("C"));
      assertTrue(cut.contains("D"));
  
      // removeAll
      cut.removeAll(Arrays.asList("C"));
      assertEquals(1, cut.size());
      assertTrue(cut.contains("D"));
  
      // clear
      cut.clear();
      assertTrue(cut.isEmpty());
    }
  
    @Test
    public void iteration() throws Exception {
  
      List<String> list = new ArrayList<String>();
  
      for (int i = 'a'; i <= 'z'; i++) {
        list.add(String.valueOf((char) i));
      }
  
      Set<String> cut = setFromList(list);
  
      // ordering guarantee
      int i = 0;
      for (String x : cut) {
        assertEquals(list.get(i++), x);
      }
    }
  
    @Test
    public void equals() throws Exception {
  
      Set<String> hashSet = new HashSet<String>();
  
      for (int i = 'a'; i <= 'z'; i++) {
        hashSet.add(String.valueOf((char) i));
      }
  
      Set<String> cut = setFromList(new ArrayList<String>(hashSet));
  
      assertTrue(hashSet.equals(cut));
      assertTrue(cut.equals(hashSet));
  
      // equals with null
      assertFalse(cut.equals(null));
  
      // equals with other types
      assertFalse(cut.equals(new ArrayList<String>()));
    }
  }
  