with Impdef;
WITH CALENDAR; USE CALENDAR;
WITH SYSTEM; USE SYSTEM;
WITH REPORT; USE REPORT;
PROCEDURE C96001A IS
SUBTYPE INT IS INTEGER RANGE 0 .. 20_000;
BEGIN
TEST ("C96001A", "CHECK THAT DELAY STATEMENT DELAYS " &
"EXECUTION FOR AT LEAST THE SPECIFIED TIME");
DECLARE X : DURATION := 5.0;
OLD_TIME : TIME;
LAPSE : DURATION;
BEGIN LOOP
OLD_TIME := CLOCK;
DELAY X;
LAPSE := CLOCK - OLD_TIME;
EXIT;
END LOOP;
IF LAPSE < X THEN
FAILED ("DELAY DID NOT LAPSE AT LEAST 5.0 " &
"SECONDS - (A)");
END IF;
EXCEPTION
WHEN OTHERS =>
FAILED ("EXCEPTION RAISED - (A)");
END;
DECLARE OLD_TIME : TIME;
LAPSE : DURATION;
BEGIN LOOP
OLD_TIME := CLOCK;
DELAY -5.0;
LAPSE := CLOCK - OLD_TIME;
EXIT;
END LOOP;
COMMENT ("(B) - NEGATIVE DELAY LAPSED FOR " &
INT'IMAGE (INT (LAPSE * 1_000)) & " MILLISECONDS");
EXCEPTION
WHEN OTHERS =>
FAILED ("EXCEPTION RAISED - (B)");
END;
DECLARE X : DURATION := 0.0;
OLD_TIME : TIME;
LAPSE : DURATION;
BEGIN LOOP
OLD_TIME := CLOCK;
DELAY X;
LAPSE := CLOCK - OLD_TIME;
EXIT;
END LOOP;
COMMENT ("(C) - ZERO DELAY LAPSED FOR " &
INT'IMAGE (INT (LAPSE * 1_000)) & " MILLISECONDS");
EXCEPTION
WHEN OTHERS =>
FAILED ("EXCEPTION RAISED - (C)");
END;
DECLARE X : DURATION := DURATION'SMALL;
OLD_TIME : TIME;
LAPSE : DURATION;
BEGIN LOOP
OLD_TIME := CLOCK;
DELAY X;
LAPSE := CLOCK - OLD_TIME;
EXIT;
END LOOP;
IF LAPSE < X THEN
IF TICK < DURATION'SMALL THEN
FAILED ("DELAY DID NOT LAPSE AT LEAST " &
"DURATION'SMALL SECONDS - (D)");
ELSE
COMMENT ("TICK > DURATION'SMALL SO DELAY IN " &
"'(D)' IS NOT MEASURABLE");
END IF;
END IF;
EXCEPTION
WHEN OTHERS =>
FAILED ("EXCEPTION RAISED - (D)");
END;
DECLARE INC1 : DURATION := 2.0 * Impdef.One_Second;
INC2 : DURATION := 3.0 * Impdef.One_Second;
OLD_TIME : TIME;
LAPSE : DURATION;
BEGIN LOOP
OLD_TIME := CLOCK;
DELAY INC1 + INC2;
LAPSE := CLOCK - OLD_TIME;
EXIT;
END LOOP;
IF LAPSE < (INC1 + INC2) THEN
FAILED ("DELAY DID NOT LAPSE AT LEAST " &
"INC1 + INC2 SECONDS - (E)");
END IF;
EXCEPTION
WHEN OTHERS =>
FAILED ("EXCEPTION RAISED - (E)");
END;
RESULT;
END C96001A;