blob: f2a016b096b30c40326b76624ee627159d7e620f [file] [log] [blame]
-- C74004A.ADA
-- Grant of Unlimited Rights
--
-- Under contracts F33600-87-D-0337, F33600-84-D-0280, MDA903-79-C-0687,
-- F08630-91-C-0015, and DCA100-97-D-0025, the U.S. Government obtained
-- unlimited rights in the software and documentation contained herein.
-- Unlimited rights are defined in DFAR 252.227-7013(a)(19). By making
-- this public release, the Government intends to confer upon all
-- recipients unlimited rights equal to those held by the Government.
-- These rights include rights to use, duplicate, release or disclose the
-- released technical data and computer software in whole or in part, in
-- any manner and for any purpose whatsoever, and to have or permit others
-- to do so.
--
-- DISCLAIMER
--
-- ALL MATERIALS OR INFORMATION HEREIN RELEASED, MADE AVAILABLE OR
-- DISCLOSED ARE AS IS. THE GOVERNMENT MAKES NO EXPRESS OR IMPLIED
-- WARRANTY AS TO ANY MATTER WHATSOEVER, INCLUDING THE CONDITIONS OF THE
-- SOFTWARE, DOCUMENTATION OR OTHER INFORMATION RELEASED, MADE AVAILABLE
-- OR DISCLOSED, OR THE OWNERSHIP, MERCHANTABILITY, OR FITNESS FOR A
-- PARTICULAR PURPOSE OF SAID MATERIAL.
--*
-- OBJECTIVE:
-- CHECK THAT OPERATIONS DEPENDING ON THE FULL DECLARATION OF A
-- PRIVATE TYPE ARE AVAILABLE WITHIN THE PACKAGE BODY.
-- HISTORY:
-- BCB 04/05/88 CREATED ORIGINAL TEST.
-- PWN 01/31/95 REMOVED INCONSISTENCIES WITH ADA 9X.
WITH REPORT; USE REPORT;
PROCEDURE C74004A IS
PACKAGE P IS
TYPE PR IS PRIVATE;
TYPE ARR1 IS LIMITED PRIVATE;
TYPE ARR2 IS PRIVATE;
TYPE REC (D : INTEGER) IS PRIVATE;
TYPE ACC IS PRIVATE;
TYPE TSK IS LIMITED PRIVATE;
TYPE FLT IS LIMITED PRIVATE;
TYPE FIX IS LIMITED PRIVATE;
TASK TYPE T IS
ENTRY ONE(V : IN OUT INTEGER);
END T;
PROCEDURE CHECK (V : ARR2);
PRIVATE
TYPE PR IS NEW INTEGER;
TYPE ARR1 IS ARRAY(1..5) OF INTEGER;
TYPE ARR2 IS ARRAY(1..5) OF BOOLEAN;
TYPE REC (D : INTEGER) IS RECORD
COMP1 : INTEGER;
COMP2 : BOOLEAN;
END RECORD;
TYPE ACC IS ACCESS INTEGER;
TYPE TSK IS NEW T;
TYPE FLT IS DIGITS 5;
TYPE FIX IS DELTA 2.0**(-1) RANGE -100.0 .. 100.0;
END P;
PACKAGE BODY P IS
X1, X2, X3 : PR;
BOOL : BOOLEAN := IDENT_BOOL(FALSE);
VAL : INTEGER := IDENT_INT(0);
FVAL : FLOAT := 0.0;
ST : STRING(1..2);
O1 : ARR1 := (1,2,3,4,5);
Y1 : ARR2 := (FALSE,TRUE,FALSE,TRUE,FALSE);
Y2 : ARR2 := (OTHERS => TRUE);
Y3 : ARR2 := (OTHERS => FALSE);
Z1 : REC(0) := (0,1,FALSE);
W1, W2 : ACC := NEW INTEGER'(0);
V1 : TSK;
TASK BODY T IS
BEGIN
ACCEPT ONE(V : IN OUT INTEGER) DO
V := IDENT_INT(10);
END ONE;
END T;
PROCEDURE CHECK (V : ARR2) IS
BEGIN
IF V /= (TRUE,FALSE,TRUE,FALSE,TRUE) THEN
FAILED ("IMPROPER VALUE PASSED AS AGGREGATE");
END IF;
END CHECK;
BEGIN
TEST ("C74004A", "CHECK THAT OPERATIONS DEPENDING ON THE " &
"FULL DECLARATION OF A PRIVATE TYPE ARE " &
"AVAILABLE WITHIN THE PACKAGE BODY");
X1 := 10;
X2 := 5;
X3 := X1 + X2;
IF X3 /= 15 THEN
FAILED ("IMPROPER RESULT FROM ADDITION OPERATOR");
END IF;
X3 := X1 - X2;
IF X3 /= 5 THEN
FAILED ("IMPROPER RESULT FROM SUBTRACTION OPERATOR");
END IF;
X3 := X1 * X2;
IF X3 /= 50 THEN
FAILED ("IMPROPER RESULT FROM MULTIPLICATION OPERATOR");
END IF;
X3 := X1 / X2;
IF X3 /= 2 THEN
FAILED ("IMPROPER RESULT FROM DIVISION OPERATOR");
END IF;
X3 := X1 ** 2;
IF X3 /= 100 THEN
FAILED ("IMPROPER RESULT FROM EXPONENTIATION OPERATOR");
END IF;
BOOL := X1 < X2;
IF BOOL THEN
FAILED ("IMPROPER RESULT FROM LESS THAN OPERATOR");
END IF;
BOOL := X1 > X2;
IF NOT BOOL THEN
FAILED ("IMPROPER RESULT FROM GREATER THAN OPERATOR");
END IF;
BOOL := X1 <= X2;
IF BOOL THEN
FAILED ("IMPROPER RESULT FROM LESS THAN OR EQUAL TO " &
"OPERATOR");
END IF;
BOOL := X1 >= X2;
IF NOT BOOL THEN
FAILED ("IMPROPER RESULT FROM GREATER THAN OR EQUAL " &
"TO OPERATOR");
END IF;
X3 := X1 MOD X2;
IF X3 /= 0 THEN
FAILED ("IMPROPER RESULT FROM MOD OPERATOR");
END IF;
X3 := X1 REM X2;
IF X3 /= 0 THEN
FAILED ("IMPROPER RESULT FROM REM OPERATOR");
END IF;
X3 := ABS(X1);
IF X3 /= 10 THEN
FAILED ("IMPROPER RESULT FROM ABS OPERATOR - 1");
END IF;
X1 := -10;
X3 := ABS(X1);
IF X3 /= 10 THEN
FAILED ("IMPROPER RESULT FROM ABS OPERATOR - 2");
END IF;
X3 := PR'BASE'FIRST;
IF X3 /= PR(INTEGER'FIRST) THEN
FAILED ("IMPROPER RESULT FROM 'BASE'FIRST");
END IF;
X3 := PR'FIRST;
IF X3 /= PR(INTEGER'FIRST) THEN
FAILED ("IMPROPER RESULT FROM 'FIRST");
END IF;
VAL := PR'WIDTH;
IF NOT EQUAL(VAL,INTEGER'WIDTH) THEN
FAILED ("IMPROPER RESULT FROM 'WIDTH");
END IF;
VAL := PR'POS(X3);
IF NOT EQUAL(VAL,INTEGER'FIRST) THEN
FAILED ("IMPROPER RESULT FROM 'POS");
END IF;
X3 := PR'VAL(VAL);
IF X3 /= PR(INTEGER'FIRST) THEN
FAILED ("IMPROPER RESULT FROM 'VAL");
END IF;
X3 := PR'SUCC(X2);
IF X3 /= 6 THEN
FAILED ("IMPROPER RESULT FROM 'SUCC");
END IF;
X3 := PR'PRED(X2);
IF X3 /= 4 THEN
FAILED ("IMPROPER RESULT FROM 'PRED");
END IF;
ST := PR'IMAGE(X3);
IF ST /= INTEGER'IMAGE(INTEGER(X3)) THEN
FAILED ("IMPROPER RESULT FROM 'IMAGE");
END IF;
X3 := PR'VALUE(ST);
IF X3 /= PR(INTEGER'VALUE(ST)) THEN
FAILED ("IMPROPER RESULT FROM 'VALUE");
END IF;
CHECK ((TRUE,FALSE,TRUE,FALSE,TRUE));
IF O1(2) /= IDENT_INT(2) THEN
FAILED ("IMPROPER VALUE FROM INDEXING");
END IF;
IF O1(2..4) /= (2,3,4) THEN
FAILED ("IMPROPER VALUES FROM SLICING");
END IF;
IF VAL IN O1'RANGE THEN
FAILED ("IMPROPER RESULT FROM 'RANGE");
END IF;
VAL := O1'LENGTH;
IF NOT EQUAL(VAL,5) THEN
FAILED ("IMPROPER RESULT FROM 'LENGTH");
END IF;
Y3 := Y1(1..2) & Y2(3..5);
IF Y3 /= (FALSE,TRUE,TRUE,TRUE,TRUE) THEN
FAILED ("IMPROPER RESULT FROM CATENATION");
END IF;
Y3 := NOT Y1;
IF Y3 /= (TRUE,FALSE,TRUE,FALSE,TRUE) THEN
FAILED ("IMPROPER RESULT FROM NOT OPERATOR");
END IF;
Y3 := Y1 AND Y2;
IF Y3 /= (FALSE,TRUE,FALSE,TRUE,FALSE) THEN
FAILED ("IMPROPER RESULT FROM AND OPERATOR");
END IF;
Y3 := Y1 OR Y2;
IF Y3 /= (TRUE,TRUE,TRUE,TRUE,TRUE) THEN
FAILED ("IMPROPER RESULT FROM OR OPERATOR");
END IF;
Y3 := Y1 XOR Y2;
IF Y3 /= (TRUE,FALSE,TRUE,FALSE,TRUE) THEN
FAILED ("IMPROPER RESULT FROM XOR OPERATOR");
END IF;
VAL := Z1.COMP1;
IF NOT EQUAL(VAL,1) THEN
FAILED ("IMPROPER RESULT FROM SELECTION OF RECORD " &
"COMPONENTS");
END IF;
W1 := NEW INTEGER'(0);
IF NOT EQUAL(W1.ALL,0) THEN
FAILED ("IMPROPER RESULT FROM ALLOCATION");
END IF;
W1 := NULL;
IF W1 /= NULL THEN
FAILED ("IMPROPER RESULT FROM NULL LITERAL");
END IF;
VAL := W2.ALL;
IF NOT EQUAL(VAL,0) THEN
FAILED ("IMPROPER RESULT FROM SELECTED COMPONENT");
END IF;
BOOL := V1'CALLABLE;
IF NOT BOOL THEN
FAILED ("IMPROPER RESULT FROM 'CALLABLE");
END IF;
BOOL := V1'TERMINATED;
IF BOOL THEN
FAILED ("IMPROPER RESULT FROM 'TERMINATED");
END IF;
V1.ONE(VAL);
IF NOT EQUAL(VAL,10) THEN
FAILED ("IMPROPER RESULT RETURNED FROM ENTRY SELECTION");
END IF;
IF NOT (FLT(1.0) IN FLT) THEN
FAILED ("IMPROPER RESULT FROM IMPLICIT CONVERSION");
END IF;
VAL := FLT'DIGITS;
IF NOT EQUAL(VAL,5) THEN
FAILED ("IMPROPER RESULT FROM 'DIGITS");
END IF;
BOOL := FLT'MACHINE_ROUNDS;
BOOL := FLT'MACHINE_OVERFLOWS;
VAL := FLT'MACHINE_RADIX;
VAL := FLT'MACHINE_MANTISSA;
VAL := FLT'MACHINE_EMAX;
VAL := FLT'MACHINE_EMIN;
FVAL := FIX'DELTA;
IF FVAL /= 2.0**(-1) THEN
FAILED ("IMPROPER RESULT FROM 'DELTA");
END IF;
VAL := FIX'FORE;
VAL := FIX'AFT;
END P;
USE P;
BEGIN
RESULT;
END C74004A;