#include <cassert>
#include <iostream>
using namespace std;

#include <GL/glut.h>
#include <GL/gl.h>

#include <commandline.h>
#include <gobjdebug01test.h>
#include <gobjtest.h>
#include <graphmisctest.h>
#include <graphicsImmediateDeferredTest.h>
#include <menusystemtest.h>
#include <OpenGLtemplatedtest.h>
#include <pointsurfacetest.h>
#include <test05.h>
#include <test07.h>
#include <triangles3Tdisplaytest.h>
#include <windowscaleD2test.h>



template <typename T>
class guilaunch
{
public:

  T x;
  guilaunch(int argc, char**argv)
    : x(argc,argv,GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH,800,600,"")
  {
    x.eval();
    glutMainLoop();
  }
};
    


int main(int argc, char**argv)
{
  commandline cmd(argc,argv);
  uint prog(0);
  cmd.mapvar(prog,"prog");

  switch (prog)
  {
    case 0:
      cout << "Test programs for graphmisc workspace" << endl << endl;

      cout << "$./main prog=5      - strings and points in 3D space displayed with text" << endl;
      //cout << "$./main prog=6      - switchContainer and some OpenGL" << endl;
      cout << "$./main prog=7      - compile display list from gobjContainer. The user" << endl;
      cout << "                      can enter the number of rings 'r' at the command line" << endl;
      cout << "                      and the torus geometry is recompiled and redisplayed." << endl;
      cout << "$./main prog=8      - Menu System Development and basic tests" << endl;

      cout << "$./main prog=10 n=4  - triangles3Tdisplay test with triangles as indexed points, vary n." << endl;
      cout << "$./main prog=11 n=60 - triangles3TdisplayN test with triangles as indexed points and normals, vary n." << endl;
      cout << "$./main prog=12     -  Normals and Color per vertex." << endl;
      cout << "$./main prog=13     -  Normals and Color per triangle." << endl;
      cout << "$./main prog=14     -  Color per triangle." << endl;

      cout << "$./main prog=25     -  Displaying a 2D oval using 2D input." << endl;
      cout << "$./main prog=26     -  Displaying the surface of a sphere using 3D input." << endl;
      cout << "$./main prog=27     -  Displaying a parallelogram with points." << endl;
      cout << "$./main prog=41" << gobjtest::doc[1] << endl;
      cout << "$./main prog=42" << gobjtest::doc[2] << endl;
      cout << "$./main prog=43" << gobjtest::doc[3] << endl;




      cout << "$./main prog=61 " << graphicsImmediateDeferredTest::doc[1] << endl;
      cout << "$./main prog=62 " << graphicsImmediateDeferredTest::doc[2] << endl;
      cout << "$./main prog=63 " << graphicsImmediateDeferredTest::doc[3] << endl;
      cout << "$./main prog=64 " << graphicsImmediateDeferredTest::doc[4] << endl;
      cout << "$./main prog=65 " << graphicsImmediateDeferredTest::doc[5] << endl;
      cout << "$./main prog=66 " << graphicsImmediateDeferredTest::doc[6] << endl;
      cout << "$./main prog=67 " << graphicsImmediateDeferredTest::doc[7] << endl;

      cout << "$./main prog=70 " << gobjdebug01test::doc[1] << endl;
      cout << "$./main prog=71 " << gobjdebug01test::doc[2] << endl;
      cout << "$./main prog=72 " << gobjdebug01test::doc[3] << endl;

      cout << "$./main prog=81 " << windowscaleD2test::doc[1] << endl;
      cout << "$./main prog=82 " << windowscaleD2test::doc[2] << endl;
   
      break;

    case 5: guilaunch<test05>(argc,argv); break;
    case 7: guilaunch<test07>(argc,argv); break;
    case 8: menusystemtest().test01(argc,argv); break;
    case 9: menusystemtest().test02(argc,argv); break;
    case 10: triangles3Tdisplaytest().test01(argc,argv); break;
    case 11: triangles3Tdisplaytest().test02(argc,argv); break;
    case 12: triangles3Tdisplaytest().test03(argc,argv); break;
    case 13: triangles3Tdisplaytest().test04(argc,argv); break;
    case 14: triangles3Tdisplaytest().test05(argc,argv); break;

    case 20: OpenGLtemplatedtest().test01(argc,argv); break;

    case 25: return pointsurfacetest().test01(argc,argv); 
    case 26: return pointsurfacetest().test02(argc,argv); 
    case 27: return pointsurfacetest().test03(argc,argv); 

    case 41: gobjtest().test001(argc,argv); break;
    case 42: gobjtest().test002(argc,argv); break;
    case 43: gobjtest().test003(argc,argv); break;

    case 55: graphmisctest::test001(); break;
    case 56: graphmisctest().test002(argc,argv); break;

    case 61: graphicsImmediateDeferredTest().test01(argc,argv); break;
    case 62: graphicsImmediateDeferredTest().test02(argc,argv); break;
    case 63: graphicsImmediateDeferredTest().test03(argc,argv); break;
    case 64: graphicsImmediateDeferredTest().test04(argc,argv); break;
    case 65: graphicsImmediateDeferredTest().test05(argc,argv); break;
    case 66: graphicsImmediateDeferredTest().test06(argc,argv); break;
    case 67: graphicsImmediateDeferredTest().test07(argc,argv); break;

    case 70: gobjdebug01test().test01(); break;
    case 71: gobjdebug01test().test02(); break;
    case 72: gobjdebug01test().test03(); break;

    case 81: return windowscaleD2test::test001(argc,argv);
    case 82: windowscaleD2test().test002(argc,argv); break;

    default: cout << "error:  No case handled." << endl; return 1;
  }



  return 0;
}



