-- -- C354002.A -- -- 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 the attributes of modular types yield -- correct values/results. The attributes checked are: -- -- First, Last, Range, Base, Min, Max, Succ, Pred, -- Image, Width, Value, Pos, and Val -- -- TEST DESCRIPTION: -- This test defines several modular types. One type defined at -- each of System.Max_Binary_Modulus, System.Max_Nonbinary_Modulus, -- a power of two half that of System.Max_Binary_Modulus, one less -- than that power of two; one more than that power of two, two -- less than a (large) power of two. For each of these types, -- determine the correct operation of the following attributes: -- -- First, Last, Range, Base, Min, Max, Succ, Pred, Image, Width, -- Value, Pos, Val, and Modulus -- -- The attributes Wide_Image and Wide_Value are deferred to C354003. -- -- -- -- CHANGE HISTORY: -- 08 SEP 94 SAIC Initial version -- 17 NOV 94 SAIC Revised version -- 13 DEC 94 SAIC split off Wide_String attributes into C354003 -- 06 JAN 95 SAIC Promoted to next release -- 19 APR 95 SAIC Revised in accord with reviewer comments -- 27 JAN 96 SAIC Eliminated 32/64 bit potential conflict for 2.1 -- --! with Report; with System; with TCTouch; procedure C354002 is function ID(Local_Value: Integer) return Integer renames Report.Ident_Int; function ID(Local_Value: String) return String renames Report.Ident_Str; Power_2_Bits : constant := System.Storage_Unit; Half_Max_Binary_Value : constant := System.Max_Binary_Modulus / 2; type Max_Binary is mod System.Max_Binary_Modulus; type Max_NonBinary is mod System.Max_Nonbinary_Modulus; type Half_Max_Binary is mod Half_Max_Binary_Value; type Medium is mod 2048; type Medium_Plus is mod 2042; type Medium_Minus is mod 2111; type Small is mod 2; type Finger is mod 5; MBL : constant := Max_NonBinary'Last; MNBM : constant := Max_NonBinary'Modulus; Ones_Complement_Permission : constant Boolean := MBL = MNBM; type Finger_Id is (Thumb, Index, Middle, Ring, Pinkie); subtype Midrange is Medium_Minus range 222 .. 1111; -- a few numbers for testing purposes Max_Binary_Mod_Over_3 : constant := Max_Binary'Modulus / 3; Max_NonBinary_Mod_Over_4 : constant := Max_NonBinary'Modulus / 4; System_Max_Bin_Mod_Pred : constant := System.Max_Binary_Modulus - 1; System_Max_NonBin_Mod_Pred : constant := System.Max_Nonbinary_Modulus - 1; Half_Max_Bin_Value_Pred : constant := Half_Max_Binary_Value - 1; AMB, BMB : Max_Binary; AHMB, BHMB : Half_Max_Binary; AM, BM : Medium; AMP, BMP : Medium_Plus; AMM, BMM : Medium_Minus; AS, BS : Small; AF, BF : Finger; TC_Pass_Case : Boolean := True; procedure Value_Fault( S: String ) is -- check 'Value for failure modes begin -- the evaluation of the 'Value expression should raise C_E TCTouch.Assert_Not( Midrange'Value(S) = 0, "Value_Fault" ); if Midrange'Value(S) not in Midrange'Base then Report.Failed("'Value(" & S & ") raised no exception"); end if; exception when Constraint_Error => null; -- expected case when others => Report.Failed("'Value(" & S & ") raised wrong exception"); end Value_Fault; begin -- Main test procedure. Report.Test ("C354002", "Check attributes of modular types" ); -- Base TCTouch.Assert( Midrange'Base'First = 0, "Midrange'Base'First" ); TCTouch.Assert( Midrange'Base'Last = Medium_Minus'Last, "Midrange'Base'Last" ); -- First TCTouch.Assert( Max_Binary'First = 0, "Max_Binary'First" ); TCTouch.Assert( Max_NonBinary'First = 0, "Max_NonBinary'First" ); TCTouch.Assert( Half_Max_Binary'First = 0, "Half_Max_Binary'First" ); TCTouch.Assert( Medium'First = Medium(ID(0)), "Medium'First" ); TCTouch.Assert( Medium_Plus'First = Medium_Plus(ID(0)), "Medium_Plus'First" ); TCTouch.Assert( Medium_Minus'First = Medium_Minus(ID(0)), "Medium_Minus'First" ); TCTouch.Assert( Small'First = Small(ID(0)), "Small'First" ); TCTouch.Assert( Finger'First = Finger(ID(0)), "Finger'First" ); TCTouch.Assert( Midrange'First = Midrange(ID(222)), "Midrange'First" ); -- Image TCTouch.Assert( Half_Max_Binary'Image(255) = " 255", "Half_Max_Binary'Image" ); TCTouch.Assert( Medium'Image(0) = ID(" 0"), "Medium'Image" ); TCTouch.Assert( Medium_Plus'Image(Medium_Plus'Last) = " 2041", "Medium_Plus'Image" ); TCTouch.Assert( Medium_Minus'Image(Medium_Minus(ID(1024))) = " 1024", "Medium_Minus'Image" ); TCTouch.Assert( Small'Image(Small(ID(1))) = " 1", "Small'Image" ); TCTouch.Assert( Midrange'Image(Midrange(ID(333))) = " 333", "Midrange'Image" ); -- Last TCTouch.Assert( Max_Binary'Last = System_Max_Bin_Mod_Pred, "Max_Binary'Last"); if Ones_Complement_Permission then TCTouch.Assert( Max_NonBinary'Last >= System_Max_NonBin_Mod_Pred, "Max_NonBinary'Last (ones comp)"); else TCTouch.Assert( Max_NonBinary'Last = System_Max_NonBin_Mod_Pred, "Max_NonBinary'Last"); end if; TCTouch.Assert( Half_Max_Binary'Last = Half_Max_Bin_Value_Pred, "Half_Max_Binary'Last"); TCTouch.Assert( Medium'Last = Medium(ID(2047)), "Medium'Last"); TCTouch.Assert( Medium_Plus'Last = Medium_Plus(ID(2041)), "Medium_Plus'Last"); TCTouch.Assert( Medium_Minus'Last = Medium_Minus(ID(2110)), "Medium_Minus'Last"); TCTouch.Assert( Small'Last = Small(ID(1)), "Small'Last"); TCTouch.Assert( Finger'Last = Finger(ID(4)), "Finger'Last"); TCTouch.Assert( Midrange'Last = Midrange(ID(1111)), "Midrange'Last"); -- Max TCTouch.Assert( Max_Binary'Max(Power_2_Bits, Max_Binary'Last) = Max_Binary'Last, "Max_Binary'Max"); TCTouch.Assert( Max_NonBinary'Max(100,2000) = 2000, "Max_NonBinary'Max"); TCTouch.Assert( Half_Max_Binary'Max(123,456) = 456, "Half_Max_Binary'Max"); TCTouch.Assert( Medium'Max(0,2040) = 2040, "Medium'Max"); TCTouch.Assert( Medium_Plus'Max(0,1) = 1, "Medium_Plus'Max"); TCTouch.Assert( Medium_Minus'Max(2001,1995) = 2001, "Medium_Minus'Max"); TCTouch.Assert( Small'Max(1,0) = 1, "Small'Max"); TCTouch.Assert( Finger'Max(Finger'Last+1,4) = 4, "Finger'Max"); TCTouch.Assert( Midrange'Max(Midrange'First+1,222) = Midrange'First+1, "Midrange'Max"); -- Min TCTouch.Assert( Max_Binary'Min(Power_2_Bits, Max_Binary'Last) = Power_2_Bits, "Max_Binary'Min"); TCTouch.Assert( Max_NonBinary'Min(100,2000) = 100, "Max_NonBinary'Min"); TCTouch.Assert( Half_Max_Binary'Min(123,456) = 123, "Half_Max_Binary'Min"); TCTouch.Assert( Medium'Min(0,Medium(ID(2040))) = 0, "Medium'Min"); TCTouch.Assert( Medium_Plus'Min(0,1) = 0, "Medium_Plus'Min"); TCTouch.Assert( Medium_Minus'Min(2001,1995) = 1995, "Medium_Minus'Min"); TCTouch.Assert( Small'Min(1,0) = 0, "Small'Min"); TCTouch.Assert( Finger'Min(Finger'Last+1,4) /= 4, "Finger'Min"); TCTouch.Assert( Midrange'Min(Midrange'First+1,222) = 222, "Midrange'Min"); -- Modulus TCTouch.Assert( Max_Binary'Modulus = System.Max_Binary_Modulus, "Max_Binary'Modulus"); TCTouch.Assert( Max_NonBinary'Modulus = System.Max_Nonbinary_Modulus, "Max_NonBinary'Modulus"); TCTouch.Assert( Half_Max_Binary'Modulus = Half_Max_Binary_Value, "Half_Max_Binary'Modulus"); TCTouch.Assert( Medium'Modulus = 2048, "Medium'Modulus"); TCTouch.Assert( Medium_Plus'Modulus = 2042, "Medium_Plus'Modulus"); TCTouch.Assert( Medium_Minus'Modulus = 2111, "Medium_Minus'Modulus"); TCTouch.Assert( Small'Modulus = 2, "Small'Modulus"); TCTouch.Assert( Finger'Modulus = 5, "Finger'Modulus"); TCTouch.Assert( Midrange'Modulus = ID(2111), "Midrange'Modulus"); -- Pos declare Int : Natural := 222; begin for I in Midrange loop TC_Pass_Case := TC_Pass_Case and Midrange'Pos(I) = Int; Int := Int +1; end loop; end; TCTouch.Assert( TC_Pass_Case, "Midrange'Pos"); -- Pred TCTouch.Assert( Max_Binary'Pred(0) = System_Max_Bin_Mod_Pred, "Max_Binary'Pred(0)"); if Ones_Complement_Permission then TCTouch.Assert( Max_NonBinary'Pred(0) >= System_Max_NonBin_Mod_Pred, "Max_NonBinary'Pred(0) (ones comp)"); else TCTouch.Assert( Max_NonBinary'Pred(0) = System_Max_NonBin_Mod_Pred, "Max_NonBinary'Pred(0)"); end if; TCTouch.Assert( Half_Max_Binary'Pred(0) = Half_Max_Bin_Value_Pred, "Half_Max_Binary'Pred(0)"); TCTouch.Assert( Medium'Pred(Medium(ID(0))) = 2047, "Medium'Pred(0)"); TCTouch.Assert( Medium_Plus'Pred(0) = 2041, "Medium_Plus'Pred(0)"); TCTouch.Assert( Medium_Minus'Pred(0) = 2110, "Medium_Minus'Pred(0)"); TCTouch.Assert( Small'Pred(0) = 1, "Small'Pred(0)"); TCTouch.Assert( Finger'Pred(Finger(ID(0))) = 4, "Finger'Pred(0)"); TCTouch.Assert( Midrange'Pred(222) = 221, "Midrange'Pred('First)"); -- Range for I in Midrange'Range loop if I not in Midrange then Report.Failed("Midrange loop test"); end if; end loop; for I in Medium'Range loop if I not in Medium then Report.Failed("Medium loop test"); end if; end loop; for I in Medium_Minus'Range loop if I not in 0..2110 then Report.Failed("Medium loop test"); end if; end loop; -- Succ TCTouch.Assert( Max_Binary'Succ(System_Max_Bin_Mod_Pred) = 0, "Max_Binary'Succ('Last)"); if Ones_Complement_Permission then TCTouch.Assert( (Max_NonBinary'Succ(System_Max_NonBin_Mod_Pred) = 0) or (Max_NonBinary'Succ(System_Max_NonBin_Mod_Pred) = Max_NonBinary'Last), "Max_NonBinary'Succ('Last) (ones comp)"); else TCTouch.Assert( Max_NonBinary'Succ(System_Max_NonBin_Mod_Pred) = 0, "Max_NonBinary'Succ('Last)"); end if; TCTouch.Assert( Half_Max_Binary'Succ(Half_Max_Bin_Value_Pred) = 0, "Half_Max_Binary'Succ('Last)"); TCTouch.Assert( Medium'Succ(2047) = 0, "Medium'Succ('Last)"); TCTouch.Assert( Medium_Plus'Succ(2041) = 0, "Medium_Plus'Succ('Last)"); TCTouch.Assert( Medium_Minus'Succ(2110) = 0, "Medium_Minus'Succ('Last)"); TCTouch.Assert( Small'Succ(1) = 0, "Small'Succ('Last)"); TCTouch.Assert( Finger'Succ(4) = 0, "Finger'Succ('Last)"); TCTouch.Assert( Midrange'Succ(Midrange(ID(1111))) = 1112, "Midrange'Succ('Last)"); -- Val for I in Natural range ID(222)..ID(1111) loop TCTouch.Assert( Midrange'Val(I) = Medium_Minus(I), "Midrange'Val"); end loop; -- Value TCTouch.Assert( Half_Max_Binary'Value("255") = 255, "Half_Max_Binary'Value" ); TCTouch.Assert( Medium'Value(" 1e2") = 100, "Medium'Value(""1e2"")" ); TCTouch.Assert( Medium'Value(" 0 ") = 0, "Medium'Value" ); TCTouch.Assert( Medium_Plus'Value(ID("2041")) = 2041, "Medium_Plus'Value" ); TCTouch.Assert( Medium_Minus'Value(ID("+10_24")) = 1024, "Medium_Minus'Value" ); TCTouch.Assert( Small'Value("+1") = 1, "Small'Value" ); TCTouch.Assert( Midrange'Value(ID("333")) = 333, "Midrange'Value" ); TCTouch.Assert( Midrange'Value("1E3") = 1000, "Midrange'Value(""1E3"")" ); Value_Fault( "bad input" ); Value_Fault( "-333" ); Value_Fault( "9999" ); Value_Fault( ".1" ); Value_Fault( "1e-1" ); -- Width TCTouch.Assert( Medium'Width = 5, "Medium'Width"); TCTouch.Assert( Medium_Plus'Width = 5, "Medium_Plus'Width"); TCTouch.Assert( Medium_Minus'Width = 5, "Medium_Minus'Width"); TCTouch.Assert( Small'Width = 2, "Small'Width"); TCTouch.Assert( Finger'Width = 2, "Finger'Width"); TCTouch.Assert( Midrange'Width = 5, "Midrange'Width"); Report.Result; end C354002;