//--------------------------------------------------------------------
//
//  Laboratory 6                                           test6.cpp
//
//  Test program for the operations in the Queue ADT
//
//--------------------------------------------------------------------

#include <iostream>
#include "queuearr.cpp"
//#include "queuelnk.cpp"

using namespace std;

void print_help()
{
    cout << endl << "Commands:" << endl;
    cout << "  H  : Help (displays this message)" << endl;
    cout << "  +x : Enqueue x" << endl;
    cout << "  -  : Dequeue" << endl;
    cout << "  C  : Clear the queue" << endl;
    cout << "  E  : Empty queue?" << endl;
    cout << "  F  : Full queue?" << endl;
    cout << "  >x : Put x at front    (Inactive : In-lab Exercise 2)"
         << endl;
    cout << "  =  : Get x from rear   (Inactive : In-lab Exercise 2)"
         << endl;
    cout << "  #  : Length            (Inactive : In-lab Exercise 3)"
         << endl;
    cout << "  Q  : Quit the test program" << endl;
    cout << endl;
}

void main()
{
    Queue<char> testQueue(8);   // Test queue
    char testData;              // Queue data item
    char cmd;                   // Input command

    print_help();

    do
    {
        testQueue.showStructure();                    // Output queue

        cout << endl << "Command: ";                  // Read command
        cin >> cmd;
        if ( cmd == '+'  ||  cmd == '>' )
           cin >> testData;

        switch ( cmd )
        {
          case 'H' : case 'h' :
               print_help();
               break;

          case '+' :                                  // enqueue
               cout << "Enqueue " << testData << endl;
               testQueue.enqueue(testData);
               break;

          case '-' :                                  // dequeue
               cout << "Dequeued " << testQueue.dequeue() << endl;
               break;

          case 'C' : case 'c' :                       // clear
               cout << "Clear the queue" << endl;
               testQueue.clear();
               break;

          case 'E' : case 'e' :                       // empty
               if ( testQueue.isEmpty() )
                  cout << "Queue is empty" << endl;
               else
                  cout << "Queue is NOT empty" << endl;
               break;

          case 'F' : case 'f' :                       // full
               if ( testQueue.isFull() )
                  cout << "Queue is full" << endl;
               else
                  cout << "Queue is NOT full" << endl;
               break;

//>       case '>' :                              // In-lab Exercise 2
//>            cout << "Put " << testData << " in front " << endl;
//>            testQueue.putFront(testData);
//>            break;

//=       case '=' :                              // In-lab Exercise 2
//=            cout << "Got " << testQueue.getRear() << " from rear "
//=                 << endl;
//=            break;

//#       case '#' :                              // In-lab Exercise 3
//#            cout << "Length = " << testQueue.getLength() << endl;
//#            break;

          case 'Q' : case 'q' :                   // Quit test program
               break;

          default :                               // Invalid command
               cout << "Inactive or invalid command" << endl;
        }
    }
    while ( cmd != 'Q'  &&  cmd != 'q' );

}

