NIST Cobol Test Suite

Photo by Siora Photography on Unsplash

O NIST CCVS85 Test Suite é um recurso desenvolvido pelo National Computer Centre, do Reino Unido, para avaliar a aderência de determinado compilador aos padrões ANSI X3.23-1985, ISO 1989-1985, ANSI X3.23a-1989 e ANSI X3.23b-1993.

Na prática, se um compilador passa nesse teste significa que ele é compatível com o que conhecemos como Cobol 85. Este é o caso, por exemplo, do GnuCobol desde sua primeira versão.

O que ele avalia?

A suite é formada por módulos que verificam a compatibilidade e o funcionamento do compilador em determinados recursos da linguagem. Cada módulo é conhecido por duas letras, como na tabela abaixo:

Core tests:

  • NC – COBOL nucleus tests
  • SM – COPY sentence tests
  • IC – CALL sentence tests

File I-O tests:

  • SQ – Sequential file I-O tests
  • RL – Relative file I-O tests
  • IX – Indexed file I-O tests
  • ST – SORT sentence tests

Advanced facilities:

  • RW – REPORT SECTION tests
  • CM – COMMUNICATION SECTION tests
  • IF – Intrinsic Function tests
  • SG – Segment tests
  • DB – Debugging facilities tests
  • OB – Obsolete facilities tests

Como funciona?

Cada módulo é formado por dezenas de programas que, uma vez compilados pelo compilador que se pretende testar, e executados, precisam apresentar um resultado esperado.

O código abaixo é de um dos programas do módulo ST que verifica o funcionamento das várias opções do comando SORT.

