NIST Cobol Test Suite

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.