// Path: Java-data-Structures/src/main/java/com/queues/LinkedListImplOfQueue.java
// public class LinkedListImplOfQueue<Item> implements Queue<Item>{
// 
//     /*
//      * Structure of each node of the linked list
//      */
//     private class Node {
//         Item item;
//         Node next;
//         public Node(Item item, Node next) {
//             this.item = item;
//             this.next = next;
//         }
//     }
//     
//     /*** A reference to the Node on the top of the Queue. */
//     private Node topQueue;
//     
//     /*** A reference to the Node at the end of the Queue. */
//     private Node endQueue;
//     
//     /*** Contains the size of the Queue. */
//     private int queueSize;
//     
//     /**
//      * Constructs an empty Queue.
//      */
//     public LinkedListImplOfQueue() {
//         topQueue = null;
//         endQueue = null;
//         queueSize = 0;
//     }
//     
//     /*** {@inheritDoc} */
//     @Override
//     public void add(Item item) {
//         if(item == null)
//             throw new NullPointerException("Null Item");
//         Node newNode = new Node(item, null); 
//         if (queueSize == 0) {
//             topQueue = newNode;
//             endQueue = topQueue;
//         }else{
//             endQueue.next = newNode;
//             endQueue = endQueue.next;
//         }
//         queueSize++;
//     }
// 
//     /*** {@inheritDoc} */
//     @Override
//     public Item poll() {
//         if (this.isEmpty()) {
//             throw new IllegalStateException("The queue is empty");
//         }
//         Item polledItem = topQueue.item;
//         topQueue = topQueue.next;
//         queueSize--;
//         if (queueSize == 0) {
//             endQueue = null;
//         }
//         return polledItem;
//     }
// 
//     /*** {@inheritDoc} */
//     @Override
//     public Item peek() {
//         if (this.isEmpty())
//             throw new IllegalStateException("The queue is empty");
//         return topQueue.item;
//     }
// 
//     /*** {@inheritDoc} */
//     @Override
//     public boolean isEmpty() {
//         if(queueSize == 0)
//             return true;
//         return false;
//     }
// 
//     /*** {@inheritDoc} */
//     @Override
//     public void clear() {
//         topQueue = null;
//         endQueue = null;
//         queueSize = 0;
//     }
// 
//     /*** {@inheritDoc} */
//     @Override
//     public int size() {
//         return queueSize;
//     }
// 
//     /*** {@inheritDoc} */
//     @Override
//     public boolean contains(Item item) {
//         Node top = topQueue;
//         while (top != null) {
//             if (top.item.equals(item))
//                 return true;
//             top = top.next;
//         }
//         return false;
//     }
//     
//     /*** {@inheritDoc} */
//     @Override
//     public Iterator<Item> iterator() {
//         return new IteratorLinkedListImplOfQueue();
//     }
//     
//     /**
//      * IteratorLinkedListImplOfQueue implements Iterator interface in order to
//      * provide iterable capabilities to the Queue.
//      *
//      * @author STEPHANE MIGUEL KAKANAKOU (Skakanakou@gmail.com)
//      *
//      */
//     private class IteratorLinkedListImplOfQueue implements Iterator<Item> {
// 
//         /*** Reference on the current node in the iteration. */
//         private Node currentNode;
// 
//         /*** Constructs IteratorLinkedListImplOfQueue. */
//         public IteratorLinkedListImplOfQueue() {
//             currentNode = topQueue;
//         }
// 
//         /*** {@inheritDoc} */
//         @Override
//         public boolean hasNext() {
//             if (currentNode != null)
//                 return true;
//             return false;
//         }
// 
//         /*** {@inheritDoc} */
//         @Override
//         public Item next() {
//             Item result = currentNode.item;
//             currentNode = currentNode.next;
//             return result;
//         }
//     }
// 
// }
// 
// Path: Java-data-Structures/src/main/java/com/queues/Queue.java
// public interface Queue<Item> extends Iterable<Item> {
// 
//     /**
//      * Inserts the specified element at the end of this queue.
//      *
//      * @param item
//      *            the element to add
//      * 
//      * @exception java.lang.NullPointerException
//      *                if item is null
//      */
//     void add(Item item);
// 
//     /**
//      * Retrieves and removes the head of this queue.
//      *
//      * @return the head of this queue
//      *
//      * @exception java.lang.IllegalStateException
//      *                if the Queue is empty
//      */
//     Item poll();
// 
//     /**
//      * Retrieves but not removes the head of this queue.
//      *
//      * @return the head of this queue
//      *
//      * @exception java.lang.IllegalStateException
//      *                if the Queue is empty
//      */
//     Item peek();
// 
//     /**
//      * Tests if this Queue is empty.
//      *
//      * @return true if the Queue empty and false if not.
//      */
//     boolean isEmpty();
// 
//     /**
//      * Removes all of the elements from this Queue.
//      */
//     void clear();
// 
//     /**
//      * Returns the number of elements in this Queue.
//      *
//      * @return size the number of elements in this Queue.
//      */
//     int size();
// 
//     /**
//      * Returns true if this Queue contains the specified element.
//      *
//      * @param item
//      *            the item to look for.
//      *
//      * @return true if the Queue contains the item and false if not.
//      */
//     boolean contains(Item item);
// 
// }


import com.queues.LinkedListImplOfQueue;
import com.queues.Queue;
import junit.framework.TestCase;
package com.test.queues;



public class TestLinkedListImplOfQueue extends TestCase{