000100 IDENTIFICATION DIVISION.                                         ST1234.2
000200 PROGRAM-ID.                                                      ST1234.2
000300     ST123A.                                                      ST1234.2
000400****************************************************************  ST1234.2
000500*                                                              *  ST1234.2
000600*    VALIDATION FOR:-                                          *  ST1234.2
000700*                                                              *  ST1234.2
000800*    "ON-SITE VALIDATION, NATIONAL INSTITUTE OF STD & TECH.     ".ST1234.2
000900*                                                              *  ST1234.2
001000*    "COBOL 85 VERSION 4.2, Apr  1993 SSVG                      ".ST1234.2
001100*                                                              *  ST1234.2
001200****************************************************************  ST1234.2
001300*                                                              *  ST1234.2
001400*      X-CARDS USED BY THIS PROGRAM ARE :-                     *  ST1234.2
001500*                                                              *  ST1234.2
001600*        X-01                                                  *  ST1234.2
001700*        X-02                                                  *  ST1234.2
001800*        X-27                                                  *  ST1234.2
001900*        X-55  - SYSTEM PRINTER NAME.                          *  ST1234.2
002000*        X-69                                                  *  ST1234.2
002100*        X-74                                                  *  ST1234.2
002200*        X-75                                                  *  ST1234.2
002300*        X-76                                                  *  ST1234.2
002400*        X-82  - SOURCE COMPUTER NAME.                         *  ST1234.2
002500*        X-83  - OBJECT COMPUTER NAME.                         *  ST1234.2
002600*                                                              *  ST1234.2
002700****************************************************************  ST1234.2
002800*                                                              *  ST1234.2
002900*    PROGRAM ST123A TESTS THE SORTING OF VARIABLE LENGTH       *  ST1234.2
003000*    RECORDS.  THIS PROGRAM CAN BE USED ONLY IF LEVEL 2 OF THE *  ST1234.2
003100*    SEQUENTIAL I-O MODULE IS SUPPORTED AS THE                 *  ST1234.2
003200*    "RECORD IS VARYING IN SIZE" CLAUSE IS USED IN THE SD      *  ST1234.2
003300*    ENTRY.  (ST123A WILL BE RUN AS PART OF THE SET ST122A,    *  ST1234.2
003400*    ST123A, ST124A).                                          *  ST1234.2
003500*                                                              *  ST1234.2
003600****************************************************************  ST1234.2
003700 ENVIRONMENT DIVISION.                                            ST1234.2
003800 CONFIGURATION SECTION.                                           ST1234.2
003900 SOURCE-COMPUTER.                                                 ST1234.2
004000     GNU-Linux.                                                   ST1234.2
004100 OBJECT-COMPUTER.                                                 ST1234.2
004200     GNU-Linux.                                                   ST1234.2
004300 INPUT-OUTPUT SECTION.                                            ST1234.2
004400 FILE-CONTROL.                                                    ST1234.2
004500     SELECT PRINT-FILE ASSIGN TO                                  ST1234.2
004600     "report.log".                                                ST1234.2
004700     SELECT   SORTIN-1J ASSIGN TO                                 ST1234.2
004800     "XXXXX001".                                                  ST1234.2
004900     SELECT   SORTOUT-1J ASSIGN TO                                ST1234.2
005000     "XXXXX002".                                                  ST1234.2
005100     SELECT   SORTFILE-1J ASSIGN TO                               ST1234.2
005200     "XXXXX027".                                                  ST1234.2
005300 DATA DIVISION.                                                   ST1234.2
005400 FILE SECTION.                                                    ST1234.2
005500 FD  PRINT-FILE.                                                  ST1234.2
005600 01  PRINT-REC PICTURE X(120).                                    ST1234.2
005700 01  DUMMY-RECORD PICTURE X(120).                                 ST1234.2
005800 FD  SORTIN-1J                                                    ST1234.2
005900     LABEL RECORDS STANDARD                                       ST1234.2
006500     RECORD IS VARYING IN SIZE                                    ST1234.2
006600     DATA RECORDS ARE SHORT-IN                                    ST1234.2
006700                      MEDIUM-IN                                   ST1234.2
006800                      LONG-IN.                                    ST1234.2
006900 01  SHORT-IN           PICTURE X(50).                            ST1234.2
007000 01  MEDIUM-IN          PICTURE X(75).                            ST1234.2
007100 01  LONG-IN.                                                     ST1234.2
007200     02 FALSE-LENGTH-1  PICTURE X(25).                            ST1234.2
007300     02 FALSE-LENGTH-2  PICTURE A(20).                            ST1234.2
007400     02 FALSE-LENGTH-3  PICTURE 9(15).                            ST1234.2
007500     02 FALSE-LENGTH-4  PICTURE X(40).                            ST1234.2
007600 FD  SORTOUT-1J                                                   ST1234.2
007700     LABEL RECORDS ARE STANDARD                                   ST1234.2
008300     RECORD IS VARYING IN SIZE                                    ST1234.2
008400     DATA RECORD SHORT-OUT                                        ST1234.2
008500                 MEDIUM-OUT                                       ST1234.2
008600                 LONG-OUT.                                        ST1234.2
008700 01  SHORT-OUT.                                                   ST1234.2
008800     02 FAKE-LENGTH-1   PICTURE X(10).                            ST1234.2
008900     02 FAKE-LENGTH-2   PICTURE A(10).                            ST1234.2
009000     02 FAKE-LENGTH-3   PICTURE 9(10).                            ST1234.2
009100     02 FAKE-LENGTH-4   PICTURE X(20).                            ST1234.2
009200 01  MEDIUM-OUT         PICTURE X(75).                            ST1234.2
009300 01  LONG-OUT           PICTURE X(100).                           ST1234.2
009400 SD  SORTFILE-1J                                                  ST1234.2
009500     RECORD IS VARYING IN SIZE                                    ST1234.2
009600     DATA RECORD SHORT-SORT                                       ST1234.2
009700                 MEDIUM-SORT                                      ST1234.2
009800                 LONG-SORT.                                       ST1234.2
009900 01  SHORT-SORT.                                                  ST1234.2
010000     02 SHORT-NON-KEY   PICTURE XX.                               ST1234.2
010100     02 SHORT-KEY-1     PICTURE X(10).                            ST1234.2
010200     02 SHORT-KEY-2     PICTURE X(38).                            ST1234.2
010300 01  MEDIUM-SORT.                                                 ST1234.2
010400     02 MEDIUM-NON-KEY  PICTURE XX.                               ST1234.2
010500     02 MEDIUM-KEY-1    PICTURE X(10).                            ST1234.2
010600     02 MEDIUM-KEY-2    PICTURE X(38).                            ST1234.2
010700     02 MEDIUM-FILLER   PICTURE X(25).                            ST1234.2
010800 01  LONG-SORT.                                                   ST1234.2
010900     02 LONG-NON-KEY    PICTURE XX.                               ST1234.2
011000     02 LONG-KEY-1      PICTURE X(10).                            ST1234.2
011100     02 LONG-KEY-2      PICTURE X(38).                            ST1234.2
011200     02 LONG-FILLER     PICTURE X(50).                            ST1234.2
011300 PROCEDURE    DIVISION.                                           ST1234.2
011400 SORT-PARAGRAPH.                                                  ST1234.2
011500     SORT     SORTFILE-1J                                         ST1234.2
011600              DESCENDING KEY                                      ST1234.2
011700              MEDIUM-KEY-1                                        ST1234.2
011800              MEDIUM-KEY-2                                        ST1234.2
011900              USING SORTIN-1J                                     ST1234.2
012000              GIVING SORTOUT-1J.                                  ST1234.2
012100     STOP     RUN.                                                ST1234.2

Repare que os REMARKS explicam que esse teste específico é composto por três programas: o primeiro gera o arquivo que vai ser classificado; o segundo (esse que está sendo mostrado) classifica esse arquivo por três chaves em ordem descendente; e um terceiro irá verificar o resultado.

O módulo ST possui mais ou menos outros 35 programas para fazer testes diversos do comando SORT. Um mesmo programa pode testar mais de uma situação. O relatório abaixo mostra o resultado das provas desse módulo:

