package com.github.obourgain.elasticsearch.http.concurrent; import java.util.Arrays; import java.util.List; import org.assertj.core.api.Assertions; import org.junit.Test; public class SnapshotableCopyOnWriteArrayTest { @Test public void should_add() throws Exception { SnapshotableCopyOnWriteArray<Object> array = new SnapshotableCopyOnWriteArray<>(); array.add("foo"); Assertions.assertThat(array.size()).isEqualTo(1); } @Test public void should_add_all() { SnapshotableCopyOnWriteArray<Object> array = new SnapshotableCopyOnWriteArray<>(); array.addAll(Arrays.asList("foo", "bar")); Assertions.assertThat(array.size()).isEqualTo(2); } @Test public void should_add_all_to_non_emtpy_array() { SnapshotableCopyOnWriteArray<Object> array = new SnapshotableCopyOnWriteArray<>(); array.add("hello"); array.addAll(Arrays.asList("foo", "bar")); Assertions.assertThat(array.size()).isEqualTo(3); } @Test public void should_create_a_snapshot() { SnapshotableCopyOnWriteArray<Object> array = new SnapshotableCopyOnWriteArray<>(); array.addAll(Arrays.asList("foo", "bar")); Assertions.assertThat(array.size()).isEqualTo(2); List<Object> snapshot = array.snapshot(); Assertions.assertThat(snapshot).containsExactly("foo", "bar"); } @Test public void snapshot_should_not_be_modified_when_adding_after_it() { SnapshotableCopyOnWriteArray<Object> array = new SnapshotableCopyOnWriteArray<>(); array.addAll(Arrays.asList("foo", "bar")); Assertions.assertThat(array.size()).isEqualTo(2); List<Object> snapshot = array.snapshot(); array.addAll(Arrays.asList("foo", "bar")); Assertions.assertThat(array.size()).isEqualTo(4); Assertions.assertThat(snapshot).containsExactly("foo", "bar"); } @Test public void should_remove() { SnapshotableCopyOnWriteArray<Object> array = new SnapshotableCopyOnWriteArray<>(); array.addAll(Arrays.asList("foo", "bar", "baz")); array.remove("bar"); Assertions.assertThat(array.size()).isEqualTo(2); Assertions.assertThat(array.snapshot()).containsExactly("foo", "baz"); } @Test public void should_remove_at_the_end() { SnapshotableCopyOnWriteArray<Object> array = new SnapshotableCopyOnWriteArray<>(); array.addAll(Arrays.asList("foo", "bar", "baz")); array.remove("baz"); Assertions.assertThat(array.size()).isEqualTo(2); Assertions.assertThat(array.snapshot()).containsExactly("foo", "bar"); } @Test public void should_remove_at_the_beginning() { SnapshotableCopyOnWriteArray<Object> array = new SnapshotableCopyOnWriteArray<>(); array.addAll(Arrays.asList("foo", "bar", "baz")); array.remove("bar"); Assertions.assertThat(array.size()).isEqualTo(2); Assertions.assertThat(array.snapshot()).containsExactly("foo", "baz"); } @Test public void should_not_remove_if_not_present() { SnapshotableCopyOnWriteArray<Object> array = new SnapshotableCopyOnWriteArray<>(); array.addAll(Arrays.asList("foo", "bar")); array.remove("hello"); Assertions.assertThat(array.size()).isEqualTo(2); Assertions.assertThat(array.snapshot()).containsExactly("foo", "bar"); } }