    public void testEmpty() {
        // test empty queue
// Path: Java-data-Structures/src/main/java/com/queues/LinkedListImplOfQueue.java
// public class LinkedListImplOfQueue<Item> implements Queue<Item>{
// 
//     /*
//      * Structure of each node of the linked list
//      */
//     private class Node {
//         Item item;
//         Node next;
//         public Node(Item item, Node next) {
//             this.item = item;
//             this.next = next;
//         }
//     }
//     
//     /*** A reference to the Node on the top of the Queue. */
//     private Node topQueue;
//     
//     /*** A reference to the Node at the end of the Queue. */
//     private Node endQueue;
//     
//     /*** Contains the size of the Queue. */
//     private int queueSize;
//     
//     /**
//      * Constructs an empty Queue.
//      */
//     public LinkedListImplOfQueue() {
//         topQueue = null;
//         endQueue = null;
//         queueSize = 0;
//     }
//     
//     /*** {@inheritDoc} */
//     @Override
//     public void add(Item item) {
//         if(item == null)
//             throw new NullPointerException("Null Item");
//         Node newNode = new Node(item, null); 
//         if (queueSize == 0) {
//             topQueue = newNode;
//             endQueue = topQueue;
//         }else{
//             endQueue.next = newNode;
//             endQueue = endQueue.next;
//         }
//         queueSize++;
//     }
// 
//     /*** {@inheritDoc} */
//     @Override
//     public Item poll() {
//         if (this.isEmpty()) {
//             throw new IllegalStateException("The queue is empty");
//         }
//         Item polledItem = topQueue.item;
//         topQueue = topQueue.next;
//         queueSize--;
//         if (queueSize == 0) {
//             endQueue = null;
//         }
//         return polledItem;
//     }
// 
//     /*** {@inheritDoc} */
//     @Override
//     public Item peek() {
//         if (this.isEmpty())
//             throw new IllegalStateException("The queue is empty");
//         return topQueue.item;
//     }
// 
//     /*** {@inheritDoc} */
//     @Override
//     public boolean isEmpty() {
//         if(queueSize == 0)
//             return true;
//         return false;
//     }
// 
//     /*** {@inheritDoc} */
//     @Override
//     public void clear() {
//         topQueue = null;
//         endQueue = null;
//         queueSize = 0;
//     }
// 
//     /*** {@inheritDoc} */
//     @Override
//     public int size() {
//         return queueSize;
//     }
// 
//     /*** {@inheritDoc} */
//     @Override
//     public boolean contains(Item item) {
//         Node top = topQueue;
//         while (top != null) {
//             if (top.item.equals(item))
//                 return true;
//             top = top.next;
//         }
//         return false;
//     }
//     
//     /*** {@inheritDoc} */
//     @Override
//     public Iterator<Item> iterator() {
//         return new IteratorLinkedListImplOfQueue();
//     }
//     
//     /**
//      * IteratorLinkedListImplOfQueue implements Iterator interface in order to
//      * provide iterable capabilities to the Queue.
//      *
//      * @author STEPHANE MIGUEL KAKANAKOU (Skakanakou@gmail.com)
//      *
//      */
//     private class IteratorLinkedListImplOfQueue implements Iterator<Item> {
// 
//         /*** Reference on the current node in the iteration. */
//         private Node currentNode;
// 
//         /*** Constructs IteratorLinkedListImplOfQueue. */
//         public IteratorLinkedListImplOfQueue() {
//             currentNode = topQueue;
//         }
// 
//         /*** {@inheritDoc} */
//         @Override
//         public boolean hasNext() {
//             if (currentNode != null)
//                 return true;
//             return false;
//         }
// 
//         /*** {@inheritDoc} */
//         @Override
//         public Item next() {
//             Item result = currentNode.item;
//             currentNode = currentNode.next;
//             return result;
//         }
//     }
// 
// }
// 
// Path: Java-data-Structures/src/main/java/com/queues/Queue.java
// public interface Queue<Item> extends Iterable<Item> {
// 
//     /**
//      * Inserts the specified element at the end of this queue.
//      *
//      * @param item
//      *            the element to add
//      * 
//      * @exception java.lang.NullPointerException
//      *                if item is null
//      */
//     void add(Item item);
// 
//     /**
//      * Retrieves and removes the head of this queue.
//      *
//      * @return the head of this queue
//      *
//      * @exception java.lang.IllegalStateException
//      *                if the Queue is empty
//      */
//     Item poll();
// 
//     /**
//      * Retrieves but not removes the head of this queue.
//      *
//      * @return the head of this queue
//      *
//      * @exception java.lang.IllegalStateException
//      *                if the Queue is empty
//      */
//     Item peek();
// 
//     /**
//      * Tests if this Queue is empty.
//      *
//      * @return true if the Queue empty and false if not.
//      */
//     boolean isEmpty();
// 
//     /**
//      * Removes all of the elements from this Queue.
//      */
//     void clear();
// 
//     /**
//      * Returns the number of elements in this Queue.
//      *
//      * @return size the number of elements in this Queue.
//      */
//     int size();
// 
//     /**
//      * Returns true if this Queue contains the specified element.
//      *
//      * @param item
//      *            the item to look for.
//      *
//      * @return true if the Queue contains the item and false if not.
//      */
//     boolean contains(Item item);
// 
// }


// Path: Java-data-Structures/src/test/java/com/test/queues/TestLinkedListImplOfQueue.java
import com.queues.LinkedListImplOfQueue;
import com.queues.Queue;
import junit.framework.TestCase;

package com.test.queues;



public class TestLinkedListImplOfQueue extends TestCase{

    public void testEmpty() {
        // test empty queue
        Queue<String> que = new LinkedListImplOfQueue<String>();