Filename    total pass fail deleted inspect
--------    ----- ---- ---- ------- -------
ST101A.CBL      9    9    0       0       0 OK
ST102A.SUB      1    1    0       0       0 OK
ST103A.SUB      9    9    0       0       0 OK
ST104A.CBL      1    1    0       0       0 OK
ST105A.SUB      2    2    0       0       0 OK
ST106A.CBL      1    1    0       0       0 OK
ST107A.SUB      6    6    0       0       0 OK
ST108A.CBL      9    9    0       0       0 OK
ST109A.CBL      1    1    0       0       0 OK
ST110A.SUB      1    1    0       0       0 OK
ST111A.SUB      7    7    0       0       0 OK
ST112M.CBL      1    1    0       0       0 OK
ST113M.SUB      1    1    0       0       0 OK
ST114M.SUB     10   10    0       0       0 OK
ST115A.CBL      1    1    0       0       0 OK
ST116A.SUB      1    1    0       0       0 OK
ST117A.SUB      1    1    0       0       0 OK
ST118A.CBL      9    9    0       0       0 OK
ST119A.CBL     27   27    0       0       0 OK
ST120A.SUB      1    1    0       0       0 OK
ST121A.SUB      9    9    0       0       0 OK
ST122A.CBL      1    1    0       0       0 OK
ST123A.SUB      1    1    0       0       0 OK
ST124A.SUB      7    7    0       0       0 OK
ST125A.CBL      1    1    0       0       0 OK
ST126A.SUB     18   18    0       0       0 OK
ST127A.CBL     27   27    0       0       0 OK
ST131A.CBL     15   15    0       0       0 OK
ST132A.CBL      6    6    0       0       0 OK
ST133A.CBL     18   18    0       0       0 OK
ST134A.CBL      4    4    0       0       0 OK
ST135A.CBL      9    9    0       0       0 OK
ST136A.CBL      5    5    0       0       0 OK
ST137A.CBL      6    6    0       0       0 OK
ST139A.CBL     10   10    0       0       0 OK
ST140A.CBL     11   11    0       0       0 OK
ST144A.CBL     11   11    0       0       0 OK
ST146A.CBL      4    4    0       0       0 OK
ST147A.CBL     26   26    0       0       0 OK
ST301M.CBL      1    1    0       0       0 OK
--------    ----- ---- ---- ------- -------
Total         289  289    0       0       0

Number of programs:    40
Successfully executed: 40
Compile error:          0
Execute error:          0

Como se executa?

No Linux, quando se faz o download do GnuCobol e se descompacta o arquivo, é criado um diretório chamado ./tests/cobol85 onde estão todos os programas e scripts necessários para execução da suíte. É necessário que o perl esteja disponível no servidor.

Para executá-lo, devemos executar os seguintes comandos:

cd ./tests/cobol85
make clean
make test

O comando make test vai compilar os programas de cada módulo, executá-los e comparar os resultados gerados com os resultados esperados. No final, haverá um arquivo no diretório ./tests/cobol85 semelhante ao que se vê abaixo:

------ Directory Information -------   --- Total Tests Information ---
Module Programs Executed Error Crash   Pass Fail Deleted Inspect Total
------ -------- -------- ----- -----  ----- ---- ------- ------- -----
NC           95       95     0     0   4371    0       4      26  4401
SM           17       17     0     0    293    0       2       1   296
IC           25       25     0     0    247    0       4       0   251
SQ           85       85     0     0    521    0       0      89   610
RL           35       35     0     0   1830    0       5       0  1835
IX           42       42     0     0    510    0       1       0   511
ST           40       40     0     0    289    0       0       0   289
SG           13       13     0     0    313    0       0       0   313
OB            7        7     0     0     34    0       0       0    34
IF           45       45     0     0    735    0       0       0   735
DB           15       15     0     0    404    0       4      27   435
------ -------- -------- ----- -----  ----- ---- ------- ------- -----
Total       419      419     0     0   9547    0      20     143  9710

Nem todos os testes são obrigatórios

Como os diferentes padrões do Cobol (68, 74, 85, 2002…) estabelecem recursos obrigatórios e opcionais, nem todos os testes disponíveis no NIST COBOL Test Suite precisam ser executados.

Se um determinado compilador não oferece suporte, por exemplo, para REPORT WRITER, os testes do módulo RW podem ser desabilitados. Outro exemplo, se durante a instalação do GnuCobol o usuário optar por não habilitar o processamento de arquivos indexados, o módulo IX também pode ser inibido.

Conclusão

Esta suíte é um recurso importante para garantir que um compilador Cobol é suficientemente confiável para ser homologado para um ambiente de produção.

Seu uso não dispensa testes adicionais internos e específicos da instalação onde se pretende adotar o compilador, mas com certeza oferece uma garantia a mais de que programas codificados de acordo com o padrão Cobol ANS 85 funcionarão satisfatoriamente em um compilador open source como o GnuCobol.


Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *