package labs.arraylist;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

import org.junit.Test;

public class TestList {

  @Test
  public void testConstructor() {
    MyArrayList<String> stringList = new MyArrayList<>();
    stringList.add("apple");
    assertEquals("apple", stringList.get(0));

    MyArrayList<Integer> integerList = new MyArrayList<>();
    integerList.add(1);
    assertTrue(1 == integerList.get(0));
  }

  @Test
  public void testGet() {
    MyArrayList<String> list = new MyArrayList<>();
    list.add("apple");
    list.add("banana");
    list.add("cherry");
    list.add("durian");

    assertEquals("apple", list.get(0));
    assertEquals("banana", list.get(1));
    assertEquals("cherry", list.get(2));
    assertEquals("durian", list.get(3));
  }

  @Test
  public void testSize() {
    MyArrayList<String> list = new MyArrayList<>();
    assertEquals(0, list.size());

    list.add("apple");
    assertEquals(1, list.size());

    list.add("banana");
    assertEquals(2, list.size());

    list.add("cherry");
    assertEquals(3, list.size());

    list.add("durian");
    assertEquals(4, list.size());
  }

  @Test
  public void testRemove() {
    MyArrayList<String> list = new MyArrayList<>();
    list.add("apple");
    list.add("banana");
    list.add("cherry");
    list.add("durian");

    list.remove(1);
    assertEquals(3, list.size());
    assertEquals("apple", list.get(0));
    assertEquals("cherry", list.get(1));
    assertEquals("durian", list.get(2));

    list.remove(0);
    assertEquals(2, list.size());
    assertEquals("cherry", list.get(0));
    assertEquals("durian", list.get(1));
  }

  @Test
  public void testClear() {
    MyArrayList<String> list = new MyArrayList<>();
    list.add("apple");
    list.add("banana");
    list.add("cherry");
    list.add("durian");

    list.clear();
    assertEquals(0, list.size());
  }

  @Test
  public void testContains() {
    MyArrayList<String> list = new MyArrayList<>();
    list.add("apple");
    list.add("banana");
    list.add("cherry");

    assertTrue(list.contains("apple"));
    assertTrue(list.contains("banana"));
    assertTrue(list.contains("cherry"));
    assertFalse(list.contains("durian"));
  }

  // UNCOMMENT TO TEST ITERABLE
  /*
  @Test
  public void testIterable() {
    MyArrayList<String> list = new MyArrayList<>();

    assertTrue(list instanceof Iterable);

    list.add("apple");
    list.add("banana");
    list.add("cherry");

    String expected = "apple banana cherry ";
    String actual = "";

    for (String fruit : list) {
      actual += fruit + " ";
    }

    assertEquals(expected, actual);
  }
  */
}
