#include <stdio.h>

#include "DeviceToolKits/Console.h"
#ifndef  TESTPROTO
#define  NO_PRAGMAS  1
#endif
#include "DeviceToolKits/proto/Console.h"
#include "DeviceToolKits/ConsoleBase.h"

ULONG                   DosBase = 0;
ULONG                   DiskFontBase = 0;
struct   IntuitionBase  *IntuitionBase = 0;
ULONG                   GfxBase = 0;

struct   NewWindow      nw = {
   10, 10,                       /* starting position (left,top) */
   620,90,                       /* width, height */
   -1,-1,                        /* detailpen, blockpen */
   0,                            /* flags for idcmp */
   WINDOWDEPTH|WINDOWSIZING|WINDOWDRAG|SIMPLE_REFRESH|ACTIVATE|GIMMEZEROZERO,
                                /* window gadget flags */
   0,                           /* pointer to 1st user gadget */
   NULL,                        /* pointer to user check */
   (UBYTE *)"Console Test",     /* title */
   NULL,                        /* pointer to window screen */
   NULL,                        /* pointer to super bitmap */
   100,45,                      /* min width, height */
   640,200,                     /* max width, height */
   WBENCHSCREEN
};

struct   Window         *w;
struct   RastPort       *rp;

DTConsole_t             Console1;

