package basics.collections;

import java.util.ArrayList;
import java.util.EmptyStackException;
import java.util.List;
import basics.testing.Test;

/**
 * First in first out stack.
 * @author kst
 *
 * @param <E>
 */
public class StackFIFO<E>
{
private List<E> items;

public StackFIFO()
{
   items = new ArrayList<E>();
}

public void push(E item)
{
   items.add(item);
}

public E pop()
{
   if(items.size() == 0)
      throw new EmptyStackException();
   return items.remove(0);
}

public E peek()
{
   if(items.size() == 0)
      throw new EmptyStackException();
   return items.get(0);
}

public boolean empty()
{
   return items.isEmpty();
}

public static void unittest()
{
   StackFIFO<String> s = new StackFIFO<String>();
   s.push("a");
   Test.assertEqualsTrue(s.peek(), "a", "peek not a but " + s.peek());
   s.push("b");
   Test.assertEqualsTrue(s.peek(), "a", "peek not a but " + s.peek());
   s.push("c");
   Test.assertEqualsTrue(s.peek(), "a", "peek not a but " + s.peek());
   Test.assertEqualsTrue(s.pop(), "a", "pop not a");
   Test.assertEqualsTrue(s.pop(), "b", "pop not b");
   Test.assertEqualsTrue(s.pop(), "c", "pop not c");
   Test.assertTrue(s.empty(), "stack not empty");
}
}
