diff --git a/build.gradle b/build.gradle index 4368f97..a2f8cfb 100644 --- a/build.gradle +++ b/build.gradle @@ -14,6 +14,7 @@ dependencies { testImplementation platform('org.junit:junit-bom:5.10.0') testImplementation 'org.junit.jupiter:junit-jupiter' testImplementation group: 'org.assertj', name: 'assertj-core', version: '3.25.3' + implementation group: 'org.reflections', name: 'reflections', version: '0.10.2' } compileJava.options.encoding = 'UTF-8' diff --git a/src/main/java/List/ArrayList/ArrayList_hellomatia.java b/src/main/java/List/ArrayList/ArrayList_hellomatia.java new file mode 100644 index 0000000..0a14703 --- /dev/null +++ b/src/main/java/List/ArrayList/ArrayList_hellomatia.java @@ -0,0 +1,66 @@ +package List.ArrayList; + +import List.List; + +@JavaDiverCustomArrayList +public class ArrayList_hellomatia implements List { + + private static final int INITIAL_CAPACITY = 10; + private E[] array; + private int size; + private int maxCapacity; + + @SuppressWarnings("unchecked") + public ArrayList_hellomatia() { + this.array = (E[]) new Object[INITIAL_CAPACITY]; + maxCapacity = array.length; + } + + @Override + public void insert(E data) { + if (size() == maxCapacity) { + maxCapacity = 2 * maxCapacity; + @SuppressWarnings("unchecked") + E[] newArray = (E[]) new Object[maxCapacity]; + System.arraycopy(array, 0, newArray, 0, size()); + array = newArray; + } + array[size()] = data; + ++size; + } + + @Override + public int size() { + return size; + } + + @Override + public boolean isEmpty() { + return size() == 0; + } + + @Override + public boolean contains(E o) { + for (int i = 0; i < size(); i++) { + if (array[i].equals(o)) { + return true; + } + } + return false; + } + + @Override + public E get(int index) { + return array[index]; + } + + @Override + public E remove(int index) { + E removed = array[index]; + for (int i = index; i < size() - 1; i++) { + array[i] = array[i + 1]; + } + --size; + return removed; + } +} diff --git a/src/main/java/List/ArrayList/ArrayList_name.java b/src/main/java/List/ArrayList/ArrayList_name.java index f7fd310..a7715bc 100644 --- a/src/main/java/List/ArrayList/ArrayList_name.java +++ b/src/main/java/List/ArrayList/ArrayList_name.java @@ -1,9 +1,9 @@ package List.ArrayList; import List.List; - import java.util.ArrayList; +@JavaDiverCustomArrayList public class ArrayList_name implements List { // 구현시 삭제 diff --git a/src/main/java/List/ArrayList/JavaDiverCustomArrayList.java b/src/main/java/List/ArrayList/JavaDiverCustomArrayList.java new file mode 100644 index 0000000..480d3c7 --- /dev/null +++ b/src/main/java/List/ArrayList/JavaDiverCustomArrayList.java @@ -0,0 +1,8 @@ +package List.ArrayList; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@Retention(RetentionPolicy.RUNTIME) +public @interface JavaDiverCustomArrayList { +} diff --git a/src/test/java/List/ArrayList/ArrayListTest_hellomatia.java b/src/test/java/List/ArrayList/ArrayListTest_hellomatia.java new file mode 100644 index 0000000..429103f --- /dev/null +++ b/src/test/java/List/ArrayList/ArrayListTest_hellomatia.java @@ -0,0 +1,88 @@ +package List.ArrayList; + +import List.List; +import org.junit.jupiter.api.DynamicTest; +import org.junit.jupiter.api.TestFactory; +import org.reflections.Reflections; +import org.reflections.scanners.Scanners; + +import java.lang.reflect.Constructor; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Set; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +public class ArrayListTest_hellomatia { + + + @TestFactory + @SuppressWarnings("unchecked") + Collection testAllArrayLists() throws Exception { + java.util.List dynamicTests = new ArrayList<>(); + + String packageName = "List.ArrayList"; + + Set> annotatedClasses = findClassesWithAnnotation(packageName); + + for (Class clazz : annotatedClasses) { + Constructor constructor = clazz.getDeclaredConstructor(); + constructor.setAccessible(true); + + dynamicTests.add(DynamicTest.dynamicTest(clazz.getSimpleName() + " - ArrayList의 생성 및 초기화", + () -> testArrayListCreation((List) constructor.newInstance()))); + + dynamicTests.add(DynamicTest.dynamicTest(clazz.getSimpleName() + " - 데이터 5개 저장", + () -> testArrayListInsertion((List) constructor.newInstance()))); + + dynamicTests.add(DynamicTest.dynamicTest(clazz.getSimpleName() + " - 데이터 5개 저장 후 22인 데이터 모두 삭제", + () -> testArrayListDeletion((List) constructor.newInstance()))); + } + + return dynamicTests; + } + + private Set> findClassesWithAnnotation(String packageName) { + Reflections reflections = new Reflections(packageName, Scanners.TypesAnnotated); + return reflections.getTypesAnnotatedWith(JavaDiverCustomArrayList.class); + } + + private void testArrayListCreation(List list) { + assertThat(list).isNotNull(); + } + + private void testArrayListInsertion(List list) { + list.insert(11); + list.insert(11); + list.insert(22); + list.insert(22); + list.insert(33); + + assertThat(list.size()).isEqualTo(5); + assertThat(list.get(0)).isEqualTo(11); + assertThat(list.get(1)).isEqualTo(11); + assertThat(list.get(2)).isEqualTo(22); + assertThat(list.get(3)).isEqualTo(22); + assertThat(list.get(4)).isEqualTo(33); + } + + private void testArrayListDeletion(List list) { + list.insert(11); + list.insert(11); + list.insert(22); + list.insert(22); + list.insert(33); + + for (int i = 0; i < list.size(); i++) { + if (list.get(i) == 22) { + list.remove(i); + i--; + } + } + + assertThat(list.size()).isEqualTo(3); + assertThat(list.get(0)).isEqualTo(11); + assertThat(list.get(1)).isEqualTo(11); + assertThat(list.get(2)).isEqualTo(33); + } +} \ No newline at end of file