//--------------------------------------------------------------------
//
//  Laboratory 3                                           test3.cpp
//
//  Test program for the operations in the List ADT
//
//--------------------------------------------------------------------

#include <iostream>
#include "listarr.h"

using namespace std;

void print_help()
{
    cout << endl << "Commands:" << endl;
    cout << "  H   : Help (displays this message)" << endl;
    cout << "  +x  : Insert x after the cursor" << endl;
    cout << "  -   : Remove the data item marked by the cursor" << endl;
    cout << "  =x  : Replace the data item marked by the cursor with x"
         << endl;
    cout << "  @   : Display the data item marked by the cursor" << endl;
    cout << "  <   : Go to the beginning of the list" << endl;
    cout << "  >   : Go to the end of the list" << endl;
    cout << "  N   : Go to the next data item" << endl;
    cout << "  P   : Go to the prior data item" << endl;
    cout << "  C   : Clear the list" << endl;
    cout << "  E   : Empty list?" << endl;
    cout << "  F   : Full list?" << endl;
    cout << "  M n : Move data item marked by cursor to pos. n "
         << " (Inactive : In-lab Ex. 2)" << endl;
    cout << "  ?x  : Search rest of list for x               "
         << " (Inactive : In-lab Ex. 3)" << endl;
    cout << "  Q   : Quit the test program" << endl;
    cout << endl;
}

void main()
{
// hack: put a "try/catch" with list creation code?
// we need to demonstrate use of the try/catch syntax.

    List testList(8);         // Test list
    char testData;            // List data item 
    int n;                    // Position within list
    char cmd;                 // Input command

    print_help();

    do
    {
        testList.showStructure();                     // Output list

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

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

          case '+' :                                  // insert
               cout << "Insert " << testData << endl;
               try
               {
                  testList.insert(testData);
               }
               catch (logic_error &e)
               {
                  cerr << "EXCEPTION: A logic error occurred in the insert function.";
               }
               break;

          case '-' :                                  // remove
               cout << "Remove the data item marked by the cursor"
                    << endl;
               try
               {
                  testList.remove();
               }
               catch (logic_error &e)
               {
                  cerr << "EXCEPTION: A logic error occurred in the remove function.";
               }
               break;

          case '=' :                                  // replace
               cout << "Replace the data item marked by the cursor "
                    << "with " << testData << endl;
               try
               {
                  testList.replace(testData);
               }
               catch (logic_error &e)
               {
                  cerr << "EXCEPTION: A logic error occurred in the replace function.";
               }
               break;

          case '@' :                                  // getCursor
               try
               {
                  testList.replace(testData);
                  cout << "Data item marked by the cursor is "
                       << testList.getCursor() << endl;
               }
               catch (logic_error &e)
               {
                  cerr << "EXCEPTION: A logic error occurred in the getCursor function.";
               }
               break;

          case '<' :                                  // gotoBeginning
               cout << "Go to the beginning of the list" << endl;
               try
               {
                  testList.gotoBeginning();
               }
               catch (logic_error &e)
               {
                  cerr << "EXCEPTION: A logic error occurred in the gotoBeginning function.";
               }
               break;

          case '>' :                                  // gotoEnd
               cout << "Go to the end of the list" << endl;
               try
               {
                  testList.gotoEnd();
               }
               catch (logic_error &e)
               {
                  cerr << "EXCEPTION: A logic error occurred in the gotoEnd function.";
               }
               break;

          case 'N' : case 'n' :                       // gotoNext
               try
               {
                  if ( testList.gotoNext() )
                     cout << "Go to the next data item" << endl;
                  else
                     cout << "Failed -- either at the end of the list "
                          << "or the list is empty" << endl;
               }
               catch (logic_error &e)
               {
                  cerr << "EXCEPTION: A logic error occurred in the gotoNext function.";
               }
               break;

          case 'P' : case 'p' :                       // gotoPrior
               try
               {
                  if ( testList.gotoPrior() )
                     cout << "Go to the prior data item" << endl;
                  else
                     cout << "Failed -- either at the beginning of the "
                          << "list or the list is empty" << endl;
               }
               catch (logic_error &e)
               {
                  cerr << "EXCEPTION: A logic error occurred in the gotoPrior function.";
               }
               break;

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

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

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

//M       case 'M' : case 'm' :                   // In-lab Exercise 2
//M            cout << "Move the data item marked by the cursor to "
//M                 << "posititon " << n << endl;
//M            try
//M            {
//M               testList.moveToNth(n);
//M            }
//M            catch (logic_error &e)
//M            {
//M               cerr << "EXCEPTION: A logic error occurred in the moveToNth function.";
//M            }
//M            break;

//?       case '?' :                              // In-lab Exercise 3
//?            try
//?            {
//?            if ( testList.find(testData) )
//?               cout << "Found" << endl;
//?            else
//?               cout << "NOT found" << endl;
//?            }
//?            catch (logic_error &e)
//?            {
//?               cerr << "EXCEPTION: A logic error occurred in the find function.";
//?            }
//?            break;

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

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

