                    Uso de la unidad Test.pas

                               por

                          Adolfo Di Mare

                    Reporte Tcnico ECCI-94-09
                       Proyecto 326-93-256
                           Revisin 1.0


Resumen:
=======

Se discute la  la implementacin de  la unidad Test.pas  que sirve 
para  probar  interactivamente Tipos  Abstractos de  Datos (ADTs), 
pues contiene operaciones que facilita la generacin de menes  de 
prueba  para  las operaciones  del ADT.   La implementacin  se ha 
realizado para el ambiente Turbo Pascal v5.0, aunque para trabajar 
con ella es ms cmodo usar la versin v6.0 o una posterior.


Abstract:
========

The implementation of  unit Test.pas is  discussed.  This unit  is 
usefull to test interactively Abstract Data Types (ADTs)   because 
it includes  operation that  easethe generation  of menus  to test 
each of the ADT operations. This implementation has been made  for 
the  Turbo  Pascal  v5.0  environment,  even  though  it  is  less 
cumbersome to use version v6.0 or later to work with it.


Esta investigacin se realiz dentro del proyecto de investigacin 
326-93-256 "DBgen: Generacin de Sistemas  a partir de su Base  de 
Datos" inscrito ante  la  Vicerrectora  de  Investigacin  de  la 
Universidad  de  Costa  Rica.   La  Escuela  de  Ciencias  de   la 
Computacin e Informtica tambin ha aportado fondos para realizar 
este trabajo.


                    Uso de la unidad Test.pas
                    =========================

Test.doc v1.0 Nov-1989 Gustavo Alonso Sanabria Sanabria
Test.doc v2.0 May-1994 Adolfo Di Mare

Programadores

     Gustavo Alonso Sanabria Sanabria
     Adolfo Di Mare
     Algunos estudiantes de Programacin II
     incluyeron otras mejoras

     La unidad Test.pas has sido diseada para que el  programador 
pueda desarrollar y  probar sus Tipos  Abstractos de Datos  (ADTs) 
sin deba dedicar mucho esfuerzo para hacer los menes del programa 
de prueba.

     Un programa de prueba interactiva de ADTS tiene las siguiente 
partes:

  1.- El ADT y sus operaciones
  2.- El cuerpo principal programa de prueba
  4.- Las variable globales sobre las que se acta
  3.- Herramientas usadas en el programa de prueba.

La  unidad Test.pas  es la ltima  parte del programa.  Una de las 
funciones ms importantes de la unidad Test.pas es generar el men 
principal del programa de prueba, relevando as al programador  de 
esta tediosa labor.

     El  programa interactivo  de prueba est  compuesto de varias 
opciones, cada una de las que aparece en el men principal. A cada 
opcin  le  corresponde un  procedimiento que  tiene, siempre,  la 
misma  forma.  Adems, todas las  opciones operan sobre las mismas 
variables globales, las  que son modificadas  por cada opcin.  En 
general, las opciones de este programa se ven como sigue:


     VAR
       GLOBAL : RECORD  { variables globales usadas por cada }
         adt : TAdt;    { una de las opciones del men       }
         F   : FILE;    { archivo para Load() y Store()      }
         { ... }
       END; 

    {$F+ Fuerza llamados lejanos}

     PROCEDURE Opcion_Convierte;
     VAR
       a,b : IONTEGER;
       etc : TOtros_Tipos;
     BEGIN { Opcion_Convierte }
       IF Test.Display THEN BEGIN
         Test.Say('Convierte()');
         EXIT;
       END;

       ADT.Print(GLOBAL.adt, OUTPUT);

       Convierte(GLOBAL.adt, a, b, etc);
     END;  { Opcion_Convierte }

     {$F- Desabilita llamados lejanos}

     En  el  men principal  del programa  de prueba  aparecer la 
opcin "Convierte()", pues la funcin de procedimiento  Test.Say() 
es precisamente obtener la hilera  que ser desplegada en el  men 
principal.  Para  asegurar que  el programa  despliegue el  rtulo 
correcto, es  necesario  que  Test.Say()   sea  invocado  slo  si 
Test.Display es TRUE.

     El men que Test.pas genera para el programa de prueba se  ve 
como sigue:

            () Borrados[0]
            () (Al revs)

                   Prueba del ADT lista mejorado
                   

               A. Pone en la lista 14 nuevos valores
               B. Purgar la lista
               C. Insertar en la cabeza
               D. Inserta al final  de la  lista
               E. Insertar
               F. Convierte()
               G. Borrar
               H. Recrear la lista con Clear()
               I. Localizar la posicin  de un  elemento
               J. Sacar un elemento por su ndice

      Memoria disponible : 214,800 bytes Opcin : : Esc ==> salir

     En  este  caso, la  opcin que  corresponde al  procedimiento 
