// Path: src/main/java/rogeriogentil/data/structures/chapter03/SinglyLinkedList.java
// public class SinglyLinkedList<E> {
// 
//    private int size;
//    private Node<E> headNode;
//    private Node<E> tailNode;
// 
//    public Node<E> getHead() {
//       return headNode;
//    }
// 
//    public Node<E> getTail() {
//       return tailNode;
//    }
// 
//    public int getSize() {
//       return size;
//    }
// 
//    public void addFirst(E element) {
//       Node newest = new Node(element);
//       newest.setNext(headNode);
//       headNode = newest;
//       
//       if (this.isEmpty()) {
//          tailNode = headNode;
//       }
//       
//       size++;
//    }
// 
//    public void addLast(E element) {
//       Node newest = new Node(element);
//       
//       if (this.isEmpty()) {
//          headNode = newest;
//          tailNode = headNode;
//       } else {
//          tailNode.setNext(newest);
//          tailNode = newest;
//       }
//       
//       size++;
//    }
// 
//    public E removeFist() {
//       if (this.isEmpty()) {
//           return null;
//       }
//       
//       E element = headNode.getElement();
//       headNode = headNode.getNext();
// //      headNode.setNext(null);
//       size--;
//       
//       return element;
//    }
// 
//    public boolean isEmpty() {
//       return this.size == 0;
//    }
//    
//    public E first() {
//        return headNode.getElement();
//    }
// }


import rogeriogentil.data.structures.chapter03.SinglyLinkedList;
import org.junit.Test;
import static org.junit.Assert.*;
package rogeriogentil.data.structures.chapter03;



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

   @Test
   public void deveAdicionarNoInicio() {
      SinglyLinkedList<String> linkedList = new SinglyLinkedList<>();
      linkedList.addFirst("C");
      linkedList.addFirst("B");
      linkedList.addFirst("A");

      assertTrue(linkedList.getHead().getElement().equals("A"));
      assertTrue(linkedList.getSize() == 3);
   }

   @Test
   public void deveAdicionarNoFim() {
      SinglyLinkedList<String> linkedList = new SinglyLinkedList();
      linkedList.addLast("A");
      linkedList.addLast("B");
      linkedList.addLast("C");

      assertTrue(linkedList.getHead().getNext().getNext().getElement().equals("C"));
      assertTrue(linkedList.getSize() == 3);
   }

   @Test
   public void deveIndicarQueListaEstaVazia() {
      SinglyLinkedList linkedList = new SinglyLinkedList();
// Path: src/main/java/rogeriogentil/data/structures/chapter03/SinglyLinkedList.java
// public class SinglyLinkedList<E> {
// 
//    private int size;
//    private Node<E> headNode;
//    private Node<E> tailNode;
// 
//    public Node<E> getHead() {
//       return headNode;
//    }
// 
//    public Node<E> getTail() {
//       return tailNode;
//    }
// 
//    public int getSize() {
//       return size;
//    }
// 
//    public void addFirst(E element) {
//       Node newest = new Node(element);
//       newest.setNext(headNode);
//       headNode = newest;
//       
//       if (this.isEmpty()) {
//          tailNode = headNode;
//       }
//       
//       size++;
//    }
// 
//    public void addLast(E element) {
//       Node newest = new Node(element);
//       
//       if (this.isEmpty()) {
//          headNode = newest;
//          tailNode = headNode;
//       } else {
//          tailNode.setNext(newest);
//          tailNode = newest;
//       }
//       
//       size++;
//    }
// 
//    public E removeFist() {
//       if (this.isEmpty()) {
//           return null;
//       }
//       
//       E element = headNode.getElement();
//       headNode = headNode.getNext();
// //      headNode.setNext(null);
//       size--;
//       
//       return element;
//    }
// 
//    public boolean isEmpty() {
//       return this.size == 0;
//    }
//    
//    public E first() {
//        return headNode.getElement();
//    }
// }


// Path: src/test/java/rogeriogentil/data/structures/chapter03/SinglyLinkedListTest.java
import rogeriogentil.data.structures.chapter03.SinglyLinkedList;
import org.junit.Test;
import static org.junit.Assert.*;

package rogeriogentil.data.structures.chapter03;



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

   @Test
   public void deveAdicionarNoInicio() {
      SinglyLinkedList<String> linkedList = new SinglyLinkedList<>();
      linkedList.addFirst("C");
      linkedList.addFirst("B");
      linkedList.addFirst("A");

      assertTrue(linkedList.getHead().getElement().equals("A"));
      assertTrue(linkedList.getSize() == 3);
   }

   @Test
   public void deveAdicionarNoFim() {
      SinglyLinkedList<String> linkedList = new SinglyLinkedList();
      linkedList.addLast("A");
      linkedList.addLast("B");
      linkedList.addLast("C");

      assertTrue(linkedList.getHead().getNext().getNext().getElement().equals("C"));
      assertTrue(linkedList.getSize() == 3);
   }

   @Test
   public void deveIndicarQueListaEstaVazia() {
      SinglyLinkedList linkedList = new SinglyLinkedList();
      assertTrue(linkedList.isEmpty());