-- CXF3A07.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 Ada.Text_IO.Editing.Put and Ada.Strings.Fixed.Move -- have the same effect in putting edited output results into string -- variables. -- -- TEST DESCRIPTION: -- This test is structured using tables of data, consisting of -- numerical values, picture strings, and expected image -- result strings. These data tables are found in package FXF3A00. -- -- The operation of the two above subprograms are examined twice, first -- with the output of an edited output string to a receiving string -- object of equal size, the other to a receiving string object of -- larger size, where justification and padding are considered. -- The procedure Editing.Put will place an edited output string into -- a larger receiving string with right justification and blank fill. -- Procedure Move has parameter control of justification and fill, and -- in this test will mirror Put by specifying right justification and -- blank fill. -- -- In the cases where the edited output string is of shorter length -- than the receiving string object, a blank-filled constant string -- will be catenated to the front of the expected edited output string -- for comparison with the receiving string object, enabling direct -- string comparison for result verification. -- -- TEST FILES: -- The following files comprise this test: -- -- FXF3A00.A (foundation code) -- => CXF3A07.A -- -- -- CHANGE HISTORY: -- 30 JAN 95 SAIC Initial prerelease version. -- 11 MAR 97 PWB.CTA Fixed string lengths --! with FXF3A00; with Ada.Text_IO.Editing; with Ada.Strings.Fixed; with Report; procedure CXF3A07 is begin Report.Test ("CXF3A07", "Check that Ada.Text_IO.Editing.Put and " & "Ada.Strings.Fixed.Move have the same " & "effect in putting edited output results " & "into string variables"); Test_Block: declare use Ada.Text_IO; -- Instantiate the Decimal_Output generic package for two -- different decimal data types. package Pack_2DP is -- Uses decimal type with delta 0.01. new Editing.Decimal_Output(FXF3A00.Decimal_Type_2DP); package Pack_NDP is -- Uses decimal type with delta 1.0. new Editing.Decimal_Output(Num => FXF3A00.Decimal_Type_NDP, Default_Currency => "$", Default_Fill => '*', Default_Separator => ',', Default_Radix_Mark => '.'); TC_Picture : Editing.Picture; TC_Start_Loop : Integer := 0; TC_End_Loop : Integer := 0; TC_Offset : Integer := 0; TC_Length : Natural := 0; TC_Put_String_20, -- Longer than the longest edited TC_Move_String_20 : String(1..20); -- output string. TC_Put_String_17, -- Exact length of longest edited TC_Move_String_17 : String(1..17); -- output string in 2DP-US data set. TC_Put_String_8, -- Exact length of longest edited TC_Move_String_8 : String(1..8); -- output string in NDP-US data set. begin -- Examine cases where the output string is longer than the length -- of the edited output result. Use the instantiation of -- Decimal_Output specific to data with two decimal places. TC_Start_Loop := 1; TC_End_Loop := FXF3A00.Number_of_2DP_Items - -- 10 FXF3A00.Number_Of_Foreign_Strings; for i in TC_Start_Loop..TC_End_Loop loop -- 1..10 -- Create the picture object from the picture string. TC_Picture := Editing.To_Picture(FXF3A00.Valid_Strings(i).all, Blank_When_Zero => False); -- Determine the actual length of the edited output string -- that is expected from Put and Image. TC_Length := Pack_2DP.Length(Pic => TC_Picture, Currency => "$"); -- Determine the difference in length between the receiving string -- object and the expected length of the edited output string. -- Define a blank filled string constant with length equal to this -- length difference. declare TC_Length_Diff : Integer := TC_Put_String_20'Length - TC_Length; TC_Buffer_String : constant String(1..TC_Length_Diff) := (others => ' '); begin -- Fill the two receiving string objects with edited output, -- using the two different methods (Put and Move). Pack_2DP.Put(To => TC_Put_String_20, Item => FXF3A00.Data_With_2DP(i), Pic => TC_Picture, Currency => "$", Fill => '*', Separator => ',', Radix_Mark => '.'); Ada.Strings.Fixed.Move (Source => Pack_2DP.Image(Item => FXF3A00.Data_With_2DP(i), Pic => TC_Picture, Currency => "$", Fill => '*', Separator => ',', Radix_Mark => '.'), Target => TC_Move_String_20, Drop => Ada.Strings.Error, Justify => Ada.Strings.Right, Pad => Ada.Strings.Space); -- Each receiving string object is now filled with the edited -- output result, right justified. -- Compare these two string objects with the expected edited -- output value, which is appended to the blank filled string -- whose length is the difference between the expected edited -- output length and the length of the receiving strings. if TC_Buffer_String & FXF3A00.Edited_Output(i).all /= TC_Put_String_20 or TC_Buffer_String & FXF3A00.Edited_Output(i).all /= TC_Move_String_20 then Report.Failed("Failed case where the output string is " & "longer than the length of the edited " & "output result, loop #" & Integer'Image(i)); end if; exception when Layout_Error => Report.Failed("Layout_Error raised when the output string " & "is longer than the length of the edited " & "output result, loop #" & Integer'Image(i)); when others => Report.Failed("Exception raised when the output string is " & "longer than the length of the edited " & "output result, loop #" & Integer'Image(i)); end; end loop; -- Repeat the above loop, but only evaluate three cases - those where -- the length of the expected edited output string is the exact length -- of the receiving strings (no justification will be required within -- the string. This series of evaluations again uses decimal data -- with two decimal places. for i in TC_Start_Loop..TC_End_Loop loop -- 1..10 case i is when 1 | 5 | 7 => -- Create the picture object from the picture string. TC_Picture := Editing.To_Picture(FXF3A00.Valid_Strings(i).all); -- Fill the two receiving string objects with edited output, -- using the two different methods (Put and Move). -- Use default parameters in the various calls where possible. Pack_2DP.Put(To => TC_Put_String_17, Item => FXF3A00.Data_With_2DP(i), Pic => TC_Picture); Ada.Strings.Fixed.Move (Source => Pack_2DP.Image(Item => FXF3A00.Data_With_2DP(i), Pic => TC_Picture), Target => TC_Move_String_17); -- Each receiving string object is now filled with the edited -- output result. Compare these two string objects with the -- expected edited output value. if FXF3A00.Edited_Output(i).all /= TC_Put_String_17 or FXF3A00.Edited_Output(i).all /= TC_Move_String_17 then Report.Failed("Failed case where the output string is " & "the exact length of the edited output " & "result, loop #" & Integer'Image(i)); end if; when others => null; end case; end loop; -- Evaluate a mix of cases, where the expected edited output string -- length is either exactly as long or shorter than the receiving -- output string parameter. This series of evaluations uses decimal -- data with no decimal places. TC_Start_Loop := TC_End_Loop + 1; -- 11 TC_End_Loop := TC_Start_Loop + -- 22 FXF3A00.Number_of_NDP_Items - 1; TC_Offset := FXF3A00.Number_of_Foreign_Strings; -- 10 -- This offset is required due to the arrangement of data within the -- tables found in FXF3A00. for i in TC_Start_Loop..TC_End_Loop loop -- 11..22 -- Create the picture object from the picture string. TC_Picture := Editing.To_Picture(FXF3A00.Valid_Strings(i).all); -- Determine the actual length of the edited output string -- that is expected from Put and Image. TC_Length := Pack_NDP.Length(TC_Picture); -- Fill the two receiving string objects with edited output, -- using the two different methods (Put and Move). Pack_NDP.Put(TC_Put_String_8, FXF3A00.Data_With_NDP(i-TC_Offset), TC_Picture); Ada.Strings.Fixed.Move (Pack_NDP.Image(FXF3A00.Data_With_NDP(i-TC_Offset), TC_Picture), TC_Move_String_8, Ada.Strings.Error, Ada.Strings.Right, Ada.Strings.Space); -- Determine if there is a difference in length between the -- receiving string object and the expected length of the edited -- output string. If so, then define a blank filled string constant -- with length equal to this length difference. if TC_Length < TC_Put_String_8'Length then declare TC_Length_Diff : Integer := TC_Put_String_8'Length - TC_Length; TC_Buffer_String : constant String(1..TC_Length_Diff) := (others => ' '); begin -- Each receiving string object is now filled with the edited -- output result, right justified. -- Compare these two string objects with the expected edited -- output value, which is appended to the blank filled string -- whose length is the difference between the expected edited -- output length and the length of the receiving strings. if TC_Buffer_String & FXF3A00.Edited_Output(i+TC_Offset).all /= TC_Put_String_8 or TC_Buffer_String & FXF3A00.Edited_Output(i+TC_Offset).all /= TC_Move_String_8 then Report.Failed("Failed case where the output string is " & "longer than the length of the edited " & "output result, loop #" & Integer'Image(i) & ", using data with no decimal places"); end if; end; else -- Compare these two string objects with the expected edited -- output value, which is appended to the blank filled string -- whose length is the difference between the expected edited -- output length and the length of the receiving strings. if FXF3A00.Edited_Output(i+TC_Offset).all /= TC_Put_String_8 or FXF3A00.Edited_Output(i+TC_Offset).all /= TC_Move_String_8 then Report.Failed("Failed case where the output string is " & "the same length as the edited output " & "result, loop #" & Integer'Image(i) & ", using data with no decimal places"); end if; end if; end loop; exception when others => Report.Failed("Exception raised in Test_Block"); end Test_Block; Report.Result; end CXF3A07;