1-- CXF3004.A
2--
3--                             Grant of Unlimited Rights
4--
5--     Under contracts F33600-87-D-0337, F33600-84-D-0280, MDA903-79-C-0687,
6--     F08630-91-C-0015, and DCA100-97-D-0025, the U.S. Government obtained
7--     unlimited rights in the software and documentation contained herein.
8--     Unlimited rights are defined in DFAR 252.227-7013(a)(19).  By making
9--     this public release, the Government intends to confer upon all
10--     recipients unlimited rights  equal to those held by the Government.
11--     These rights include rights to use, duplicate, release or disclose the
12--     released technical data and computer software in whole or in part, in
13--     any manner and for any purpose whatsoever, and to have or permit others
14--     to do so.
15--
16--                                    DISCLAIMER
17--
18--     ALL MATERIALS OR INFORMATION HEREIN RELEASED, MADE AVAILABLE OR
19--     DISCLOSED ARE AS IS.  THE GOVERNMENT MAKES NO EXPRESS OR IMPLIED
20--     WARRANTY AS TO ANY MATTER WHATSOEVER, INCLUDING THE CONDITIONS OF THE
21--     SOFTWARE, DOCUMENTATION OR OTHER INFORMATION RELEASED, MADE AVAILABLE
22--     OR DISCLOSED, OR THE OWNERSHIP, MERCHANTABILITY, OR FITNESS FOR A
23--     PARTICULAR PURPOSE OF SAID MATERIAL.
24--*
25--
26-- OBJECTIVE:
27--      Check that statically identifiable picture strings can be used
28--      in conjunction with function Image to produce output strings
29--      appropriate to foreign currency representations.
30--
31--      Check that statically identifiable picture strings will cause
32--      function Image to raise Layout_Error under the appropriate
33--      conditions.
34--
35-- TEST DESCRIPTION:
36--      This test defines several picture strings that are statically
37--      identifiable, (i.e.,  Pic : Picture := To_Picture("..."); ).
38--      These picture strings are used in conjunction with decimal data
39--      as parameters in calls to function Image.
40--
41--
42-- CHANGE HISTORY:
43--      11 Apr 96   SAIC    Initial release for 2.1.
44--
45--!
46
47with Report;
48with Ada.Text_IO.Editing;
49with Ada.Exceptions;
50
51procedure CXF3004 is
52begin
53
54   Report.Test ("CXF3004", "Check that statically identifiable "        &
55                           "picture strings will cause function Image " &
56                           "to raise Layout_Error under appropriate "   &
57                           "conditions");
58
59   Test_Block:
60   declare
61
62      use Ada.Exceptions;
63      use Ada.Text_IO.Editing;
64
65      FF_Currency  : constant String    := "FF";
66      DM_Currency  : constant String    := "DM";
67      FF_Separator : constant Character := '.';
68      DM_Separator : constant Character := ',';
69      FF_Radix     : constant Character := ',';
70      DM_Radix     : constant Character := '.';
71      Blank_Fill   : constant Character := ' ';
72      Star_Fill    : constant Character := '*';
73
74
75      -- Define a decimal data type, and instantiate the Decimal_Output
76      -- generic package for the data type.
77
78      type Decimal_Data_Type is delta 0.01 digits 16;
79
80      package Image_IO is
81        new Decimal_Output(Num                => Decimal_Data_Type,
82                           Default_Currency   => "$",
83                           Default_Fill       => Star_Fill,
84                           Default_Separator  => Default_Separator,
85                           Default_Radix_Mark => DM_Radix);
86
87
88
89      -- The following decimal data items are used with picture strings
90      -- in evaluating use of foreign currency symbols.
91
92      Dec_Data_1 : Decimal_Data_Type := 123456.78;
93      Dec_Data_2 : Decimal_Data_Type :=     32.10;
94      Dec_Data_3 : Decimal_Data_Type :=  -1234.57;
95      Dec_Data_4 : Decimal_Data_Type := 123456.78;
96      Dec_Data_5 : Decimal_Data_Type :=     12.34;
97      Dec_Data_6 : Decimal_Data_Type :=     12.34;
98      Dec_Data_7 : Decimal_Data_Type :=  12345.67;
99
100
101      -- Statically identifiable picture strings.
102      -- These strings are used in conjunction with non-default values
103      -- for Currency string, Radix mark, and Separator in calls to
104      -- function Image.
105
106      Picture_1 : Picture := To_Picture("-###**_***_**9.99");    -- FF
107      Picture_2 : Picture := To_Picture("###z_ZZ9.99");          -- FF
108      Picture_3 : Picture := To_Picture("<<<<_<<<.<<###>");      -- DM
109      Picture_4 : Picture := To_Picture("-$_$$$_$$$_$$9.99");    -- DM
110      Picture_5 : Picture := To_Picture("$Zz9.99");              -- DM
111      Picture_6 : Picture := To_Picture("$$$9.99");              -- DM
112      Picture_7 : Picture := To_Picture("###_###_##9.99");       -- CHF
113
114
115      -- The following ten edited output strings correspond to the ten
116      -- foreign currency picture strings.
117
118      Output_1 : constant String := "  FF***123.456,78";
119      Output_2 : constant String := " FF   32,10";
120      Output_3 : constant String := "  (1,234.57DM )";
121      Output_4 : constant String := "      DM123,456.78";
122      Output_5 : constant String := "DM 12.34";
123      Output_6 : constant String := " DM12.34";
124      Output_7 : constant String := "  CHF12,345.67";
125
126
127   begin
128
129      -- Check the results of function Image, using the picture strings
130      -- constructed above, in creating foreign currency edited output
131      -- strings.
132
133      if Image_IO.Image(Item       => Dec_Data_1,
134                        Pic        => Picture_1,
135                        Currency   => FF_Currency,
136                        Fill       => Star_Fill,
137                        Separator  => FF_Separator,
138                        Radix_Mark => FF_Radix) /= Output_1
139      then
140         Report.Failed("Incorrect result from Fn. Image using Picture_1");
141      end if;
142
143      if Image_IO.Image(Item       => Dec_Data_2,
144                        Pic        => Picture_2,
145                        Currency   => FF_Currency,
146                        Fill       => Blank_Fill,
147                        Separator  => FF_Separator,
148                        Radix_Mark => FF_Radix) /= Output_2
149      then
150         Report.Failed("Incorrect result from Fn. Image using Picture_2");
151      end if;
152
153      if Image_IO.Image(Item       => Dec_Data_3,
154                        Pic        => Picture_3,
155                        Currency   => DM_Currency,
156                        Fill       => Blank_Fill,
157                        Separator  => DM_Separator,
158                        Radix_Mark => DM_Radix) /= Output_3
159      then
160         Report.Failed("Incorrect result from Fn. Image using Picture_3");
161      end if;
162
163      if Image_IO.Image(Item       => Dec_Data_4,
164                        Pic        => Picture_4,
165                        Currency   => DM_Currency,
166                        Fill       => Blank_Fill,
167                        Separator  => DM_Separator,
168                        Radix_Mark => DM_Radix) /= Output_4
169      then
170         Report.Failed("Incorrect result from Fn. Image using Picture_4");
171      end if;
172
173      if Image_IO.Image(Item       => Dec_Data_5,
174                        Pic        => Picture_5,
175                        Currency   => DM_Currency,
176                        Fill       => Blank_Fill,
177                        Separator  => DM_Separator,
178                        Radix_Mark => DM_Radix) /= Output_5
179      then
180         Report.Failed("Incorrect result from Fn. Image using Picture_5");
181      end if;
182
183      if Image_IO.Image(Item       => Dec_Data_6,
184                        Pic        => Picture_6,
185                        Currency   => DM_Currency,
186                        Fill       => Blank_Fill,
187                        Separator  => DM_Separator,
188                        Radix_Mark => DM_Radix) /= Output_6
189      then
190         Report.Failed("Incorrect result from Fn. Image using Picture_6");
191      end if;
192
193      if Image_IO.Image(Item       => Dec_Data_7,
194                        Pic        => Picture_7,
195                        Currency   => "CHF",
196                        Fill       => Blank_Fill,
197                        Separator  => ',',
198                        Radix_Mark => '.') /= Output_7
199      then
200         Report.Failed("Incorrect result from Fn. Image using Picture_7");
201      end if;
202
203
204      -- The following calls of Function Image, using the specific
205      -- decimal values and picture strings provided, will cause
206      -- a Layout_Error to be raised.
207      -- Note: The data and the picture strings used in the following
208      --       evaluations are not themselves erroneous, but when used in
209      --       combination will cause Layout_Error to be raised.
210
211      Exception_Block_1 :
212      declare
213         Erroneous_Data_1    : Decimal_Data_Type :=  12.34;
214         Erroneous_Picture_1 : Picture := To_Picture("9.99");
215         N         : constant Natural := Image_IO.Length(Erroneous_Picture_1);
216         TC_String : String(1..N);
217      begin
218         TC_String := Image_IO.Image(Erroneous_Data_1, Erroneous_Picture_1);
219         Report.Failed("Layout_Error not raised by combination of "  &
220                       "Erroneous_Picture_1 and Erroneous_Data_1");
221         Report.Comment("Should never be printed: " & TC_String);
222      exception
223         when Ada.Text_IO.Layout_Error => null; -- OK, expected exception.
224         when The_Error : others       =>
225            Report.Failed
226              ("The following exception was incorrectly raised in " &
227               "Exception_Block_1: " & Exception_Name(The_Error));
228      end Exception_Block_1;
229
230      Exception_Block_2 :
231      declare
232         Erroneous_Data_2    : Decimal_Data_Type :=  -12.34;
233         Erroneous_Picture_2 : Picture := To_Picture("99.99");
234         N         : constant Natural := Image_IO.Length(Erroneous_Picture_2);
235         TC_String : String(1..N);
236      begin
237         TC_String := Image_IO.Image(Erroneous_Data_2, Erroneous_Picture_2);
238         Report.Failed("Layout_Error not raised by combination of "  &
239                       "Erroneous_Picture_2 and Erroneous_Data_2");
240         Report.Comment("Should never be printed: " & TC_String);
241      exception
242         when Ada.Text_IO.Layout_Error => null; -- OK, expected exception.
243         when The_Error : others       =>
244            Report.Failed
245              ("The following exception was incorrectly raised in " &
246               "Exception_Block_2: " & Exception_Name(The_Error));
247      end Exception_Block_2;
248
249   exception
250      when The_Error : others =>
251         Report.Failed("The following exception was raised in the " &
252                       "Test_Block: " & Exception_Name(The_Error));
253   end Test_Block;
254
255   Report.Result;
256
257end CXF3004;
258