// Path: src/main/java/rogeriogentil/data/structures/chapter03/CircularyLinkedList.java
// public class CircularyLinkedList<E> {
//    
//    private int size;
//    private Node<E> tailNode;
// 
//    public int getSize() {
//       return size;
//    }
//    
//    public Node<E> getHeadNode() {
//       return tailNode.getNext();
//    }
// 
//    public Node<E> getTailNode() {
//       return tailNode;
//    }
//    
//    public boolean isEmpty() {
//       return size == 0;
//    }
//    
//    public E first() {
//       if (this.isEmpty()) 
//          return null;
//       
//       return getTailNode().getNext().getElement();
//    }
//    
//    public E last() {
//       if (this.isEmpty()) 
//          return null;
//       
//       return getTailNode().getNext().getElement();
//    }
//    
//    public void addFirst(E element) {
//       Node<E> newest = new Node<>(element);
//       
//       if (isEmpty()) {
//          tailNode = newest;         
//       } else {
//          newest.setNext(tailNode.getNext());
//       }
//       
//       tailNode.setNext(newest);
//       
//       size++;
//    }
// 
//    public void addLast(E element) {
//       Node<E> newest = new Node<>(element);
//       
//       if (this.isEmpty()) {
//          tailNode = newest;
//          tailNode.setNext(newest);
//          newest.setNext(tailNode);
//       } else {
//          newest.setNext(tailNode.getNext());
//          tailNode.setNext(newest);
//          tailNode = newest;
//       }
//       
//       size++;
//    }
//    
//    public void rotate() {
//       if (!isEmpty()) {
//          tailNode = tailNode.getNext();
//       }
//    }
// }


import rogeriogentil.data.structures.chapter03.CircularyLinkedList;
import static org.junit.Assert.assertTrue;
import org.junit.Test;
package rogeriogentil.data.structures.chapter03;


/**
 *
 * @author rogerio
 */
public class CircularyLinkedListTest {

   @Test
   public void deveSerMesmoElementoEmNextQuandoListaEstaVazia() {
      CircularyLinkedList<String> linkedList = new CircularyLinkedList<>();
      linkedList.addFirst("A");

      assertTrue(linkedList.getTailNode().getElement().equals("A"));
      assertTrue(linkedList.getTailNode().getNext().getElement().equals("A"));
      assertTrue(linkedList.getSize() == 1);
   }
   
   @Test
   public void deveAdicionarNoInicio() {
      CircularyLinkedList<String> linkedList = new CircularyLinkedList<>();
      linkedList.addFirst("C");
      linkedList.addFirst("B");
      linkedList.addFirst("A");

      assertTrue(linkedList.getHeadNode().getElement().equals("A"));
      assertTrue(linkedList.getSize() == 3);
   }
   
   @Test
   public void tailDeveApontarParaNovoNoQuandoAdicionarNoInicio() {
// Path: src/main/java/rogeriogentil/data/structures/chapter03/CircularyLinkedList.java
// public class CircularyLinkedList<E> {
//    
//    private int size;
//    private Node<E> tailNode;
// 
//    public int getSize() {
//       return size;
//    }
//    
//    public Node<E> getHeadNode() {
//       return tailNode.getNext();
//    }
// 
//    public Node<E> getTailNode() {
//       return tailNode;
//    }
//    
//    public boolean isEmpty() {
//       return size == 0;
//    }
//    
//    public E first() {
//       if (this.isEmpty()) 
//          return null;
//       
//       return getTailNode().getNext().getElement();
//    }
//    
//    public E last() {
//       if (this.isEmpty()) 
//          return null;
//       
//       return getTailNode().getNext().getElement();
//    }
//    
//    public void addFirst(E element) {
//       Node<E> newest = new Node<>(element);
//       
//       if (isEmpty()) {
//          tailNode = newest;         
//       } else {
//          newest.setNext(tailNode.getNext());
//       }
//       
//       tailNode.setNext(newest);
//       
//       size++;
//    }
// 
//    public void addLast(E element) {
//       Node<E> newest = new Node<>(element);
//       
//       if (this.isEmpty()) {
//          tailNode = newest;
//          tailNode.setNext(newest);
//          newest.setNext(tailNode);
//       } else {
//          newest.setNext(tailNode.getNext());
//          tailNode.setNext(newest);
//          tailNode = newest;
//       }
//       
//       size++;
//    }
//    
//    public void rotate() {
//       if (!isEmpty()) {
//          tailNode = tailNode.getNext();
//       }
//    }
// }


// Path: src/test/java/rogeriogentil/data/structures/chapter03/CircularyLinkedListTest.java
import rogeriogentil.data.structures.chapter03.CircularyLinkedList;
import static org.junit.Assert.assertTrue;
import org.junit.Test;

package rogeriogentil.data.structures.chapter03;


/**
 *
 * @author rogerio
 */
public class CircularyLinkedListTest {

   @Test
   public void deveSerMesmoElementoEmNextQuandoListaEstaVazia() {
      CircularyLinkedList<String> linkedList = new CircularyLinkedList<>();
      linkedList.addFirst("A");

      assertTrue(linkedList.getTailNode().getElement().equals("A"));
      assertTrue(linkedList.getTailNode().getNext().getElement().equals("A"));
      assertTrue(linkedList.getSize() == 1);
   }
   
   @Test
   public void deveAdicionarNoInicio() {
      CircularyLinkedList<String> linkedList = new CircularyLinkedList<>();
      linkedList.addFirst("C");
      linkedList.addFirst("B");
      linkedList.addFirst("A");

      assertTrue(linkedList.getHeadNode().getElement().equals("A"));
      assertTrue(linkedList.getSize() == 3);
   }
   
   @Test
   public void tailDeveApontarParaNovoNoQuandoAdicionarNoInicio() {
      CircularyLinkedList<String> linkedList = new CircularyLinkedList<>();