blob: 56e4c0c4ec240711d65ff5c28f21d10cf6c206fe [file] [log] [blame]
-- C460011.A
--
-- Grant of Unlimited Rights
--
-- Under contracts F33600-87-D-0337, F33600-84-D-0280, MDA903-79-C-0687 and
-- F08630-91-C-0015, 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 conversion of a decimal type to a modular type raises
-- Constraint_Error when the operand value is outside the base range
-- of the modular type.
-- Check that a conversion of a decimal type to an integer type
-- rounds correctly.
--
-- TEST DESCRIPTION:
-- Test conversion from decimal types to modular types. Test
-- conversion to mod 255, mod 256 and mod 258 to test the boundaries
-- of 8 bit (+/-) unsigned numbers.
-- Test operand values that are negative, the value of the mod,
-- and greater than the value of the mod.
-- Declare a generic test procedure and instantiate it for each of the
-- unsigned types for each operand type.
-- Check that the the operand is properly rounded during the conversion.
--
-- APPLICABILITY CRITERIA:
-- This test is applicable to all implementations which support
-- decimal types.
--
-- CHANGE HISTORY:
-- 24 NOV 98 RLB Split decimal cases from C460008 into this
-- test, added conversions to integer types.
-- 18 JAN 99 RLB Repaired errors in test.
--
--!
------------------------------------------------------------------- C460011
with Report;
procedure C460011 is
Shy_By_One : constant := 2**8-1;
Heavy_By_Two : constant := 2**8+2;
type Unsigned_Edge_8 is mod Shy_By_One;
type Unsigned_8_Bit is mod 2**8;
type Unsigned_Over_8 is mod Heavy_By_Two;
type Signed_8_Bit is range -128 .. 127;
type Signed_Over_8 is range -200 .. 200;
NPC : constant String := " not properly converted";
procedure Assert( Truth: Boolean; Message: String ) is
begin
if not Truth then
Report.Failed(Message);
end if;
end Assert;
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
type Decim is delta 0.1 digits 5; -- N/A => ERROR.
generic
type Source is delta <> digits <>;
type Target is mod <>;
procedure Decimal_Conversion_Check( For_The_Value : Source;
Message : String );
procedure Decimal_Conversion_Check( For_The_Value : Source;
Message : String ) is
Item : Target;
begin
Item := Target( For_The_Value );
Report.Failed("Deci expected Constraint_Error " & Message);
Report.Comment("Value of" & Target'Image(Item) & NPC);
exception
when Constraint_Error => null; -- expected case
when others => Report.Failed("Deci raised wrong exception " & Message);
end Decimal_Conversion_Check;
procedure Decim_To_Short is
new Decimal_Conversion_Check( Decim, Unsigned_Edge_8 );
procedure Decim_To_Eight is
new Decimal_Conversion_Check( Decim, Unsigned_8_Bit );
procedure Decim_To_Wide is
new Decimal_Conversion_Check( Decim, Unsigned_Over_8 );
function Identity( Launder: Decim ) return Decim is
Flat_Broke : constant Decim := 0.0;
begin
if Report.Ident_Bool( Launder = Flat_Broke ) then
return Flat_Broke;
else
return Launder;
end if;
end Identity;
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
begin -- Main test procedure.
Report.Test ("C460011", "Check that conversion to " &
"a modular type raises Constraint_Error when " &
"the operand value is outside the base range " &
"of the modular type" );
-- Decimal Error cases
Decim_To_Short( Identity( -5.00 ), "M2S Dynamic, Negative" );
Decim_To_Short( Shy_By_One * 1.0, "M2S Static, At_Mod" );
Decim_To_Short( 1995.9, "M2S Static, Over_Mod" );
Decim_To_Eight( -0.5, "M28 Static, Negative" );
Decim_To_Eight( 2.0*128, "M28 Static, At_Mod" );
Decim_To_Eight( Identity( 2001.2 ), "M28 Dynamic, Over_Mod" );
Decim_To_Wide ( Decim'First, "M2W Static, Negative" );
Decim_To_Wide ( Identity( 2*128.0 +2.0 ), "M2W Dynamic, At_Mod" );
Decim_To_Wide ( Decim'Last, "M2W Static, Over_Mod" );
-- Check a few, correct, edge cases, for modular types.
Eye_Dew: declare
Sense : Decim := 0.00;
Little : Unsigned_Edge_8;
Moderate : Unsigned_8_Bit;
Big : Unsigned_Over_8;
begin
Moderate := Unsigned_8_Bit (Sense);
Assert( Moderate = 0, "Sense => Moderate, 0");
Sense := 2*128.0;
Big := Unsigned_Over_8 (Sense);
Assert( Big = 256, "Sense => Big, 256");
end Eye_Dew;
Rounding: declare
Easy : Decim := Identity ( 2.0);
Simple : Decim := Identity ( 2.1);
Halfway : Decim := Identity ( 2.5);
Upward : Decim := Identity ( 2.8);
Chop : Decim := Identity (-2.2);
Neg_Half : Decim := Identity (-2.5);
Downward : Decim := Identity (-2.7);
Little : Unsigned_Edge_8;
Moderate : Unsigned_8_Bit;
Big : Unsigned_Over_8;
Also_Little:Signed_8_Bit;
Also_Big : Signed_Over_8;
begin
Little := Unsigned_Edge_8 (Easy);
Assert( Little = 2, "Easy => Little, 2");
Moderate := Unsigned_8_Bit (Simple);
Assert( Moderate = 2, "Simple => Moderate, 2");
Big := Unsigned_Over_8 (Halfway); -- Rounds up by 4.6(33).
Assert( Big = 3, "Halfway => Big, 3");
Little := Unsigned_Edge_8 (Upward);
Assert( Little = 3, "Upward => Little, 3");
Also_Big := Signed_Over_8 (Halfway); -- Rounds up by 4.6(33).
Assert( Also_Big = 3, "Halfway => Also_Big, 3");
Also_Little := Signed_8_Bit (Chop);
Assert( Also_Little = -2, "Chop => Also_Little, -2");
Also_Big := Signed_Over_8 (Neg_Half); -- Rounds down by 4.6(33).
Assert( Also_Big = -3, "Halfway => Also_Big, -3");
Also_Little := Signed_8_Bit (Downward);
Assert( Also_Little = -3, "Downward => Also_Little, -3");
end Rounding;
Report.Result;
end C460011;