//-----------------------------------------------------------------
// main.C.sample 
// This file is an example for a main.C Demeter main file.
// It provides sample code fragments showing how to use some of the 
// Demeter runtime libraries. To have a quick test of your environment 
// rename this file to main.C and compile the environment. 
//-----------------------------------------------------------------

#include "UNKNOWN.h"


/*
 * GEN_DIR is a global variable containing the path of the generation
 * environment. This path is used to find the cd-print and cd-parse
 * class dictionaries.
 * Do NOT delete the following statement.
 */

char* GEN_DIR = getenv( "GEN_DIR" );

int main( int argc, char* argv[], char* envp[] )
{
   //----------------------------------------
   // Parsing an object 
   //----------------------------------------
   // specify file to parse in 
   const int MAXPATH = 256;
   char Dem_input[MAXPATH];

   // Input file is first argument
   if( argc >= 2 )
      strcpy( Dem_input, argv[1] );
   else {
      strcpy( Dem_input, "demeter-input" );  // default input 
   }

   // parse it in 
   cout << "Parsing in object in: " << Dem_input << ". \n";
   WorkFlowManagement* iWorkFlowManagement = new WorkFlowManagement();
   iWorkFlowManagement = ( WorkFlowManagement* ) iWorkFlowManagement -> g_parse( Dem_input );
   if ( iWorkFlowManagement == NULL ) {
      cerr << "Parser error." << endl;
      exit(1);
   }
   cout << endl;

   //----------------------------------------
   // Drawing an object 
   //----------------------------------------
   cout << "Drawing the parsed object:\n";
   iWorkFlowManagement -> g_draw();
   cout << "\nEnd of drawing.\n" << endl;

   //----------------------------------------
   // Copying an object 
   //----------------------------------------
   cout << "Copying the object.\n";
   WorkFlowManagement* nWorkFlowManagement = ( WorkFlowManagement* ) iWorkFlowManagement -> g_copy();
   cout << endl;

   //----------------------------------------
   // Displaying the copied object as a tree
   //----------------------------------------
   cout << "Displaying the copied object as a tree:\n";
   nWorkFlowManagement -> g_displayAsTree();
   cout << "\nEnd of display.\n" << endl;

   //----------------------------------------
   // Comparing two objects 
   //----------------------------------------
   cout << "Comparing the two objects:\n";
   if ( iWorkFlowManagement -> g_equal( nWorkFlowManagement ) == 1 )
      cout << "copied and original object are equal\n" << endl;
   else
      cout << "copied and original object are NOT equal\n" << endl;

   //----------------------------------------
   // Printing an object 
   //----------------------------------------
   cout << "Pretty printing the parsed object:\n";
   ofstream outFile( "demeter-output" );
   cout << iWorkFlowManagement << endl;
   iWorkFlowManagement -> g_print( outFile );
   outFile.close();
   cout << "\nEnd of printing.\n" << endl;

   //----------------------------------------
   // Selftest of generic parser/printer 
   //----------------------------------------
   cout << "Selftest of generic parser/printer:\n";
   WorkFlowManagement* iWorkFlowManagementprinted = new WorkFlowManagement();
   iWorkFlowManagementprinted = (WorkFlowManagement*)iWorkFlowManagementprinted->g_parse( "demeter-output" );
   if( iWorkFlowManagement->g_equal( iWorkFlowManagementprinted ) == 1 ) {
     cout << "g_parse and g_parse( g_print( g_parse ) ) are equal.\n"
          << "Selftest passed.\n";
   } else {
     cout << "g_parse and g_parse( g_print( g_parse ) ) are NOT equal.\n"
          << "Selftest failed.\n";
   }
   cout << endl;

   //----------------------------------------
   // Your own code follows after this 
   //----------------------------------------

#include "user-calls.h"
   cout << "\n*** FINISHED ***" << endl;

   return (0);
}