main(argc,argv)
int   argc;
char  *argv[];
{
   long  status;
   int   i;

/*  Open the necessary libraries  */

   if ((DosBase = (ULONG) OpenLibrary("dos.library",0L)) == (ULONG) NULL) {
      fprintf(stderr,"Could not open dos.library.\n");
      fflush(stderr);
      goto cleanup;
   }
   if ((DiskFontBase = (ULONG) OpenLibrary("diskfont.library",0L)) == (ULONG) NULL) {
      fprintf(stderr,"Could not open diskfont.library.\n");
      fflush(stderr);
      goto cleanup;
   }
   if ((IntuitionBase = (struct IntuitionBase *) OpenLibrary(
    "intuition.library",0L)) == NULL) {
      fprintf(stderr,"Could not open intuition.library.\n");
      fflush(stderr);
      goto cleanup;
   }
   if ((GfxBase = (ULONG) OpenLibrary("graphics.library",0L)) == (ULONG) NULL) {
      fprintf(stderr,"Could not open graphics.library.\n");
      fflush(stderr);
      goto cleanup;
   }

#ifdef   TESTSHARED
/*  Open the Console library  */

   DTConsoleOpen(DTCONSOLEREV);
#endif

/*  Create the window for console testing  */

   w = OpenWindow(&nw);
   if (w == NULL) {
      fprintf(stderr,"Could not open test window.\n");
      fflush(stderr);
      goto cleanup;
   }

/*  Open the Console Device  */

   if ((Console1 = DTConsoleCreate(w,&status)) == NULL) {
      fprintf(stderr,"Error initializing console device = %ld.\n",status);
      fflush(stderr);
      goto cleanup;
   }

/*  Begin tests  */

   DTConsoleWrite(Console1,"Hello, World\r\n",14L);

   DTConsoleWriteStr(Console1,"Testing BACKSPACE");
   for (i=0; i<10; i++) {
      DTConsoleBACKSPACE(Console1);
      Delay(30L);
   }
   DTConsoleWriteStr(Console1,"\r\n");

   DTConsoleWriteStr(Console1,"Testing TAB\r");
   for (i=0; i<6; i++) {
      DTConsoleTAB(Console1);
      Delay(30L);
   }
   DTConsoleWriteStr(Console1,"\r\n");

   DTConsoleWriteStr(Console1,"Testing LINEFEED\r");
   for (i=0; i<4; i++) {
      DTConsoleLINEFEED(Console1);
      Delay(30L);
   }
   DTConsoleWriteStr(Console1,"\r\n");

   DTConsoleWriteStr(Console1,"Testing VERTICALTAB\r");
   for (i=0; i<4; i++) {
      DTConsoleVERTICALTAB(Console1);
      Delay(30L);
   }
   DTConsoleWriteStr(Console1,"\r\n");

   DTConsoleWriteStr(Console1,"Testing FORMFEED\r");
   Delay(30L);
   for (i=0; i<2; i++) {
      DTConsoleFORMFEED(Console1);
      Delay(30L);
   }
   DTConsoleWriteStr(Console1,"\r\n");

   DTConsoleWriteStr(Console1,"Testing CR");
   Delay(30L);
   DTConsoleCR(Console1);
   Delay(60L);
   DTConsoleWriteStr(Console1,"\r\n");

   DTConsoleWriteStr(Console1,"Testing INSCHAR\r");
   for(i=0; i<4; i++) {
      DTConsoleINSCHAR(Console1,"1");
      Delay(30L);
   }
   DTConsoleWriteStr(Console1,"\r\n");

   DTConsoleWriteStr(Console1,"    Testing DELCHAR\r");
   DTConsoleCR(Console1);
   for(i=0; i<4; i++) {
      DTConsoleDELCHAR(Console1,"1");
      Delay(30L);
   }
   DTConsoleWriteStr(Console1,"\r\n");

   DTConsoleWriteStr(Console1,"Testing INSLINE\r");
   DTConsoleCR(Console1);
   for(i=0; i<3; i++) {
      DTConsoleINSLINE(Console1,"1");
      Delay(30L);
   }
   DTConsoleWriteStr(Console1,"\r\n");

   DTConsoleWriteStr(Console1,"Testing DELLINE\r");
   DTConsoleCR(Console1);
   DTConsoleLINEFEED(Console1);
   Delay(60L);
   for(i=0; i<4; i++) {
      DTConsoleDELLINE(Console1,"1");
      Delay(30L);
   }
   DTConsoleWriteStr(Console1,"\r\n");

   DTConsoleWriteStr(Console1,"Testing CURSUP\r");
   for(i=0; i<4; i++) {
      DTConsoleCURSUP(Console1,"1");
      Delay(30L);
   }
   DTConsoleWriteStr(Console1,"\r\n");

   DTConsoleWriteStr(Console1,"Testing CURSDOWN\r");
   for(i=0; i<4; i++) {
      DTConsoleCURSDOWN(Console1,"1");
      Delay(30L);
   }
   DTConsoleWriteStr(Console1,"\r\n");

   DTConsoleWriteStr(Console1,"Testing CURSRIGHT\r");
   for(i=0; i<4; i++) {
      DTConsoleCURSRIGHT(Console1,"1");
      Delay(30L);
   }
   DTConsoleWriteStr(Console1,"\r\n");

   DTConsoleWriteStr(Console1,"Testing CURSLEFT");
   for(i=0; i<4; i++) {
      DTConsoleCURSLEFT(Console1,"1");
      Delay(30L);
   }
   DTConsoleWriteStr(Console1,"\r\n");

   DTConsoleWriteStr(Console1,"Testing CURSPREVLINE");
   for(i=0; i<4; i++) {
      DTConsoleCURSPREVLINE(Console1,"1");
      Delay(30L);
   }
   DTConsoleWriteStr(Console1,"\r\n");

   DTConsoleWriteStr(Console1,"Testing CURSNEXTLINE");
   for(i=0; i<4; i++) {
      DTConsoleCURSNEXTLINE(Console1,"1");
      Delay(30L);
   }
   DTConsoleWriteStr(Console1,"\r\n");

   DTConsoleWriteStr(Console1,"Testing ERASEEOD");
   DTConsoleCURSPREVLINE(Console1,"3");
   Delay(60L);
   for(i=0; i<4; i++) {
      DTConsoleERASEEOD(Console1);
      Delay(30L);
   }
   DTConsoleWriteStr(Console1,"\r\n");

   DTConsoleWriteStr(Console1,"Testing ERASEEOL.junk");
   DTConsoleCURSLEFT(Console1,"5");
   Delay(60L);
   DTConsoleERASEEOL(Console1);
   Delay(30L);
   DTConsoleWriteStr(Console1,"\r\n");

   DTConsoleWriteStr(Console1,"Testing SCROLLUP");
   for(i=0; i<4; i++) {
      DTConsoleSCROLLUP(Console1,"1");
      Delay(30L);
   }
   DTConsoleWriteStr(Console1,"\r\n");

   DTConsoleWriteStr(Console1,"Testing SCROLLDOWN");
   DTConsoleWriteStr(Console1,"\n\n\n");
   for(i=0; i<4; i++) {
      DTConsoleSCROLLDOWN(Console1,"1");
      Delay(30L);
   }
   DTConsoleWriteStr(Console1,"\r\n");

   DTConsoleWriteStr(Console1,"Testing CURSOROFF");
   DTConsoleCURSOROFF(Console1);
   DTConsoleWriteStr(Console1,"printed.with.cursor.off");
   Delay(60L);
   DTConsoleWriteStr(Console1,"\r\n");

   DTConsoleCURSORON(Console1);
   Delay(30L);
   DTConsoleWriteStr(Console1,"Testing CURSORON");

cleanup:
   DTConsoleFree(Console1);
   if (w != NULL) {
      CloseWindow(w);
   }
#ifdef   TESTSHARED
   DTConsoleClose();
#endif
   if (GfxBase != (ULONG) NULL) {
      CloseLibrary((struct Library *) GfxBase);
   }
   if (IntuitionBase != NULL) {
      CloseLibrary((struct Library *) IntuitionBase);
   }
   if (DiskFontBase != (ULONG) NULL) {
      CloseLibrary((struct Library *) DiskFontBase);
   }
   if (DosBase != (ULONG) NULL) {
      CloseLibrary((struct Library *) DosBase);
   }
}

