package io.ebeaninternal.server.type; import org.junit.Test; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.List; import java.util.ListIterator; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; public class ModifyAwareListTest { private ModifyAwareList<String> createList() { ArrayList list = new ArrayList(); list.addAll(Arrays.asList("A", "B", "C", "D", "E")); return new ModifyAwareList<>(list); } private ModifyAwareList<String> createEmptyList() { return new ModifyAwareList<>(new ArrayList<>()); } @Test public void testSize() throws Exception { assertEquals(5, createList().size()); } @Test public void testIsEmpty() throws Exception { assertFalse(createList().isEmpty()); assertTrue(createEmptyList().isEmpty()); } @Test public void testContains() throws Exception { assertTrue(createList().contains("B")); assertFalse(createList().contains("Z")); } @Test public void testIterator() throws Exception { ModifyAwareList<String> list = createList(); Iterator<String> iterator = list.iterator(); assertTrue(iterator.hasNext()); assertEquals("A", iterator.next()); assertFalse(list.isMarkedDirty()); iterator.remove(); assertTrue(list.isMarkedDirty()); } @Test public void testToArray() throws Exception { Object[] objects = createList().toArray(); assertEquals(5, objects.length); assertEquals("A", objects[0]); assertEquals("E", objects[4]); } @Test public void testToArray1() throws Exception { String[] objects = createList().toArray(new String[5]); assertEquals(5, objects.length); assertEquals("A", objects[0]); assertEquals("E", objects[4]); } @Test public void testAdd() throws Exception { ModifyAwareList<String> list = createList(); assertFalse(list.isMarkedDirty()); list.add("F"); assertTrue(list.isMarkedDirty()); } @Test public void testRemove() throws Exception { ModifyAwareList<String> list = createList(); assertFalse(list.isMarkedDirty()); list.remove("A"); assertTrue(list.isMarkedDirty()); } @Test public void testContainsAll() throws Exception { ModifyAwareList<String> list = createList(); assertTrue(list.containsAll(Arrays.asList("A", "B"))); assertFalse(list.containsAll(Arrays.asList("A", "B", "Z"))); } @Test public void testAddAll() throws Exception { ModifyAwareList<String> list = createList(); assertFalse(list.isMarkedDirty()); assertTrue(list.addAll(Arrays.asList("F", "G"))); assertTrue(list.isMarkedDirty()); } @Test public void testRemoveAll() throws Exception { ModifyAwareList<String> list = createList(); assertFalse(list.isMarkedDirty()); assertTrue(list.removeAll(Arrays.asList("A", "G"))); assertTrue(list.isMarkedDirty()); } @Test public void testRetainAll() throws Exception { ModifyAwareList<String> list = createList(); assertFalse(list.isMarkedDirty()); assertTrue(list.retainAll(Arrays.asList("A", "B"))); assertTrue(list.isMarkedDirty()); assertEquals(2, list.size()); } @Test public void testClear() throws Exception { ModifyAwareList<String> list = createList(); assertFalse(list.isMarkedDirty()); list.clear(); assertTrue(list.isMarkedDirty()); assertEquals(0, list.size()); } @Test public void testGet() throws Exception { ModifyAwareList<String> list = createList(); assertEquals("A", list.get(0)); assertEquals("B", list.get(1)); assertEquals("E", list.get(4)); } @Test public void testSet() throws Exception { ModifyAwareList<String> list = createList(); assertFalse(list.isMarkedDirty()); list.set(0, "Z"); assertTrue(list.isMarkedDirty()); assertEquals(5, list.size()); } @Test public void testIndexOf() throws Exception { ModifyAwareList<String> list = createList(); assertFalse(list.isMarkedDirty()); assertEquals(2, list.indexOf("C")); assertEquals(-1, list.indexOf("Z")); assertFalse(list.isMarkedDirty()); } @Test public void testLastIndexOf() throws Exception { ModifyAwareList<String> list = createList(); assertFalse(list.isMarkedDirty()); assertEquals(2, list.lastIndexOf("C")); assertEquals(-1, list.lastIndexOf("Z")); assertFalse(list.isMarkedDirty()); } @Test public void testListIterator() throws Exception { ModifyAwareList<String> list = createList(); ListIterator<String> iterator = list.listIterator(); assertTrue(iterator.hasNext()); assertEquals("A", iterator.next()); assertFalse(list.isMarkedDirty()); iterator.remove(); assertTrue(list.isMarkedDirty()); } @Test public void testListIterator1() throws Exception { ModifyAwareList<String> list = createList(); ListIterator<String> iterator = list.listIterator(2); assertTrue(iterator.hasNext()); assertEquals("C", iterator.next()); assertFalse(list.isMarkedDirty()); iterator.remove(); assertTrue(list.isMarkedDirty()); } @Test public void testSubList() throws Exception { ModifyAwareList<String> list = createList(); List<String> sub = list.subList(1, 3); assertEquals("B", sub.get(0)); assertEquals("C", sub.get(1)); assertFalse(list.isMarkedDirty()); sub.remove("C"); assertTrue(list.isMarkedDirty()); } @Test public void testAsSet() throws Exception { ModifyAwareList<String> list = createList(); ModifyAwareSet<String> set = list.asSet(); assertFalse(set.isMarkedDirty()); set.add("next"); assertTrue(set.isMarkedDirty()); } @Test public void serialise() throws IOException, ClassNotFoundException { ByteArrayOutputStream os = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(os); ModifyAwareList<String> orig = createList(); oos.writeObject(orig); oos.flush(); oos.close(); ByteArrayInputStream is = new ByteArrayInputStream(os.toByteArray()); ObjectInputStream ois = new ObjectInputStream(is); ModifyAwareList<String> read = (ModifyAwareList<String>)ois.readObject(); assertThat(read).contains("A", "B", "C", "D", "E"); } }