package org.springside.modules.utils.collection;
import static org.assertj.core.api.Assertions.*;
import java.util.List;
import java.util.Random;
import org.junit.Test;
import com.google.common.collect.Ordering;
public class ListUtilTest {
@Test
public void guavaBuildList() {
List<String> list1 = ListUtil.newArrayList();
List<String> list2 = ListUtil.newArrayList("a", "b");
assertThat(list2).hasSize(2).containsExactly("a", "b");
List<String> list3 = ListUtil.newArrayList(SetUtil.newHashSet("a", "b"));
assertThat(list2).hasSize(2).containsExactly("a", "b");
List<String> list4 = ListUtil.newArrayListWithCapacity(10);
List<String> list5 = ListUtil.newCopyOnWriteArrayList();
List<String> list6 = ListUtil.newCopyOnWriteArrayList("a", "b");
assertThat(list6).hasSize(2).containsExactly("a", "b");
List<String> list7 = ListUtil.newLinkedList();
}
@Test
public void jdkBuild() {
List<String> list1 = ListUtil.emptyList();
assertThat(list1).hasSize(0);
List<String> list2 = ListUtil.emptyListIfNull(null);
assertThat(list2).isNotNull().hasSize(0);
List<String> list3 = ListUtil.emptyListIfNull(list1);
assertThat(list3).isSameAs(list1);
try {
list1.add("a");
fail("should fail before");
} catch (Throwable t) {
assertThat(t).isInstanceOf(UnsupportedOperationException.class);
}
List<String> list4 = ListUtil.singletonList("1");
assertThat(list4).hasSize(1).contains("1");
try {
list4.add("a");
fail("should fail before");
} catch (Throwable t) {
assertThat(t).isInstanceOf(UnsupportedOperationException.class);
}
List<String> list5 = ListUtil.newArrayList();
List<String> list6 = ListUtil.unmodifiableList(list5);
try {
list6.add("a");
fail("should fail before");
} catch (Throwable t) {
assertThat(t).isInstanceOf(UnsupportedOperationException.class);
}
List<String> list7 = ListUtil.synchronizedList(list6);
}
@Test
public void general() {
List<String> list1 = ListUtil.newArrayList();
List<String> list2 = ListUtil.newArrayList("a", "b", "c");
List<String> list3 = ListUtil.newArrayList("a");
assertThat(ListUtil.isEmpty(list1)).isTrue();
assertThat(ListUtil.isEmpty(null)).isTrue();
assertThat(ListUtil.isEmpty(list2)).isFalse();
assertThat(ListUtil.isNotEmpty(list1)).isFalse();
assertThat(ListUtil.isNotEmpty(null)).isFalse();
assertThat(ListUtil.isNotEmpty(list2)).isTrue();
assertThat(ListUtil.getFirst(list2)).isEqualTo("a");
assertThat(ListUtil.getLast(list2)).isEqualTo("c");
assertThat(ListUtil.getFirst(list3)).isEqualTo("a");
assertThat(ListUtil.getLast(list3)).isEqualTo("a");
assertThat(ListUtil.getFirst(list1)).isNull();
assertThat(ListUtil.getFirst(null)).isNull();
}
@Test
public void sortAndSearch() {
List<String> list = ListUtil.newArrayList("d", "a", "c", "b", "e", "i", "g");
ListUtil.sort(list);
assertThat(list).hasSize(7).containsExactly("a", "b", "c", "d", "e", "g", "i");
ListUtil.shuffle(list);
ListUtil.shuffle(list, new Random());
System.out.println("shuffle list:" + list);
ListUtil.sort(list, Ordering.natural());
assertThat(list).hasSize(7).containsExactly("a", "b", "c", "d", "e", "g", "i");
assertThat(ListUtil.binarySearch(list, "b")).isEqualTo(1);
assertThat(ListUtil.binarySearch(list, "b", Ordering.natural())).isEqualTo(1);
assertThat(ListUtil.binarySearch(list, "x")).isEqualTo(-8);
// reverse
List list8 = ListUtil.reverse(list);
assertThat(list8).hasSize(7).containsExactly("i", "g", "e", "d", "c", "b", "a");
// sortReverse
ListUtil.shuffle(list8);
ListUtil.sortReverse(list8);
assertThat(list8).hasSize(7).containsExactly("i", "g", "e", "d", "c", "b", "a");
ListUtil.shuffle(list8);
ListUtil.sortReverse(list8, Ordering.natural());
assertThat(list8).hasSize(7).containsExactly("i", "g", "e", "d", "c", "b", "a");
}
@Test
public void collectionCalc() {
List<String> list1 = ListUtil.newArrayList("1", "2", "3", "6", "6");
List<String> list2 = ListUtil.newArrayList("4", "5", "6", "7", "6", "6");
List<String> result = ListUtil.union(list1, list2);
assertThat(result).containsExactly("1", "2", "3", "6", "6", "4", "5", "6", "7", "6", "6");
List<String> result2 = ListUtil.intersection(list1, list2);
assertThat(result2).containsExactly("6", "6");
List<String> result3 = ListUtil.difference(list2, list1);
assertThat(result3).containsExactly("4", "5", "7", "6");
List<String> result4 = ListUtil.disjoint(list1, list2);
assertThat(result4).containsExactly("1", "2", "3", "4", "5", "7", "6");
}
}