package fr.umlv.queue;

import static org.junit.Assert.*;

import org.junit.Test;
 
public class FifoTest {
  @Test(expected=IllegalArgumentException.class)
  public void testFifoCapacity() {
    new Fifo(-3);
  }
  
  @Test(expected=IllegalArgumentException.class)
  public void testFifoCapacity2() {
    new Fifo(0);
  }

  @Test(expected=IllegalStateException.class)
  public void testEmpty() {
    Fifo fifo = new Fifo(1);
    fifo.poll();
  }
  
  @Test(expected=IllegalStateException.class)
  public void testFull() {
    Fifo fifo = new Fifo(1);
    fifo.offer(43);
    fifo.offer(7);
  }

  @Test
  public void testContract() {
    Fifo fifo = new Fifo(2);
    fifo.offer(9);
    assertEquals(9, fifo.poll());
    fifo.offer(2);
    fifo.offer(37);
    assertEquals(2, fifo.poll());
    fifo.offer(12);
    assertEquals(37, fifo.poll());
    assertEquals(12, fifo.poll());
  }

  @Test
  public void testSize() {
    Fifo fifo = new Fifo(10);
    assertEquals(0, fifo.size());
    fifo.offer("foo");
    assertEquals(1, fifo.size());
    fifo.offer("bar");
    assertEquals(2, fifo.size());
    fifo.poll();
    assertEquals(1, fifo.size());
    fifo.poll();
    assertEquals(0, fifo.size());
  }
  
  @Test
  public void testIsEmpty() {
    Fifo fifo = new Fifo(7);
    assertTrue(fifo.isEmpty());
    fifo.offer("oof");
    assertFalse(fifo.isEmpty());
    fifo.offer("rab");
    assertFalse(fifo.isEmpty());
    fifo.poll();
    fifo.poll();
    assertTrue(fifo.isEmpty());
  }
}
