/*
 * Copyright (c) 2012 Google Inc.
 *
 * All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse
 * Public License v1.0 which accompanies this distribution, and is available at
 *
 * http://www.eclipse.org/legal/epl-v10.html
 */
package com.google.eclipse.protobuf.cdt.util;

import static com.google.common.collect.Lists.newArrayList;
import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder;
import static org.hamcrest.core.IsEqual.equalTo;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;

import org.junit.Before;
import org.junit.Test;

import java.util.List;

/**
 * Tests for <code>{@link ExtendedListIterator}</code>.
 *
 * @author alruiz@google.com (Alex Ruiz)
 */
public class ExtendedListIterator_Test {
  private List<String> list;
  private ExtendedListIterator<String> iterator;

  @Before public void setUp() {
    list = newArrayList("Luke", "Yoda", "Leia");
    iterator = new ExtendedListIterator<String>(list);
  }

  @Test public void should_iterate_through_list() {
    assertTrue(iterator.hasNext());
    assertThat(iterator.next(), equalTo("Luke"));
    assertTrue(iterator.hasNext());
    assertThat(iterator.next(), equalTo("Yoda"));
    assertTrue(iterator.hasNext());
    assertThat(iterator.next(), equalTo("Leia"));
    assertFalse(iterator.hasNext());
  }

  @Test public void should_return_elements_that_have_not_been_visited_yet() {
    assertThat(contentsOf(iterator.notRetrievedYet()), containsInAnyOrder("Luke", "Yoda", "Leia"));
    iterator.next();
    assertThat(contentsOf(iterator.notRetrievedYet()), containsInAnyOrder("Yoda", "Leia"));
    iterator.next();
    assertThat(contentsOf(iterator.notRetrievedYet()), containsInAnyOrder("Leia"));
    iterator.next();
    assertTrue(contentsOf(iterator.notRetrievedYet()).isEmpty());
  }

  private <T> List<T> contentsOf(ExtendedIterator<T> iterator) {
    return ((ExtendedListIterator<T>) iterator).contents();
  }

  @Test public void should_indicate_if_last_list_element_was_retrieved() {
    assertFalse(iterator.wasLastListElementRetrieved());
    iterator.next(); // Luke
    assertFalse(iterator.wasLastListElementRetrieved());
    iterator.next(); // Yoda
    assertFalse(iterator.wasLastListElementRetrieved());
    iterator.next(); // Leia
    assertTrue(iterator.wasLastListElementRetrieved());
  }
}
