-- CD92001.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 if X denotes a scalar object, X'Valid -- yields true if an only if the object denoted by X is normal and -- has a valid representation. -- -- TEST DESCRIPTION: -- Using Unchecked_Conversion, Image and Value attributes, combined -- with string manipulation, cause valid and invalid values to be -- stored in various objects. Check their validity with the -- attribute 'Valid. Invalid objects are created in a loop which -- performs a simplistic check to ensure that the values being used -- are indeed not valid, then assigns the value using an instance of -- Unchecked_Conversion. The creation of the tables of valid values -- is trivial. -- -- APPLICABILITY CRITERIA: -- All implementations must attempt to compile this test. -- -- For implementations validating against Systems Programming Annex (C): -- this test must execute and report PASSED. -- -- For implementations not validating against Annex C: -- this test may report compile time errors at one or more points -- indicated by "-- N/A => ERROR", in which case it may be graded as -- inapplicable. Otherwise, the test must execute and report PASSED. -- -- -- CHANGE HISTORY: -- 10 MAY 95 SAIC Initial version -- 07 MAY 96 SAIC Changed U_C to Ada.U_C for 2.1 -- 05 JAN 99 RLB Added Component_Size clauses to compensate -- for the fact that there is no required size -- for either the enumeration or modular components. --! with Report; with Ada.Unchecked_Conversion; with System; procedure CD92001 is type Sparse_Enumerated is ( Help, Home, Page_Up, Del, EndK, Page_Down, Up, Left, Down, Right ); for Sparse_Enumerated use ( Help => 2, Home => 4, Page_Up => 8, Del => 16, EndK => 32, Page_Down => 64, Up => 128, Left => 256, Down => 512, Right => 1024 ); type Mod_10 is mod 10; type Default_Enumerated is ( Zero, One, Two, Three, Four, Five, Six, Seven, Eight, Nine, Clear, '=', '/', '*', '-', '+', Enter ); for Default_Enumerated'Size use 8; Default_Enumerated_Count : constant := 17; type Mod_By_Enum_Items is mod Default_Enumerated_Count; type Mod_Same_Size_As_Sparse_Enum is mod 2**12; -- Sparse_Enumerated 'Size; type Mod_Same_Size_As_Def_Enum is mod 2**8; -- Default_Enumerated'Size; subtype Test_Width is Positive range 1..100; -- Note: There is no required relationship between 'Size and 'Component_Size, -- so we must use component_size clauses here. -- We use the following expressions to insure that the component size is a -- multiple of the Storage_Unit. Sparse_Component_Size : constant := ((Sparse_Enumerated'Size / System.Storage_Unit) + Boolean'Pos((Sparse_Enumerated'Size mod System.Storage_Unit) /= 0)) * System.Storage_Unit; Default_Component_Size : constant := ((Default_Enumerated'Size / System.Storage_Unit) + Boolean'Pos((Sparse_Enumerated'Size mod System.Storage_Unit) /= 0)) * System.Storage_Unit; type Sparse_Enum_Table is array(Test_Width) of Sparse_Enumerated; for Sparse_Enum_Table'Component_Size use Sparse_Component_Size; -- N/A => ERROR. type Def_Enum_Table is array(Test_Width) of Default_Enumerated; for Def_Enum_Table'Component_Size use Default_Component_Size; -- N/A => ERROR. type Sparse_Mod_Table is array(Test_Width) of Mod_Same_Size_As_Sparse_Enum; for Sparse_Mod_Table'Component_Size use Sparse_Component_Size; -- N/A => ERROR. type Default_Mod_Table is array(Test_Width) of Mod_Same_Size_As_Def_Enum; for Default_Mod_Table'Component_Size use Default_Component_Size; -- N/A => ERROR. function UC_Sparse_Mod_Enum is new Ada.Unchecked_Conversion( Sparse_Mod_Table, Sparse_Enum_Table ); function UC_Def_Mod_Enum is new Ada.Unchecked_Conversion( Default_Mod_Table, Def_Enum_Table ); Valid_Sparse_Values : Sparse_Enum_Table; Valid_Def_Values : Def_Enum_Table; Sample_Enum_Value_Table : Sparse_Mod_Table; Sample_Def_Value_Table : Default_Mod_Table; -- fill the Valid tables with valid values for conversion procedure Fill_Valid is K : Mod_10 := 0; P : Mod_By_Enum_Items := 0; begin for I in Test_Width loop Valid_Sparse_Values(I) := Sparse_Enumerated'Val( K ); Valid_Def_Values(I) := Default_Enumerated'Val( Integer(P) ); K := K +1; P := P +1; end loop; end Fill_Valid; -- fill the Sample tables with invalid values for conversion procedure Fill_Invalid is K : Mod_Same_Size_As_Sparse_Enum := 1; P : Mod_Same_Size_As_Def_Enum := 1; begin for I in Test_Width loop K := K +13; if K mod 2 = 0 then -- oops, that would be a valid value K := K +1; end if; if P = Mod_Same_Size_As_Def_Enum'Last or P < Default_Enumerated_Count then -- that would be valid P := Default_Enumerated_Count + 1; else P := P +1; end if; Sample_Enum_Value_Table(I) := K; Sample_Def_Value_Table(I) := P; end loop; Valid_Sparse_Values := UC_Sparse_Mod_Enum(Sample_Enum_Value_Table); Valid_Def_Values := UC_Def_Mod_Enum(Sample_Def_Value_Table); end Fill_Invalid; -- fill the tables with second set of valid values for conversion procedure Refill_Valid is K : Mod_10 := 0; P : Mod_By_Enum_Items := 0; Table : Array(Mod_10) of Mod_Same_Size_As_Sparse_Enum := ( 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024 ); begin for I in Test_Width loop Sample_Enum_Value_Table(I) := Table(K); Sample_Def_Value_Table(I) := Mod_Same_Size_As_Def_Enum(P); K := K +1; P := P +1; end loop; Valid_Sparse_Values := UC_Sparse_Mod_Enum(Sample_Enum_Value_Table); Valid_Def_Values := UC_Def_Mod_Enum(Sample_Def_Value_Table); end Refill_Valid; procedure Validate(Expect_Valid: Boolean) is begin -- here's where we actually use the tested attribute for K in Test_Width loop if Valid_Sparse_Values(K)'Valid /= Expect_Valid then Report.Failed("Expected 'Valid =" & Boolean'Image(Expect_Valid) & " for Sparse item " & Integer'Image(K) ); end if; end loop; for P in Test_Width loop if Valid_Def_Values(P)'Valid /= Expect_Valid then Report.Failed("Expected 'Valid =" & Boolean'Image(Expect_Valid) & " for Default item " & Integer'Image(P) ); end if; end loop; end Validate; begin -- Main test procedure. Report.Test ("CD92001", "Check object attribute: X'Valid" ); Fill_Valid; Validate(True); Fill_Invalid; Validate(False); Refill_Valid; Validate(True); Report.Result; end CD92001;