
// QueueTester.java
// Andrew Davison, ad@coe.psu.ac.th, May 2023

/* Various queue data structures:
      * CircularFifoQueue
      * UnmodifiableQueue
      * PredicatedQueue
      * TransformedQueue

   Also see CircularQueueTester.java

  Usage:
    > compile QueueTester.java
    > run QueueTester
*/

import java.util.*;

import org.apache.commons.collections4.*;
import org.apache.commons.collections4.queue.*;
import org.apache.commons.collections4.functors.*;


public class QueueTester
{
  public static void main(String[] args)
  {
    Queue<Integer> q = new CircularFifoQueue<Integer>();
    q.add(1); 
    q.add(2);
    q.add(3);
    System.out.println("circular queue:" + q);


    // -----------------------------------

    Queue<Integer> roQ = UnmodifiableQueue.unmodifiableQueue(q);
    System.out.println("\nMake unmodifiable: " + roQ);
    System.out.println("Try to add a value");
    try {  roQ.add(12);  }
    catch(UnsupportedOperationException e)
    {  System.out.println(e);  }


    // -----------------------------------

    Queue<Integer> predQ = PredicatedQueue.predicatedQueue(q, 
                            NotNullPredicate.notNullPredicate());
    System.out.println("\nDisallow nulls: " + predQ);
    System.out.println("Try to add a null");
    try {  predQ.add(null);   }
    catch(IllegalArgumentException e)
    {  System.out.println(e);  }

    predQ = PredicatedQueue.predicatedQueue(q,  n -> (n < 10));
    System.out.println("\nDisallow values >= 10: " + predQ);
    System.out.println("Try to add 11");
    try {  predQ.add(11);   }
    catch(IllegalArgumentException e)
    {  System.out.println(e);  }

    // -----------------------------------

    System.out.println("\nTransformed queue (+ve)");

    q = new CircularFifoQueue<Integer>();  // underlying queue

    // modify the key (k) and value (v) added
    TransformedQueue<Integer> tq = 
       TransformedQueue.transformedQueue(q, v -> Math.abs(v));
    System.out.println("Added -1");
    tq.add(-1);
    System.out.println("Added -5");
    tq.add(-5);
    System.out.println("Resulting queue: " + tq);

  } /* main */

}  // end of QueueTester class