Convierte() es la opcin F. Si el operador del programa selecciona 
la letra 'F', entonces el resultado ser que Test.pas invocar  al 
procedimiento  Opcion_Convierte, pero  asegurando que Test.Display 
sea FALSE para que  el cuerpo de la  opcin se ejecute. De  ah en 
adelante, el  resto  es  responsabilidad  del  programador  y  del 
operador del programa.

   El  protocolo  para  que  Test.pas  produzca  el  men  es   el 
siguiente:

- El ttulo del men debe definido ser invocando al  procedimiento 
  Test.Title(fila,   tipo_de_lena,  ttulo).    El  ttulo  puede 
  aparacer en  cualquier fila,  pero debe  tenerse cuidado  con la 
  presentacin.  Si  son demasiadas  opciones o  si el  ttulo del 
  men  se encuentra  en una fila  muy abajo, Test.pas  tratar de 
  poner el men en dos columnas (a partir de las columnas 3 y 40). 
  En  algunas  ocaciones  los  mensajes  quedan  truncados  o   se 
  desordena  la presentacin del men,  por lo que se recomendable 
  que las descripciones sean cortas.  En caso de haber  suficiente 
  campo bajo le  ttulo  del  men,  los  mensajes  se  despliegan 
  centrados respecto al mensaje ms largo. 

- A cada una de  la  opciones  del  men  debe  corresponderle  un 
  procedimiento que realize el trabajo asociado a la opcin.

- Debe invocarse el  procedimiento Test.AddOption(proc)  para  que 
  Test.pas  pueda  construir el  men de  opciones.  El  argumento 
  "proc" debe ser un procediento  que no tenga parmetros, y  debe 
  usar el modelo largo {$F+} de enlace a rutinas. El procedimiento 
  Opcion_Convierte()   es  un  buen   ejemplo  de  este  tipo   de 
  procedimiento.

  Las  opciones son agregadas al men  en el orden de invocacin a 
  AddOption(),  esto  es, a  el primer  llamado de  AddOption() se 
  asignar la  letra  A  en  el  men,  al  segundo  la  B  y  as 
  sucesivamente hasta la letra Z.

- Tambin se  puede  incluir  rutinas  para  ejecutarse  antes  de 
  empezar a  trabajar  con  el  men  (procedimiento  First_Proc), 
  despus de trabajar con  el  men  al  salir  totalmente  de  l 
  (procedimiento Last_Proc), as como para realizar rutinas que se 
  repiten antes de solicitar una opcin del men, despus de hacer 
  solicitar la opcin  pero  antes  de  ejecutarla  y  despus  de 
  ejecutar  esa  opcin  (procedimientos  Pre_Menu  Inter_Menu   y 
  Post_Menu,   respectivamente).   Estas   rutinas  son  definidar 
  invocando una diferentes procedimientos de Test.pas:
    Test.First_Proc (proc); (se ejecuta una vez al principio)
    Test.Last_Proc  (proc); (se ejecuta una vez al final)
    Test.Pre_Menu   (proc);
    Test.Inter_Menu (proc);
    Test.Post_Menu  (proc);
  en  donde  "proc" siempre  es un  procedimiento que  no requiere 
  argumentos y que usa enlace lejano {$F+} a subrutinas.

- Es posible forzar a que una rutina sea ejecutada cierta cantidad 
  de veces (por lo  menos una)  antes de  desplegar el men de  la 
  aplicacin.   El  programador  debe  invocar  al   procedimiento 
  Test.Force_Option(proc), para que Test.pas llama a "proc"  antes 
  de desplegar, por primera vez,  el men principal.  Es muy  til 
  invocar  a  un procedimiento  antes y  despus de  ejecutar cada 
  opcin del men,  porque entonce es  posible desplegar el  valor 
  del ADT.

  En genera, "proc" lo que hace es realizar alguna  inicializacin 
  de  variables. Por ejemple, si se  est probando el ADT lista lo 
  usual es usar Test.Force_Option() para agregarle algunos valores 
  inciales a la lista GLOBAL.L, que de otra manera estara vaca.

- Para que Test.pas comience  a trabajar, es necesario invocar  al 
  procedimiento Test.GoWork, que es el encargardo de desplegar  el 
  men principal y de invocar a las opciones seleccionadas pro  el 
  operador  del programa.  Si  se desea volver a  usar el men una 
  vez  que se sale de  l, ste debe volver a  ser llena do con la 
  informacin necesaria, pues queda inicializado.

   La funcin Test.Display sirve para indicar que se  desplegarun 
mensaje  para la  opcin (desplegado por  el procedimiento Say()). 
Esto se hace para  mantener en un slo  lugar tanto el rtulo  del 
men principal como la implementacin de una opcin.

   Tambin se  incluyen otros  procedimientos miscelneos  que son 
tiles para construir el programa interactivo. Su especifificacin 
se encuentra en la unidad.

     La principal restriccin de Test.pas es que slo maneja hasta 
26 opciones, pues a cada opcin le debe corresponder una letra  en 
el  rango  ASCII ['A'..'Z'].   En la  prctica, sin  embargo, esta 
restriccin   no  es  problema,  y   en  muchos  casos  obliga  al 
programador usuario a trabajar mejor.

Requerimientos:

- El mximo de opciones que  pueden ser manejadas por esta  unidad 
  es 26.

- Todos los procedimientos que se incluyan en las rutinas de  esta 
  unidad deben  ser compilados  con la  opcin de  forzar llamados 
  lejanos.  Esto simplemente puede lograrse mediante el  directivo 
  al complilador {$F+} colocado antes de todos los  procedimientos 
  usados, y que  puede desactivarse despus  de ellos mediante  la 
  opcin {$F-}.

     Un  ejemplo  de  uso  de  esta  unidad  est  en  el  program 
UseTest.pas, que sirve para sumar dos nmeros.


Bibliografa
============

[1] Aho, Alfred V.; John E.  Hopcroft; Jefrrey  D.  Ullman:  "Data 
    Structures and Algorithms"; 1983. [AHO-83].

[2] Borland; "Turbo Pascal Version 5.5"; 1984.

[3] Liskov, Barbara; Gutag,  John; "Abstraction  and Specification 
    in Program Development"; McGraw-Hill; 1986.

[4] Di Mare, Adolfo:  "Convenciones de  Programacin para  Pascal, 
    Revisin 2"; Reporte tcnico ECCI-01-88, ECCI-UCR, 1988.

[5] Di  Mare, Adolfo:  "Abstraccin de  Datos en  Pascal"; Reporte 
    tcnico PIBDC-01-89, ECCI-UCR, 1991.

[6] Horowitz, E.; Sahni,  S.: "Fundamentals  of Data  Structures"; 
    Computer Science Press; 1982.


               Reportes tcnicos de Adolfo Di Mare
               ===================================

     Los siguientes Reportes Tcnicos, todos confeccionados por el 
mismo autor, describen todos  las implementaciones y algunos  usos 
importantes de los ADTs programados en Turbo Pascal en al  Escuela 
de Ciencias de la Computacin e Informtica, de la Universidad  de 
Costa Rica. 

     Todas estas  implementaciones estn  disponibles en  Internet
por medio de ftp annimo en el directorio:

     http://www.di-mare.com/adolfo/p/src/Test.zip

     Los derechos de autor  estn reservados  a nombre  del autor,
Adolfo Di Mare.

     El texto de cada Reporte Tcnico se encuentra  en el  archivo
de texto nombrado entre parntesis cuadrados.

[R1]  "Prueba  interactiva  de  ADTs", Reporte  Tcnico ECCI-94-01
      [Archivo UseADT.doc]; Mayo, 1994.

[R2]  "La Implementacin de Elem.pas"; Reporte  Tcnico ECCI-94-02
      [Archivo Elem.doc]; Mayo 1994.

[R3]  "La   Implementacin   de  Rational.pas";   Reporte  Tcnico
      ECCI-94-03 [Archivo Rational.doc]; Mayo 1994.

[R4]  "La Implementacin de Poly.pas"; Reporte  Tcnico ECCI-94-04
      [Archivo Poly.doc]; Mayo 1994.

[R5]  "La    Implementacin  de   ListAHO.pas";  Reporte   Tcnico
      ECCI-94-05 [Archivo Aho.doc]; Mayo 1994.

[R6]  "La Implementacin de List.pas"; Reporte  Tcnico ECCI-94-06
      [Archivo List.doc]; Mayo 1994.

[R7]  "La Implementacin de Tree.pas"; Reporte  Tcnico ECCI-94-07
      [Archivo Tree.doc]; Mayo 1994.

[R8]  "La Implementacin de Heap.pas"; Reporte  Tcnico ECCI-94-08
      [Archivo Heap.doc]; Mayo 1994.

[R9]  "Uso  de  la  unidad Test.pas";  Reporte Tcnico  ECCI-94-09
      [Archivo Test.doc]; Mayo 1994.

[R10] "Manejo  de excepciones  en Turbo  Pascal"; Reporte  Tcnico
      ECCI-94-10 [Archivo Except.doc]; Mayo 1994.
