diff options
author | upstream source tree <ports@midipix.org> | 2015-03-15 20:14:05 -0400 |
---|---|---|
committer | upstream source tree <ports@midipix.org> | 2015-03-15 20:14:05 -0400 |
commit | 554fd8c5195424bdbcabf5de30fdc183aba391bd (patch) | |
tree | 976dc5ab7fddf506dadce60ae936f43f58787092 /gcc/testsuite/ada/acats/tests/cxa | |
download | cbb-gcc-4.6.4-554fd8c5195424bdbcabf5de30fdc183aba391bd.tar.bz2 cbb-gcc-4.6.4-554fd8c5195424bdbcabf5de30fdc183aba391bd.tar.xz |
obtained gcc-4.6.4.tar.bz2 from upstream website;upstream
verified gcc-4.6.4.tar.bz2.sig;
imported gcc-4.6.4 source tree from verified upstream tarball.
downloading a git-generated archive based on the 'upstream' tag
should provide you with a source tree that is binary identical
to the one extracted from the above tarball.
if you have obtained the source via the command 'git clone',
however, do note that line-endings of files in your working
directory might differ from line-endings of the respective
files in the upstream repository.
Diffstat (limited to 'gcc/testsuite/ada/acats/tests/cxa')
86 files changed, 31445 insertions, 0 deletions
diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxa3001.a b/gcc/testsuite/ada/acats/tests/cxa/cxa3001.a new file mode 100644 index 000000000..9c7e25b97 --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxa3001.a @@ -0,0 +1,507 @@ +-- CXA3001.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 character classification functions defined in +-- package Ada.Characters.Handling produce correct results when provided +-- constant arguments from package Ada.Characters.Latin_1. +-- +-- TEST DESCRIPTION: +-- This test checks the character classification functions of package +-- Ada.Characters.Handling. In the evaluation of each function, loops +-- are constructed to examine the function with as many values of type +-- Character (Ada.Characters.Latin_1 constants) as possible in an +-- amount of code that is about equal to the amount of code required +-- to examine the function with a few representative input values and +-- endpoint values. +-- The usage paradigm being demonstrated by this test is that of the +-- functions being used to assign to boolean variables, as well as +-- serving as boolean conditions. +-- +-- +-- CHANGE HISTORY: +-- 06 Dec 94 SAIC ACVC 2.0 +-- 29 Apr 95 SAIC Fixed subtest checking Is_Graphic function. +-- +--! + +with Ada.Characters.Latin_1; +with Ada.Characters.Handling; +with Report; + +procedure CXA3001 is + +begin + + Report.Test ("CXA3001", "Check that the character classification " & + "functions defined in package " & + "Ada.Characters.Handling produce " & + "correct results when provided constant " & + "arguments from package Ada.Characters.Latin_1"); + + Test_Block: + declare + + package AC renames Ada.Characters; + package ACH renames Ada.Characters.Handling; + + TC_Boolean : Boolean := False; + + begin + + -- Over the next six statements/blocks of code, evaluate functions + -- Is_Control and Is_Graphic with control character and non-control + -- character values. + + for i in Character'Pos(AC.Latin_1.NUL) .. + Character'Pos(AC.Latin_1.US) loop + if not ACH.Is_Control(Character'Val(i)) then + Report.Failed ("Incorrect result from function Is_Control - 1"); + end if; + if ACH.Is_Graphic(Character'Val(i)) then + Report.Failed ("Incorrect result from function Is_Graphic - 1"); + end if; + end loop; + + + for i in Character'Pos(AC.Latin_1.Space) .. + Character'Pos(AC.Latin_1.Tilde) loop + if not ACH.Is_Graphic(Character'Val(i)) then + Report.Failed ("Incorrect result from function Is_Graphic - 2"); + end if; + if ACH.Is_Control(Character'Val(i)) then + Report.Failed ("Incorrect result from function Is_Control - 2"); + end if; + end loop; + + + for i in Character'Pos(AC.Latin_1.Reserved_128) .. + Character'Pos(AC.Latin_1.APC) loop + if not ACH.Is_Control(Character'Val(i)) then + Report.Failed ("Incorrect result from function Is_Control - 3"); + end if; + TC_Boolean := ACH.Is_Graphic(Character'Val(i)); + if TC_Boolean then + Report.Failed ("Incorrect result from function Is_Graphic - 3"); + TC_Boolean := False; + end if; + end loop; + + for i in Character'Pos(AC.Latin_1.No_Break_Space) .. + Character'Pos(AC.Latin_1.LC_Y_Diaeresis) loop + TC_Boolean := ACH.Is_Control(Character'Val(i)); + if TC_Boolean then + Report.Failed ("Incorrect result from function Is_Control - 4"); + TC_Boolean := False; + end if; + if not ACH.Is_Graphic(Character'Val(i)) then + Report.Failed ("Incorrect result from function Is_Graphic - 4"); + end if; + end loop; + + -- Check renamed constants. + + if not (ACH.Is_Control(AC.Latin_1.IS4) and + ACH.Is_Control(AC.Latin_1.IS3) and + ACH.Is_Control(AC.Latin_1.IS2) and + ACH.Is_Control(AC.Latin_1.IS1)) or + (ACH.Is_Control(AC.Latin_1.NBSP) or + ACH.Is_Control(AC.Latin_1.Paragraph_Sign) or + ACH.Is_Control(AC.Latin_1.Minus_Sign) or + ACH.Is_Control(AC.Latin_1.Ring_Above)) + then + Report.Failed ("Incorrect result from function Is_Control - 5"); + end if; + + if (ACH.Is_Graphic(AC.Latin_1.IS4) or + ACH.Is_Graphic(AC.Latin_1.IS3) or + ACH.Is_Graphic(AC.Latin_1.IS2) or + ACH.Is_Graphic(AC.Latin_1.IS1)) or + not (ACH.Is_Graphic(AC.Latin_1.NBSP) and + ACH.Is_Graphic(AC.Latin_1.Paragraph_Sign) and + ACH.Is_Graphic(AC.Latin_1.Minus_Sign) and + ACH.Is_Graphic(AC.Latin_1.Ring_Above)) + then + Report.Failed ("Incorrect result from function Is_Graphic - 5"); + end if; + + + -- Evaluate function Is_Letter with letter/non-letter inputs. + + for i in Character'Pos('A') .. Character'Pos('Z') loop + if not ACH.Is_Letter(Character'Val(i)) then + Report.Failed ("Incorrect Is_Letter result - 1"); + end if; + end loop; + + for i in Character'Pos(AC.Latin_1.LC_A) .. + Character'Pos(AC.Latin_1.LC_Z) loop + if not ACH.Is_Letter(Character'Val(i)) then + Report.Failed ("Incorrect Is_Letter result - 2"); + end if; + end loop; + + for i in Character'Pos(AC.Latin_1.UC_A_Grave) .. + Character'Pos(AC.Latin_1.UC_O_Diaeresis) loop + if not ACH.Is_Letter(Character'Val(i)) then + Report.Failed ("Incorrect Is_Letter result - 3"); + end if; + end loop; + + for i in Character'Pos(AC.Latin_1.UC_O_Oblique_Stroke) .. + Character'Pos(AC.Latin_1.LC_O_Diaeresis) loop + if not ACH.Is_Letter(Character'Val(i)) then + Report.Failed ("Incorrect Is_Letter result - 4"); + end if; + end loop; + + for i in Character'Pos(AC.Latin_1.LC_O_Oblique_Stroke) .. + Character'Pos(AC.Latin_1.LC_Y_Diaeresis) loop + if not ACH.Is_Letter(Character'Val(i)) then + Report.Failed ("Incorrect Is_Letter result - 5"); + end if; + end loop; + + -- Check for rejection of non-letters. + for i in Character'Pos(AC.Latin_1.NUL) .. + Character'Pos(AC.Latin_1.Commercial_At) loop + if ACH.Is_Letter(Character'Val(i)) then + Report.Failed ("Incorrect Is_Letter result - 6"); + end if; + end loop; + + + -- Evaluate function Is_Lower with lower case/non-lower case inputs. + + for i in Character'Pos(AC.Latin_1.LC_A) .. + Character'Pos(AC.Latin_1.LC_Z) loop + if not ACH.Is_Lower(Character'Val(i)) then + Report.Failed ("Incorrect Is_Lower result - 1"); + end if; + end loop; + + for i in Character'Pos(AC.Latin_1.LC_A_Grave) .. + Character'Pos(AC.Latin_1.LC_O_Diaeresis) loop + if not ACH.Is_Lower(Character'Val(i)) then + Report.Failed ("Incorrect Is_Lower result - 2"); + end if; + end loop; + + for i in Character'Pos(AC.Latin_1.LC_O_Oblique_Stroke) .. + Character'Pos(AC.Latin_1.LC_Y_Diaeresis) loop + if not ACH.Is_Lower(Character'Val(i)) then + Report.Failed ("Incorrect Is_Lower result - 3"); + end if; + end loop; + + if ACH.Is_Lower('A') or + ACH.Is_Lower(AC.Latin_1.UC_Icelandic_Eth) or + ACH.Is_Lower(AC.Latin_1.Number_Sign) or + ACH.Is_Lower(AC.Latin_1.Cedilla) or + ACH.Is_Lower(AC.Latin_1.SYN) or + ACH.Is_Lower(AC.Latin_1.ESA) + then + Report.Failed ("Incorrect Is_Lower result - 4"); + end if; + + + -- Evaluate function Is_Upper with upper case/non-upper case inputs. + + for i in Character'Pos('A') .. Character'Pos('Z') loop + if not ACH.Is_Upper(Character'Val(i)) then + Report.Failed ("Incorrect Is_Upper result - 1"); + end if; + end loop; + + for i in Character'Pos(AC.Latin_1.UC_A_Grave) .. + Character'Pos(AC.Latin_1.UC_O_Diaeresis) loop + if not ACH.Is_Upper(Character'Val(i)) then + Report.Failed ("Incorrect Is_Upper result - 2"); + end if; + end loop; + + for i in Character'Pos(AC.Latin_1.UC_O_Oblique_Stroke) .. + Character'Pos(AC.Latin_1.UC_Icelandic_Thorn) loop + if not ACH.Is_Upper(Character'Val(i)) then + Report.Failed ("Incorrect Is_Upper result - 3"); + end if; + end loop; + + if ACH.Is_Upper('8') or + ACH.Is_Upper(AC.Latin_1.LC_A_Ring ) or + ACH.Is_Upper(AC.Latin_1.Dollar_Sign) or + ACH.Is_Upper(AC.Latin_1.Broken_Bar) or + ACH.Is_Upper(AC.Latin_1.ETB) or + ACH.Is_Upper(AC.Latin_1.VTS) + then + Report.Failed ("Incorrect Is_Upper result - 4"); + end if; + + + for i in Character'Pos('a') .. Character'Pos('z') loop + if ACH.Is_Upper(Character'Val(i)) then + Report.Failed ("Incorrect Is_Upper result - 5"); + end if; + end loop; + + + -- Evaluate function Is_Basic with basic/non-basic inputs. + -- (Note: Basic letters are those without diacritical marks.) + + for i in Character'Pos('A') .. Character'Pos('Z') loop + if not ACH.Is_Basic(Character'Val(i)) then + Report.Failed ("Incorrect Is_Basic result - 1"); + end if; + end loop; + + for i in Character'Pos(AC.Latin_1.LC_A) .. + Character'Pos(AC.Latin_1.LC_Z) loop + if not ACH.Is_Basic(Character'Val(i)) then + Report.Failed ("Incorrect Is_Basic result - 2"); + end if; + end loop; + + + if not (ACH.Is_Basic(AC.Latin_1.UC_AE_Diphthong) and + ACH.Is_Basic(AC.Latin_1.LC_AE_Diphthong) and + ACH.Is_Basic(AC.Latin_1.LC_German_Sharp_S) and + ACH.Is_Basic(AC.Latin_1.LC_Icelandic_Eth) and + ACH.Is_Basic(AC.Latin_1.LC_Icelandic_Thorn) and + ACH.Is_Basic(AC.Latin_1.UC_Icelandic_Eth) and + ACH.Is_Basic(AC.Latin_1.UC_Icelandic_Thorn)) + then + Report.Failed ("Incorrect Is_Basic result - 3"); + end if; + + -- Check for rejection of non-basics. + if ACH.Is_Basic(AC.Latin_1.UC_A_Tilde) or + ACH.Is_Basic(AC.Latin_1.LC_A_Grave) or + ACH.Is_Basic(AC.Latin_1.Ampersand) or + ACH.Is_Basic(AC.Latin_1.Yen_Sign) or + ACH.Is_Basic(AC.Latin_1.NAK) or + ACH.Is_Basic(AC.Latin_1.SS2) + then + Report.Failed ("Incorrect Is_Basic result - 4"); + end if; + + + + for i in Character'Pos(AC.Latin_1.NUL) .. + Character'Pos(AC.Latin_1.Commercial_At) loop + if ACH.Is_Basic(Character'Val(i)) then + Report.Failed ("Incorrect Is_Basic result - 5"); + end if; + end loop; + + + -- Evaluate functions Is_Digit and Is_Decimal_Digit (a rename of + -- Is_Digit) with decimal digit/non-digit inputs. + + + if not (ACH.Is_Digit('0') and + ACH.Is_Decimal_Digit('9')) or + ACH.Is_Digit ('a') or -- Hex digits. + ACH.Is_Decimal_Digit ('f') or + ACH.Is_Decimal_Digit ('A') or + ACH.Is_Digit ('F') + then + Report.Failed ("Incorrect Is_Digit/Is_Decimal_Digit result - 1"); + end if; + + if ACH.Is_Digit (AC.Latin_1.Full_Stop) or + ACH.Is_Decimal_Digit (AC.Latin_1.Dollar_Sign) or + ACH.Is_Digit (AC.Latin_1.Number_Sign) or + ACH.Is_Decimal_Digit (AC.Latin_1.Left_Parenthesis) or + ACH.Is_Digit (AC.Latin_1.Right_Parenthesis) + then + Report.Failed ("Incorrect Is_Digit/Is_Decimal_Digit result - 2"); + end if; + + + -- Evaluate functions Is_Hexadecimal_Digit with hexadecimal digit and + -- non-hexadecimal digit inputs. + + for i in Character'Pos('0') .. Character'Pos('9') loop + if not ACH.Is_Hexadecimal_Digit(Character'Val(i)) then + Report.Failed ("Incorrect Is_Hexadecimal_Digit result - 1"); + end if; + end loop; + + for i in Character'Pos('A') .. Character'Pos('F') loop + if not ACH.Is_Hexadecimal_Digit(Character'Val(i)) then + Report.Failed ("Incorrect Is_Hexadecimal_Digit result - 2"); + end if; + end loop; + + for i in Character'Pos(AC.Latin_1.LC_A) .. + Character'Pos(AC.Latin_1.LC_F) loop + if not ACH.Is_Hexadecimal_Digit(Character'Val(i)) then + Report.Failed ("Incorrect Is_Hexadecimal_Digit result - 3"); + end if; + end loop; + + + if ACH.Is_Hexadecimal_Digit (AC.Latin_1.Minus_Sign) or + ACH.Is_Hexadecimal_Digit (AC.Latin_1.Hyphen) or + ACH.Is_Hexadecimal_Digit (AC.Latin_1.LC_G) or + ACH.Is_Hexadecimal_Digit (AC.Latin_1.LC_Z) or + ACH.Is_Hexadecimal_Digit ('G') or + ACH.Is_Hexadecimal_Digit (AC.Latin_1.Cent_Sign) or + ACH.Is_Hexadecimal_Digit (AC.Latin_1.Pound_Sign) + then + Report.Failed ("Incorrect Is_HexaDecimal_Digit result - 4"); + end if; + + + -- Evaluate functions Is_Alphanumeric and Is_Special with + -- letters, digits, and non-alphanumeric inputs. + + for i in Character'Pos(AC.Latin_1.NUL) .. + Character'Pos(AC.Latin_1.US) loop + if ACH.Is_Alphanumeric(Character'Val(i)) then + Report.Failed ("Incorrect Is_Alphanumeric result - 1"); + end if; + TC_Boolean := ACH.Is_Special(Character'Val(i)); + if TC_Boolean then + Report.Failed ("Incorrect Is_Special result - 1"); + TC_Boolean := False; + end if; + end loop; + + for i in Character'Pos(AC.Latin_1.Reserved_128) .. + Character'Pos(AC.Latin_1.APC) loop + TC_Boolean := ACH.Is_Alphanumeric(Character'Val(i)); + if TC_Boolean then + Report.Failed ("Incorrect Is_Alphanumeric result - 2"); + TC_Boolean := False; + end if; + if ACH.Is_Special(Character'Val(i)) then + Report.Failed ("Incorrect Is_Special result - 2"); + end if; + end loop; + + for i in Character'Pos(AC.Latin_1.Space) .. + Character'Pos(AC.Latin_1.Solidus) loop + TC_Boolean := ACH.Is_Alphanumeric(Character'Val(i)); + if TC_Boolean then + Report.Failed ("Incorrect Is_Alphanumeric result - 3"); + TC_Boolean := False; + end if; + if not ACH.Is_Special(Character'Val(i)) then + Report.Failed ("Incorrect Is_Special result - 3"); + end if; + end loop; + + for i in Character'Pos('A') .. Character'Pos('Z') loop + if not ACH.Is_Alphanumeric(Character'Val(i)) then + Report.Failed ("Incorrect Is_Alphanumeric result - 4"); + end if; + TC_Boolean := ACH.Is_Special(Character'Val(i)); + if TC_Boolean then + Report.Failed ("Incorrect Is_Special result - 4"); + TC_Boolean := False; + end if; + end loop; + + for i in Character'Pos('0') .. Character'Pos('9') loop + if not ACH.Is_Alphanumeric(Character'Val(i)) then + Report.Failed ("Incorrect Is_Alphanumeric result - 5"); + end if; + TC_Boolean := ACH.Is_Special(Character'Val(i)); + if TC_Boolean then + Report.Failed ("Incorrect Is_Special result - 5"); + TC_Boolean := False; + end if; + end loop; + + for i in Character'Pos(AC.Latin_1.LC_A) .. + Character'Pos(AC.Latin_1.LC_Z) loop + if not ACH.Is_Alphanumeric(Character'Val(i)) then + Report.Failed ("Incorrect Is_Alphanumeric result - 6"); + end if; + TC_Boolean := ACH.Is_Special(Character'Val(i)); + if TC_Boolean then + Report.Failed ("Incorrect Is_Special result - 6"); + TC_Boolean := False; + end if; + end loop; + + for i in Character'Pos(AC.Latin_1.No_Break_Space) .. + Character'Pos(AC.Latin_1.Inverted_Question) loop + TC_Boolean := ACH.Is_Alphanumeric(Character'Val(i)); + if TC_Boolean then + Report.Failed ("Incorrect Is_Alphanumeric result - 7"); + TC_Boolean := False; + end if; + if not ACH.Is_Special(Character'Val(i)) then + Report.Failed ("Incorrect Is_Special result - 7"); + end if; + end loop; + + for i in Character'Pos(AC.Latin_1.UC_A_Grave) .. + Character'Pos(AC.Latin_1.UC_O_Diaeresis) loop + if not ACH.Is_Alphanumeric(Character'Val(i)) then + Report.Failed ("Incorrect Is_Alphanumeric result - 8"); + end if; + TC_Boolean := ACH.Is_Special(Character'Val(i)); + if TC_Boolean then + Report.Failed ("Incorrect Is_Special result - 8"); + TC_Boolean := False; + end if; + end loop; + + for i in Character'Pos(AC.Latin_1.UC_O_Oblique_Stroke) .. + Character'Pos(AC.Latin_1.LC_O_Diaeresis) loop + if not ACH.Is_Alphanumeric(Character'Val(i)) then + Report.Failed ("Incorrect Is_Alphanumeric result - 9"); + end if; + TC_Boolean := ACH.Is_Special(Character'Val(i)); + if TC_Boolean then + Report.Failed ("Incorrect Is_Special result - 9"); + TC_Boolean := False; + end if; + end loop; + + for i in Character'Pos(AC.Latin_1.LC_O_Oblique_Stroke) .. + Character'Pos(AC.Latin_1.LC_Y_Diaeresis) loop + if not ACH.Is_Alphanumeric(Character'Val(i)) then + Report.Failed ("Incorrect Is_Alphanumeric result - 10"); + end if; + TC_Boolean := ACH.Is_Special(Character'Val(i)); + if TC_Boolean then + Report.Failed ("Incorrect Is_Special result - 10"); + TC_Boolean := False; + end if; + end loop; + + + exception + when others => Report.Failed ("Exception raised during processing"); + end Test_Block; + + + Report.Result; + +end CXA3001; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxa3002.a b/gcc/testsuite/ada/acats/tests/cxa/cxa3002.a new file mode 100644 index 000000000..12d98fdfe --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxa3002.a @@ -0,0 +1,318 @@ +-- CXA3002.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 conversion functions for Characters and Strings +-- defined in package Ada.Characters.Handling provide correct results +-- when given character/string input parameters. +-- +-- TEST DESCRIPTION: +-- This test checks the output of the To_Lower, To_Upper, and +-- To_Basic functions for both Characters and Strings. Each function +-- is called with input parameters that are within the appropriate +-- range of values, and also with values outside the specified +-- range (i.e., lower case 'a' to To_Lower). The functions are also +-- used in combination with one another, with the result of one function +-- providing the actual input parameter value to another. +-- +-- +-- CHANGE HISTORY: +-- 06 Dec 94 SAIC ACVC 2.0 +-- 22 Dec 94 SAIC Corrected evaluations of Functions In Combination. +-- +--! + +with Ada.Characters.Latin_1; +with Ada.Characters.Handling; +with Report; + +procedure CXA3002 is + + package AC renames Ada.Characters; + package ACH renames Ada.Characters.Handling; + +begin + + Report.Test ("CXA3002", "Check that the conversion functions for " & + "Characters and Strings defined in package " & + "Ada.Characters.Handling provide correct " & + "results when given character/string input " & + "parameters"); + + + Character_Block: + declare + Offset : constant Integer := Character'Pos('a') - Character'Pos('A'); + begin + + -- Function To_Lower for Characters + + if ACH.To_Lower('A') /= 'a' or ACH.To_Lower('Z') /= 'z' then + Report.Failed ("Incorrect operation of function To_Lower - 1"); + end if; + + + for i in Character'Pos('A') .. Character'Pos('Z') loop + if ACH.To_Lower(Character'Val(i)) /= Character'Val(i + Offset) then + Report.Failed ("Incorrect operation of function To_Lower - 2"); + end if; + end loop; + + + if (ACH.To_Lower(AC.Latin_1.UC_A_Grave) /= + AC.Latin_1.LC_A_Grave) or + (ACH.To_Lower(AC.Latin_1.UC_Icelandic_Thorn) /= + AC.Latin_1.LC_Icelandic_Thorn) + then + Report.Failed ("Incorrect operation of function To_Lower - 3"); + end if; + + + if ACH.To_Lower('c') /= 'c' or + ACH.To_Lower('w') /= 'w' or + ACH.To_Lower(AC.Latin_1.CR) /= AC.Latin_1.CR or + ACH.To_Lower(AC.Latin_1.LF) /= AC.Latin_1.LF or + ACH.To_Lower(AC.Latin_1.Comma) /= AC.Latin_1.Comma or + ACH.To_Lower(AC.Latin_1.Question) /= AC.Latin_1.Question or + ACH.To_Lower('0') /= '0' or + ACH.To_Lower('9') /= '9' + then + Report.Failed ("Incorrect operation of function To_Lower - 4"); + end if; + + + --- Function To_Upper for Characters + + + if not (ACH.To_Upper('b') = 'B') and (ACH.To_Upper('y') = 'Y') then + Report.Failed ("Incorrect operation of function To_Upper - 1"); + end if; + + + for i in Character'Pos(AC.Latin_1.LC_A) .. + Character'Pos(AC.Latin_1.LC_Z) loop + if ACH.To_Upper(Character'Val(i)) /= Character'Val(i - Offset) then + Report.Failed ("Incorrect operation of function To_Upper - 2"); + end if; + end loop; + + + if (ACH.To_Upper(AC.Latin_1.LC_U_Diaeresis) /= + AC.Latin_1.UC_U_Diaeresis) or + (ACH.To_Upper(AC.Latin_1.LC_A_Ring) /= + AC.Latin_1.UC_A_Ring) + then + Report.Failed ("Incorrect operation of function To_Upper - 3"); + end if; + + + if not (ACH.To_Upper('F') = 'F' and + ACH.To_Upper('U') = 'U' and + ACH.To_Upper(AC.Latin_1.LC_German_Sharp_S) = + AC.Latin_1.LC_German_Sharp_S and + ACH.To_Upper(AC.Latin_1.LC_Y_Diaeresis) = + AC.Latin_1.LC_Y_Diaeresis) + then + Report.Failed ("Incorrect operation of function To_Upper - 4"); + end if; + + + --- Function To_Basic for Characters + + + if ACH.To_Basic(AC.Latin_1.LC_A_Circumflex) /= + ACH.To_Basic(AC.Latin_1.LC_A_Tilde) or + ACH.To_Basic(AC.Latin_1.LC_E_Grave) /= + ACH.To_Basic(AC.Latin_1.LC_E_Acute) or + ACH.To_Basic(AC.Latin_1.LC_I_Circumflex) /= + ACH.To_Basic(AC.Latin_1.LC_I_Diaeresis) or + ACH.To_Basic(AC.Latin_1.UC_O_Tilde) /= + ACH.To_Basic(AC.Latin_1.UC_O_Acute) or + ACH.To_Basic(AC.Latin_1.UC_U_Grave) /= + ACH.To_Basic(AC.Latin_1.UC_U_Acute) or + ACH.To_Basic(AC.Latin_1.LC_Y_Acute) /= + ACH.To_Basic(AC.Latin_1.LC_Y_Diaeresis) + then + Report.Failed ("Incorrect operation of function To_Basic - 1"); + end if; + + + if ACH.To_Basic('Y') /= 'Y' or + ACH.To_Basic(AC.Latin_1.LC_E_Acute) /= 'e' or + ACH.To_Basic('6') /= '6' or + ACH.To_Basic(AC.Latin_1.LC_R) /= 'r' + then + Report.Failed ("Incorrect operation of function To_Basic - 2"); + end if; + + + -- Using Functions (for Characters) in Combination + + + if (ACH.To_Upper(ACH.To_Lower('A')) /= 'A' ) or + (ACH.To_Upper(ACH.To_Lower(AC.Latin_1.UC_A_Acute)) /= + AC.Latin_1.UC_A_Acute ) + then + Report.Failed("Incorrect operation of functions in combination - 1"); + end if; + + + if ACH.To_Basic(ACH.To_Lower(ACH.To_Upper(AC.Latin_1.LC_U_Grave))) /= + 'u' + then + Report.Failed("Incorrect operation of functions in combination - 2"); + end if; + + + if ACH.To_Lower (ACH.To_Basic + (ACH.To_Upper(AC.Latin_1.LC_O_Diaeresis))) /= 'o' + then + Report.Failed("Incorrect operation of functions in combination - 3"); + end if; + + + exception + when others => Report.Failed ("Exception raised in Character_Block"); + end Character_Block; + + + String_Block: + declare + + LC_String : constant String := "az" & + AC.Latin_1.LC_A_Grave & + AC.Latin_1.LC_C_Cedilla; + + UC_String : constant String := "AZ" & + AC.Latin_1.UC_A_Grave & + AC.Latin_1.UC_C_Cedilla; + + LC_Basic_String : constant String := "aei" & 'o' & 'u'; + + LC_NonBasic_String : constant String := AC.Latin_1.LC_A_Diaeresis & + AC.Latin_1.LC_E_Circumflex & + AC.Latin_1.LC_I_Acute & + AC.Latin_1.LC_O_Tilde & + AC.Latin_1.LC_U_Grave; + + UC_Basic_String : constant String := "AEIOU"; + + UC_NonBasic_String : constant String := AC.Latin_1.UC_A_Tilde & + AC.Latin_1.UC_E_Acute & + AC.Latin_1.UC_I_Grave & + AC.Latin_1.UC_O_Diaeresis & + AC.Latin_1.UC_U_Circumflex; + + LC_Special_String : constant String := "ab" & + AC.Latin_1.LC_German_Sharp_S & + AC.Latin_1.LC_Y_Diaeresis; + + UC_Special_String : constant String := "AB" & + AC.Latin_1.LC_German_Sharp_S & + AC.Latin_1.LC_Y_Diaeresis; + + begin + + -- Function To_Lower for Strings + + + if ACH.To_Lower (UC_String) /= LC_String or + ACH.To_Lower (LC_String) /= LC_String + then + Report.Failed ("Incorrect result from To_Lower for strings - 1"); + end if; + + + if ACH.To_Lower (UC_Basic_String) /= LC_Basic_String then + Report.Failed ("Incorrect result from To_Lower for strings - 2"); + end if; + + + -- Function To_Upper for Strings + + + if not (ACH.To_Upper (LC_String) = UC_String) then + Report.Failed ("Incorrect result from To_Upper for strings - 1"); + end if; + + + if ACH.To_Upper (LC_Basic_String) /= UC_Basic_String or + ACH.To_Upper (UC_String) /= UC_String + then + Report.Failed ("Incorrect result from To_Upper for strings - 2"); + end if; + + + if ACH.To_Upper (LC_Special_String) /= UC_Special_String then + Report.Failed ("Incorrect result from To_Upper for strings - 3"); + end if; + + + + -- Function To_Basic for Strings + + + if (ACH.To_Basic (LC_String) /= "azac") or + (ACH.To_Basic (UC_String) /= "AZAC") + then + Report.Failed ("Incorrect result from To_Basic for Strings - 1"); + end if; + + + if ACH.To_Basic (LC_NonBasic_String) /= LC_Basic_String then + Report.Failed ("Incorrect result from To_Basic for Strings - 2"); + end if; + + + if ACH.To_Basic (UC_NonBasic_String) /= UC_Basic_String then + Report.Failed ("Incorrect result from To_Basic for Strings - 3"); + end if; + + + -- Using Functions (for Strings) in Combination + + + if ACH.To_Upper(ACH.To_Lower(UC_Basic_String)) /= UC_Basic_String or + ACH.To_Lower(ACH.To_Upper(LC_Basic_String)) /= LC_Basic_String + then + Report.Failed ("Incorrect operation of functions in combination - 4"); + end if; + + + if (ACH.To_Basic(ACH.To_Lower(UC_NonBasic_String)) /= LC_Basic_String) or + (ACH.To_Basic(ACH.To_Upper(LC_NonBasic_String)) /= UC_Basic_String) + then + Report.Failed ("Incorrect operation of functions in combination - 5"); + end if; + + + exception + when others => Report.Failed ("Exception raised in String_Block"); + end String_Block; + + + Report.Result; + +end CXA3002; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxa3003.a b/gcc/testsuite/ada/acats/tests/cxa/cxa3003.a new file mode 100644 index 000000000..f469ef8b5 --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxa3003.a @@ -0,0 +1,243 @@ +-- CXA3003.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 functions defined in package Ada.Characters.Handling +-- for use in classifying and converting characters between the ISO 646 +-- and type Character sets produce the correct results with both +-- Character and String input values. +-- +-- TEST DESCRIPTION: +-- This test is designed to exercise the classification and conversion +-- functions (between Character and ISO_646 types) found in package +-- Ada.Characters.Handling. Two subprograms are defined, a procedure for +-- characters, a function for strings, that will utilize these functions +-- to validate and change characters in variables. In the procedure, if +-- a character argument is found to be outside the subtype ISO_646, this +-- character is evaluated to determine whether it is also a letter. +-- If it is a letter, the character is converted to a basic character and +-- returned. If it is not a letter, the character is exchanged with an +-- asterisk. In the case of the function subprogram designed for strings, +-- if a character component of a string argument is outside the subtype +-- ISO_646, that character is substituted with an asterisk. +-- +-- Arguments for the defined subprograms consist of ISO_646 characters, +-- non-ISO_646 characters, strings with only ISO_646 characters, and +-- strings with non-ISO_646 characters. The character and string values +-- are then validated to determine that the expected results were +-- obtained. +-- +-- +-- CHANGE HISTORY: +-- 06 Dec 94 SAIC ACVC 2.0 +-- 29 Apr 95 SAIC Modified identifier string lengths. +-- 31 Oct 95 SAIC Update and repair for ACVC 2.0.1. +-- +--! + +with Ada.Characters.Latin_1; +with Ada.Characters.Handling; +with Report; + +procedure CXA3003 is + +begin + + Report.Test ("CXA3003", "Check that the functions defined in package " & + "Ada.Characters.Handling for use in " & + "classifying and converting characters " & + "between the ISO 646 and type Character sets " & + "produce the correct results with both " & + "Character and String input values" ); + + Test_Block: + declare + + -- ISO_646 Characters + + Char_1, + TC_Char_1 : Character := Ada.Characters.Latin_1.NUL; -- Control Char + Char_2, + TC_Char_2 : Character := Ada.Characters.Latin_1.Colon; -- Graphic Char + Char_3, + TC_Char_3 : Character := '4'; + Char_4, + TC_Char_4 : Character := 'Z'; + Char_5, + TC_Char_5 : Character := Ada.Characters.Latin_1.LC_W; -- w + + New_ISO_646_Char : Character := '*'; + + + -- Non-ISO_646 Characters + + Char_Array : array (6..10) of Character := + (Ada.Characters.Latin_1.SSA, + Ada.Characters.Latin_1.Cent_Sign, + Ada.Characters.Latin_1.Cedilla, + Ada.Characters.Latin_1.UC_A_Ring, + Ada.Characters.Latin_1.LC_A_Ring); + + TC_Char : constant Character := '*'; + + -- ISO_646 Strings + + Str_1, + TC_Str_1 : String (1..5) := "ABCDE"; + + Str_2, + TC_Str_2 : String (1..5) := "#$%^&"; + + + -- Non-ISO_646 Strings + + Str_3 : String (1..8) := "$123.45" & + Ada.Characters.Latin_1.Cent_Sign; + TC_Str_3 : String (1..8) := "$123.45*"; + + Str_4 : String (1..7) := "abc" & + Ada.Characters.Latin_1.Cedilla & + "efg"; + TC_Str_4 : String (1..7) := "abc*efg"; + + Str_5 : String (1..3) := Ada.Characters.Latin_1.LC_E_Grave & + Ada.Characters.Latin_1.LC_T & + Ada.Characters.Latin_1.LC_E_Acute; + TC_Str_5 : String (1..3) := "*t*"; + + --- + + procedure Validate_Character (Char : in out Character) is + -- If parameter Char is an ISO_646 character, Char will be returned, + -- otherwise the following constant will be returned. + Star : constant Ada.Characters.Handling.ISO_646 := + Ada.Characters.Latin_1.Asterisk; + begin + if Ada.Characters.Handling.Is_ISO_646(Char) then + -- Check that the Is_ISO_646 function provide a correct result. + if Character'Pos(Char) > 127 then + Report.Failed("Is_ISO_646 returns a false positive result"); + end if; + else + if Character'Pos(Char) < 128 then + Report.Failed("Is_ISO_646 returns a false negative result"); + end if; + end if; + -- Cross-check Is_ISO_646 with To_ISO_646. '*' will be returned + -- if Char is not in the ISO_646 set. + Char := Ada.Characters.Handling.To_ISO_646(Char, Star); + exception + when others => Report.Failed ("Exception in Validate_Character"); + end Validate_Character; + + --- + + function Validate_String (Str : String) return String is + New_ISO_646_Char : constant Ada.Characters.Handling.ISO_646 := + Ada.Characters.Latin_1.Asterisk; + begin + -- Checking that the string contains non-ISO_646 characters at this + -- point is not strictly necessary, since the function To_ISO_646 + -- will perform that check as part of its processing, and would + -- return the original string if no modification were necessary. + -- However, this format allows for the testing of both functions. + + if not Ada.Characters.Handling.Is_ISO_646(Str) then + return Ada.Characters.Handling.To_ISO_646 + (Item => Str, Substitute => New_ISO_646_Char); + else + return Str; + end if; + exception + when others => Report.Failed ("Exception in Validate_String"); + return Str; + end Validate_String; + + + begin + + -- Check each character in turn, and if the character does not belong + -- to the ISO_646 subset of type Character, replace it with an + -- asterisk. If the character is a member of the subset, the character + -- should be returned unchanged. + + Validate_Character (Char_1); + Validate_Character (Char_2); + Validate_Character (Char_3); + Validate_Character (Char_4); + Validate_Character (Char_5); + + if Char_1 /= TC_Char_1 or Char_2 /= TC_Char_2 or + Char_3 /= TC_Char_3 or Char_4 /= TC_Char_4 or + Char_5 /= TC_Char_5 + then + Report.Failed ("Incorrect ISO_646 character substitution"); + end if; + + -- Non-ISO_646 characters + + for i in 6..10 loop + Validate_Character (Char_Array(i)); + end loop; + + for i in 6..10 loop + if Char_Array(i) /= TC_Char then + Report.Failed ("Character position " & Integer'Image(i) & + " not replaced correctly"); + end if; + end loop; + + + + -- Check each string, and if the string contains characters that do not + -- belong to the ISO_646 subset of type Character, replace that character + -- in the string with an asterisk. If the string is comprised of only + -- ISO_646 characters, the string should be returned unchanged. + + + Str_1 := Validate_String (Str_1); + Str_2 := Validate_String (Str_2); + Str_3 := Validate_String (Str_3); + Str_4 := Validate_String (Str_4); + Str_5 := Validate_String (Str_5); + + + if Str_1 /= TC_Str_1 or + Str_2 /= TC_Str_2 or + Str_3 /= TC_Str_3 or + Str_4 /= TC_Str_4 or + Str_5 /= TC_Str_5 + then + Report.Failed ("Incorrect ISO_646 character substitution in string"); + end if; + + + exception + when others => Report.Failed ("Exception raised in Test_Block"); + end Test_Block; + + Report.Result; + +end CXA3003; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxa4001.a b/gcc/testsuite/ada/acats/tests/cxa/cxa4001.a new file mode 100644 index 000000000..d850acd4a --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxa4001.a @@ -0,0 +1,218 @@ +-- CXA4001.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 types, operations, and other entities defined within +-- the package Ada.Strings.Maps are available and/or produce correct +-- results. +-- +-- TEST DESCRIPTION: +-- This test demonstrates the availability and function of the types and +-- operations defined in package Ada.Strings.Maps. It demonstrates the +-- use of these types and functions as they would be used in common +-- programming practice. +-- Character set creation, assignment, and comparison are evaluated +-- in this test. Each of the functions provided in package +-- Ada.Strings.Maps is utilized in creating or manipulating set objects, +-- and the function results are evaluated for correctness. +-- Character sequences are examined using the functions provided for +-- manipulating objects of this type. Likewise, character maps are +-- created, and their contents evaluated. Exception raising conditions +-- from the function To_Mapping are also created. +-- Note: Throughout this test, the set logical operators are printed in +-- capital letters to enhance their visibility. +-- +-- +-- CHANGE HISTORY: +-- 06 Dec 94 SAIC ACVC 2.0 +-- +--! + +with Ada.Strings.Maps; +with Report; + +procedure CXA4001 is + + use Ada.Strings; + use type Maps.Character_Set; + +begin + + Report.Test ("CXA4001", "Check that the types, operations, and other " & + "entities defined within the package " & + "Ada.Strings.Maps are available and/or produce " & + "correct results"); + + Test_Block: + declare + + MidPoint_Letter : constant := 13; + Last_Letter : constant := 26; + + Vowels : constant Maps.Character_Sequence := "aeiou"; + Quasi_Vowel : constant Character := 'y'; + + Alphabet : Maps.Character_Sequence (1..Last_Letter); + Half_Alphabet : Maps.Character_Sequence (1..MidPoint_Letter); + Inverse_Alphabet : Maps.Character_Sequence (1..Last_Letter); + + Alphabet_Set, + Consonant_Set, + Vowel_Set, + Full_Vowel_Set, + First_Half_Set, + Second_Half_Set : Maps.Character_Set; + + begin + + -- Load the alphabet string for use in creating sets. + + + for i in 0..12 loop + Half_Alphabet(i+1) := Character'Val(Character'Pos('a') + i); + end loop; + + for i in 0..25 loop + Alphabet(i+1) := Character'Val(Character'Pos('a') + i); + end loop; + + + -- Initialize a series of Character_Set objects. + + Alphabet_Set := Maps.To_Set(Alphabet); + Vowel_Set := Maps.To_Set(Vowels); + Full_Vowel_Set := Vowel_Set OR Maps.To_Set(Quasi_Vowel); + Consonant_Set := Vowel_Set XOR Alphabet_Set; + + First_Half_Set := Maps.To_Set(Half_Alphabet); + Second_Half_Set := Alphabet_Set XOR First_Half_Set; + + + -- Evaluation of Set objects, operators, and functions. + + if Alphabet_Set /= (Vowel_Set OR Consonant_Set) then + Report.Failed("Incorrect set combinations using OR operator"); + end if; + + + for i in 1..5 loop + if not Maps.Is_In(Vowels(i), Vowel_Set) or + not Maps.Is_In(Vowels(i), Alphabet_Set) or + Maps.Is_In(Vowels(i), Consonant_Set) + then + Report.Failed("Incorrect function Is_In use with set " & + "combinations - " & Integer'Image(i)); + end if; + end loop; + + + if Maps.Is_Subset(Vowel_Set, First_Half_Set) or + Maps."<="(Vowel_Set, Second_Half_Set) or + not Maps.Is_Subset(Vowel_Set, Alphabet_Set) + then + Report.Failed("Incorrect set evaluation using Is_Subset function"); + end if; + + + if not (Full_Vowel_Set = Maps.To_Set("aeiouy")) then + Report.Failed("Incorrect result for ""="" set operator"); + end if; + + + if not ((Vowel_Set AND First_Half_Set) OR + (Full_Vowel_Set AND Second_Half_Set)) = Full_Vowel_Set then + Report.Failed + ("Incorrect result for AND, OR, or ""="" set operators"); + end if; + + + if (Alphabet_Set AND Maps.Null_Set) /= Maps.Null_Set or + (Alphabet_Set OR Maps.Null_Set) /= Alphabet_Set + then + Report.Failed("Incorrect result for AND or OR set operators"); + end if; + + + Vowel_Set := Full_Vowel_Set; + Vowel_Set := Vowel_Set AND (NOT Maps.To_Set(Quasi_Vowel)); + + if not (Vowels = Maps.To_Sequence(Vowel_Set)) then + Report.Failed("Incorrect Set to Sequence translation"); + end if; + + + for i in 1..26 loop + Inverse_Alphabet(i) := Alphabet(27-i); + end loop; + + declare + Inverse_Map : Maps.Character_Mapping := + Maps.To_Mapping(Alphabet, Inverse_Alphabet); + begin + if Maps.Value(Maps.Identity, 'b') /= Maps.Value(Inverse_Map,'y') + then + Report.Failed("Incorrect Inverse mapping"); + end if; + end; + + + -- Check that Translation_Error is raised when a character is + -- repeated in the parameter "From" string. + declare + Bad_Map : Maps.Character_Mapping; + begin + Bad_Map := Maps.To_Mapping(From => "aa", To => "yz"); + Report.Failed("Exception not raised with repeated character"); + exception + when Translation_Error => null; -- OK + when others => + Report.Failed("Incorrect exception raised in To_Mapping with " & + "a repeated character"); + end; + + + -- Check that Translation_Error is raised when the parameters of the + -- function To_Mapping are of unequal lengths. + declare + Bad_Map : Maps.Character_Mapping; + begin + Bad_Map := Maps.To_Mapping("abc", "yz"); + Report.Failed("Exception not raised with unequal parameter lengths"); + exception + when Translation_Error => null; -- OK + when others => + Report.Failed("Incorrect exception raised in To_Mapping with " & + "unequal parameter lengths"); + end; + + + exception + when others => Report.Failed ("Exception raised in Test_Block"); + end Test_Block; + + + Report.Result; + +end CXA4001; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxa4002.a b/gcc/testsuite/ada/acats/tests/cxa/cxa4002.a new file mode 100644 index 000000000..583621ab4 --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxa4002.a @@ -0,0 +1,182 @@ +-- CXA4002.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 subprograms defined in package Ada.Strings.Fixed are +-- available, and that they produce correct results. Specifically, +-- check the subprograms Index, "*" (string constructor function), +-- Count, Trim, and Replace_Slice. +-- +-- TEST DESCRIPTION: +-- This test demonstrates how certain Fixed string functions are used +-- to eliminate specific substrings from portions of text. A procedure +-- is defined that will take as parameters a source string along with +-- a substring that is to be completely removed from the source string. +-- The source string is parsed using the Index function, and any substring +-- slices are replaced in the source string by a series of X's (based on +-- the length of the substring.) +-- Three lines of text are provided to this procedure, and the resulting +-- substitutions are compared with expected results to validate the +-- string processing. +-- A global accumulator is updated with the number of occurrences of the +-- substring in the source string. +-- +-- +-- CHANGE HISTORY: +-- 06 Dec 94 SAIC ACVC 2.0 +-- +--! + +with Ada.Strings; +with Ada.Strings.Fixed; +with Ada.Strings.Maps; +with Report; + +procedure CXA4002 is + +begin + + Report.Test ("CXA4002", "Check that the subprograms defined in package " & + "Ada.Strings.Fixed are available, and that " & + "they produce correct results"); + + Test_Block: + declare + + TC_Total : Natural := 0; + Number_Of_Lines : constant := 3; + + type Restricted_Words_Array_Type is array (1..10) of String (1..10); + + Restricted_Words : Restricted_Words_Array_Type := + (" platoon", " marines ", " Marines ", + "north ", "south ", " east", + " beach ", " airport", "airfield ", + " road "); + + subtype Line_Of_Text_Type is String(1..25); + type Page_Of_Text_Type is array (1..Number_Of_Lines) + of Line_Of_Text_Type; + + Text_Page : Page_Of_Text_Type := ("The platoon of Marines ", + "moved south on the south ", + "road to the airfield. "); + + TC_Revised_Line_1 : constant String := "The XXXXXXX of XXXXXXX "; + TC_Revised_Line_2 : constant String := "moved XXXXX on the XXXXX "; + TC_Revised_Line_3 : constant String := "XXXX to the XXXXXXXX. "; + + --- + + procedure Censor (Source_String : in out String; + Pattern_String : in String) is + + -- Create a replacement string that is the same length as the + -- pattern string being removed. + Replacement : constant String := -- "*" + Ada.Strings.Fixed."*"(Pattern_String'Length, 'X'); + + Going : Ada.Strings.Direction := Ada.Strings.Forward; + Map : constant Ada.Strings.Maps.Character_Mapping := + Ada.Strings.Maps.Identity; + Start_Pos, + Index : Natural := Source_String'First; + + + begin -- Censor + + -- Accumulate count of total replacement operations. + + TC_Total := TC_Total + -- Count + Ada.Strings.Fixed.Count (Source => Source_String, + Pattern => Pattern_String, + Mapping => Map); + loop + + Index := Ada.Strings.Fixed.Index -- Index + (Source_String(Start_Pos..Source_String'Last), + Pattern_String, + Going, + Map); + + exit when Index = 0; -- No matches, exit loop. + + -- if a match was found, modify the substring. + Ada.Strings.Fixed.Replace_Slice -- Replace_Slice + (Source_String, + Index, + Index + Pattern_String'Length - 1, + Replacement); + Start_Pos := Index + Pattern_String'Length; + + end loop; + + end Censor; + + + begin + + -- Invoke Censor subprogram to cleanse text. + -- Loop through each line of text, and check for the presence of each + -- restricted word. + -- Use the Trim function to eliminate leading or trailing blanks from + -- the restricted word parameters. + + for Line in 1..Number_Of_Lines loop + for Word in Restricted_Words'Range loop + Censor (Text_Page(Line), + Ada.Strings.Fixed.Trim(Restricted_Words(Word), -- Trim + Ada.Strings.Both)); + end loop; + end loop; + + + -- Validate results. + + if TC_Total /= 6 then + Report.Failed ("Incorrect number of substitutions performed"); + end if; + + if Text_Page(1) /= TC_Revised_Line_1 then + Report.Failed ("Incorrect substitutions on Line 1"); + end if; + + if Text_Page(2) /= TC_Revised_Line_2 then + Report.Failed ("Incorrect substitutions on Line 2"); + end if; + + if Text_Page(3) /= TC_Revised_Line_3 then + Report.Failed ("Incorrect substitutions on Line 3"); + end if; + + + exception + when others => Report.Failed ("Exception raised in Test_Block"); + end Test_Block; + + + Report.Result; + +end CXA4002; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxa4003.a b/gcc/testsuite/ada/acats/tests/cxa/cxa4003.a new file mode 100644 index 000000000..cd57a9296 --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxa4003.a @@ -0,0 +1,326 @@ +-- CXA4003.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 subprograms defined in package Ada.Strings.Fixed are +-- available, and that they produce correct results. Specifically, +-- check the subprograms Index, Index_Non_Blank, Head, Tail, Translate, +-- Find_Token, Move, Overwrite, and Replace_Slice. +-- +-- TEST DESCRIPTION: +-- This test demonstrates how certain fixed string operations could be +-- used in string information processing. A procedure is defined that +-- will extract portions of a 50 character string that correspond to +-- certain data items (i.e., name, address, state, zip code). These +-- parsed items will then be added to the appropriate fields of data +-- base elements. These data base elements are then compared for +-- accuracy against a similar set of predefined data base elements. +-- +-- A variety of fixed string processing subprograms are used in this +-- test. Each parsing operation uses a different combination +-- of the available subprograms to accomplish the same goal, therefore +-- continuity of approach to string parsing is not seen in this test. +-- However, a wide variety of possible approaches are demonstrated, while +-- exercising a large number of the total predefined subprograms of +-- package Ada.Strings.Fixed. +-- +-- +-- CHANGE HISTORY: +-- 06 Dec 94 SAIC ACVC 2.0 +-- +--! + +with Ada.Strings.Fixed; +with Ada.Strings.Maps; +with Report; + +procedure CXA4003 is + +begin + + Report.Test ("CXA4003", "Check that the subprograms defined in package " & + "Ada.Strings.Fixed are available, and that they " & + "produce correct results"); + + Test_Block: + declare + + Number_Of_Info_Strings : constant Natural := 3; + DB_Size : constant Natural := Number_Of_Info_Strings; + Count : Natural := 0; + Finished_Processing : Boolean := False; + Blank_String : constant String := " "; + + subtype Info_String_Type is String (1..50); + type Info_String_Storage_Type is + array (1..Number_Of_Info_Strings) of Info_String_Type; + + + subtype Name_Type is String (1..10); + subtype Street_Number_Type is String (1..5); + subtype Street_Name_Type is String (1..10); + subtype City_Type is String (1..10); + subtype State_Type is String (1..2); + subtype Zip_Code_Type is String (1..5); + + type Data_Base_Element_Type is + record + Name : Name_Type := (others => ' '); + Street_Number : Street_Number_Type := (others => ' '); + Street_Name : Street_Name_Type := (others => ' '); + City : City_Type := (others => ' '); + State : State_Type := (others => ' '); + Zip_Code : Zip_Code_Type := (others => ' '); + end record; + + type Data_Base_Type is array (1..DB_Size) of Data_Base_Element_Type; + + Data_Base : Data_Base_Type; + + --- + + Info_String_1 : Info_String_Type := + "Joe_Jones 123 Sixth_St San_Diego CA 98765"; + + Info_String_2 : Info_String_Type := + "Sam_Smith 56789 S._Seventh Carlsbad CA 92177"; + + Info_String_3 : Info_String_Type := + "Jane_Brown 1219 Info_Lane Tuscon AZ 85643"; + + + Info_Strings : Info_String_Storage_Type := (1 => Info_String_1, + 2 => Info_String_2, + 3 => Info_String_3); + + + + TC_DB_Element_1 : Data_Base_Element_Type := + ("Joe Jones ", "123 ", "Sixth St ", "San Diego ", "CA", "98765"); + + TC_DB_Element_2 : Data_Base_Element_Type := + ("Sam Smith ", "56789", "S. Seventh", "Carlsbad ", "CA", "92177"); + + TC_DB_Element_3 : Data_Base_Element_Type := + ("Jane Brown", "1219 ", "Info Lane ", "Tuscon ", "AZ", "85643"); + + TC_Data_Base : Data_Base_Type := (TC_DB_Element_1, + TC_DB_Element_2, + TC_DB_Element_3); + + --- + + + procedure Store_Information + (Info_String : in Info_String_Type; + DB_Record : in out Data_Base_Element_Type) is + + package AS renames Ada.Strings; + use type AS.Maps.Character_Set; + + UnderScore : AS.Maps.Character_Sequence := "_"; + Blank : AS.Maps.Character_Sequence := " "; + + Start, + Stop : Natural := 0; + + Underscore_to_Blank_Map : constant AS.Maps.Character_Mapping := + AS.Maps.To_Mapping(From => UnderScore, + To => Blank); + + Numeric_Set : constant AS.Maps.Character_Set := + AS.Maps.To_Set("0123456789"); + + Cal : constant AS.Maps.Character_Sequence := "CA"; + California_Set : constant AS.Maps.Character_Set := + AS.Maps.To_Set(Cal); + Arizona_Set : constant AS.Maps.Character_Set := + AS.Maps.To_Set("AZ"); + Nevada_Set : constant AS.Maps.Character_Set := + AS.Maps.To_Set("NV"); + + begin + + -- Find the starting position of the name field (first non-blank), + -- then, from that position, find the end of the name field (first + -- blank). + + Start := AS.Fixed.Index_Non_Blank(Info_String); + Stop := AS.Fixed.Index (Info_String(Start..Info_String'Length), + AS.Maps.To_Set(' '), + AS.Inside, + AS.Forward) - 1 ; + + -- Store the name field in the data base element field for "Name". + + DB_Record.Name := AS.Fixed.Head(Info_String(1..Stop), + DB_Record.Name'Length); + + -- Replace any underscore characters in the name field + -- that were used to separate first/middle/last names. + + AS.Fixed.Translate (DB_Record.Name, Underscore_to_Blank_Map); + + + -- Continue the extraction process; now find the position of + -- the street number in the string. + + Start := Stop + 1; + + AS.Fixed.Find_Token(Info_String(Start..Info_String'Length), + Numeric_Set, + AS.Inside, + Start, + Stop); + + -- Store the street number field in the appropriate data base + -- element. + -- No modification of the default parameters of procedure Move + -- is required. + + AS.Fixed.Move(Source => Info_String(Start..Stop), + Target => DB_Record.Street_Number); + + + -- Continue the extraction process; find the street name in the + -- info string. Skip blanks to the start of the street name, then + -- search for the index of the next blank character in the string. + + Start := + AS.Fixed.Index_Non_Blank(Info_String(Stop+1..Info_String'Length)); + + Stop := + AS.Fixed.Index(Info_String(Start..Info_String'Length), + Blank_String) - 1; + + -- Store the street name in the appropriate data base element field. + + AS.Fixed.Overwrite(DB_Record.Street_Name, + 1, + Info_String(Start..Stop)); + + -- Replace any underscore characters in the street name field + -- that were used as word separation. + + DB_Record.Street_Name := AS.Fixed.Translate(DB_Record.Street_Name, + Underscore_to_Blank_Map); + + + -- Continue the extraction; remove the city name from the string. + + Start := + AS.Fixed.Index_Non_Blank(Info_String(Stop+1..Info_String'Length)); + + Stop := + AS.Fixed.Index(Info_String(Start..Info_String'Length), + Blank_String) - 1; + + -- Store the city name field in the appropriate data base element. + + AS.Fixed.Replace_Slice(DB_Record.City, + 1, + DB_Record.City'Length, + Info_String(Start..Stop)); + + -- Replace any underscore characters in the city name field + -- that were used as word separation. + + AS.Fixed.Translate (DB_Record.City, Underscore_to_Blank_Map); + + + -- Continue the extraction; remove the state identifier from the + -- info string. + + Start := Stop + 1; + + AS.Fixed.Find_Token(Info_String(Start..Info_String'Length), + AS.Maps."OR"(California_Set, + AS.Maps."OR"(Nevada_Set, Arizona_Set)), + AS.Inside, + Start, + Stop); + + -- Store the state indicator into the data base element. + + AS.Fixed.Move(Source => Info_String(Start..Stop), + Target => DB_Record.State, + Drop => Ada.Strings.Right, + Justify => Ada.Strings.Left, + Pad => AS.Space); + + + -- Continue the extraction process; remove the final data item in + -- the info string, the zip code, and place it into the + -- corresponding data base element. + + DB_Record.Zip_Code := AS.Fixed.Tail(Info_String, + DB_Record.Zip_Code'Length); + + exception + when AS.Length_Error => + Report.Failed ("Length_Error raised in procedure"); + when AS.Pattern_Error => + Report.Failed ("Pattern_Error raised in procedure"); + when AS.Translation_Error => + Report.Failed ("Translation_Error raised in procedure"); + when others => + Report.Failed ("Exception raised in procedure"); + end Store_Information; + + + begin + + -- Loop thru the information strings, extract the name and address + -- information, place this info into elements of the data base. + + while not Finished_Processing loop + + Count := Count + 1; + + Store_Information (Info_Strings(Count), Data_Base(Count)); + + Finished_Processing := (Count = Number_Of_Info_Strings); + + end loop; + + + -- Verify that the string processing was successful. + + for i in 1..DB_Size loop + if Data_Base(i) /= TC_Data_Base(i) then + Report.Failed + ("Data processing error on record " & Integer'Image(i)); + end if; + end loop; + + + exception + when others => Report.Failed ("Exception raised in Test_Block"); + end Test_Block; + + + Report.Result; + +end CXA4003; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxa4004.a b/gcc/testsuite/ada/acats/tests/cxa/cxa4004.a new file mode 100644 index 000000000..ec11f7d50 --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxa4004.a @@ -0,0 +1,431 @@ +-- CXA4004.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 subprograms defined in package Ada.Strings.Fixed are +-- available, and that they produce correct results. Specifically, check +-- the subprograms Count, Find_Token, Index, Index_Non_Blank, and Move. +-- +-- TEST DESCRIPTION: +-- This test, when combined with tests CXA4002,3, and 5 will provide +-- thorough coverage of the functionality found in Ada.Strings.Fixed. +-- This test contains many small, specific test cases, situations that +-- although common in user environments, are often difficult to generate +-- in large numbers in a application-based test. +-- +-- +-- CHANGE HISTORY: +-- 06 Dec 94 SAIC ACVC 2.0 +-- 10 Apr 95 SAIC Corrected subtest for Move, Drop=Right. +-- +--! + +with Report; +with Ada.Strings; +with Ada.Strings.Fixed; +with Ada.Strings.Maps; + +procedure CXA4004 is +begin + + Report.Test("CXA4004", "Check that the subprograms defined in " & + "package Ada.Strings.Fixed are available, " & + "and that they produce correct results"); + + Test_Block: + declare + + package ASF renames Ada.Strings.Fixed; + package Maps renames Ada.Strings.Maps; + + Result_String : String(1..10) := (others => Ada.Strings.Space); + + Source_String1 : String(1..5) := "abcde"; -- odd length string + Source_String2 : String(1..6) := "abcdef"; -- even length string + Source_String3 : String(1..12) := "abcdefghijkl"; + Source_String4 : String(1..12) := "abcdefghij "; -- last two ch pad + Source_String5 : String(1..12) := " cdefghijkl"; -- first two ch pad + Source_String6 : String(1..12) := "abcdefabcdef"; + + Location : Natural := 0; + Slice_Start : Positive; + Slice_End, + Slice_Count : Natural := 0; + + CD_Set : Maps.Character_Set := Maps.To_Set("cd"); + ABCD_Set : Maps.Character_Set := Maps.To_Set("abcd"); + A_to_F_Set : Maps.Character_Set := Maps.To_Set("abcdef"); + + CD_to_XY_Map : Maps.Character_Mapping := + Maps.To_Mapping(From => "cd", To => "xy"); + + begin + + -- Procedure Move + + -- Evaluate the Procedure Move with various combinations of + -- parameters. + + -- Justify = Left (default case) + + ASF.Move(Source => Source_String1, -- "abcde" + Target => Result_String); + + if Result_String /= "abcde " then + Report.Failed("Incorrect result from Move with Justify = Left"); + end if; + + -- Justify = Right + + ASF.Move(Source => Source_String2, -- "abcdef" + Target => Result_String, + Drop => Ada.Strings.Error, + Justify => Ada.Strings.Right); + + if Result_String /= " abcdef" then + Report.Failed("Incorrect result from Move with Justify = Right"); + end if; + + -- Justify = Center (two cases, odd and even pad lengths) + + ASF.Move(Source_String1, -- "abcde" + Result_String, + Ada.Strings.Error, + Ada.Strings.Center, + 'x'); -- non-default padding. + + if Result_String /= "xxabcdexxx" then -- Unequal padding added right + Report.Failed("Incorrect result from Move with Justify = Center-1"); + end if; + + ASF.Move(Source_String2, -- "abcdef" + Result_String, + Ada.Strings.Error, + Ada.Strings.Center); + + if Result_String /= " abcdef " then -- Equal padding added on L/R. + Report.Failed("Incorrect result from Move with Justify = Center-2"); + end if; + + -- When the source string is longer than the target string, several + -- cases can be examined, with the results depending on the value of + -- the Drop parameter. + + -- Drop = Left + + ASF.Move(Source => Source_String3, -- "abcdefghijkl" + Target => Result_String, + Drop => Ada.Strings.Left); + + if Result_String /= "cdefghijkl" then + Report.Failed("Incorrect result from Move with Drop = Left"); + end if; + + -- Drop = Right + + ASF.Move(Source_String3, Result_String, Ada.Strings.Right); + + if Result_String /= "abcdefghij" then + Report.Failed("Incorrect result from Move with Drop = Right"); + end if; + + -- Drop = Error + -- The effect in this case depends on the value of the justify + -- parameter, and on whether any characters in Source other than + -- Pad would fail to be copied. + + -- Drop = Error, Justify = Left, right overflow characters are pad. + + ASF.Move(Source => Source_String4, -- "abcdefghij " + Target => Result_String, + Drop => Ada.Strings.Error, + Justify => Ada.Strings.Left); + + if not(Result_String = "abcdefghij") then -- leftmost 10 characters + Report.Failed("Incorrect result from Move with Drop = Error - 1"); + end if; + + -- Drop = Error, Justify = Right, left overflow characters are pad. + + ASF.Move(Source_String5, -- " cdefghijkl" + Result_String, + Ada.Strings.Error, + Ada.Strings.Right); + + if Result_String /= "cdefghijkl" then -- rightmost 10 characters + Report.Failed("Incorrect result from Move with Drop = Error - 2"); + end if; + + -- In other cases of Drop=Error, Length_Error is propagated, such as: + + begin + + ASF.Move(Source_String3, -- 12 characters, no Pad. + Result_String, -- 10 characters + Ada.Strings.Error, + Ada.Strings.Left); + + Report.Failed("Length_Error not raised by Move - 1"); + + exception + when Ada.Strings.Length_Error => null; -- OK + when others => + Report.Failed("Incorrect exception raised by Move - 1"); + end; + + + + -- Function Index + -- (Other usage examples of this function found in CXA4002-3.) + -- Check when the pattern is not found in the source. + + if ASF.Index("abcdef", "gh") /= 0 or + ASF.Index("abcde", "abcdef") /= 0 or -- pattern > source + ASF.Index("xyz", + "abcde", + Ada.Strings.Backward) /= 0 or + ASF.Index("", "ab") /= 0 or -- null source string. + ASF.Index("abcde", " ") /= 0 -- blank pattern. + then + Report.Failed("Incorrect result from Index, no pattern match"); + end if; + + -- Check that Pattern_Error is raised when the pattern is the + -- null string. + begin + Location := ASF.Index(Source_String6, -- "abcdefabcdef" + "", -- null pattern string. + Ada.Strings.Forward); + Report.Failed("Pattern_Error not raised by Index"); + exception + when Ada.Strings.Pattern_Error => null; -- OK, expected exception. + when others => + Report.Failed("Incorrect exception raised by Index, null pattern"); + end; + + -- Use the search direction "backward" to locate the particular + -- pattern within the source string. + + Location := ASF.Index(Source_String6, -- "abcdefabcdef" + "de", -- slice 4..5, 10..11 + Ada.Strings.Backward); -- search from right end. + + if Location /= 10 then + Report.Failed("Incorrect result from Index going Backward"); + end if; + + -- Using the version of Index testing character set membership, + -- check combinations of forward/backward, inside/outside parameter + -- configurations. + + if ASF.Index(Source => Source_String1, -- "abcde" + Set => CD_Set, + Test => Ada.Strings.Inside, + Going => Ada.Strings.Forward) /= 3 or -- 'c' at pos 3. + ASF.Index(Source_String6, -- "abcdefabcdef" + CD_Set, + Ada.Strings.Outside, + Ada.Strings.Backward) /= 12 or -- 'f' at position 12 + ASF.Index(Source_String6, -- "abcdefabcdef" + CD_Set, + Ada.Strings.Inside, + Ada.Strings.Backward) /= 10 or -- 'd' at position 10 + ASF.Index("cdcdcdcdacdcdcdcd", + CD_Set, + Ada.Strings.Outside, + Ada.Strings.Forward) /= 9 -- 'a' at position 9 + then + Report.Failed("Incorrect result from function Index for sets - 1"); + end if; + + -- Additional interesting uses/combinations using Index for sets. + + if ASF.Index("cd", -- same size, str-set + CD_Set, + Ada.Strings.Inside, + Ada.Strings.Forward) /= 1 or -- 'c' at position 1 + ASF.Index("abcd", -- same size, str-set, + Maps.To_Set("efgh"), -- different contents. + Ada.Strings.Outside, + Ada.Strings.Forward) /= 1 or + ASF.Index("abccd", -- set > string + Maps.To_Set("acegik"), + Ada.Strings.Inside, + Ada.Strings.Backward) /= 4 or -- 'c' at position 4 + ASF.Index("abcde", + Maps.Null_Set) /= 0 or + ASF.Index("", -- Null string. + CD_Set) /= 0 or + ASF.Index("abc ab", -- blank included + Maps.To_Set("e "), -- in string and set. + Ada.Strings.Inside, + Ada.Strings.Backward) /= 4 -- blank in string. + then + Report.Failed("Incorrect result from function Index for sets - 2"); + end if; + + + + -- Function Index_Non_Blank. + -- (Other usage examples of this function found in CXA4002-3.) + + + if ASF.Index_Non_Blank(Source => Source_String4, -- "abcdefghij " + Going => Ada.Strings.Backward) /= 10 or + ASF.Index_Non_Blank("abc def ghi jkl ", + Ada.Strings.Backward) /= 15 or + ASF.Index_Non_Blank(" abcdef") /= 3 or + ASF.Index_Non_Blank(" ") /= 0 + then + Report.Failed("Incorrect result from Index_Non_Blank"); + end if; + + + + -- Function Count + -- (Other usage examples of this function found in CXA4002-3.) + + if ASF.Count("abababa", "aba") /= 2 or + ASF.Count("abababa", "ab" ) /= 3 or + ASF.Count("babababa", "ab") /= 3 or + ASF.Count("abaabaaba", "aba") /= 3 or + ASF.Count("xxxxxxxxxxxxxxxxxxxy", "xy") /= 1 or + ASF.Count("xxxxxxxxxxxxxxxxxxxx", "x") /= 20 + then + Report.Failed("Incorrect result from Function Count"); + end if; + + -- Determine the number of slices of Source that when mapped to a + -- non-identity map, match the pattern string. + + Slice_Count := ASF.Count(Source_String6, -- "abcdefabcdef" + "xy", + CD_to_XY_Map); -- maps 'c' to 'x', 'd' to 'y' + + if Slice_Count /= 2 then -- two slices "xy" in "mapped" Source_String6 + Report.Failed("Incorrect result from Count with non-identity map"); + end if; + + -- If the pattern supplied to Function Count is the null string, then + -- Pattern_Error is propagated. + + declare + The_Null_String : constant String := ""; + begin + Slice_Count := ASF.Count(Source_String6, The_Null_String); + Report.Failed("Pattern_Error not raised by Function Count"); + exception + when Ada.Strings.Pattern_Error => null; -- OK + when others => + Report.Failed("Incorrect exception from Count with null pattern"); + end; + + + -- Function Count returning the number of characters in a particular + -- set that are found in source string. + + if ASF.Count(Source_String6, CD_Set) /= 4 then -- 2 'c' and 'd' chars. + Report.Failed("Incorrect result from Count with set"); + end if; + + + + -- Function Find_Token. + -- (Other usage examples of this function found in CXA4002-3.) + + ASF.Find_Token(Source => Source_String6, -- First slice with no + Set => ABCD_Set, -- 'a', 'b', 'c', or 'd' + Test => Ada.Strings.Outside, -- is "ef" at 5..6. + First => Slice_Start, + Last => Slice_End); + + if Slice_Start /= 5 or Slice_End /= 6 then + Report.Failed("Incorrect result from Find_Token - 1"); + end if; + + -- If no appropriate slice is contained by the source string, then the + -- value returned in Last is zero, and the value in First is + -- Source'First. + + ASF.Find_Token(Source_String6, -- "abcdefabcdef" + A_to_F_Set, -- Set of characters 'a' thru 'f'. + Ada.Strings.Outside, -- No characters outside this set. + Slice_Start, + Slice_End); + + if Slice_Start /= Source_String6'First or Slice_End /= 0 then + Report.Failed("Incorrect result from Find_Token - 2"); + end if; + + -- Additional testing of Find_Token. + + ASF.Find_Token("eabcdabcddcab", + ABCD_Set, + Ada.Strings.Inside, + Slice_Start, + Slice_End); + + if Slice_Start /= 2 or Slice_End /= 13 then + Report.Failed("Incorrect result from Find_Token - 3"); + end if; + + ASF.Find_Token("efghijklabcdabcd", + ABCD_Set, + Ada.Strings.Outside, + Slice_Start, + Slice_End); + + if Slice_Start /= 1 or Slice_End /= 8 then + Report.Failed("Incorrect result from Find_Token - 4"); + end if; + + ASF.Find_Token("abcdefgabcdabcd", + ABCD_Set, + Ada.Strings.Outside, + Slice_Start, + Slice_End); + + if Slice_Start /= 5 or Slice_End /= 7 then + Report.Failed("Incorrect result from Find_Token - 5"); + end if; + + ASF.Find_Token("abcdcbabcdcba", + ABCD_Set, + Ada.Strings.Inside, + Slice_Start, + Slice_End); + + if Slice_Start /= 1 or Slice_End /= 13 then + Report.Failed("Incorrect result from Find_Token - 6"); + end if; + + + exception + when others => Report.Failed("Exception raised in Test_Block"); + end Test_Block; + + Report.Result; + +end CXA4004; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxa4005.a b/gcc/testsuite/ada/acats/tests/cxa/cxa4005.a new file mode 100644 index 000000000..d61f853ca --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxa4005.a @@ -0,0 +1,683 @@ +-- CXA4005.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 subprograms defined in package Ada.Strings.Fixed are +-- available, and that they produce correct results. Specifically, +-- check the subprograms Delete, Head, Insert, Overwrite, Replace_Slice, +-- Tail, Trim, and "*". +-- +-- TEST DESCRIPTION: +-- This test, when combined with tests CXA4002-4 will provide coverage +-- of the functionality found in Ada.Strings.Fixed. +-- This test contains many small, specific test cases, situations that +-- although common in user environments, are often difficult to generate +-- in large numbers in a application-based test. They represent +-- individual usage paradigms in-the-small. +-- +-- +-- CHANGE HISTORY: +-- 06 Dec 94 SAIC ACVC 2.0 +-- 11 Apr 95 SAIC Corrected acceptance conditions of certain +-- subtests. +-- 06 Nov 95 SAIC Fixed bugs for ACVC 2.0.1. +-- 22 Feb 01 PHL Check that the lower bound of the result is 1. +-- 13 Mar 01 RLB Fixed a couple of ACATS style violations; +-- removed pointless checks of procedures. +-- Added checks of other functions. These changes +-- were made to test Defect Report 8652/0049, as +-- reflected in Technical Corrigendum 1. +-- +--! + +with Report; +with Ada.Strings; +with Ada.Strings.Fixed; +with Ada.Strings.Maps; + +procedure CXA4005 is + + type TC_Name_Holder is access String; + Name : TC_Name_Holder; + + function TC_Check (S : String) return String is + begin + if S'First /= 1 then + Report.Failed ("Lower bound of result of function " & Name.all & + " is" & Integer'Image (S'First)); + end if; + return S; + end TC_Check; + + procedure TC_Set_Name (N : String) is + begin + Name := new String'(N); + end TC_Set_Name; + +begin + + Report.Test("CXA4005", "Check that the subprograms defined in " & + "package Ada.Strings.Fixed are available, " & + "and that they produce correct results"); + + Test_Block: + declare + + package ASF renames Ada.Strings.Fixed; + package Maps renames Ada.Strings.Maps; + + Result_String, + Delete_String, + Insert_String, + Trim_String, + Overwrite_String : String(1..10) := (others => Ada.Strings.Space); + + Source_String1 : String(1..5) := "abcde"; -- odd length string + Source_String2 : String(1..6) := "abcdef"; -- even length string + Source_String3 : String(1..12) := "abcdefghijkl"; + Source_String4 : String(1..12) := "abcdefghij "; -- last two ch pad + Source_String5 : String(1..12) := " cdefghijkl"; -- first two ch pad + Source_String6 : String(1..12) := "abcdefabcdef"; + + Location : Natural := 0; + Slice_Start : Positive; + Slice_End, + Slice_Count : Natural := 0; + + CD_Set : Maps.Character_Set := Maps.To_Set("cd"); + X_Set : Maps.Character_Set := Maps.To_Set('x'); + ABCD_Set : Maps.Character_Set := Maps.To_Set("abcd"); + A_to_F_Set : Maps.Character_Set := Maps.To_Set("abcdef"); + + CD_to_XY_Map : Maps.Character_Mapping := + Maps.To_Mapping(From => "cd", To => "xy"); + + begin + + -- Procedure Replace_Slice + -- The functionality of this procedure + -- is similar to procedure Move, and + -- is tested here in the same manner, evaluated + -- with various combinations of parameters. + + -- Index_Error propagation when Low > Source'Last + 1 + + begin + ASF.Replace_Slice(Result_String, + Result_String'Last + 2, -- should raise exception + Result_String'Last, + "xxxxxxx"); + Report.Failed("Index_Error not raised by Replace_Slice - 1"); + exception + when Ada.Strings.Index_Error => null; -- OK, expected exception. + when others => + Report.Failed("Incorrect exception from Replace_Slice - 1"); + end; + + -- Index_Error propagation when High < Source'First - 1 + + begin + ASF.Replace_Slice(Result_String(5..10), + 5, + 3, -- should raise exception since < 'First - 1. + "xxxxxxx"); + Report.Failed("Index_Error not raised by Replace_Slice - 2"); + exception + when Ada.Strings.Index_Error => null; -- OK, expected exception. + when others => + Report.Failed("Incorrect exception from Replace_Slice - 2"); + end; + + -- Justify = Left (default case) + + Result_String := "XXXXXXXXXX"; + + ASF.Replace_Slice(Source => Result_String, + Low => 1, + High => 10, + By => Source_String1); -- "abcde" + + if Result_String /= "abcde " then + Report.Failed("Incorrect result from Replace_Slice - Justify = Left"); + end if; + + -- Justify = Right + + ASF.Replace_Slice(Source => Result_String, + Low => 1, + High => Result_String'Last, + By => Source_String2, -- "abcdef" + Drop => Ada.Strings.Error, + Justify => Ada.Strings.Right); + + if Result_String /= " abcdef" then + Report.Failed("Incorrect result from Replace_Slice - Justify=Right"); + end if; + + -- Justify = Center (two cases, odd and even pad lengths) + + ASF.Replace_Slice(Result_String, + 1, + Result_String'Last, + Source_String1, -- "abcde" + Ada.Strings.Error, + Ada.Strings.Center, + 'x'); -- non-default padding. + + if Result_String /= "xxabcdexxx" then -- Unequal padding added right + Report.Failed("Incorrect result, Replace_Slice - Justify=Center - 1"); + end if; + + ASF.Replace_Slice(Result_String, + 1, + Result_String'Last, + Source_String2, -- "abcdef" + Ada.Strings.Error, + Ada.Strings.Center); + + if Result_String /= " abcdef " then -- Equal padding added on L/R. + Report.Failed("Incorrect result from Replace_Slice with " & + "Justify = Center - 2"); + end if; + + -- When the source string is longer than the target string, several + -- cases can be examined, with the results depending on the value of + -- the Drop parameter. + + -- Drop = Left + + ASF.Replace_Slice(Result_String, + 1, + Result_String'Last, + Source_String3, -- "abcdefghijkl" + Drop => Ada.Strings.Left); + + if Result_String /= "cdefghijkl" then + Report.Failed("Incorrect result from Replace_Slice - Drop=Left"); + end if; + + -- Drop = Right + + ASF.Replace_Slice(Result_String, + 1, + Result_String'Last, + Source_String3, -- "abcdefghijkl" + Ada.Strings.Right); + + if Result_String /= "abcdefghij" then + Report.Failed("Incorrect result, Replace_Slice with Drop=Right"); + end if; + + -- Drop = Error + + -- The effect in this case depends on the value of the justify + -- parameter, and on whether any characters in Source other than + -- Pad would fail to be copied. + + -- Drop = Error, Justify = Left, right overflow characters are pad. + + ASF.Replace_Slice(Result_String, + 1, + Result_String'Last, + Source_String4, -- "abcdefghij " + Drop => Ada.Strings.Error, + Justify => Ada.Strings.Left); + + if not(Result_String = "abcdefghij") then -- leftmost 10 characters + Report.Failed("Incorrect result, Replace_Slice - Drop = Error - 1"); + end if; + + -- Drop = Error, Justify = Right, left overflow characters are pad. + + ASF.Replace_Slice(Source => Result_String, + Low => 1, + High => Result_String'Last, + By => Source_String5, -- " cdefghijkl" + Drop => Ada.Strings.Error, + Justify => Ada.Strings.Right); + + if Result_String /= "cdefghijkl" then -- rightmost 10 characters + Report.Failed("Incorrect result, Replace_Slice - Drop = Error - 2"); + end if; + + -- In other cases of Drop=Error, Length_Error is propagated, such as: + + begin + + ASF.Replace_Slice(Source => Result_String, + Low => 1, + High => Result_String'Last, + By => Source_String3, -- "abcdefghijkl" + Drop => Ada.Strings.Error); + + Report.Failed("Length_Error not raised by Replace_Slice - 1"); + + exception + when Ada.Strings.Length_Error => null; -- OK + when others => + Report.Failed("Incorrect exception from Replace_Slice - 3"); + end; + + + -- Function Replace_Slice + + TC_Set_Name ("Replace_Slice"); + + if TC_Check (ASF.Replace_Slice("abcde", 3, 3, "x")) + /= "abxde" or -- High = Low + TC_Check (ASF.Replace_Slice("abc", 2, 3, "xyz")) /= "axyz" or + TC_Check (ASF.Replace_Slice("abcd", 4, 1, "xy")) + /= "abcxyd" or -- High < Low + TC_Check (ASF.Replace_Slice("abc", 2, 3, "x")) /= "ax" or + TC_Check (ASF.Replace_Slice("a", 1, 1, "z")) /= "z" + then + Report.Failed("Incorrect result from Function Replace_Slice - 1"); + end if; + + if TC_Check (ASF.Replace_Slice("abcde", 5, 5, "z")) + /= "abcdz" or -- By length 1 + TC_Check (ASF.Replace_Slice("abc", 1, 3, "xyz")) + /= "xyz" or -- High > Low + TC_Check (ASF.Replace_Slice("abc", 3, 2, "xy")) + /= "abxyc" or -- insert + TC_Check (ASF.Replace_Slice("a", 1, 1, "xyz")) /= "xyz" + then + Report.Failed("Incorrect result from Function Replace_Slice - 2"); + end if; + + + + -- Function Insert. + + TC_Set_Name ("Insert"); + + declare + New_String : constant String := + TC_Check ( + ASF.Insert(Source => Source_String1(2..5), -- "bcde" + Before => 3, + New_Item => Source_String2)); -- "abcdef" + begin + if New_String /= "babcdefcde" then + Report.Failed("Incorrect result from Function Insert - 1"); + end if; + end; + + if TC_Check (ASF.Insert("a", 1, "z")) /= "za" or + TC_Check (ASF.Insert("abc", 3, "")) /= "abc" or + TC_Check (ASF.Insert("abc", 1, "z")) /= "zabc" + then + Report.Failed("Incorrect result from Function Insert - 2"); + end if; + + begin + if TC_Check (ASF.Insert(Source => Source_String1(2..5), -- "bcde" + Before => Report.Ident_Int(7), + New_Item => Source_String2)) -- "abcdef" + /= "babcdefcde" then + Report.Failed("Index_Error not raised by Insert - 3A"); + else + Report.Failed("Index_Error not raised by Insert - 3B"); + end if; + exception + when Ada.Strings.Index_Error => null; -- OK, expected exception. + when others => + Report.Failed("Incorrect exception from Insert - 3"); + end; + + + -- Procedure Insert + + -- Drop = Right + + ASF.Insert(Source => Insert_String, + Before => 6, + New_Item => Source_String2, -- "abcdef" + Drop => Ada.Strings.Right); + + if Insert_String /= " abcde" then -- last char of New_Item dropped. + Report.Failed("Incorrect result from Insert with Drop = Right"); + end if; + + -- Drop = Left + + ASF.Insert(Source => Insert_String, -- 10 char string + Before => 2, -- 9 chars, 2..10 available + New_Item => Source_String3, -- 12 characters long. + Drop => Ada.Strings.Left); -- truncate from Left. + + if Insert_String /= "l abcde" then -- 10 chars, leading blank. + Report.Failed("Incorrect result from Insert with Drop=Left"); + end if; + + -- Drop = Error + + begin + ASF.Insert(Source => Result_String, -- 10 chars + Before => Result_String'Last, + New_Item => "abcdefghijk", + Drop => Ada.Strings.Error); + Report.Failed("Exception not raised by Procedure Insert"); + exception + when Ada.Strings.Length_Error => null; -- OK, expected exception + when others => + Report.Failed("Incorrect exception raised by Procedure Insert"); + end; + + + + -- Function Overwrite + + TC_Set_Name ("Overwrite"); + + Overwrite_String := TC_Check ( + ASF.Overwrite(Result_String, -- 10 chars + 1, -- starting at pos=1 + Source_String3(1..10))); + + if Overwrite_String /= Source_String3(1..10) then + Report.Failed("Incorrect result from Function Overwrite - 1"); + end if; + + + if TC_Check (ASF.Overwrite("abcdef", 4, "xyz")) /= "abcxyz" or + TC_Check (ASF.Overwrite("a", 1, "xyz")) + /= "xyz" or -- chars appended + TC_Check (ASF.Overwrite("abc", 3, " ")) + /= "ab " or -- blanks appended + TC_Check (ASF.Overwrite("abcde", 1, "z" )) /= "zbcde" + then + Report.Failed("Incorrect result from Function Overwrite - 2"); + end if; + + + + -- Procedure Overwrite, with truncation. + + ASF.Overwrite(Source => Overwrite_String, -- 10 characters. + Position => 1, + New_Item => Source_String3, -- 12 characters. + Drop => Ada.Strings.Left); + + if Overwrite_String /= "cdefghijkl" then + Report.Failed("Incorrect result from Overwrite with Drop=Left"); + end if; + + -- The default drop value is Right, used here. + + ASF.Overwrite(Source => Overwrite_String, -- 10 characters. + Position => 1, + New_Item => Source_String3); -- 12 characters. + + if Overwrite_String /= "abcdefghij" then + Report.Failed("Incorrect result from Overwrite with Drop=Right"); + end if; + + -- Drop = Error + + begin + ASF.Overwrite(Source => Overwrite_String, -- 10 characters. + Position => 1, + New_Item => Source_String3, -- 12 characters. + Drop => Ada.Strings.Error); + Report.Failed("Exception not raised by Procedure Overwrite"); + exception + when Ada.Strings.Length_Error => null; -- OK, expected exception. + when others => + Report.Failed + ("Incorrect exception raised by Procedure Overwrite"); + end; + + Overwrite_String := "ababababab"; + ASF.Overwrite(Overwrite_String, Overwrite_String'Last, "z"); + ASF.Overwrite(Overwrite_String, Overwrite_String'First,"z"); + ASF.Overwrite(Overwrite_String, 5, "zz"); + + if Overwrite_String /= "zbabzzabaz" then + Report.Failed("Incorrect result from Procedure Overwrite"); + end if; + + + + -- Function Delete + + TC_Set_Name ("Delete"); + + declare + New_String1 : constant String := -- This returns a 4 char string. + TC_Check (ASF.Delete(Source => Source_String3, + From => 3, + Through => 10)); + New_String2 : constant String := -- This returns Source. + TC_Check (ASF.Delete(Source_String3, 10, 3)); + begin + if New_String1 /= "abkl" or + New_String2 /= Source_String3 + then + Report.Failed("Incorrect result from Function Delete - 1"); + end if; + end; + + if TC_Check (ASF.Delete("a", 1, 1)) + /= "" or -- Source length = 1 + TC_Check (ASF.Delete("abc", 1, 2)) + /= "c" or -- From = Source'First + TC_Check (ASF.Delete("abc", 3, 3)) + /= "ab" or -- From = Source'Last + TC_Check (ASF.Delete("abc", 3, 1)) + /= "abc" -- From > Through + then + Report.Failed("Incorrect result from Function Delete - 2"); + end if; + + + + -- Procedure Delete + + -- Justify = Left + + Delete_String := Source_String3(1..10); -- Initialize to "abcdefghij" + + ASF.Delete(Source => Delete_String, + From => 6, + Through => Delete_String'Last, + Justify => Ada.Strings.Left, + Pad => 'x'); -- pad with char 'x' + + if Delete_String /= "abcdexxxxx" then + Report.Failed("Incorrect result from Delete - Justify = Left"); + end if; + + -- Justify = Right + + ASF.Delete(Source => Delete_String, -- Remove x"s from end and + From => 6, -- shift right. + Through => Delete_String'Last, + Justify => Ada.Strings.Right, + Pad => 'x'); -- pad with char 'x' on left. + + if Delete_String /= "xxxxxabcde" then + Report.Failed("Incorrect result from Delete - Justify = Right"); + end if; + + -- Justify = Center + + ASF.Delete(Source => Delete_String, + From => 1, + Through => 5, + Justify => Ada.Strings.Center, + Pad => 'z'); + + if Delete_String /= "zzabcdezzz" then -- extra pad char on right side. + Report.Failed("Incorrect result from Delete - Justify = Center"); + end if; + + + + -- Function Trim + -- Use non-identity character sets to perform the trim operation. + + TC_Set_Name ("Trim"); + + Trim_String := "cdabcdefcd"; + + -- Remove the "cd" from each end of the string. This will not effect + -- the "cd" slice at 5..6. + + declare + New_String : constant String := + TC_Check (ASF.Trim(Source => Trim_String, + Left => CD_Set, Right => CD_Set)); + begin + if New_String /= Source_String2 then -- string "abcdef" + Report.Failed("Incorrect result from Trim with character sets"); + end if; + end; + + if TC_Check (ASF.Trim("abcdef", Maps.Null_Set, Maps.Null_Set)) + /= "abcdef" then + Report.Failed("Incorrect result from Trim with Null sets"); + end if; + + if TC_Check (ASF.Trim("cdxx", CD_Set, X_Set)) /= "" then + Report.Failed("Incorrect result from Trim, string removal"); + end if; + + + -- Procedure Trim + + -- Justify = Right + + ASF.Trim(Source => Trim_String, + Left => CD_Set, + Right => CD_Set, + Justify => Ada.Strings.Right, + Pad => 'x'); + + if Trim_String /= "xxxxabcdef" then + Report.Failed("Incorrect result from Trim with Justify = Right"); + end if; + + -- Justify = Left + + ASF.Trim(Source => Trim_String, + Left => X_Set, + Right => Maps.Null_Set, + Justify => Ada.Strings.Left, + Pad => Ada.Strings.Space); + + if Trim_String /= "abcdef " then -- Padded with 4 blanks on right. + Report.Failed("Incorrect result from Trim with Justify = Left"); + end if; + + -- Justify = Center + + ASF.Trim(Source => Trim_String, + Left => ABCD_Set, + Right => CD_Set, + Justify => Ada.Strings.Center, + Pad => 'x'); + + if Trim_String /= "xxef xx" then -- Padded with 2 pad chars on L/R + Report.Failed("Incorrect result from Trim with Justify = Center"); + end if; + + + + -- Function Head, demonstrating use of padding. + + TC_Set_Name ("Head"); + + -- Use the characters of Source_String1 ("abcde") and pad the + -- last five characters of Result_String with 'x' characters. + + + Result_String := TC_CHeck (ASF.Head(Source_String1, 10, 'x')); + + if Result_String /= "abcdexxxxx" then + Report.Failed("Incorrect result from Function Head with padding"); + end if; + + if TC_Check (ASF.Head(" ab ", 2)) /= " " or + TC_Check (ASF.Head("a", 6, 'A')) /= "aAAAAA" or + TC_Check (ASF.Head("abcdefgh", 3, 'x')) /= "abc" or + TC_Check (ASF.Head(ASF.Head("abc ", 7, 'x'), 10, 'X')) + /= "abc xxXXX" + then + Report.Failed("Incorrect result from Function Head"); + end if; + + + + -- Function Tail, demonstrating use of padding. + + TC_Set_Name ("Tail"); + + -- Use the characters of Source_String1 ("abcde") and pad the + -- first five characters of Result_String with 'x' characters. + + Result_String := TC_Check (ASF.Tail(Source_String1, 10, 'x')); + + if Result_String /= "xxxxxabcde" then + Report.Failed("Incorrect result from Function Tail with padding"); + end if; + + if TC_Check (ASF.Tail("abcde ", 5)) + /= "cde " or -- blanks, back + TC_Check (ASF.Tail(" abc ", 8, ' ')) + /= " abc " or -- blanks, front/back + TC_Check (ASF.Tail("", 5, 'Z')) + /= "ZZZZZ" or -- pad characters only + TC_Check (ASF.Tail("abc", 0)) + /= "" or -- null result + TC_Check (ASF.Tail("abcdefgh", 3)) + /= "fgh" or + TC_Check (ASF.Tail(ASF.Tail(" abc ", 6, 'x'), + 10, + 'X')) /= "XXXXx abc " + then + Report.Failed("Incorrect result from Function Tail"); + end if; + + + -- Function "*" - with (Natural, String) parameters + + TC_Set_Name ("""*"""); + + if TC_Check (ASF."*"(3, Source_String1)) /= "abcdeabcdeabcde" or + TC_Check (ASF."*"(2, Source_String2)) /= Source_String6 or + TC_Check (ASF."*"(4, Source_String1(1..2))) /= "abababab" or + TC_Check (ASF."*"(0, Source_String1)) /= "" + then + Report.Failed("Incorrect result from Function ""*"" with strings"); + end if; + + exception + when others => Report.Failed("Exception raised in Test_Block"); + end Test_Block; + + Report.Result; + +end CXA4005; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxa4006.a b/gcc/testsuite/ada/acats/tests/cxa/cxa4006.a new file mode 100644 index 000000000..e1d7f46f5 --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxa4006.a @@ -0,0 +1,319 @@ +-- CXA4006.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 subprograms defined in package Ada.Strings.Bounded are +-- available, and that they produce correct results. Specifically, check +-- the subprograms Length, Slice, "&", To_Bounded_String, Append, Index, +-- To_String, Replace_Slice, Trim, Overwrite, Delete, Insert, and +-- Translate. +-- +-- TEST DESCRIPTION: +-- This test demonstrates the uses of a variety of the string functions +-- found in the package Ada.Strings.Bounded, simulating the operations +-- found in a text processing package. +-- With bounded strings, the length of each "line" of text can vary up +-- to the instantiated maximum, allowing one to view a page of text as +-- a series of expandable lines. This provides flexibility in text +-- formatting of individual lines (strings). +-- Several subprograms are defined, all of which attempt to take advantage +-- of as many different bounded string utilities as possible. Often, +-- an operation that is being performed in a subprogram using a certain +-- bounded string utility could more efficiently be performed using a +-- a different utility. However, in the interest of including as broad +-- coverage as possible, a mixture of utilities is invoked in this test. +-- A simulated page of text is provided as a parameter to the test +-- defined subprograms, and the appropriate processing performed. The +-- processed page of text is then compared to a predefined "finished" +-- page, and test passage/failure is based on the results of this +-- comparison. +-- +-- +-- CHANGE HISTORY: +-- 06 Dec 94 SAIC ACVC 2.0 +-- +--! + +with Ada.Strings; +with Ada.Strings.Bounded; +with Ada.Strings.Maps; +with Report; + +procedure CXA4006 is + +begin + + Report.Test ("CXA4006", "Check that the subprograms defined in package " & + "Ada.Strings.Bounded are available, and that " & + "they produce correct results"); + + Test_Block: + declare + + Characters_Per_Line : constant Positive := 40; + Lines_Per_Page : constant Natural := 4; + + package BS_40 is new + Ada.Strings.Bounded.Generic_Bounded_Length(Characters_Per_Line); + use type BS_40.Bounded_String; + + type Page_Type is array (1..Lines_Per_Page) of BS_40.Bounded_String; + + -- Note: Misspellings below are intentional. + + Line1 : BS_40.Bounded_String := + BS_40.To_Bounded_String("ada is a progrraming language designed"); + Line2 : BS_40.Bounded_String := + BS_40.To_Bounded_String("to support the construction of long-"); + Line3 : BS_40.Bounded_String := + BS_40.To_Bounded_String("lived, highly reliabel software "); + Line4 : BS_40.Bounded_String := + BS_40.To_Bounded_String("systems"); + + Page : Page_Type := (1 => Line1, 2 => Line2, 3 => Line3, 4 => Line4); + + Finished_Page : Page_Type := + (BS_40.To_Bounded_String("Ada is a programming language designed"), + BS_40.To_Bounded_String("to support the construction of long-"), + BS_40.To_Bounded_String("lived, HIGHLY RELIABLE software systems."), + BS_40.To_Bounded_String("")); + + --- + + procedure Compress (Page : in out Page_Type) is + Clear_Line : Natural := Lines_Per_Page; + begin + -- If two consecutive lines on the page are together less than the + -- maximum line length, then append those two lines, move up all + -- lower lines on the page, and blank out the last line. + for i in 1..Lines_Per_Page - 1 loop + if BS_40.Length(Page(i)) + BS_40.Length(Page(i+1)) <= + BS_40.Max_Length + then + Page(i) := BS_40."&"(Page(i), + Page(i+1)); -- "&" (bounded, bounded) + + for j in i+1..Lines_Per_Page - 1 loop + Page(j) := + BS_40.To_Bounded_String + (BS_40.Slice(Page(j+1), + 1, + BS_40.Length(Page(j+1)))); + Clear_Line := j + 1; + end loop; + Page(Clear_Line) := BS_40.Null_Bounded_String; + end if; + end loop; + end Compress; + + --- + + procedure Format (Page : in out Page_Type) is + Sm_Ada : BS_40.Bounded_String := BS_40.To_Bounded_String("ada"); + Cap_Ada : constant String := "Ada"; + Char_Pos : Natural := 0; + Finished : Boolean := False; + Line : Natural := Page_Type'Last; + begin + + -- Add a period to the end of the last line. + while Line >= Page_Type'First and not Finished loop + if Page(Line) /= BS_40.Null_Bounded_String and + BS_40.Length(Page(Line)) <= BS_40.Max_Length + then + Page(Line) := BS_40.Append(Page(Line), '.'); + Finished := True; + end if; + Line := Line - 1; + end loop; + + -- Replace all occurrences of "ada" with "Ada". + for Line in Page_Type'First .. Page_Type'Last loop + Finished := False; + while not Finished loop + Char_Pos := BS_40.Index(Source => Page(Line), + Pattern => BS_40.To_String(Sm_Ada), + Going => Ada.Strings.Backward); + -- A zero is returned by function Index if no occurrences of + -- the pattern string are found. + Finished := (Char_Pos = 0); + if not Finished then + BS_40.Replace_Slice + (Source => Page(Line), + Low => Char_Pos, + High => Char_Pos + BS_40.Length(Sm_Ada) - 1, + By => Cap_Ada); + end if; + end loop; -- while loop + end loop; -- for loop + + end Format; + + --- + + procedure Spell_Check (Page : in out Page_Type) is + type Spelling_Type is (Incorrect, Correct); + type Word_Array_Type is array (Spelling_Type) + of BS_40.Bounded_String; + type Dictionary_Type is array (1..2) of Word_Array_Type; + + -- Note that the "words" in the dictionary will require various + -- amounts of Trimming prior to their use in the string functions. + Dictionary : Dictionary_Type := + (1 => (BS_40.To_Bounded_String(" reliabel "), + BS_40.To_Bounded_String(" reliable ")), + 2 => (BS_40.To_Bounded_String(" progrraming "), + BS_40.To_Bounded_String(" programming "))); + + Pos : Natural := Natural'First; + Finished : Boolean := False; + + begin + + for Line in Page_Type'Range loop + + -- Search for the first incorrectly spelled word in the Dictionary, + -- if it is found, replace it with the correctly spelled word, + -- using the Overwrite function. + + while not Finished loop + Pos := + BS_40.Index(Page(Line), + BS_40.To_String( + BS_40.Trim(Dictionary(1)(Incorrect), + Ada.Strings.Both)), + Ada.Strings.Forward); + Finished := (Pos = 0); + if not Finished then + Page(Line) := + BS_40.Overwrite(Page(Line), + Pos, + BS_40.To_String + (BS_40.Trim(Dictionary(1)(Correct), + Ada.Strings.Both))); + end if; + end loop; + + Finished := False; + + -- Search for the second incorrectly spelled word in the + -- Dictionary, if it is found, replace it with the correctly + -- spelled word, using the Delete procedure and Insert function. + + while not Finished loop + Pos := + BS_40.Index(Page(Line), + BS_40.To_String( + BS_40.Trim(Dictionary(2)(Incorrect), + Ada.Strings.Both)), + Ada.Strings.Forward); + + Finished := (Pos = 0); + + if not Finished then + BS_40.Delete + (Page(Line), + Pos, + Pos + BS_40.To_String + (BS_40.Trim(Dictionary(2)(Incorrect), + Ada.Strings.Both))'Length-1); + Page(Line) := + BS_40.Insert(Page(Line), + Pos, + BS_40.To_String + (BS_40.Trim(Dictionary(2)(Correct), + Ada.Strings.Both))); + end if; + end loop; + + Finished := False; + + end loop; + end Spell_Check; + + --- + + procedure Bold (Page : in out Page_Type) is + Key_Word : constant String := "highly reliable"; + Bold_Mapping : constant Ada.Strings.Maps.Character_Mapping := + Ada.Strings.Maps.To_Mapping(From => " abcdefghijklmnopqrstuvwxyz", + To => " ABCDEFGHIJKLMNOPQRSTUVWXYZ"); + Pos : Natural := Natural'First; + Finished : Boolean := False; + begin + -- This procedure is designed to change the case of the phrase + -- "highly reliable" into upper case (a type of "Bolding"). + -- All instances of the phrase on all lines of the page will be + -- modified. + + for Line in Page_Type'First .. Page_Type'Last loop + while not Finished loop + Pos := BS_40.Index(Page(Line), Key_Word); + Finished := (Pos = 0); + if not Finished then + + BS_40.Overwrite + (Page(Line), + Pos, + BS_40.To_String + (BS_40.Translate + (BS_40.To_Bounded_String + (BS_40.Slice(Page(Line), + Pos, + Pos + Key_Word'Length - 1)), + Bold_Mapping))); + + end if; + end loop; + Finished := False; + end loop; + end Bold; + + + begin + + Compress(Page); + Format(Page); + Spell_Check(Page); + Bold(Page); + + for i in 1..Lines_Per_Page loop + if BS_40.To_String(Page(i)) /= BS_40.To_String(Finished_Page(i)) or + BS_40.Length(Page(i)) /= BS_40.Length(Finished_Page(i)) + then + Report.Failed("Incorrect modification of Page, Line " & + Integer'Image(i)); + end if; + end loop; + + + exception + when others => Report.Failed ("Exception raised in Test_Block"); + end Test_Block; + + + Report.Result; + +end CXA4006; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxa4007.a b/gcc/testsuite/ada/acats/tests/cxa/cxa4007.a new file mode 100644 index 000000000..fca15d367 --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxa4007.a @@ -0,0 +1,334 @@ +-- CXA4007.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 subprograms defined in package Ada.Strings.Bounded are +-- available, and that they produce correct results. Specifically, check +-- the subprograms Append, Count, Element, Find_Token, Head, +-- Index_Non_Blank, Replace_Element, Replicate, Tail, To_Bounded_String, +-- "&", ">", "<", ">=", "<=", and "*". +-- +-- TEST DESCRIPTION: +-- This test, when taken in conjunction with tests CXA400[6,8,9], will +-- constitute a test of all the functionality contained in package +-- Ada.Strings.Bounded. This test uses a variety of the +-- subprograms defined in the bounded string package in ways typical +-- of common usage. Different combinations of available subprograms +-- are used to accomplish similar bounded string processing goals. +-- +-- +-- CHANGE HISTORY: +-- 06 Dec 94 SAIC ACVC 2.0 +-- 22 Dec 94 SAIC Changed obsolete constant to Ada.Strings.Space. +-- +--! + +with Ada.Strings; +with Ada.Strings.Bounded; +with Ada.Strings.Maps; +with Report; + +procedure CXA4007 is + +begin + + Report.Test ("CXA4007", "Check that the subprograms defined in package " & + "Ada.Strings.Bounded are available, and that " & + "they produce correct results"); + + Test_Block: + declare + + package BS80 is new Ada.Strings.Bounded.Generic_Bounded_Length(80); + use type BS80.Bounded_String; + + Part1 : constant String := "Rum"; + Part2 : Character := 'p'; + Part3 : BS80.Bounded_String := BS80.To_Bounded_String("el"); + Part4 : Character := 's'; + Part5 : BS80.Bounded_String := BS80.To_Bounded_String("tilt"); + Part6 : String(1..3) := "ski"; + + Full_Catenate_String, + Full_Append_String, + Constructed_String, + Drop_String, + Replicated_String, + Token_String : BS80.Bounded_String; + + CharA : Character := 'A'; + CharB : Character := 'B'; + CharC : Character := 'C'; + CharD : Character := 'D'; + CharE : Character := 'E'; + CharF : Character := 'F'; + + ABStr : String(1..15) := "AAAAABBBBBBBBBB"; + StrB : String(1..2) := "BB"; + StrE : String(1..2) := "EE"; + + + begin + + -- Evaluation of the overloaded forms of the "&" operator defined + -- for instantiations of Bounded Strings. + + Full_Catenate_String := + BS80."&"(Part2, -- Char & Bnd Str + BS80."&"(Part3, -- Bnd Str & Bnd Str + BS80."&"(Part4, -- Char & Bnd Str + BS80."&"(Part5, -- Bnd Str & Bnd Str + BS80.To_Bounded_String(Part6))))); + + Full_Catenate_String := + Part1 & Full_Catenate_String; -- Str & Bnd Str + Full_Catenate_String := + Full_Catenate_String & 'n'; -- Bnd Str & Char + + + -- Evaluation of the overloaded forms of function Append. + + Full_Append_String := + BS80.Append(Part2, -- Char,Bnd + BS80.Append(Part3, -- Bnd, Bnd + BS80.Append(Part4, -- Char,Bnd + BS80.Append(BS80.To_String(Part5), -- Str,Bnd + BS80.To_Bounded_String(Part6))))); + + Full_Append_String := + BS80.Append(BS80.To_Bounded_String(Part1), -- Bnd , Str + BS80.To_String(Full_Append_String)); + + Full_Append_String := + BS80.Append(Left => Full_Append_String, + Right => 'n'); -- Bnd, Char + + + -- Validate the resulting bounded strings. + + if Full_Catenate_String < Full_Append_String or + Full_Catenate_String > Full_Append_String or + not (Full_Catenate_String = Full_Append_String and + Full_Catenate_String <= Full_Append_String and + Full_Catenate_String >= Full_Append_String) + then + Report.Failed("Incorrect results from bounded string catenation" & + " and comparison"); + end if; + + + -- Evaluate the overloaded forms of the Constructor function "*" and + -- the Replicate function. + + Constructed_String := + (2 * CharA) & -- "AA" + (2 * StrB) & -- "AABBBB" + (3 * BS80."*"(2, CharC)) & -- "AABBBBCCCCCC" + BS80.Replicate(3, + BS80.Replicate(2, CharD)) & -- "AABBBBCCCCCCDDDDDD" + BS80.Replicate(2, StrE) & -- "AABBBBCCCCCCDDDDDDEEEE" + BS80.Replicate(2, CharF); -- "AABBBBCCCCCCDDDDDDEEEEFF" + + + -- Use of Function Replicate that involves dropping characters. The + -- attempt to replicate the 15 character string six times will exceed + -- the 80 character bound of the string. Therefore, the result should + -- be the catenation of 5 copies of the 15 character string, followed + -- by 5 'A' characters (the first five characters of the 6th + -- replication) with the remaining characters of the 6th replication + -- dropped. + + Drop_String := + BS80.Replicate(Count => 6, + Item => ABStr, -- "AAAAABBBBBBBBBB" + Drop => Ada.Strings.Right); + + if BS80.Element(Drop_String, 1) /= 'A' or + BS80.Element(Drop_String, 6) /= 'B' or + BS80.Element(Drop_String, 76) /= 'A' or + BS80.Element(Drop_String, 80) /= 'A' + then + Report.Failed("Incorrect result from Replicate with Drop"); + end if; + + + -- Use function Index_Non_Blank in the evaluation of the + -- Constructed_String. + + if BS80.Index_Non_Blank(Constructed_String, Ada.Strings.Forward) /= + BS80.To_String(Constructed_String)'First or + BS80.Index_Non_Blank(Constructed_String, Ada.Strings.Backward) /= + BS80.Length(Constructed_String) + then + Report.Failed("Incorrect results from constructor functions"); + end if; + + + + declare + + -- Define character set objects for use with the Count function. + -- Constructed_String = "AABBBBCCCCCCDDDDDDEEEEFF" from above. + + A_Set : Ada.Strings.Maps.Character_Set := + Ada.Strings.Maps.To_Set(BS80.Element(Constructed_String,1)); + B_Set : Ada.Strings.Maps.Character_Set := + Ada.Strings.Maps.To_Set(BS80.Element(Constructed_String,3)); + C_Set : Ada.Strings.Maps.Character_Set := + Ada.Strings.Maps.To_Set(BS80.Element(Constructed_String,7)); + D_Set : Ada.Strings.Maps.Character_Set := + Ada.Strings.Maps.To_Set(BS80.Element(Constructed_String,13)); + E_Set : Ada.Strings.Maps.Character_Set := + Ada.Strings.Maps.To_Set(BS80.Element(Constructed_String,19)); + F_Set : Ada.Strings.Maps.Character_Set := + Ada.Strings.Maps.To_Set(BS80.Element(Constructed_String,23)); + + + Start : Positive; + Stop : Natural := 0; + + begin + + -- Evaluate the results from function Count by comparing the number + -- of A's to the number of F's, B's to E's, and C's to D's in the + -- Constructed_String. + -- There should be an equal number of each of the characters that + -- are being compared (i.e., 2 A's and F's, 4 B's and E's, etc) + + if BS80.Count(Constructed_String, A_Set) /= + BS80.Count(Constructed_String, F_Set) or + BS80.Count(Constructed_String, B_Set) /= + BS80.Count(Constructed_String, E_Set) or + not (BS80.Count(Constructed_String, C_Set) = + BS80.Count(Constructed_String, D_Set)) + then + Report.Failed("Incorrect result from function Count"); + end if; + + + -- Evaluate the functions Head, Tail, and Find_Token. + -- Create the Token_String from the Constructed_String above. + + Token_String := + BS80.Tail(BS80.Head(Constructed_String, 3), 2) & -- "AB" & + BS80.Head(BS80.Tail(Constructed_String, 13), 2) & -- "CD" & + BS80.Head(BS80.Tail(Constructed_String, 3), 2); -- "EF" + + if Token_String /= BS80.To_Bounded_String("ABCDEF") then + Report.Failed("Incorrect result from Catenation of Token_String"); + end if; + + + -- Find the starting/ending position of the first A in the + -- Token_String (both should be 1, only one A appears in string). + -- The Function Head uses the default pad character to return a + -- bounded string longer than its input parameter bounded string. + + BS80.Find_Token(BS80.Head(Token_String, 10), -- Default pad. + A_Set, + Ada.Strings.Inside, + Start, + Stop); + + if Start /= 1 and Stop /= 1 then + Report.Failed("Incorrect result from Find_Token - 1"); + end if; + + + -- Find the starting/ending position of the first non-AB slice in + -- the "head" five characters of Token_String (slice CDE at + -- positions 3-5) + + BS80.Find_Token(BS80.Head(Token_String, 5), -- "ABCDE" + Ada.Strings.Maps."OR"(A_Set, B_Set), -- Set (AB) + Ada.Strings.Outside, + Start, + Stop); + + if Start /= 3 and Stop /= 5 then + Report.Failed("Incorrect result from Find_Token - 2"); + end if; + + + -- Find the starting/ending position of the first CD slice in + -- the "tail" eight characters (including two pad characters) + -- of Token_String (slice CD at positions 5-6 of the tail + -- portion specified) + + BS80.Find_Token(BS80.Tail(Token_String, 8, + Ada.Strings.Space), -- " ABCDEF" + Ada.Strings.Maps."OR"(C_Set, D_Set), -- Set (CD) + Ada.Strings.Inside, + Start, + Stop); + + if Start /= 5 and Stop /= 6 then + Report.Failed("Incorrect result from Find_Token - 3"); + end if; + + + -- Evaluate the Replace_Element procedure. + + -- Token_String = "ABCDEF" + + BS80.Replace_Element(Token_String, 3, BS80.Element(Token_String,4)); + + -- Token_String = "ABDDEF" + + BS80.Replace_Element(Source => Token_String, + Index => 2, + By => BS80.Element(Token_String, 5)); + + -- Token_String = "AEDDEF" + + BS80.Replace_Element(Token_String, + 1, + BS80.Element(BS80.Tail(Token_String, 2), 2)); + + -- Token_String = "FEDDEF" + -- Evaluate this result. + + if BS80.Element(Token_String, BS80.To_String(Token_String)'First) /= + BS80.Element(Token_String, BS80.To_String(Token_String)'Last) or + BS80.Count(Token_String, D_Set) /= + BS80.Count(Token_String, E_Set) or + BS80.Index_Non_Blank(BS80.Head(Token_String,6)) /= + BS80.Index_Non_Blank(BS80.Tail(Token_String,6)) or + BS80.Head(Token_String, 1) /= + BS80.Tail(Token_String, 1) + then + Report.Failed("Incorrect result from operations in combination"); + end if; + + end; + + exception + when others => Report.Failed ("Exception raised in Test_Block"); + end Test_Block; + + + Report.Result; + +end CXA4007; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxa4008.a b/gcc/testsuite/ada/acats/tests/cxa/cxa4008.a new file mode 100644 index 000000000..629305f76 --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxa4008.a @@ -0,0 +1,662 @@ +-- CXA4008.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 subprograms defined in package Ada.Strings.Bounded are +-- available, and that they produce correct results, especially under +-- conditions where truncation of the result is required. Specifically, +-- check the subprograms Append, Count with non-Identity maps, Index with +-- non-Identity maps, Index with Set parameters, Insert (function and +-- procedure), Replace_Slice (function and procedure), To_Bounded_String, +-- and Translate. +-- +-- TEST DESCRIPTION: +-- This test, in conjunction with tests CXA4006, CXA4007, and CXA4009, +-- will provide coverage of the most common usages of the functionality +-- found in the Ada.Strings.Bounded package. It deals in large part +-- with truncation effects and options. This test contains many small, +-- specific test cases, situations that are often difficult to generate +-- in large numbers in an application-based test. These cases represent +-- specific usage paradigms in-the-small. +-- +-- +-- CHANGE HISTORY: +-- 06 Dec 94 SAIC ACVC 2.0 +-- 10 Apr 95 SAIC Corrected acceptance condition of subtest for +-- Function Append with Truncation = Left. +-- 31 Oct 95 SAIC Update and repair for ACVC 2.0.1. +-- +--! + +with Report; +with Ada.Strings.Maps.Constants; +with Ada.Strings.Bounded; +with Ada.Strings.Maps; + +procedure CXA4008 is + +begin + + Report.Test("CXA4008", "Check that the subprograms defined in " & + "package Ada.Strings.Bounded are available, " & + "and that they produce correct results, " & + "especially under conditions where " & + "truncation of the result is required"); + + Test_Block: + declare + + package AS renames Ada.Strings; + package ASB renames Ada.Strings.Bounded; + package ASC renames Ada.Strings.Maps.Constants; + package Maps renames Ada.Strings.Maps; + + package B10 is new ASB.Generic_Bounded_Length(Max => 10); + use type B10.Bounded_String; + + Result_String : B10.Bounded_String; + Test_String : B10.Bounded_String; + AtoE_Bnd_Str : B10.Bounded_String := B10.To_Bounded_String("abcde"); + FtoJ_Bnd_Str : B10.Bounded_String := B10.To_Bounded_String("fghij"); + AtoJ_Bnd_Str : B10.Bounded_String := + B10.To_Bounded_String("abcdefghij"); + + Location : Natural := 0; + Total_Count : Natural := 0; + + CD_Set : Maps.Character_Set := Maps.To_Set("cd"); + + AB_to_YZ_Map : Maps.Character_Mapping := + Maps.To_Mapping(From => "ab", To => "yz"); + + CD_to_XY_Map : Maps.Character_Mapping := + Maps.To_Mapping(From => "cd", To => "xy"); + + + begin + -- Function To_Bounded_String with Truncation + -- Evaluate the function Append with parameters that will + -- cause the truncation of the result. + + -- Drop = Error (default case, Length_Error will be raised) + + begin + Test_String := + B10.To_Bounded_String("Much too long for this bounded string"); + Report.Failed("Length Error not raised by To_Bounded_String"); + exception + when AS.Length_Error => null; -- Expected exception raised. + when others => + Report.Failed("Incorrect exception raised by To_Bounded_String"); + end; + + -- Drop = Left + + Test_String := B10.To_Bounded_String(Source => "abcdefghijklmn", + Drop => Ada.Strings.Left); + + if Test_String /= B10.To_Bounded_String("efghijklmn") then + Report.Failed + ("Incorrect result from To_Bounded_String, Drop = Left"); + end if; + + -- Drop = Right + + Test_String := B10.To_Bounded_String(Source => "abcdefghijklmn", + Drop => Ada.Strings.Right); + + if not(Test_String = AtoJ_Bnd_Str) then + Report.Failed + ("Incorrect result from To_Bounded_String, Drop = Right"); + end if; + + + + + -- Function Append with Truncation + -- Evaluate the function Append with parameters that will + -- cause the truncation of the result. + + -- Drop = Error (default case, Length_Error will be raised) + + begin + -- Append (Bnd Str, Bnd Str); + Result_String := + B10.Append(B10.To_Bounded_String("abcde"), + B10.To_Bounded_String("fghijk")); -- 11 char + Report.Failed("Length_Error not raised by Append - 1"); + exception + when AS.Length_Error => null; -- OK, correct exception raised. + when others => + Report.Failed("Incorrect exception raised by Append - 1"); + end; + + begin + -- Append (Str, Bnd Str); + Result_String := B10.Append(B10.To_String(AtoE_Bnd_Str), + B10.To_Bounded_String("fghijk"), + AS.Error); + Report.Failed("Length_Error not raised by Append - 2"); + exception + when AS.Length_Error => null; -- OK, correct exception raised. + when others => + Report.Failed("Incorrect exception raised by Append - 2"); + end; + + begin + -- Append (Bnd Str, Char); + Result_String := + B10.Append(B10.To_Bounded_String("abcdefghij"), 'k'); + Report.Failed("Length_Error not raised by Append - 3"); + exception + when AS.Length_Error => null; -- OK, correct exception raised. + when others => + Report.Failed("Incorrect exception raised by Append - 3"); + end; + + -- Drop = Left + + -- Append (Bnd Str, Bnd Str) + Result_String := B10.Append(B10.To_Bounded_String("abcdefgh"), -- 8 chs + B10.To_Bounded_String("ijklmn"), -- 6 chs + Ada.Strings.Left); + + if Result_String /= B10.To_Bounded_String("efghijklmn") then -- 10 chars + Report.Failed("Incorrect truncation performed by Append - 4"); + end if; + + -- Append (Bnd Str, Str) + Result_String := + B10.Append(B10.To_Bounded_String("abcdefghij"), + "xyz", + Ada.Strings.Left); + + if Result_String /= B10.To_Bounded_String("defghijxyz") then + Report.Failed("Incorrect truncation performed by Append - 5"); + end if; + + -- Append (Char, Bnd Str) + + Result_String := B10.Append('A', + B10.To_Bounded_String("abcdefghij"), + Ada.Strings.Left); + + if Result_String /= B10.To_Bounded_String("abcdefghij") then + Report.Failed("Incorrect truncation performed by Append - 6"); + end if; + + -- Drop = Right + + -- Append (Bnd Str, Bnd Str) + Result_String := B10.Append(FtoJ_Bnd_Str, + AtoJ_Bnd_Str, + Ada.Strings.Right); + + if Result_String /= B10.To_Bounded_String("fghijabcde") then + Report.Failed("Incorrect truncation performed by Append - 7"); + end if; + + -- Append (Str, Bnd Str) + Result_String := B10.Append(B10.To_String(AtoE_Bnd_Str), + AtoJ_Bnd_Str, + Ada.Strings.Right); + + if Result_String /= B10.To_Bounded_String("abcdeabcde") then + Report.Failed("Incorrect truncation performed by Append - 8"); + end if; + + -- Append (Char, Bnd Str) + Result_String := B10.Append('A', AtoJ_Bnd_Str, Ada.Strings.Right); + + if Result_String /= B10.To_Bounded_String("Aabcdefghi") then + Report.Failed("Incorrect truncation performed by Append - 9"); + end if; + + + -- Function Index with non-Identity map. + -- Evaluate the function Index with a non-identity map + -- parameter which will cause mapping of the source parameter + -- prior to the evaluation of the index position search. + + Location := B10.Index(Source => AtoJ_Bnd_Str, -- "abcdefghij" + Pattern => "xy", + Going => Ada.Strings.Forward, + Mapping => CD_to_XY_Map); -- change "cd" to "xy" + + if Location /= 3 then + Report.Failed("Incorrect result from Index, non-Identity map - 1"); + end if; + + Location := B10.Index(B10.To_Bounded_String("AND IF MAN"), + "an", + Ada.Strings.Backward, + ASC.Lower_Case_Map); + + if Location /= 9 then + Report.Failed("Incorrect result from Index, non-Identity map - 2"); + end if; + + Location := B10.Index(Source => B10.To_Bounded_String("The the"), + Pattern => "the", + Going => Ada.Strings.Forward, + Mapping => ASC.Lower_Case_Map); + + if Location /= 1 then + Report.Failed("Incorrect result from Index, non-Identity map - 3"); + end if; + + + if B10.Index(B10.To_Bounded_String("abcd"), -- Pattern = Source + "abcd") /= 1 or + B10.Index(B10.To_Bounded_String("abc"), -- Pattern < Source + "abcd") /= 0 or + B10.Index(B10.Null_Bounded_String, -- Source = Null + "abc") /= 0 + then + Report.Failed("Incorrect result from Index with string patterns"); + end if; + + + -- Function Index (for Sets). + -- This version of Index uses Sets as the basis of the search. + + -- Test = Inside, Going = Forward (Default case). + Location := + B10.Index(Source => B10.To_Bounded_String("abcdeabcde"), + Set => CD_Set, -- set containing 'c' and 'd' + Test => Ada.Strings.Inside, + Going => Ada.Strings.Forward); + + if not (Location = 3) then -- position of first 'c' in source. + Report.Failed("Incorrect result from Index using Sets - 1"); + end if; + + -- Test = Inside, Going = Backward. + Location := + B10.Index(Source => B10."&"(AtoE_Bnd_Str, AtoE_Bnd_Str), + Set => CD_Set, -- set containing 'c' and 'd' + Test => Ada.Strings.Inside, + Going => Ada.Strings.Backward); + + if not (Location = 9) then -- position of last 'd' in source. + Report.Failed("Incorrect result from Index using Sets - 2"); + end if; + + -- Test = Outside, Going = Forward. + Location := B10.Index(B10.To_Bounded_String("deddacd"), + CD_Set, + Test => Ada.Strings.Outside, + Going => Ada.Strings.Forward); + + if Location /= 2 then -- position of 'e' in source. + Report.Failed("Incorrect result from Index using Sets - 3"); + end if; + + -- Test = Outside, Going = Backward. + Location := B10.Index(B10.To_Bounded_String("deddacd"), + CD_Set, + Ada.Strings.Outside, + Ada.Strings.Backward); + + if Location /= 5 then -- correct position of 'a'. + Report.Failed("Incorrect result from Index using Sets - 4"); + end if; + + if B10.Index(B10.To_Bounded_String("cd"), -- Source = Set + CD_Set) /= 1 or + B10.Index(B10.To_Bounded_String("c"), -- Source < Set + CD_Set) /= 1 or + B10.Index(B10.Null_Bounded_String, -- Source = Null + CD_Set) /= 0 or + B10.Index(AtoE_Bnd_Str, -- "abcde" + Maps.Null_Set) /= 0 or -- Null set + B10.Index(AtoE_Bnd_Str, + Maps.To_Set('x')) /= 0 -- No match. + then + Report.Failed("Incorrect result from Index using Sets - 5"); + end if; + + + -- Function Count with non-Identity mapping. + -- Evaluate the function Count with a non-identity map + -- parameter which will cause mapping of the source parameter + -- prior to the evaluation of the number of matching patterns. + + Total_Count := + B10.Count(Source => B10.To_Bounded_String("abbabaabab"), + Pattern => "yz", + Mapping => AB_to_YZ_Map); + + if Total_Count /= 4 then + Report.Failed + ("Incorrect result from function Count, non-Identity map - 1"); + end if; + + -- And a few with identity maps as well. + + if B10.Count(B10.To_Bounded_String("ABABABABAB"), + "ABA", + Maps.Identity) /= 2 or + B10.Count(B10.To_Bounded_String("ADCBADABCD"), + "AB", + Maps.To_Mapping("CD", "AB")) /= 5 or + B10.Count(B10.To_Bounded_String("aaaaaaaaaa"), + "aaa") /= 3 or + B10.Count(B10.To_Bounded_String("XX"), -- Source < Pattern + "XXX", + Maps.Identity) /= 0 or + B10.Count(AtoE_Bnd_Str, -- Source = Pattern + "abcde") /= 1 or + B10.Count(B10.Null_Bounded_String, -- Source = Null + " ") /= 0 + then + Report.Failed + ("Incorrect result from function Count, w,w/o mapping"); + end if; + + + -- Procedure Translate + + -- Partial mapping of source. + + Test_String := B10.To_Bounded_String("abcdeabcab"); + + B10.Translate(Source => Test_String, Mapping => AB_to_YZ_Map); + + if Test_String /= B10.To_Bounded_String("yzcdeyzcyz") then + Report.Failed("Incorrect result from procedure Translate - 1"); + end if; + + -- Total mapping of source. + + Test_String := B10.To_Bounded_String("abbaaababb"); + + B10.Translate(Source => Test_String, Mapping => ASC.Upper_Case_Map); + + if Test_String /= B10.To_Bounded_String("ABBAAABABB") then + Report.Failed("Incorrect result from procedure Translate - 2"); + end if; + + -- No mapping of source. + + Test_String := B10.To_Bounded_String("xyzsypcc"); + + B10.Translate(Source => Test_String, Mapping => AB_to_YZ_Map); + + if Test_String /= B10.To_Bounded_String("xyzsypcc") then + Report.Failed("Incorrect result from procedure Translate - 3"); + end if; + + -- Map > 2 characters, partial mapping. + + Test_String := B10.To_Bounded_String("have faith"); + + B10.Translate(Test_String, + Maps.To_Mapping("aeiou", "AEIOU")); + + if Test_String /= B10.To_Bounded_String("hAvE fAIth") then + Report.Failed("Incorrect result from procedure Translate - 4"); + end if; + + + -- Function Replace_Slice + -- Evaluate function Replace_Slice with + -- a variety of Truncation options. + + -- Drop = Error (Default) + + begin + Test_String := AtoJ_Bnd_Str; + Result_String := + B10.Replace_Slice(Source => Test_String, -- "abcdefghij" + Low => 3, + High => 5, -- 3-5, 3 chars. + By => "xxxxxx"); -- more than 3. + Report.Failed("Length_Error not raised by Function Replace_Slice"); + exception + when AS.Length_Error => null; -- Correct exception raised. + when others => + Report.Failed + ("Incorrect exception raised by Function Replace_Slice"); + end; + + -- Drop = Left + + Result_String := + B10.Replace_Slice(Source => Test_String, -- "abcdefghij" + Low => 7, + High => 10, -- 7-10, 4 chars. + By => "xxxxxx", -- 6 chars. + Drop => Ada.Strings.Left); + + if Result_String /= B10.To_Bounded_String("cdefxxxxxx") then -- drop a,b + Report.Failed + ("Incorrect result from Function Replace Slice, Drop = Left"); + end if; + + -- Drop = Right + + Result_String := + B10.Replace_Slice(Source => Test_String, -- "abcdefghij" + Low => 2, + High => 5, -- 2-5, 4 chars. + By => "xxxxxx", -- 6 chars. + Drop => Ada.Strings.Right); + + if Result_String /= B10.To_Bounded_String("axxxxxxfgh") then -- drop i,j + Report.Failed + ("Incorrect result from Function Replace Slice, Drop = Right"); + end if; + + -- Low = High = Source'Last, "By" length = 1. + + if B10.Replace_Slice(AtoE_Bnd_Str, + B10.To_String(AtoE_Bnd_Str)'Last, + B10.To_String(AtoE_Bnd_Str)'Last, + "X", + Ada.Strings.Error) /= + B10.To_Bounded_String("abcdX") + then + Report.Failed("Incorrect result from Function Replace_Slice"); + end if; + + + + -- Procedure Replace_Slice + -- Evaluate procedure Replace_Slice with + -- a variety of Truncation options. + + -- Drop = Error (Default) + + begin + Test_String := AtoJ_Bnd_Str; + B10.Replace_Slice(Source => Test_String, -- "abcdefghij" + Low => 3, + High => 5, -- 3-5, 3 chars. + By => "xxxxxx"); -- more than 3. + Report.Failed("Length_Error not raised by Procedure Replace_Slice"); + exception + when AS.Length_Error => null; -- Correct exception raised. + when others => + Report.Failed + ("Incorrect exception raised by Procedure Replace_Slice"); + end; + + -- Drop = Left + + Test_String := AtoJ_Bnd_Str; + B10.Replace_Slice(Source => Test_String, -- "abcdefghij" + Low => 7, + High => 9, -- 7-9, 3 chars. + By => "xxxxx", -- 5 chars. + Drop => Ada.Strings.Left); + + if Test_String /= B10.To_Bounded_String("cdefxxxxxj") then -- drop a,b + Report.Failed + ("Incorrect result from Procedure Replace Slice, Drop = Left"); + end if; + + -- Drop = Right + + Test_String := AtoJ_Bnd_Str; + B10.Replace_Slice(Source => Test_String, -- "abcdefghij" + Low => 1, + High => 3, -- 1-3, 3chars. + By => "xxxx", -- 4 chars. + Drop => Ada.Strings.Right); + + if Test_String /= B10.To_Bounded_String("xxxxdefghi") then -- drop j + Report.Failed + ("Incorrect result from Procedure Replace Slice, Drop = Right"); + end if; + + -- High = Source'First, Low > High (Insert before Low). + + Test_String := AtoE_Bnd_Str; + B10.Replace_Slice(Source => Test_String, -- "abcde" + Low => B10.To_String(Test_String)'Last, + High => B10.To_String(Test_String)'First, + By => "XXXX", -- 4 chars. + Drop => Ada.Strings.Right); + + if Test_String /= B10.To_Bounded_String("abcdXXXXe") then + Report.Failed + ("Incorrect result from Procedure Replace Slice"); + end if; + + + + -- Function Insert with Truncation + -- Drop = Error (Default). + + begin + Result_String := + B10.Insert(Source => AtoJ_Bnd_Str, -- "abcdefghij" + Before => 2, + New_Item => "xyz"); + Report.Failed("Length_Error not raised by Function Insert"); + exception + when AS.Length_Error => null; -- Correct exception raised. + when others => + Report.Failed("Incorrect exception raised by Function Insert"); + end; + + -- Drop = Left + + Result_String := + B10.Insert(Source => AtoJ_Bnd_Str, -- "abcdefghij" + Before => 5, + New_Item => "xyz", -- 3 additional chars. + Drop => Ada.Strings.Left); + + if B10.To_String(Result_String) /= "dxyzefghij" then -- drop a, b, c + Report.Failed("Incorrect result from Function Insert, Drop = Left"); + end if; + + -- Drop = Right + + Result_String := + B10.Insert(Source => B10.To_Bounded_String("abcdef"), + Before => 2, + New_Item => "vwxyz", -- 5 additional chars. + Drop => Ada.Strings.Right); + + if B10.To_String(Result_String) /= "avwxyzbcde" then -- drop f. + Report.Failed("Incorrect result from Function Insert, Drop = Right"); + end if; + + -- Additional cases. + + if B10.Insert(B10.To_Bounded_String("a"), 1, " B") /= + B10.To_Bounded_String(" Ba") or + B10.Insert(B10.Null_Bounded_String, 1, "abcde") /= + AtoE_Bnd_Str or + B10.Insert(B10.To_Bounded_String("ab"), 2, "") /= + B10.To_Bounded_String("ab") + then + Report.Failed("Incorrect result from Function Insert"); + end if; + + + -- Procedure Insert + + -- Drop = Error (Default). + begin + Test_String := AtoJ_Bnd_Str; + B10.Insert(Source => Test_String, -- "abcdefghij" + Before => 9, + New_Item => "wxyz", + Drop => Ada.Strings.Error); + Report.Failed("Length_Error not raised by Procedure Insert"); + exception + when AS.Length_Error => null; -- Correct exception raised. + when others => + Report.Failed("Incorrect exception raised by Procedure Insert"); + end; + + -- Drop = Left + + Test_String := AtoJ_Bnd_Str; + B10.Insert(Source => Test_String, -- "abcdefghij" + Before => B10.Length(Test_String), -- before last char + New_Item => "xyz", -- 3 additional chars. + Drop => Ada.Strings.Left); + + if B10.To_String(Test_String) /= "defghixyzj" then -- drop a, b, c + Report.Failed("Incorrect result from Procedure Insert, Drop = Left"); + end if; + + -- Drop = Right + + Test_String := AtoJ_Bnd_Str; + B10.Insert(Source => Test_String, + Before => 4, + New_Item => "yz", -- 2 additional chars. + Drop => Ada.Strings.Right); + + if B10.To_String(Test_String) /= "abcyzdefgh" then -- drop i,j + Report.Failed + ("Incorrect result from Procedure Insert, Drop = Right"); + end if; + + -- Before = Source'First, New_Item length = 1. + + Test_String := B10.To_Bounded_String(" abc "); + B10.Insert(Test_String, + B10.To_String(Test_String)'First, + "Z"); + + if Test_String /= B10.To_Bounded_String("Z abc ") then + Report.Failed("Incorrect result from Procedure Insert"); + end if; + + + exception + when others => Report.Failed("Exception raised in Test_Block"); + end Test_Block; + + Report.Result; + +end CXA4008; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxa4009.a b/gcc/testsuite/ada/acats/tests/cxa/cxa4009.a new file mode 100644 index 000000000..f02ef0365 --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxa4009.a @@ -0,0 +1,619 @@ +-- CXA4009.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 subprograms defined in package Ada.Strings.Bounded are +-- available, and that they produce correct results, especially under +-- conditions where truncation of the result is required. Specifically, +-- check the subprograms Overwrite (function and procedure), Delete, +-- Function Trim (blanks), Trim (Set characters, function and procedure), +-- Head, Tail, and Replicate (characters and strings). +-- +-- TEST DESCRIPTION: +-- This test, in conjunction with tests CXA4006, CXA4007, and CXA4008, +-- will provide coverage of the most common usages of the functionality +-- found in the Ada.Strings.Bounded package. It deals in large part +-- with truncation effects and options. This test contains many small, +-- specific test cases, situations that are often difficult to generate +-- in large numbers in an application-based test. These cases represent +-- specific usage paradigms in-the-small. +-- +-- +-- CHANGE HISTORY: +-- 06 Dec 94 SAIC ACVC 2.0 +-- 10 Apr 95 SAIC Corrected errors in Procedure Overwrite subtests. +-- 01 Nov 95 SAIC Fixed bugs for ACVC 2.0.1. +-- +--! + +with Report; +with Ada.Strings.Bounded; +with Ada.Strings.Maps; + +procedure CXA4009 is + +begin + + Report.Test("CXA4009", "Check that the subprograms defined in " & + "package Ada.Strings.Bounded are available, " & + "and that they produce correct results, " & + "especially under conditions where " & + "truncation of the result is required"); + + Test_Block: + declare + + package AS renames Ada.Strings; + package ASB renames Ada.Strings.Bounded; + package Maps renames Ada.Strings.Maps; + + package B10 is new ASB.Generic_Bounded_Length(Max => 10); + use type B10.Bounded_String; + + Result_String : B10.Bounded_String; + Test_String : B10.Bounded_String; + AtoE_Bnd_Str : B10.Bounded_String := B10.To_Bounded_String("abcde"); + FtoJ_Bnd_Str : B10.Bounded_String := B10.To_Bounded_String("fghij"); + AtoJ_Bnd_Str : B10.Bounded_String := + B10.To_Bounded_String("abcdefghij"); + + Location : Natural := 0; + Total_Count : Natural := 0; + + CD_Set : Maps.Character_Set := Maps.To_Set("cd"); + XY_Set : Maps.Character_Set := Maps.To_Set("xy"); + + + begin + + -- Function Overwrite with Truncation + -- Drop = Error (Default). + + begin + Test_String := AtoJ_Bnd_Str; + Result_String := + B10.Overwrite(Source => Test_String, -- "abcdefghij" + Position => 9, + New_Item => "xyz", + Drop => AS.Error); + Report.Failed("Exception not raised by Function Overwrite"); + exception + when AS.Length_Error => null; -- Expected exception raised. + when others => + Report.Failed("Incorrect exception raised by Function Overwrite"); + end; + + -- Drop = Left + + Result_String := + B10.Overwrite(Source => Test_String, -- "abcdefghij" + Position => B10.Length(Test_String), -- 10 + New_Item => "xyz", + Drop => Ada.Strings.Left); + + if B10.To_String(Result_String) /= "cdefghixyz" then -- drop a,b + Report.Failed + ("Incorrect result from Function Overwrite, Drop = Left"); + end if; + + -- Drop = Right + + Result_String := B10.Overwrite(Test_String, -- "abcdefghij" + 3, + "xxxyyyzzz", + Ada.Strings.Right); + + if B10.To_String(Result_String) /= "abxxxyyyzz" then -- one 'z' dropped + Report.Failed + ("Incorrect result from Function Overwrite, Drop = Right"); + end if; + + -- Additional cases of function Overwrite. + + if B10.Overwrite(B10.To_Bounded_String("a"), -- Source length = 1 + 1, + " abc ") /= + B10.To_Bounded_String(" abc ") or + B10.Overwrite(B10.Null_Bounded_String, -- Null source + 1, + "abcdefghij") /= + AtoJ_Bnd_Str or + B10.Overwrite(AtoE_Bnd_Str, + B10.To_String(AtoE_Bnd_Str)'First, + " ") /= -- New_Item = 1 + B10.To_Bounded_String(" bcde") + then + Report.Failed("Incorrect result from Function Overwrite"); + end if; + + + + -- Procedure Overwrite + -- Correct usage, no truncation. + + Test_String := AtoE_Bnd_Str; -- "abcde" + B10.Overwrite(Test_String, 2, "xyz"); + + if Test_String /= B10.To_Bounded_String("axyze") then + Report.Failed("Incorrect result from Procedure Overwrite - 1"); + end if; + + Test_String := B10.To_Bounded_String("abc"); + B10.Overwrite(Test_String, 2, ""); -- New_Item is null string. + + if Test_String /= B10.To_Bounded_String("abc") then + Report.Failed("Incorrect result from Procedure Overwrite - 2"); + end if; + + -- Drop = Error (Default). + + begin + Test_String := AtoJ_Bnd_Str; + B10.Overwrite(Source => Test_String, -- "abcdefghij" + Position => 8, + New_Item => "uvwxyz"); + Report.Failed("Exception not raised by Procedure Overwrite"); + exception + when AS.Length_Error => null; -- Expected exception raised. + when others => + Report.Failed("Incorrect exception raised by Procedure Overwrite"); + end; + + -- Drop = Left + + Test_String := AtoJ_Bnd_Str; + B10.Overwrite(Source => Test_String, -- "abcdefghij" + Position => B10.Length(Test_String) - 2, -- 8 + New_Item => "uvwxyz", + Drop => Ada.Strings.Left); + + if B10.To_String(Test_String) /= "defguvwxyz" then -- drop a-c + Report.Failed + ("Incorrect result from Procedure Overwrite, Drop = Left"); + end if; + + -- Drop = Right + + Test_String := AtoJ_Bnd_Str; + B10.Overwrite(Test_String, -- "abcdefghij" + 3, + "xxxyyyzzz", + Ada.Strings.Right); + + if B10.To_String(Test_String) /= "abxxxyyyzz" then -- one 'z' dropped + Report.Failed + ("Incorrect result from Procedure Overwrite, Drop = Right"); + end if; + + + + -- Function Delete + + if B10.Delete(Source => AtoJ_Bnd_Str, -- "abcdefghij" + From => 3, + Through => 8) /= + B10."&"(B10.Head(AtoJ_Bnd_Str, 2), + B10.Tail(AtoJ_Bnd_Str, 2)) or + B10.Delete(AtoJ_Bnd_Str, 6, B10.Length(AtoJ_Bnd_Str)) /= + AtoE_Bnd_Str or + B10.Delete(AtoJ_Bnd_Str, 1, 5) /= + FtoJ_Bnd_Str or + B10.Delete(AtoE_Bnd_Str, 4, 5) /= + B10.Delete(AtoJ_Bnd_Str, 4, B10.Length(AtoJ_Bnd_Str)) + then + Report.Failed("Incorrect result from Function Delete - 1"); + end if; + + if B10.Delete(B10.To_Bounded_String("a"), 1, 1) /= + B10.Null_Bounded_String or + B10.Delete(AtoE_Bnd_Str, + 5, + B10.To_String(AtoE_Bnd_Str)'First) /= + AtoE_Bnd_Str or + B10.Delete(AtoE_Bnd_Str, + B10.To_String(AtoE_Bnd_Str)'Last, + B10.To_String(AtoE_Bnd_Str)'Last) /= + B10.To_Bounded_String("abcd") + then + Report.Failed("Incorrect result from Function Delete - 2"); + end if; + + + + -- Function Trim + + declare + + Text : B10.Bounded_String := B10.To_Bounded_String("Text"); + type Bnd_Array_Type is array (1..5) of B10.Bounded_String; + Bnd_Array : Bnd_Array_Type := + (B10.To_Bounded_String(" Text"), + B10.To_Bounded_String("Text "), + B10.To_Bounded_String(" Text "), + B10.To_Bounded_String("Text Text"), -- Ensure no inter-string + B10.To_Bounded_String(" Text Text")); -- trimming of blanks. + + begin + + for i in Bnd_Array_Type'Range loop + case i is + when 4 => + if B10.Trim(Bnd_Array(i), AS.Both) /= + Bnd_Array(i) then -- no change + Report.Failed("Incorrect result from Function Trim - 4"); + end if; + when 5 => + if B10.Trim(Bnd_Array(i), AS.Both) /= + B10."&"(Text, B10."&"(' ', Text)) then + Report.Failed("Incorrect result from Function Trim - 5"); + end if; + when others => + if B10.Trim(Bnd_Array(i), AS.Both) /= Text then + Report.Failed("Incorrect result from Function Trim - " & + Integer'Image(i)); + end if; + end case; + end loop; + + end; + + + + -- Function Trim using Sets + + -- Trim characters in sets from both sides of the bounded string. + if B10.Trim(Source => B10.To_Bounded_String("ddabbaxx"), + Left => CD_Set, + Right => XY_Set) /= + B10.To_Bounded_String("abba") + then + Report.Failed + ("Incorrect result from Fn Trim - Sets, Left & Right side - 1"); + end if; + + -- Ensure that the characters in the set provided as the actual to + -- parameter Right are not trimmed from the left side of the bounded + -- string; likewise for the opposite side. Only "cd" trimmed from left + -- side, and only "xy" trimmed from right side. + + if B10.Trim(B10.To_Bounded_String("cdxyabcdxy"), CD_Set, XY_Set) /= + B10.To_Bounded_String("xyabcd") + then + Report.Failed + ("Incorrect result from Fn Trim - Sets, Left & Right side - 2"); + end if; + + -- Ensure that characters contained in the sets are not trimmed from + -- the "interior" of the bounded string, just the appropriate ends. + + if B10.Trim(B10.To_Bounded_String("cdabdxabxy"), CD_Set, XY_Set) /= + B10.To_Bounded_String("abdxab") + then + Report.Failed + ("Incorrect result from Fn Trim - Sets, Left & Right side - 3"); + end if; + + -- Trim characters in set from right side only. No change to Left side. + + if B10.Trim(B10.To_Bounded_String("abxyzddcd"), XY_Set, CD_Set) /= + B10.To_Bounded_String("abxyz") + then + Report.Failed + ("Incorrect result from Fn Trim - Sets, Right side"); + end if; + + -- Trim no characters on either side of the bounded string. + + Result_String := B10.Trim(AtoJ_Bnd_Str, CD_Set, XY_Set); + if Result_String /= AtoJ_Bnd_Str then + Report.Failed("Incorrect result from Fn Trim - Sets, Neither side"); + end if; + + if B10.Trim(AtoE_Bnd_Str, Maps.Null_Set, Maps.Null_Set) /= + AtoE_Bnd_Str or + B10.Trim(B10.To_Bounded_String("dcddcxyyxx"), + CD_Set, + XY_Set) /= + B10.Null_Bounded_String + then + Report.Failed("Incorrect result from Function Trim"); + end if; + + + + -- Procedure Trim using Sets + + -- Trim characters in sets from both sides of the bounded string. + + Test_String := B10.To_Bounded_String("dcabbayx"); + B10.Trim(Source => Test_String, + Left => CD_Set, + Right => XY_Set); + + if Test_String /= B10.To_Bounded_String("abba") then + Report.Failed + ("Incorrect result from Proc Trim - Sets, Left & Right side - 1"); + end if; + + -- Ensure that the characters in the set provided as the actual to + -- parameter Right are not trimmed from the left side of the bounded + -- string; likewise for the opposite side. Only "cd" trimmed from left + -- side, and only "xy" trimmed from right side. + + Test_String := B10.To_Bounded_String("cdxyabcdxy"); + B10.Trim(Test_String, CD_Set, XY_Set); + + if Test_String /= B10.To_Bounded_String("xyabcd") then + Report.Failed + ("Incorrect result from Proc Trim - Sets, Left & Right side - 2"); + end if; + + -- Ensure that characters contained in the sets are not trimmed from + -- the "interior" of the bounded string, just the appropriate ends. + + Test_String := B10.To_Bounded_String("cdabdxabxy"); + B10.Trim(Test_String, CD_Set, XY_Set); + + if not (Test_String = B10.To_Bounded_String("abdxab")) then + Report.Failed + ("Incorrect result from Proc Trim - Sets, Left & Right side - 3"); + end if; + + -- Trim characters in set from Left side only. No change to Right side. + + Test_String := B10.To_Bounded_String("cccdabxyz"); + B10.Trim(Test_String, CD_Set, XY_Set); + + if Test_String /= B10.To_Bounded_String("abxyz") then + Report.Failed + ("Incorrect result from Proc Trim for Sets, Left side only"); + end if; + + -- Trim no characters on either side of the bounded string. + + Test_String := AtoJ_Bnd_Str; + B10.Trim(Test_String, CD_Set, CD_Set); + + if Test_String /= AtoJ_Bnd_Str then + Report.Failed("Incorrect result from Proc Trim-Sets, Neither side"); + end if; + + + + -- Function Head with Truncation + -- Drop = Error (Default). + + begin + Result_String := B10.Head(Source => AtoJ_Bnd_Str, -- max length + Count => B10.Length(AtoJ_Bnd_Str) + 1, + Pad => 'X'); + Report.Failed("Length_Error not raised by Function Head"); + exception + when AS.Length_Error => null; -- Expected exception raised. + when others => + Report.Failed("Incorrect exception raised by Function Head"); + end; + + -- Drop = Left + + -- Pad characters (5) are appended to the right end of the string + -- (which is initially at its maximum length), then the first five + -- characters of the intermediate result are dropped to conform to + -- the maximum size limit of the bounded string (10). + + Result_String := B10.Head(B10.To_Bounded_String("ABCDEFGHIJ"), + 15, + 'x', + Ada.Strings.Left); + + if Result_String /= B10.To_Bounded_String("FGHIJxxxxx") then + Report.Failed("Incorrect result from Function Head, Drop = Left"); + end if; + + -- Drop = Right + + -- Pad characters (6) are appended to the left end of the string + -- (which is initially at one less than its maximum length), then the + -- last five characters of the intermediate result are dropped + -- (which in this case are the pad characters) to conform to the + -- maximum size limit of the bounded string (10). + + Result_String := B10.Head(B10.To_Bounded_String("ABCDEFGHI"), + 15, + 'x', + Ada.Strings.Right); + + if Result_String /= B10.To_Bounded_String("ABCDEFGHIx") then + Report.Failed("Incorrect result from Function Head, Drop = Right"); + end if; + + -- Additional cases. + + if B10.Head(B10.Null_Bounded_String, 5) /= + B10.To_Bounded_String(" ") or + B10.Head(AtoE_Bnd_Str, + B10.Length(AtoE_Bnd_Str)) /= + AtoE_Bnd_Str + then + Report.Failed("Incorrect result from Function Head"); + end if; + + + + -- Function Tail with Truncation + -- Drop = Error (Default Case) + + begin + Result_String := B10.Tail(Source => AtoJ_Bnd_Str, -- max length + Count => B10.Length(AtoJ_Bnd_Str) + 1, + Pad => Ada.Strings.Space, + Drop => Ada.Strings.Error); + Report.Failed("Length_Error not raised by Function Tail"); + exception + when AS.Length_Error => null; -- Expected exception raised. + when others => + Report.Failed("Incorrect exception raised by Function Tail"); + end; + + -- Drop = Left + + -- Pad characters (5) are appended to the left end of the string + -- (which is initially at two less than its maximum length), then + -- the first three characters of the intermediate result (in this + -- case, 3 pad characters) are dropped. + + Result_String := B10.Tail(B10.To_Bounded_String("ABCDEFGH"), -- 8 ch + 13, + 'x', + Ada.Strings.Left); + + if Result_String /= B10.To_Bounded_String("xxABCDEFGH") then + Report.Failed("Incorrect result from Function Tail, Drop = Left"); + end if; + + -- Drop = Right + + -- Pad characters (3) are appended to the left end of the string + -- (which is initially at its maximum length), then the last three + -- characters of the intermediate result are dropped. + + Result_String := B10.Tail(B10.To_Bounded_String("ABCDEFGHIJ"), + 13, + 'x', + Ada.Strings.Right); + + if Result_String /= B10.To_Bounded_String("xxxABCDEFG") then + Report.Failed("Incorrect result from Function Tail, Drop = Right"); + end if; + + -- Additional cases. + + if B10.Tail(B10.Null_Bounded_String, 3, ' ') /= + B10.To_Bounded_String(" ") or + B10.Tail(AtoE_Bnd_Str, + B10.To_String(AtoE_Bnd_Str)'First) /= + B10.To_Bounded_String("e") + then + Report.Failed("Incorrect result from Function Tail"); + end if; + + + + -- Function Replicate (#, Char) with Truncation + -- Drop = Error (Default). + + begin + Result_String := B10.Replicate(Count => B10.Max_Length + 5, + Item => 'A', + Drop => AS.Error); + Report.Failed + ("Length_Error not raised by Replicate for characters"); + exception + when AS.Length_Error => null; -- Expected exception raised. + when others => + Report.Failed + ("Incorrect exception raised by Replicate for characters"); + end; + + -- Drop = Left, Right + -- Since this version of Replicate uses character parameters, the + -- result after truncation from left or right will appear the same. + -- The result will be a 10 character bounded string, composed of 10 + -- "Item" characters. + + if B10.Replicate(Count => 20, Item => 'A', Drop => Ada.Strings.Left) /= + B10.Replicate(15, 'A', Ada.Strings.Right) + then + Report.Failed("Incorrect result from Replicate for characters - 1"); + end if; + + -- Blank-filled 10 character bounded strings. + + if B10.Replicate(B10.Max_Length + 1, ' ', Drop => Ada.Strings.Left) /= + B10.Replicate(B10.Max_Length, Ada.Strings.Space) + then + Report.Failed("Incorrect result from Replicate for characters - 2"); + end if; + + -- Additional cases. + + if B10.Replicate(0, 'a') /= B10.Null_Bounded_String or + B10.Replicate(1, 'a') /= B10.To_Bounded_String("a") + then + Report.Failed("Incorrect result from Replicate for characters - 3"); + end if; + + + + -- Function Replicate (#, String) with Truncation + -- Drop = Error (Default). + + begin + Result_String := B10.Replicate(Count => 5, -- result would be 15. + Item => "abc"); + Report.Failed + ("Length_Error not raised by Replicate for strings"); + exception + when AS.Length_Error => null; -- Expected exception raised. + when others => + Report.Failed + ("Incorrect exception raised by Replicate for strings"); + end; + + -- Drop = Left + + Result_String := B10.Replicate(3, "abcd", Drop => Ada.Strings.Left); + + if Result_String /= B10.To_Bounded_String("cdabcdabcd") then + Report.Failed + ("Incorrect result from Replicate for strings, Drop = Left"); + end if; + + -- Drop = Right + + Result_String := B10.Replicate(3, "abcd", Drop => Ada.Strings.Right); + + if Result_String /= B10.To_Bounded_String("abcdabcdab") then + Report.Failed + ("Incorrect result from Replicate for strings, Drop = Right"); + end if; + + -- Additional cases. + + if B10.Replicate(10, "X") /= B10.To_Bounded_String("XXXXXXXXXX") or + B10.Replicate(10, "") /= B10.Null_Bounded_String or + B10.Replicate( 0, "ab") /= B10.Null_Bounded_String + then + Report.Failed("Incorrect result from Replicate for strings"); + end if; + + + exception + when others => Report.Failed("Exception raised in Test_Block"); + end Test_Block; + + Report.Result; + +end CXA4009; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxa4010.a b/gcc/testsuite/ada/acats/tests/cxa/cxa4010.a new file mode 100644 index 000000000..8646b12b5 --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxa4010.a @@ -0,0 +1,275 @@ +-- CXA4010.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 subprograms defined in package Ada.Strings.Unbounded +-- are available, and that they produce correct results. Specifically, +-- check the subprograms To_String, To_Unbounded_String, Insert, "&", +-- "*", Length, Slice, Replace_Slice, Overwrite, Index, Index_Non_Blank, +-- Head, Tail, and "=", "<=", ">=". +-- +-- TEST DESCRIPTION: +-- This test demonstrates the uses of many of the subprograms defined +-- in package Ada.Strings.Unbounded for use with unbounded strings. +-- The test simulates how unbounded strings could be used +-- to simulate paragraphs of text. Modifications could be easily be +-- performed using the provided subprograms (although in this test, the +-- main modification performed was the addition of more text to the +-- string). One would not have to worry about the formatting of the +-- paragraph until it was finished and correct in content. Then, once +-- all required editing is complete, the unbounded strings can be divided +-- up into the appropriate lengths based on particular formatting +-- requirements. The test then compares the formatted text product +-- with a predefined "finished product". +-- +-- This test uses a large number of the subprograms provided +-- by package Ada.Strings.Unbounded. Often, the processing involved +-- could have been performed more efficiently using a minimum number +-- of the subprograms, in conjunction with loops, etc. However, for +-- testing purposes, and in the interest of minimizing the number of +-- tests developed, subprogram variety and feature mixing was stressed. +-- +-- +-- CHANGE HISTORY: +-- 06 Dec 94 SAIC ACVC 2.0 +-- +--! + +with Report; +with Ada.Strings.Maps; +with Ada.Strings.Unbounded; + +procedure CXA4010 is +begin + + Report.Test ("CXA4010", "Check that the subprograms defined in " & + "package Ada.Strings.Unbounded are available, " & + "and that they produce correct results"); + + Test_Block: + declare + + package ASUnb renames Ada.Strings.Unbounded; + use type ASUnb.Unbounded_String; + use Ada.Strings; + + Pamphlet_Paragraph_Count : constant := 2; + Lines : constant := 4; + Line_Length : constant := 40; + + type Document_Type is array (Positive range <>) + of ASUnb.Unbounded_String; + + type Camera_Ready_Copy_Type is array (1..Lines) + of String (1..Line_Length); + + Pamphlet : Document_Type (1..Pamphlet_Paragraph_Count); + + Camera_Ready_Copy : Camera_Ready_Copy_Type := + (others => (others => Ada.Strings.Space)); + + TC_Finished_Product : Camera_Ready_Copy_Type := + ( 1 => "Ada is a programming language designed ", + 2 => "to support long-lived, reliable software", + 3 => " systems. ", + 4 => "Go with Ada! "); + + ----- + + + procedure Enter_Text_Into_Document (Document : in out Document_Type) is + begin + + -- Fill in both "paragraphs" of the document. Each unbounded string + -- functions as an individual paragraph, containing an unspecified + -- number of characters. + -- Use a variety of different unbounded string subprograms to load + -- the data. + + Document(1) := ASUnb.To_Unbounded_String("Ada is a language"); + + -- Insert the word "programming" prior to "language". + Document(1) := + ASUnb.Insert(Document(1), + ASUnb.Index(Document(1), + "language"), + ASUnb.To_String("progra" & -- Str & + ASUnb."*"(2,'m') & -- Unbd & + "ing ")); -- Str + + + -- Overwrite the word "language" with "language" + additional text. + Document(1) := + ASUnb.Overwrite(Document(1), + ASUnb.Index(Document(1), + ASUnb.To_String( + ASUnb.Tail(Document(1), 8, ' ')), + Ada.Strings.Backward), + "language designed to support long-lifed"); + + + -- Replace the word "lifed" with "lived". + Document(1) := + ASUnb.Replace_Slice(Document(1), + ASUnb.Index(Document(1), "lifed"), + ASUnb.Length(Document(1)), + "lived"); + + + -- Overwrite the word "lived" with "lived" + additional text. + Document(1) := + ASUnb.Overwrite(Document(1), + ASUnb.Index(Document(1), + ASUnb.To_String( + ASUnb.Tail(Document(1), 5, ' ')), + Ada.Strings.Backward), + "lived, reliable software systems."); + + + -- Use several of the overloaded versions of "&" to form this + -- unbounded string. + + Document(2) := 'G' & + ASUnb.To_Unbounded_String("o ") & + ASUnb.To_Unbounded_String("with") & + ' ' & + "Ada!"; + + end Enter_Text_Into_Document; + + + ----- + + + procedure Create_Camera_Ready_Copy + (Document : in Document_Type; + Camera_Copy : out Camera_Ready_Copy_Type) is + begin + -- Break the unbounded strings into fixed lengths. + + -- Search the first unbounded string for portions of text that + -- are less than or equal to the length of a string in the + -- Camera_Ready_Copy_Type object. + + Camera_Copy(1) := -- Take characters 1-39, + ASUnb.Slice(Document(1), -- and append a blank space. + 1, + ASUnb.Index(ASUnb.To_Unbounded_String( + ASUnb.Slice(Document(1), + 1, + Line_Length)), + Ada.Strings.Maps.To_Set(' '), + Ada.Strings.Inside, + Ada.Strings.Backward)) & ' '; + + Camera_Copy(2) := -- Take characters 40-79. + ASUnb.Slice(Document(1), + 40, + (ASUnb.Index_Non_Blank -- Should return 79 + (ASUnb.To_Unbounded_String + (ASUnb.Slice(Document(1), -- Slice (40..79) + 40, + 79)), + Ada.Strings.Backward) + 39)); -- Increment since + -- this slice starts + -- at 40. + + Camera_Copy(3)(1..9) := ASUnb.Slice(Document(1), -- Characters 80-88 + 80, + ASUnb.Length(Document(1))); + + + -- Break the second unbounded string into the appropriate length. + -- It is only twelve characters in length, so the entire unbounded + -- string will be placed on one string of the output object. + + Camera_Copy(4)(1..ASUnb.Length(Document(2))) := + ASUnb.To_String(ASUnb.Head(Document(2), + ASUnb.Length(Document(2)))); + + end Create_Camera_Ready_Copy; + + + ----- + + + function Valid_Proofread (Draft, Master : Camera_Ready_Copy_Type) + return Boolean is + begin + + -- Evaluate strings for equality, using the operators defined in + -- package Ada.Strings.Unbounded. The less than/greater than or + -- equal comparisons should evaluate to "equals => True". + + if ASUnb.To_Unbounded_String(Draft(1)) = -- "="(Unb,Unb) + ASUnb.To_Unbounded_String(Master(1)) and + ASUnb.To_Unbounded_String(Draft(2)) <= -- "<="(Unb,Unb) + ASUnb.To_Unbounded_String(Master(2)) and + ASUnb.To_Unbounded_String(Draft(3)) >= -- ">="(Unb,Unb) + ASUnb.To_Unbounded_String(Master(3)) and + ASUnb.To_Unbounded_String(Draft(4)) = -- "="(Unb,Unb) + ASUnb.To_Unbounded_String(Master(4)) + then + return True; + else + return False; + end if; + + end Valid_Proofread; + + + ----- + + + begin + + -- Enter text into the unbounded string paragraphs of the document. + + Enter_Text_Into_Document (Pamphlet); + + + -- Reformat the unbounded strings into fixed string format. + + Create_Camera_Ready_Copy (Document => Pamphlet, + Camera_Copy => Camera_Ready_Copy); + + + -- Verify the conversion process. + + if not Valid_Proofread (Draft => Camera_Ready_Copy, + Master => TC_Finished_Product) + then + Report.Failed ("Incorrect string processing result"); + end if; + + + exception + when others => Report.Failed ("Exception raised in Test_Block"); + end Test_Block; + + + Report.Result; + +end CXA4010; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxa4011.a b/gcc/testsuite/ada/acats/tests/cxa/cxa4011.a new file mode 100644 index 000000000..05388a04b --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxa4011.a @@ -0,0 +1,376 @@ +-- CXA4011.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 subprograms defined in package Ada.Strings.Unbounded +-- are available, and that they produce correct results. Specifically, +-- check the subprograms To_Unbounded_String, "&", ">", "<", Element, +-- Replace_Element, Count, Find_Token, Translate, Trim, Delete, and +-- "*". +-- +-- TEST DESCRIPTION: +-- This test demonstrates the uses of many of the subprograms defined +-- in package Ada.Strings.Unbounded for use with unbounded strings. +-- The test simulates how unbounded strings could be processed in a +-- user environment, using the subprograms provided in this package. +-- +-- This test uses a variety of the subprograms defined in the unbounded +-- string package in ways typical of common usage, with different +-- combinations of available subprograms being used to accomplish +-- similar unbounded string processing goals. +-- +-- +-- CHANGE HISTORY: +-- 06 Dec 94 SAIC ACVC 2.0 +-- 27 Feb 95 SAIC Test description modification. +-- 01 Nov 95 SAIC Update and repair for ACVC 2.0.1. +-- +--! + +with Report; +with Ada.Strings.Maps; +with Ada.Strings.Unbounded; + +procedure CXA4011 is +begin + + Report.Test ("CXA4011", "Check that the subprograms defined in " & + "package Ada.Strings.Unbounded are available, " & + "and that they produce correct results"); + + Test_Block: + declare + + package ASUnb renames Ada.Strings.Unbounded; + use Ada.Strings; + use type Maps.Character_Set; + use type ASUnb.Unbounded_String; + + Cad_String : ASUnb.Unbounded_String := + ASUnb.To_Unbounded_String("cad"); + + Complete_String : ASUnb.Unbounded_String := + ASUnb.To_Unbounded_String("Incomplete") & + Ada.Strings.Space & + ASUnb.To_Unbounded_String("String"); + + Incomplete_String : ASUnb.Unbounded_String := + ASUnb.To_Unbounded_String("ncomplete Strin"); + + Incorrect_Spelling : ASUnb.Unbounded_String := + ASUnb.To_Unbounded_String("Guob Dai"); + + Magic_String : ASUnb.Unbounded_String := + ASUnb.To_Unbounded_String("abracadabra"); + + Incantation : ASUnb.Unbounded_String := Magic_String; + + + A_Small_G : Character := 'g'; + A_Small_D : Character := 'd'; + + ABCD_Set : Maps.Character_Set := Maps.To_Set("abcd"); + B_Set : Maps.Character_Set := Maps.To_Set('b'); + AB_Set : Maps.Character_Set := Maps."OR"(Maps.To_Set('a'), B_Set); + + Code_Map : Maps.Character_Mapping := + Maps.To_Mapping(From => "abcd", To => "wxyz"); + Reverse_Code_Map : Maps.Character_Mapping := + Maps.To_Mapping(From => "wxyz", To => "abcd"); + Non_Existent_Map : Maps.Character_Mapping := + Maps.To_Mapping(From => "jkl", To => "mno"); + + + Token_Start : Positive; + Token_End : Natural := 0; + Matching_Letters : Natural := 0; + + + begin + + -- "&" + + -- Prepend an 'I' and append a 'g' to the string. + Incomplete_String := ASUnb."&"('I', Incomplete_String); -- Char & Unb + Incomplete_String := ASUnb."&"(Incomplete_String, + A_Small_G); -- Unb & Char + + if Incomplete_String < Complete_String or + Incomplete_String > Complete_String or + Incomplete_String /= Complete_String + then + Report.Failed("Incorrect result from use of ""&"" operator"); + end if; + + + -- Element + + -- Last element of the unbounded string should be a 'g'. + if ASUnb.Element(Incomplete_String, ASUnb.Length(Incomplete_String)) /= + A_Small_G + then + Report.Failed("Incorrect result from use of Function Element - 1"); + end if; + + if ASUnb.Element(Incomplete_String, 2) /= + ASUnb.Element(ASUnb.Tail(Incomplete_String, 2), 1) or + ASUnb.Element(ASUnb.Head(Incomplete_String, 4), 2) /= + ASUnb.Element(ASUnb.To_Unbounded_String("wnqz"), 2) + then + Report.Failed("Incorrect result from use of Function Element - 2"); + end if; + + + -- Replace_Element + + -- The unbounded string Incorrect_Spelling starts as "Guob Dai", and + -- is transformed by the following three procedure calls to "Good Day". + + ASUnb.Replace_Element(Incorrect_Spelling, 2, 'o'); + + ASUnb.Replace_Element(Incorrect_Spelling, + ASUnb.Index(Incorrect_Spelling, B_Set), + A_Small_D); + + ASUnb.Replace_Element(Source => Incorrect_Spelling, + Index => ASUnb.Length(Incorrect_Spelling), + By => 'y'); + + if Incorrect_Spelling /= ASUnb.To_Unbounded_String("Good Day") then + Report.Failed("Incorrect result from Procedure Replace_Element"); + end if; + + + -- Count + + -- Determine the number of characters in the unbounded string that + -- are contained in the set. + + Matching_Letters := ASUnb.Count(Source => Magic_String, + Set => ABCD_Set); + + if Matching_Letters /= 9 then + Report.Failed + ("Incorrect result from Function Count with Set parameter"); + end if; + + -- Determine the number of occurrences of the following pattern strings + -- in the unbounded string Magic_String. + + if ASUnb.Count(Magic_String, "ab") /= + (ASUnb.Count(Magic_String, "ac") + ASUnb.Count(Magic_String, "ad")) or + ASUnb.Count(Magic_String, "ab") /= 2 + then + Report.Failed + ("Incorrect result from Function Count with String parameter"); + end if; + + + -- Find_Token + + ASUnb.Find_Token(Magic_String, -- Find location of first "ab". + AB_Set, -- Should be (1..2). + Ada.Strings.Inside, + Token_Start, + Token_End); + + if Natural(Token_Start) /= ASUnb.To_String(Magic_String)'First or + Token_End /= ASUnb.Index(Magic_String, B_Set) + then + Report.Failed("Incorrect result from Procedure Find_Token - 1"); + end if; + + + ASUnb.Find_Token(Source => Magic_String, -- Find location of char 'r' + Set => ABCD_Set, -- in string, should be (3..3) + Test => Ada.Strings.Outside, + First => Token_Start, + Last => Token_End); + + if Natural(Token_Start) /= 3 or + Token_End /= 3 then + Report.Failed("Incorrect result from Procedure Find_Token - 2"); + end if; + + + ASUnb.Find_Token(Magic_String, -- No 'g' is in the string, so + Maps.To_Set(A_Small_G), -- the result parameters should + Ada.Strings.Inside, -- be First = Source'First and + First => Token_Start, -- Last = 0. + Last => Token_End); + + if Token_Start /= ASUnb.To_String(Magic_String)'First or + Token_End /= 0 + then + Report.Failed("Incorrect result from Procedure Find_Token - 3"); + end if; + + + -- Translate + + -- Use a mapping ("abcd" -> "wxyz") to transform the contents of + -- the unbounded string. + -- Magic_String = "abracadabra" + + Incantation := ASUnb.Translate(Magic_String, Code_Map); + + if Incantation /= ASUnb.To_Unbounded_String("wxrwywzwxrw") then + Report.Failed("Incorrect result from Function Translate"); + end if; + + -- Use the inverse mapping of the one above to return the "translated" + -- unbounded string to its original form. + + ASUnb.Translate(Incantation, Reverse_Code_Map); + + -- The map contained in the following call to Translate contains one + -- element, and this element is not found in the unbounded string, so + -- this call to Translate should have no effect on the unbounded string. + + if Incantation /= ASUnb.Translate(Magic_String, Non_Existent_Map) then + Report.Failed("Incorrect result from Procedure Translate"); + end if; + + + -- Trim + + Trim_Block: + declare + + XYZ_Set : Maps.Character_Set := Maps.To_Set("xyz"); + PQR_Set : Maps.Character_Set := Maps.To_Set("pqr"); + + Pad : constant ASUnb.Unbounded_String := + ASUnb.To_Unbounded_String("Pad"); + + The_New_Ada : constant ASUnb.Unbounded_String := + ASUnb.To_Unbounded_String("Ada9X"); + + Space_Array : array (1..4) of ASUnb.Unbounded_String := + (ASUnb.To_Unbounded_String(" Pad "), + ASUnb.To_Unbounded_String("Pad "), + ASUnb.To_Unbounded_String(" Pad"), + Pad); + + String_Array : array (1..5) of ASUnb.Unbounded_String := + (ASUnb.To_Unbounded_String("xyzxAda9Xpqr"), + ASUnb.To_Unbounded_String("Ada9Xqqrp"), + ASUnb.To_Unbounded_String("zxyxAda9Xqpqr"), + ASUnb.To_Unbounded_String("xxxyAda9X"), + The_New_Ada); + + begin + + -- Examine the version of Trim that removes blanks from + -- the left and/or right of a string. + + for i in 1..4 loop + if ASUnb.Trim(Space_Array(i), Ada.Strings.Both) /= Pad then + Report.Failed("Incorrect result from Trim for spaces - " & + Integer'Image(i)); + end if; + end loop; + + -- Examine the version of Trim that removes set characters from + -- the left and right of a string. + + for i in 1..5 loop + if ASUnb.Trim(String_Array(i), + Left => XYZ_Set, + Right => PQR_Set) /= The_New_Ada then + Report.Failed + ("Incorrect result from Trim for set characters - " & + Integer'Image(i)); + end if; + end loop; + + end Trim_Block; + + + -- Delete + + -- Use the Delete function to remove the first four and last four + -- characters from the string. + + if ASUnb.Delete(Source => ASUnb.Delete(Magic_String, + 8, + ASUnb.Length(Magic_String)), + From => ASUnb.To_String(Magic_String)'First, + Through => 4) /= + Cad_String + then + Report.Failed("Incorrect results from Function Delete"); + end if; + + + -- Constructors ("*") + + Constructor_Block: + declare + + SOS : ASUnb.Unbounded_String; + + Dot : constant ASUnb.Unbounded_String := + ASUnb.To_Unbounded_String("Dot_"); + Dash : constant String := "Dash_"; + + Distress : ASUnb.Unbounded_String := + ASUnb.To_Unbounded_String("Dot_Dot_Dot_") & + ASUnb.To_Unbounded_String("Dash_Dash_Dash_") & + ASUnb.To_Unbounded_String("Dot_Dot_Dot"); + + Repeat : constant Natural := 3; + Separator : constant Character := '_'; + + Separator_Set : Maps.Character_Set := Maps.To_Set(Separator); + + begin + + -- Use the following constructor forms to construct the string + -- "Dot_Dot_Dot_Dash_Dash_Dash_Dot_Dot_Dot". Note that the + -- trailing underscore in the string is removed in the call to + -- Trim in the If statement condition. + + SOS := ASUnb."*"(Repeat, Dot); -- "*"(#, Unb Str) + + SOS := SOS & + ASUnb."*"(Repeat, Dash) & -- "*"(#, Str) + ASUnb."*"(Repeat, Dot); -- "*"(#, Unb Str) + + if ASUnb.Trim(SOS, Maps.Null_Set, Separator_Set) /= Distress then + Report.Failed("Incorrect results from Function ""*"""); + end if; + + end Constructor_Block; + + + exception + when others => Report.Failed ("Exception raised in Test_Block"); + end Test_Block; + + + Report.Result; + +end CXA4011; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxa4012.a b/gcc/testsuite/ada/acats/tests/cxa/cxa4012.a new file mode 100644 index 000000000..5ab12b6df --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxa4012.a @@ -0,0 +1,305 @@ +-- CXA4012.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 types, operations, and other entities defined within +-- the package Ada.Strings.Wide_Maps are available and produce correct +-- results. +-- +-- TEST DESCRIPTION: +-- This test demonstrates the availability and function of the types and +-- operations defined in package Ada.Strings.Wide_Maps. It demonstrates +-- the use of these types and functions as they would be used in common +-- programming practice. +-- Wide_Character set creation, assignment, and comparison are evaluated +-- in this test. Each of the functions provided in package +-- Ada.Strings.Wide_Maps is utilized in creating or manipulating set +-- objects, and the function results are evaluated for correctness. +-- Wide_Character sequences are examined using the functions provided for +-- manipulating objects of this type. Likewise, Wide_Character maps are +-- created, and their contents evaluated. Exception raising conditions +-- from the function To_Mapping are also created. +-- Note: Throughout this test, the set logical operators are printed in +-- capital letters to enhance their visibility. +-- +-- +-- CHANGE HISTORY: +-- 06 Dec 94 SAIC ACVC 2.0 +-- 01 Nov 95 SAIC Update and repair for ACVC 2.0.1. +-- +--! + +with Ada.Characters.Handling; +with Ada.Strings.Wide_Maps; + +package CXA40120 is + + function Equiv (Ch : Character) return Wide_Character; + function Equiv (Str : String) + return Ada.Strings.Wide_Maps.Wide_Character_Sequence; + function X_Map(From : Wide_Character) return Wide_Character; + +end CXA40120; + +package body CXA40120 is + + -- The following two functions are used to translate character and string + -- values to "Wide" values. They will be applied to certain Wide_Map + -- subprogram parameters to simulate the use of Wide_Characters and + -- Wide_Character_Sequences in actual practice. + -- Note: These functions do not actually return "equivalent" wide + -- characters to their character inputs, just "non-character" + -- wide characters. + + function Equiv (Ch : Character) return Wide_Character is + C : Character := Ch; + begin + if Ch = ' ' then + return Ada.Characters.Handling.To_Wide_Character(C); + else + return Wide_Character'Val(Character'Pos(Ch) + + Character'Pos(Character'Last) + 1); + end if; + end Equiv; + + function Equiv (Str : String) + return Ada.Strings.Wide_Maps.Wide_Character_Sequence is + use Ada.Strings; + WS : Wide_Maps.Wide_Character_Sequence(Str'First..Str'Last); + begin + for i in Str'First..Str'Last loop + WS(i) := Equiv(Str(i)); + end loop; + return WS; + end Equiv; + + function X_Map(From : Wide_Character) return Wide_Character is + begin + return Equiv('X'); + end X_Map; + +end CXA40120; + + + +with CXA40120; +with Ada.Characters.Handling; +with Ada.Strings.Wide_Maps; +with Report; + +procedure CXA4012 is + + use CXA40120; + use Ada.Strings; + +begin + + Report.Test ("CXA4012", "Check that the types, operations, and other " & + "entities defined within the package " & + "Ada.Strings.Wide_Maps are available and " & + "produce correct results"); + + Test_Block: + declare + + use type Wide_Maps.Wide_Character_Set; + + MidPoint_Letter : constant := 13; + Last_Letter : constant := 26; + + Vowels : constant Wide_Maps.Wide_Character_Sequence := + Equiv("aeiou"); + Quasi_Vowel : constant Wide_Character := Equiv('y'); + + Alphabet : Wide_Maps.Wide_Character_Sequence(1..Last_Letter); + Half_Alphabet : Wide_Maps.Wide_Character_Sequence(1..MidPoint_Letter); + Inverse_Alphabet : Wide_Maps.Wide_Character_Sequence(1..Last_Letter); + + Alphabet_Set, + Consonant_Set, + Vowel_Set, + Full_Vowel_Set, + First_Half_Set, + Second_Half_Set : Wide_Maps.Wide_Character_Set := Wide_Maps.Null_Set; + + begin + + -- Load the alphabet string for use in creating sets. + + for i in 0..MidPoint_Letter-1 loop + Half_Alphabet(i+1) := + Wide_Character'Val(Wide_Character'Pos(Equiv('a')) + i); + end loop; + + for i in 0..Last_Letter-1 loop + Alphabet(i+1) := + Wide_Character'Val(Wide_Character'Pos(Equiv('a')) + i); + end loop; + + + -- Initialize a series of Wide_Character_Set objects. + + Alphabet_Set := Wide_Maps.To_Set(Alphabet); + Vowel_Set := Wide_Maps.To_Set(Vowels); + Full_Vowel_Set := Vowel_Set OR Wide_Maps.To_Set(Quasi_Vowel); + Consonant_Set := Vowel_Set XOR Alphabet_Set; + + First_Half_Set := Wide_Maps.To_Set(Half_Alphabet); + Second_Half_Set := Alphabet_Set XOR First_Half_Set; + + + -- Evaluation of Set objects, operators, and functions. + + if Alphabet_Set /= (Vowel_Set OR Consonant_Set) then + Report.Failed("Incorrect set combinations using OR operator"); + end if; + + + for i in Vowels'First .. Vowels'Last loop + if not Wide_Maps.Is_In(Vowels(i), Vowel_Set) or + not Wide_Maps.Is_In(Vowels(i), Alphabet_Set) or + Wide_Maps.Is_In(Vowels(i), Consonant_Set) + then + Report.Failed("Incorrect function Is_In use with set " & + "combinations - " & Integer'Image(i)); + end if; + end loop; + + + if Wide_Maps.Is_Subset(Vowel_Set, First_Half_Set) or + Wide_Maps."<="(Vowel_Set, Second_Half_Set) or + not Wide_Maps.Is_Subset(Vowel_Set, Alphabet_Set) + then + Report.Failed + ("Incorrect set evaluation using Is_Subset function"); + end if; + + + if not (Full_Vowel_Set = Wide_Maps.To_Set(Equiv("aeiouy"))) then + Report.Failed("Incorrect result for ""="" set operator"); + end if; + + + if not ((Vowel_Set AND First_Half_Set) OR + (Full_Vowel_Set AND Second_Half_Set)) = Full_Vowel_Set then + Report.Failed + ("Incorrect result for AND, OR, or ""="" set operators"); + end if; + + + if (Alphabet_Set AND Wide_Maps.Null_Set) /= Wide_Maps.Null_Set or + (Alphabet_Set OR Wide_Maps.Null_Set) /= Alphabet_Set + then + Report.Failed("Incorrect result for AND or OR set operators"); + end if; + + + Vowel_Set := Full_Vowel_Set; + Vowel_Set := Vowel_Set AND (NOT Wide_Maps.To_Set(Quasi_Vowel)); + + if not (Vowels = Wide_Maps.To_Sequence(Vowel_Set)) then + Report.Failed("Incorrect Set to Sequence translation"); + end if; + + + for i in 0..Last_Letter-1 loop + Inverse_Alphabet(i+1) := Alphabet(Last_Letter-i); + end loop; + + + -- Wide_Character_Mapping + + declare + Inverse_Map : Wide_Maps.Wide_Character_Mapping := + Wide_Maps.To_Mapping(Alphabet, Inverse_Alphabet); + begin + if Wide_Maps.Value(Wide_Maps.Identity, Equiv('b')) /= + Wide_Maps.Value(Inverse_Map, Equiv('y')) + then + Report.Failed("Incorrect Inverse mapping"); + end if; + end; + + + -- Check that Translation_Error is raised when a character is + -- repeated in the parameter "From" string. + declare + Bad_Map : Wide_Maps.Wide_Character_Mapping; + begin + Bad_Map := Wide_Maps.To_Mapping(From => Equiv("aa"), + To => Equiv("yz")); + Report.Failed("Exception not raised with repeated character"); + exception + when Translation_Error => null; -- OK + when others => + Report.Failed("Incorrect exception raised in To_Mapping with " & + "a repeated character"); + end; + + + -- Check that Translation_Error is raised when the parameters of the + -- function To_Mapping are of unequal lengths. + declare + Bad_Map : Wide_Maps.Wide_Character_Mapping; + begin + Bad_Map := Wide_Maps.To_Mapping(Equiv("abc"), Equiv("yz")); + Report.Failed + ("Exception not raised with unequal parameter lengths"); + exception + when Translation_Error => null; -- OK + when others => + Report.Failed("Incorrect exception raised in To_Mapping with " & + "unequal parameter lengths"); + end; + + + -- Check that the access-to-subprogram type is defined and available. + -- This provides for one Wide_Character mapping capability only. + -- The actual mapping functionality will be tested in conjunction with + -- the tests of subprograms defined for Wide_String handling. + + declare + + X_Map_Ptr : Wide_Maps.Wide_Character_Mapping_Function := + X_Map'Access; + + begin + if X_Map_Ptr(Equiv('A')) /= -- both return 'X' + X_Map_Ptr.all(Equiv('Q')) + then + Report.Failed + ("Incorrect result using access-to-subprogram values"); + end if; + end; + + + exception + when others => Report.Failed ("Exception raised in Test_Block"); + end Test_Block; + + + Report.Result; + +end CXA4012; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxa4013.a b/gcc/testsuite/ada/acats/tests/cxa/cxa4013.a new file mode 100644 index 000000000..0f93e9dc8 --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxa4013.a @@ -0,0 +1,203 @@ +-- CXA4013.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 subprograms defined in package Ada.Strings.Wide_Fixed +-- are available, and that they produce correct results. Specifically, +-- check the subprograms Index, "*" (Wide_String constructor function), +-- Count, Trim, and Replace_Slice. +-- +-- TEST DESCRIPTION: +-- This test demonstrates how certain Wide_Fixed string functions +-- are used to eliminate specific substrings from portions of text. +-- A procedure is defined that will take as parameters a source +-- Wide_String along with a substring that is to be completely removed +-- from the source string. The source Wide_String is parsed using the +-- Index function, and any substring slices are replaced in the source +-- Wide_String by a series of X's (based on the length of the substring.) +-- Three lines of text are provided to this procedure, and the resulting +-- substitutions are compared with expected results to validate the +-- string processing. +-- A global accumulator is updated with the number of occurrences of the +-- substring in the source string. +-- +-- +-- CHANGE HISTORY: +-- 06 Dec 94 SAIC ACVC 2.0 +-- +--! + +with Ada.Strings; +with Ada.Strings.Wide_Fixed; +with Ada.Strings.Wide_Maps; +with Report; + +procedure CXA4013 is + +begin + + Report.Test ("CXA4013", "Check that the subprograms defined in package " & + "Ada.Strings.Wide_Fixed are available, and that " & + "they produce correct results"); + + Test_Block: + declare + + TC_Total : Natural := 0; + Number_Of_Lines : constant := 3; + WC : Wide_Character := + Wide_Character'Val(Character'Pos('X') + + Character'Pos(Character'Last) + + 1 ); + + subtype WS is Wide_String (1..25); + + type Restricted_Words_Array_Type is + array (1..10) of Wide_String (1..10); + + Restricted_Words : Restricted_Words_Array_Type := + (" platoon", " marines ", " Marines ", + "north ", "south ", " east", + " beach ", " airport", "airfield ", + " road "); + + type Page_Of_Text_Type is array (1..Number_Of_Lines) of WS; + + Text_Page : Page_Of_Text_Type := ("The platoon of Marines ", + "moved south on the south ", + "road to the airfield. "); + + TC_Revised_Line_1 : constant Wide_String := "The XXXXXXX of XXXXXXX "; + TC_Revised_Line_2 : constant Wide_String := "moved XXXXX on the XXXXX "; + TC_Revised_Line_3 : constant Wide_String := "XXXX to the XXXXXXXX. "; + + + function Equivalent (Left : WS; Right : Wide_String) + return Boolean is + begin + for i in WS'range loop + if Left(i) /= Right(i) then + if Left(i) /= WC or Right(i) /= 'X' then + return False; + end if; + end if; + end loop; + return True; + end Equivalent; + + --- + + procedure Censor (Source_String : in out Wide_String; + Pattern_String : in Wide_String) is + + use Ada.Strings.Wide_Fixed; -- allows infix notation of "*" below. + + -- Create a replacement string that is the same length as the + -- pattern string being removed. Use the infix notation of the + -- wide string constructor function. + + Replacement : constant Wide_String := + Pattern_String'Length * WC; -- "*" + + Going : Ada.Strings.Direction := Ada.Strings.Forward; + Start_Pos, + Index : Natural := Source_String'First; + + begin -- Censor + + -- Accumulate count of total replacement operations. + + TC_Total := TC_Total + + Ada.Strings.Wide_Fixed.Count -- Count + (Source => Source_String, + Pattern => Pattern_String, + Mapping => Ada.Strings.Wide_Maps.Identity); + loop + + Index := Ada.Strings.Wide_Fixed.Index -- Index + (Source_String(Start_Pos..Source_String'Last), + Pattern_String, + Going, + Ada.Strings.Wide_Maps.Identity); + + exit when Index = 0; -- No matches, exit loop. + + -- if a match was found, modify the substring. + Ada.Strings.Wide_Fixed.Replace_Slice -- Replace_Slice + (Source_String, + Index, + Index + Pattern_String'Length - 1, + Replacement); + Start_Pos := Index + Pattern_String'Length; + + end loop; + + end Censor; + + + begin + + -- Invoke Censor subprogram to cleanse text. + -- Loop through each line of text, and check for the presence of each + -- restricted word. + -- Use the Trim function to eliminate leading or trailing blanks from + -- the restricted word parameters. + + for Line in 1..Number_Of_Lines loop + for Word in Restricted_Words'Range loop + Censor (Text_Page(Line), -- Trim + Ada.Strings.Wide_Fixed.Trim(Restricted_Words(Word), + Ada.Strings.Both)); + end loop; + end loop; + + + -- Validate results. + + if TC_Total /= 6 then + Report.Failed ("Incorrect number of substitutions performed"); + end if; + + if not Equivalent (Text_Page(1), TC_Revised_Line_1) then + Report.Failed ("Incorrect substitutions on Line 1"); + end if; + + if not Equivalent (Text_Page(2), TC_Revised_Line_2) then + Report.Failed ("Incorrect substitutions on Line 2"); + end if; + + if not Equivalent (Text_Page(3), TC_Revised_Line_3) then + Report.Failed ("Incorrect substitutions on Line 3"); + end if; + + + exception + when others => Report.Failed ("Exception raised in Test_Block"); + end Test_Block; + + + Report.Result; + +end CXA4013; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxa4014.a b/gcc/testsuite/ada/acats/tests/cxa/cxa4014.a new file mode 100644 index 000000000..6e26a0330 --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxa4014.a @@ -0,0 +1,359 @@ +-- CXA4014.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 subprograms defined in package Ada.Strings.Wide_Fixed +-- are available, and that they produce correct results. Specifically, +-- check the subprograms Find_Token, Head, Index, Index_Non_Blank, Move, +-- Overwrite, and Replace_Slice, Tail, and Translate. +-- Use the access-to-subprogram mapping version of Translate (function +-- and procedure). +-- +-- TEST DESCRIPTION: +-- This test demonstrates how certain wide fixed string operations could +-- be used in wide string information processing. A procedure is defined +-- that will extract portions of a 50 character string that correspond to +-- certain data items (i.e., name, address, state, zip code). These +-- parsed items will then be added to the appropriate fields of data +-- base elements. These data base elements are then compared for +-- accuracy against a similar set of predefined data base +-- elements. +-- A variety of wide fixed string processing subprograms are used in this +-- test. Each parsing operation attempts to use a different combination +-- of the available subprograms to accomplish the same goal, therefore +-- continuity of approach to wide string parsing is not seen in this +-- test. +-- However, a wide variety of possible approaches are demonstrated, while +-- exercising a large number of the total predefined subprograms of +-- package Ada.Strings.Wide_Fixed. +-- +-- +-- CHANGE HISTORY: +-- 06 Dec 94 SAIC ACVC 2.0 +-- 02 Nov 95 SAIC Update and repair for ACVC 2.0.1. +-- +--! + +package CXA40140 is + + UnderScore : Wide_Character := '_'; + Blank : Wide_Character := ' '; + + -- Function providing a mapping to a blank Wide_Character. + function US_to_Blank_Map (From : Wide_Character) return Wide_Character; + +end CXA40140; + +package body CXA40140 is + + function US_to_Blank_Map (From : Wide_Character) return Wide_Character is + begin + if From = UnderScore then + return Blank; + else + return From; + end if; + end US_to_Blank_Map; + +end CXA40140; + + +with CXA40140; +with Ada.Strings.Wide_Fixed; +with Ada.Strings.Wide_Maps; +with Report; + +procedure CXA4014 is + use CXA40140; +begin + + Report.Test ("CXA4014", "Check that the subprograms defined in package " & + "Ada.Strings.Wide_Fixed are available, and that " & + "they produce correct results"); + + Test_Block: + declare + + Number_Of_Info_Strings : constant Natural := 3; + DB_Size : constant Natural := Number_Of_Info_Strings; + Count : Natural := 0; + Finished_Processing : Boolean := False; + Blank_Wide_String : constant Wide_String := " "; + + subtype Info_Wide_String_Type is Wide_String (1..50); + type Info_Wide_String_Storage_Type is + array (1..Number_Of_Info_Strings) of Info_Wide_String_Type; + + + subtype Name_Type is Wide_String (1..10); + subtype Street_Number_Type is Wide_String (1..5); + subtype Street_Name_Type is Wide_String (1..10); + subtype City_Type is Wide_String (1..10); + subtype State_Type is Wide_String (1..2); + subtype Zip_Code_Type is Wide_String (1..5); + + type Data_Base_Element_Type is + record + Name : Name_Type := (others => ' '); + Street_Number : Street_Number_Type := (others => ' '); + Street_Name : Street_Name_Type := (others => ' '); + City : City_Type := (others => ' '); + State : State_Type := (others => ' '); + Zip_Code : Zip_Code_Type := (others => ' '); + end record; + + type Data_Base_Type is array (1..DB_Size) of Data_Base_Element_Type; + + Data_Base : Data_Base_Type; + + --- + + Info_String_1 : Info_Wide_String_Type := + "Joe_Jones 123 Sixth_St San_Diego CA 98765"; + + Info_String_2 : Info_Wide_String_Type := + "Sam_Smith 56789 S._Seventh Carlsbad CA 92177"; + + Info_String_3 : Info_Wide_String_Type := + "Jane_Brown 1219 Info_Lane Tuscon AZ 85643"; + + + Info_Strings : Info_Wide_String_Storage_Type := + (1 => Info_String_1, + 2 => Info_String_2, + 3 => Info_String_3); + + + + TC_DB_Element_1 : Data_Base_Element_Type := + ("Joe Jones ", "123 ", "Sixth St ", "San Diego ", "CA", "98765"); + + TC_DB_Element_2 : Data_Base_Element_Type := + ("Sam Smith ", "56789", "S. Seventh", "Carlsbad ", "CA", "92177"); + + TC_DB_Element_3 : Data_Base_Element_Type := + ("Jane Brown", "1219 ", "Info Lane ", "Tuscon ", "AZ", "85643"); + + TC_Data_Base : Data_Base_Type := (TC_DB_Element_1, + TC_DB_Element_2, + TC_DB_Element_3); + + --- + + + procedure Store_Information + (Info_String : in Info_Wide_String_Type; + DB_Record : in out Data_Base_Element_Type) is + + package AS renames Ada.Strings; + use type AS.Wide_Maps.Wide_Character_Set; + + Start, + Stop : Natural := 0; + + Numeric_Set : constant AS.Wide_Maps.Wide_Character_Set := + AS.Wide_Maps.To_Set("0123456789"); + + Cal : constant + AS.Wide_Maps.Wide_Character_Sequence := "CA"; + California_Set : constant AS.Wide_Maps.Wide_Character_Set := + AS.Wide_Maps.To_Set(Cal); + Arizona_Set : constant AS.Wide_Maps.Wide_Character_Set := + AS.Wide_Maps.To_Set("AZ"); + Nevada_Set : constant AS.Wide_Maps.Wide_Character_Set := + AS.Wide_Maps.To_Set("NV"); + + Blank_Ftn_Ptr : AS.Wide_Maps.Wide_Character_Mapping_Function := + US_to_Blank_Map'Access; + + begin + + -- Find the starting position of the name field (first non-blank), + -- then, from that position, find the end of the name field (first + -- blank). + + Start := AS.Wide_Fixed.Index_Non_Blank(Info_String); + Stop := AS.Wide_Fixed.Index (Info_String(Start..Info_String'Length), + AS.Wide_Maps.To_Set(Blank), + AS.Inside, + AS.Forward) - 1 ; + + -- Store the name field in the data base element field for "Name". + + DB_Record.Name := AS.Wide_Fixed.Head(Info_String(1..Stop), + DB_Record.Name'Length); + + -- Replace any underscore characters in the name field + -- that were used to separate first/middle/last names. + -- Use the overloaded version of Translate that takes an + -- access-to-subprogram value. + + AS.Wide_Fixed.Translate (DB_Record.Name, Blank_Ftn_Ptr); + + + -- Continue the extraction process; now find the position of + -- the street number in the string. + + Start := Stop + 1; + + AS.Wide_Fixed.Find_Token(Info_String(Start..Info_String'Length), + Numeric_Set, + AS.Inside, + Start, + Stop); + + -- Store the street number field in the appropriate data base + -- element. + -- No modification of the default parameters of procedure Move + -- is required. + + AS.Wide_Fixed.Move(Source => Info_String(Start..Stop), + Target => DB_Record.Street_Number); + + + -- Continue the extraction process; find the street name in the + -- info string. Skip blanks to the start of the street name, then + -- search for the index of the next blank character in the string. + + Start := AS.Wide_Fixed.Index_Non_Blank + (Info_String(Stop+1..Info_String'Length)); + + Stop := + AS.Wide_Fixed.Index(Info_String(Start..Info_String'Length), + Blank_Wide_String) - 1; + + -- Store the street name in the appropriate data base element field. + + AS.Wide_Fixed.Overwrite(DB_Record.Street_Name, + 1, + Info_String(Start..Stop)); + + -- Replace any underscore characters in the street name field + -- that were used as word separation with blanks. Again, use the + -- access-to-subprogram value to provide the mapping. + + DB_Record.Street_Name := + AS.Wide_Fixed.Translate(DB_Record.Street_Name, + Blank_Ftn_Ptr); + + + -- Continue the extraction; remove the city name from the string. + + Start := AS.Wide_Fixed.Index_Non_Blank + (Info_String(Stop+1..Info_String'Length)); + + Stop := + AS.Wide_Fixed.Index(Info_String(Start..Info_String'Length), + Blank_Wide_String) - 1; + + -- Store the city name field in the appropriate data base element. + + AS.Wide_Fixed.Replace_Slice(DB_Record.City, + 1, + DB_Record.City'Length, + Info_String(Start..Stop)); + + -- Replace any underscore characters in the city name field + -- that were used as word separation. + + AS.Wide_Fixed.Translate (DB_Record.City, + Blank_Ftn_Ptr); + + + -- Continue the extraction; remove the state identifier from the + -- info string. + + Start := Stop + 1; + + AS.Wide_Fixed.Find_Token(Info_String(Start..Info_String'Length), + AS.Wide_Maps."OR"(California_Set, + AS.Wide_Maps."OR"(Nevada_Set, + Arizona_Set)), + AS.Inside, + Start, + Stop); + + -- Store the state indicator into the data base element. + + AS.Wide_Fixed.Move(Source => Info_String(Start..Stop), + Target => DB_Record.State, + Drop => Ada.Strings.Right, + Justify => Ada.Strings.Left, + Pad => AS.Wide_Space); + + + -- Continue the extraction process; remove the final data item in + -- the info string, the zip code, and place it into the + -- corresponding data base element. + + DB_Record.Zip_Code := + AS.Wide_Fixed.Tail(Info_String, DB_Record.Zip_Code'Length); + + exception + when AS.Length_Error => + Report.Failed ("Length_Error raised in procedure"); + when AS.Pattern_Error => + Report.Failed ("Pattern_Error raised in procedure"); + when AS.Translation_Error => + Report.Failed ("Translation_Error raised in procedure"); + when others => + Report.Failed ("Exception raised in procedure"); + end Store_Information; + + + begin + + -- Loop thru the information strings, extract the name and address + -- information, place this info into elements of the data base. + + while not Finished_Processing loop + + Count := Count + 1; + + Store_Information (Info_Strings(Count), Data_Base(Count)); + + Finished_Processing := (Count = Number_Of_Info_Strings); + + end loop; + + + -- Verify that the string processing was successful. + + for i in 1..DB_Size loop + if Data_Base(i) /= TC_Data_Base(i) then + Report.Failed + ("Data processing error on record " & Integer'Image(i)); + end if; + end loop; + + + exception + when others => Report.Failed ("Exception raised in Test_Block"); + end Test_Block; + + + Report.Result; + +end CXA4014; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxa4015.a b/gcc/testsuite/ada/acats/tests/cxa/cxa4015.a new file mode 100644 index 000000000..83fad3af8 --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxa4015.a @@ -0,0 +1,580 @@ +-- CXA4015.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 subprograms defined in package Ada.Strings.Wide_Fixed +-- are available, and that they produce correct results. Specifically, +-- check the subprograms Count, Find_Token, Index, Index_Non_Blank, and +-- Move. +-- +-- TEST DESCRIPTION: +-- This test, when combined with tests CXA4013,14,16 will provide +-- coverage of the functionality found in Ada.Strings.Wide_Fixed. +-- This test contains many small, specific test cases, situations that +-- although common in user environments, are often difficult to generate +-- in large numbers in a application-based test. +-- +-- +-- CHANGE HISTORY: +-- 06 Dec 94 SAIC ACVC 2.0 +-- 02 Nov 95 SAIC Corrected various accesssibility problems and +-- expected result strings for ACVC 2.0.1. +-- +--! + +package CXA40150 is + + -- Wide Character mapping function defined for use with specific + -- versions of functions Index and Count. + + function AK_to_ZQ_Mapping (From : Wide_Character) return Wide_Character; + +end CXA40150; + +package body CXA40150 is + + function AK_to_ZQ_Mapping (From : Wide_Character) + return Wide_Character is + begin + if From = 'a' then + return 'z'; + elsif From = 'k' then + return 'q'; + else + return From; + end if; + end AK_to_ZQ_Mapping; + +end CXA40150; + + +with CXA40150; +with Report; +with Ada.Strings; +with Ada.Strings.Wide_Fixed; +with Ada.Strings.Wide_Maps; + +procedure CXA4015 is +begin + + Report.Test("CXA4015", "Check that the subprograms defined in " & + "package Ada.Strings.Wide_Fixed are available, " & + "and that they produce correct results"); + + + Test_Block: + declare + + use CXA40150; + + package ASF renames Ada.Strings.Wide_Fixed; + package Maps renames Ada.Strings.Wide_Maps; + + Result_String : Wide_String(1..10) := + (others => Ada.Strings.Wide_Space); + + Source_String1 : Wide_String(1..5) := "abcde"; -- odd len Wide_String + Source_String2 : Wide_String(1..6) := "abcdef"; -- even len Wide_String + Source_String3 : Wide_String(1..12) := "abcdefghijkl"; + Source_String4 : Wide_String(1..12) := "abcdefghij "; -- last 2 ch pad + Source_String5 : Wide_String(1..12) := " cdefghijkl"; -- first 2 ch pad + Source_String6 : Wide_String(1..12) := "abcdefabcdef"; + + Location : Natural := 0; + Slice_Start : Positive; + Slice_End, + Slice_Count : Natural := 0; + + CD_Set : Maps.Wide_Character_Set := Maps.To_Set("cd"); + ABCD_Set : Maps.Wide_Character_Set := Maps.To_Set("abcd"); + A_to_F_Set : Maps.Wide_Character_Set := Maps.To_Set("abcdef"); + + CD_to_XY_Map : Maps.Wide_Character_Mapping := + Maps.To_Mapping(From => "cd", To => "xy"); + + + -- Access-to-Subprogram object defined for use with specific versions of + -- functions Index and Count. + + Map_Ptr : Maps.Wide_Character_Mapping_Function := + AK_to_ZQ_Mapping'Access; + + + begin + + + -- Procedure Move + -- Evaluate the Procedure Move with various combinations of + -- parameters. + + -- Justify = Left (default case) + + ASF.Move(Source => Source_String1, -- "abcde" + Target => Result_String); + + if Result_String /= "abcde " then + Report.Failed("Incorrect result from Move with Justify = Left"); + end if; + + -- Justify = Right + + ASF.Move(Source => Source_String2, -- "abcdef" + Target => Result_String, + Drop => Ada.Strings.Error, + Justify => Ada.Strings.Right); + + if Result_String /= " abcdef" then + Report.Failed("Incorrect result from Move with Justify = Right"); + end if; + + -- Justify = Center (two cases, odd and even pad lengths) + + ASF.Move(Source_String1, -- "abcde" + Result_String, + Ada.Strings.Error, + Ada.Strings.Center, + 'x'); -- non-default padding. + + if Result_String /= "xxabcdexxx" then -- Unequal padding added right + Report.Failed("Incorrect result from Move with Justify = Center-1"); + end if; + + ASF.Move(Source_String2, -- "abcdef" + Result_String, + Ada.Strings.Error, + Ada.Strings.Center); + + if Result_String /= " abcdef " then -- Equal padding added on L/R. + Report.Failed("Incorrect result from Move with Justify = Center-2"); + end if; + + -- When the source Wide_String is longer than the target Wide_String, + -- several cases can be examined, with the results depending on the + -- value of the Drop parameter. + + -- Drop = Left + + ASF.Move(Source => Source_String3, -- "abcdefghijkl" + Target => Result_String, + Drop => Ada.Strings.Left); + + if Result_String /= "cdefghijkl" then + Report.Failed("Incorrect result from Move with Drop = Left"); + end if; + + -- Drop = Right + + ASF.Move(Source_String3, Result_String, Ada.Strings.Right); + + if Result_String /= "abcdefghij" then + Report.Failed("Incorrect result from Move with Drop = Right"); + end if; + + -- Drop = Error + -- The effect in this case depends on the value of the justify + -- parameter, and on whether any characters in Source other than + -- Pad would fail to be copied. + + -- Drop = Error, Justify = Left, right overflow characters are pad. + + ASF.Move(Source => Source_String4, -- "abcdefghij " + Target => Result_String, + Drop => Ada.Strings.Error, + Justify => Ada.Strings.Left); + + if not(Result_String = "abcdefghij") then -- leftmost 10 characters + Report.Failed("Incorrect result from Move with Drop = Error - 1"); + end if; + + -- Drop = Error, Justify = Right, left overflow characters are pad. + + ASF.Move(Source_String5, -- " cdefghijkl" + Result_String, + Ada.Strings.Error, + Ada.Strings.Right); + + if Result_String /= "cdefghijkl" then -- rightmost 10 characters + Report.Failed("Incorrect result from Move with Drop = Error - 2"); + end if; + + -- In other cases of Drop=Error, Length_Error is propagated, such as: + + begin + + ASF.Move(Source_String3, -- 12 characters, no Pad. + Result_String, -- 10 characters + Ada.Strings.Error, + Ada.Strings.Left); + + Report.Failed("Length_Error not raised by Move - 1"); + + exception + when Ada.Strings.Length_Error => null; -- OK + when others => + Report.Failed("Incorrect exception raised by Move - 1"); + end; + + + + -- Function Index + -- (Other usage examples of this function found in CXA4013-14.) + -- Check when the pattern is not found in the source. + + if ASF.Index("abcdef", "gh") /= 0 or + ASF.Index("abcde", "abcdef") /= 0 or -- pattern > source + ASF.Index("xyz", + "abcde", + Ada.Strings.Backward) /= 0 or + ASF.Index("", "ab") /= 0 or -- null source Wide_String. + ASF.Index("abcde", " ") /= 0 -- blank pattern. + then + Report.Failed("Incorrect result from Index, no pattern match"); + end if; + + -- Check that Pattern_Error is raised when the pattern is the + -- null Wide_String. + begin + Location := ASF.Index(Source_String6, -- "abcdefabcdef" + "", -- null pattern Wide_String. + Ada.Strings.Forward); + Report.Failed("Pattern_Error not raised by Index"); + exception + when Ada.Strings.Pattern_Error => null; -- OK, expected exception. + when others => + Report.Failed("Incorrect exception raised by Index, null pattern"); + end; + + -- Use the search direction "backward" to locate the particular + -- pattern within the source Wide_String. + + Location := ASF.Index(Source_String6, -- "abcdefabcdef" + "de", -- slice 4..5, 10..11 + Ada.Strings.Backward); -- search from right end. + + if Location /= 10 then + Report.Failed("Incorrect result from Index going Backward"); + end if; + + + + -- Function Index + -- Use the version of Index that takes a Wide_Character_Mapping_Function + -- parameter. + -- Use the search directions Forward and Backward to locate the + -- particular pattern wide string within the source wide string. + + Location := ASF.Index("akzqefakzqef", + "qzq", -- slice 8..10 + Ada.Strings.Backward, + Map_Ptr); -- perform 'a' to 'z', 'k' to 'q' + -- translation. + if Location /= 8 then + Report.Failed + ("Incorrect result from Index w/map ptr going Backward"); + end if; + + Location := ASF.Index("ddkkddakcdakdefcadckdfzaaqd", + "zq", -- slice 7..8 + Ada.Strings.Forward, + Map_Ptr); -- perform 'a' to 'z', 'k' to 'q' + -- translation. + if Location /= 7 then + Report.Failed + ("Incorrect result from Index w/map ptr going Forward"); + end if; + + + if ASF.Index("aakkzq", "zq", Ada.Strings.Forward, Map_Ptr) /= 2 or + ASF.Index("qzedka", "qz", Ada.Strings.Backward, Map_Ptr) /= 5 or + ASF.Index("zazaza", "zzzz", Ada.Strings.Backward, Map_Ptr) /= 3 or + ASF.Index("kka", "qqz", Ada.Strings.Forward, Map_Ptr) /= 1 + then + Report.Failed("Incorrect result from Index w/map ptr"); + end if; + + + -- Check when the pattern wide string is not found in the source. + + if ASF.Index("akzqef", "kzq", Ada.Strings.Forward, Map_Ptr) /= 0 or + ASF.Index("abcde", "abcdef", Ada.Strings.Backward, Map_Ptr) /= 0 or + ASF.Index("xyz", "akzde", Ada.Strings.Backward, Map_Ptr) /= 0 or + ASF.Index("", "zq", Ada.Strings.Forward, Map_Ptr) /= 0 or + ASF.Index("akcde", " ", Ada.Strings.Backward, Map_Ptr) /= 0 + then + Report.Failed + ("Incorrect result from Index w/map ptr, no pattern match"); + end if; + + -- Check that Pattern_Error is raised when the pattern is a + -- null Wide_String. + begin + Location := ASF.Index("akzqefakqzef", + "", -- null pattern Wide_String. + Ada.Strings.Forward, + Map_Ptr); + Report.Failed("Pattern_Error not raised by Index w/map ptr"); + exception + when Ada.Strings.Pattern_Error => null; -- OK, expected exception. + when others => + Report.Failed + ("Incorrect exception raised by Index w/map ptr, null pattern"); + end; + + + + -- Function Index + -- Using the version of Index testing wide character set membership, + -- check combinations of forward/backward, inside/outside parameter + -- configurations. + + if ASF.Index(Source => Source_String1, -- "abcde" + Set => CD_Set, + Test => Ada.Strings.Inside, + Going => Ada.Strings.Forward) /= 3 or -- 'c' at pos 3. + ASF.Index(Source_String6, -- "abcdefabcdef" + CD_Set, + Ada.Strings.Outside, + Ada.Strings.Backward) /= 12 or -- 'f' at position 12 + ASF.Index(Source_String6, -- "abcdefabcdef" + CD_Set, + Ada.Strings.Inside, + Ada.Strings.Backward) /= 10 or -- 'd' at position 10 + ASF.Index("cdcdcdcdacdcdcdcd", + CD_Set, + Ada.Strings.Outside, + Ada.Strings.Forward) /= 9 -- 'a' at position 9 + then + Report.Failed("Incorrect result from function Index for sets - 1"); + end if; + + -- Additional interesting uses/combinations using Index for sets. + + if ASF.Index("cd", -- same size, str-set + CD_Set, + Ada.Strings.Inside, + Ada.Strings.Forward) /= 1 or -- 'c' at position 1 + ASF.Index("abcd", -- same size, str-set, + Maps.To_Set("efgh"), -- different contents. + Ada.Strings.Outside, + Ada.Strings.Forward) /= 1 or + ASF.Index("abccd", -- set > Wide_String + Maps.To_Set("acegik"), + Ada.Strings.Inside, + Ada.Strings.Backward) /= 4 or -- 'c' at position 4 + ASF.Index("abcde", + Maps.Null_Set) /= 0 or + ASF.Index("", -- Null string. + CD_Set) /= 0 or + ASF.Index("abc ab", -- blank included + Maps.To_Set("e "), -- in Wide_String and + Ada.Strings.Inside, -- set. + Ada.Strings.Backward) /= 4 -- blank in Wide_Str. + then + Report.Failed("Incorrect result from function Index for sets - 2"); + end if; + + + + -- Function Index_Non_Blank. + -- (Other usage examples of this function found in CXA4013-14.) + + + if ASF.Index_Non_Blank(Source => Source_String4, -- "abcdefghij " + Going => Ada.Strings.Backward) /= 10 or + ASF.Index_Non_Blank("abc def ghi jkl ", + Ada.Strings.Backward) /= 15 or + ASF.Index_Non_Blank(" abcdef") /= 3 or + ASF.Index_Non_Blank(" ") /= 0 + then + Report.Failed("Incorrect result from Index_Non_Blank"); + end if; + + + + -- Function Count + -- (Other usage examples of this function found in CXA4013-14.) + + if ASF.Count("abababa", "aba") /= 2 or + ASF.Count("abababa", "ab" ) /= 3 or + ASF.Count("babababa", "ab") /= 3 or + ASF.Count("abaabaaba", "aba") /= 3 or + ASF.Count("xxxxxxxxxxxxxxxxxxxy", "xy") /= 1 or + ASF.Count("xxxxxxxxxxxxxxxxxxxx", "x") /= 20 + then + Report.Failed("Incorrect result from Function Count"); + end if; + + -- Determine the number of slices of Source that when mapped to a + -- non-identity map, match the pattern Wide_String. + + Slice_Count := ASF.Count(Source_String6, -- "abcdefabcdef" + "xy", + CD_to_XY_Map); -- maps 'c' to 'x', 'd' to 'y' + + if Slice_Count /= 2 then -- two slices "xy" in "mapped" Source_String6 + Report.Failed("Incorrect result from Count with non-identity map"); + end if; + + -- If the pattern supplied to Function Count is the null Wide_String, + -- then Pattern_Error is propagated. + declare + The_Null_Wide_String : constant Wide_String := ""; + begin + Slice_Count := ASF.Count(Source_String6, The_Null_Wide_String); + Report.Failed("Pattern_Error not raised by Function Count"); + exception + when Ada.Strings.Pattern_Error => null; -- OK + when others => + Report.Failed("Incorrect exception from Count with null pattern"); + end; + + + + + -- Function Count + -- Use the version of Count that takes a Wide_Character_Mapping_Function + -- value as the basis of its source mapping. + + if ASF.Count("akakaka", "zqz", Map_Ptr) /= 2 or + ASF.Count("akakaka", "qz", Map_Ptr) /= 3 or + ASF.Count("kakakaka", "q", Map_Ptr) /= 4 or + ASF.Count("zzqaakzaqzzk", "zzq", Map_Ptr) /= 4 or + ASF.Count(" ", "z", Map_Ptr) /= 0 or + ASF.Count("", "qz", Map_Ptr) /= 0 or + ASF.Count("abbababab", "zq", Map_Ptr) /= 0 or + ASF.Count("aaaaaaaaaaaaaaaaaakk", "zqq", Map_Ptr) /= 1 or + ASF.Count("azaazaazzzaaaaazzzza", "z", Map_Ptr) /= 20 + then + Report.Failed("Incorrect result from Function Count w/map ptr"); + end if; + + -- If the pattern supplied to Function Count is a null Wide_String, + -- then Pattern_Error is propagated. + declare + The_Null_Wide_String : constant Wide_String := ""; + begin + Slice_Count := ASF.Count(Source_String6, + The_Null_Wide_String, + Map_Ptr); + Report.Failed + ("Pattern_Error not raised by Function Count w/map ptr"); + exception + when Ada.Strings.Pattern_Error => null; -- OK + when others => + Report.Failed + ("Incorrect exception from Count w/map ptr, null pattern"); + end; + + + + + -- Function Count returning the number of characters in a particular + -- set that are found in source Wide_String. + + if ASF.Count(Source_String6, CD_Set) /= 4 or -- 2 'c' and 'd' chars. + ASF.Count("cddaccdaccdd", CD_Set) /= 10 + then + Report.Failed("Incorrect result from Count with set"); + end if; + + + + -- Function Find_Token. + -- (Other usage examples of this function found in CXA4013-14.) + + ASF.Find_Token(Source => Source_String6, -- First slice with no + Set => ABCD_Set, -- 'a', 'b', 'c', or 'd' + Test => Ada.Strings.Outside, -- is "ef" at 5..6. + First => Slice_Start, + Last => Slice_End); + + if Slice_Start /= 5 or Slice_End /= 6 then + Report.Failed("Incorrect result from Find_Token - 1"); + end if; + + -- If no appropriate slice is contained by the source Wide_String, + -- then the value returned in Last is zero, and the value in First is + -- Source'First. + + ASF.Find_Token(Source_String6, -- "abcdefabcdef" + A_to_F_Set, -- Set of characters 'a' thru 'f'. + Ada.Strings.Outside, -- No characters outside this set. + Slice_Start, + Slice_End); + + if Slice_Start /= Source_String6'First or Slice_End /= 0 then + Report.Failed("Incorrect result from Find_Token - 2"); + end if; + + -- Additional testing of Find_Token. + + ASF.Find_Token("eabcdabcddcab", + ABCD_Set, + Ada.Strings.Inside, + Slice_Start, + Slice_End); + + if Slice_Start /= 2 or Slice_End /= 13 then + Report.Failed("Incorrect result from Find_Token - 3"); + end if; + + ASF.Find_Token("efghijklabcdabcd", + ABCD_Set, + Ada.Strings.Outside, + Slice_Start, + Slice_End); + + if Slice_Start /= 1 or Slice_End /= 8 then + Report.Failed("Incorrect result from Find_Token - 4"); + end if; + + ASF.Find_Token("abcdefgabcdabcd", + ABCD_Set, + Ada.Strings.Outside, + Slice_Start, + Slice_End); + + if Slice_Start /= 5 or Slice_End /= 7 then + Report.Failed("Incorrect result from Find_Token - 5"); + end if; + + ASF.Find_Token("abcdcbabcdcba", + ABCD_Set, + Ada.Strings.Inside, + Slice_Start, + Slice_End); + + if Slice_Start /= 1 or Slice_End /= 13 then + Report.Failed("Incorrect result from Find_Token - 6"); + end if; + + + exception + when others => Report.Failed("Exception raised in Test_Block"); + end Test_Block; + + Report.Result; + +end CXA4015; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxa4016.a b/gcc/testsuite/ada/acats/tests/cxa/cxa4016.a new file mode 100644 index 000000000..00dcdcdbd --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxa4016.a @@ -0,0 +1,685 @@ +-- CXA4016.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 subprograms defined in package Ada.Strings.Wide_Fixed +-- are available, and that they produce correct results. Specifically, +-- check the subprograms Delete, Head, Insert, Overwrite, Replace_Slice, +-- Tail, Trim, and "*". +-- +-- TEST DESCRIPTION: +-- This test, when combined with tests CXA4013-15 will provide +-- coverage of the functionality found in package Ada.Strings.Wide_Fixed. +-- This test contains many small, specific test cases, situations that +-- although common in user environments, are often difficult to generate +-- in large numbers in a application-based test. They represent +-- individual usage paradigms in-the-small. +-- +-- +-- CHANGE HISTORY: +-- 06 Dec 94 SAIC ACVC 2.0 +-- 10 Apr 94 SAIC Modified comments in a subtest failure message. +-- 06 Nov 95 SAIC Corrected subtest results for ACVC 2.0.1 +-- 14 Mar 01 RLB Added checks that the lower bound is 1, similar +-- to CXA4005. These changes were made to test +-- Defect Report 8652/0049, as reflected in +-- Technical Corrigendum 1. +-- +--! + +with Report; +with Ada.Strings; +with Ada.Strings.Wide_Fixed; +with Ada.Strings.Wide_Maps; + +procedure CXA4016 is + + type TC_Name_Holder is access String; + Name : TC_Name_Holder; + + function TC_Check (S : Wide_String) return Wide_String is + begin + if S'First /= 1 then + Report.Failed ("Lower bound of result of function " & Name.all & + " is" & Integer'Image (S'First)); + end if; + return S; + end TC_Check; + + procedure TC_Set_Name (N : String) is + begin + Name := new String'(N); + end TC_Set_Name; + +begin + + Report.Test("CXA4016", "Check that the subprograms defined in " & + "package Ada.Strings.Wide_Fixed are available, " & + "and that they produce correct results"); + + Test_Block: + declare + + package ASW renames Ada.Strings.Wide_Fixed; + package Wide_Maps renames Ada.Strings.Wide_Maps; + + Result_String, + Delete_String, + Insert_String, + Trim_String, + Overwrite_String : Wide_String(1..10) := + (others => Ada.Strings.Wide_Space); + Replace_String : Wide_String(10..30) := + (others => Ada.Strings.Wide_Space); + + Source_String1 : Wide_String(1..5) := "abcde"; -- odd len wd str + Source_String2 : Wide_String(1..6) := "abcdef"; -- even len wd str + Source_String3 : Wide_String(1..12) := "abcdefghijkl"; + Source_String4 : Wide_String(1..12) := "abcdefghij "; -- last two ch pad + Source_String5 : Wide_String(1..12) := " cdefghijkl"; -- first two ch pad + Source_String6 : Wide_String(1..12) := "abcdefabcdef"; + + Location : Natural := 0; + Slice_Start : Positive; + Slice_End, + Slice_Count : Natural := 0; + + CD_Set : Wide_Maps.Wide_Character_Set := + Wide_Maps.To_Set("cd"); + X_Set : Wide_Maps.Wide_Character_Set := + Wide_Maps.To_Set('x'); + ABCD_Set : Wide_Maps.Wide_Character_Set := + Wide_Maps.To_Set("abcd"); + A_to_F_Set : Wide_Maps.Wide_Character_Set := + Wide_Maps.To_Set("abcdef"); + + CD_to_XY_Map : Wide_Maps.Wide_Character_Mapping := + Wide_Maps.To_Mapping(From => "cd", To => "xy"); + + begin + + -- Procedure Replace_Slice + -- The functionality of this procedure is similar to procedure Move, + -- and is tested here in the same manner, evaluated with various + -- combinations of parameters. + + -- Index_Error propagation when Low > Source'Last + 1 + + begin + ASW.Replace_Slice(Result_String, + Result_String'Last + 2, -- should raise exception + Result_String'Last, + "xxxxxxx"); + Report.Failed("Index_Error not raised by Replace_Slice - 1"); + exception + when Ada.Strings.Index_Error => null; -- OK, expected exception. + when others => + Report.Failed("Incorrect exception from Replace_Slice - 1"); + end; + + -- Index_Error propagation when High < Source'First - 1 + + begin + ASW.Replace_Slice(Replace_String(20..30), + Replace_String'First, + Replace_String'First - 2, -- should raise exception + "xxxxxxx"); + Report.Failed("Index_Error not raised by Replace_Slice - 2"); + exception + when Ada.Strings.Index_Error => null; -- OK, expected exception. + when others => + Report.Failed("Incorrect exception from Replace_Slice - 2"); + end; + + -- Justify = Left (default case) + + Result_String := "XXXXXXXXXX"; + + ASW.Replace_Slice(Source => Result_String, + Low => 1, + High => 10, + By => Source_String1); -- "abcde" + + if Result_String /= "abcde " then + Report.Failed("Incorrect result from Replace_Slice - Justify = Left"); + end if; + + -- Justify = Right + + ASW.Replace_Slice(Source => Result_String, + Low => 1, + High => Result_String'Last, + By => Source_String2, -- "abcdef" + Drop => Ada.Strings.Error, + Justify => Ada.Strings.Right); + + if Result_String /= " abcdef" then + Report.Failed("Incorrect result from Replace_Slice - Justify=Right"); + end if; + + -- Justify = Center (two cases, odd and even pad lengths) + + ASW.Replace_Slice(Result_String, + 1, + Result_String'Last, + Source_String1, -- "abcde" + Ada.Strings.Error, + Ada.Strings.Center, + 'x'); -- non-default padding. + + if Result_String /= "xxabcdexxx" then -- Unequal padding added right + Report.Failed("Incorrect result, Replace_Slice - Justify=Center - 1"); + end if; + + ASW.Replace_Slice(Result_String, + 1, + Result_String'Last, + Source_String2, -- "abcdef" + Ada.Strings.Error, + Ada.Strings.Center); + + if Result_String /= " abcdef " then -- Equal padding added on L/R. + Report.Failed("Incorrect result from Replace_Slice with " & + "Justify = Center - 2"); + end if; + + -- When the source string is longer than the target string, several + -- cases can be examined, with the results depending on the value of + -- the Drop parameter. + + -- Drop = Left + + ASW.Replace_Slice(Result_String, + 1, + Result_String'Last, + Source_String3, -- "abcdefghijkl" + Drop => Ada.Strings.Left); + + if Result_String /= "cdefghijkl" then + Report.Failed("Incorrect result from Replace_Slice - Drop=Left"); + end if; + + -- Drop = Right + + ASW.Replace_Slice(Result_String, + 1, + Result_String'Last, + Source_String3, -- "abcdefghijkl" + Ada.Strings.Right); + + if Result_String /= "abcdefghij" then + Report.Failed("Incorrect result, Replace_Slice with Drop=Right"); + end if; + + -- Drop = Error + + -- The effect in this case depends on the value of the justify + -- parameter, and on whether any characters in Source other than + -- Pad would fail to be copied. + + -- Drop = Error, Justify = Left, right overflow characters are pad. + + ASW.Replace_Slice(Result_String, + 1, + Result_String'Last, + Source_String4, -- "abcdefghij " + Drop => Ada.Strings.Error, + Justify => Ada.Strings.Left); + + if not(Result_String = "abcdefghij") then -- leftmost 10 characters + Report.Failed("Incorrect result, Replace_Slice - Drop = Error - 1"); + end if; + + -- Drop = Error, Justify = Right, left overflow characters are pad. + + ASW.Replace_Slice(Source => Result_String, + Low => 1, + High => Result_String'Last, + By => Source_String5, -- " cdefghijkl" + Drop => Ada.Strings.Error, + Justify => Ada.Strings.Right); + + if Result_String /= "cdefghijkl" then -- rightmost 10 characters + Report.Failed("Incorrect result, Replace_Slice - Drop = Error - 2"); + end if; + + -- In other cases of Drop=Error, Length_Error is propagated, such as: + + begin + + ASW.Replace_Slice(Source => Result_String, + Low => 1, + High => Result_String'Last, + By => Source_String3, -- "abcdefghijkl" + Drop => Ada.Strings.Error); + + Report.Failed("Length_Error not raised by Replace_Slice - 1"); + + exception + when Ada.Strings.Length_Error => null; -- OK + when others => + Report.Failed("Incorrect exception from Replace_Slice - 3"); + end; + + + -- Function Replace_Slice + + TC_Set_Name ("Replace_Slice"); + + if TC_Check (ASW.Replace_Slice("abcde", 3, 3, "x")) + /= "abxde" or -- High = Low + TC_Check (ASW.Replace_Slice("abc", 2, 3, "xyz")) /= "axyz" or + TC_Check (ASW.Replace_Slice("abcd", 4, 1, "xy")) + /= "abcxyd" or -- High < Low + TC_Check (ASW.Replace_Slice("abc", 2, 3, "x")) /= "ax" or + TC_Check (ASW.Replace_Slice("a", 1, 1, "z")) /= "z" + then + Report.Failed("Incorrect result from Function Replace_Slice - 1"); + end if; + + if TC_Check (ASW.Replace_Slice("abcde", 5, 5, "z")) + /= "abcdz" or -- By length 1 + TC_Check (ASW.Replace_Slice("abc", 1, 3, "xyz")) + /= "xyz" or -- High > Low + TC_Check (ASW.Replace_Slice("abc", 3, 2, "xy")) + /= "abxyc" or -- insert + TC_Check (ASW.Replace_Slice("a", 1, 1, "xyz")) /= "xyz" + then + Report.Failed("Incorrect result from Function Replace_Slice - 2"); + end if; + + + + -- Function Insert. + + TC_Set_Name ("Insert"); + + declare + New_String : constant Wide_String := + TC_Check ( + ASW.Insert(Source => Source_String1(2..5), -- "bcde" + Before => 2, + New_Item => Source_String2)); -- "abcdef" + begin + if New_String /= "abcdefbcde" then + Report.Failed("Incorrect result from Function Insert - 1"); + end if; + end; + + if TC_Check (ASW.Insert("a", 1, "z")) /= "za" or + TC_Check (ASW.Insert("abc", 3, "")) /= "abc" or + TC_Check (ASW.Insert("abc", 4, "z")) /= "abcz" + then + Report.Failed("Incorrect result from Function Insert - 2"); + end if; + + begin + if TC_Check (ASW.Insert(Source => Source_String1(2..5), -- "bcde" + Before => Report.Ident_Int(7), + New_Item => Source_String2)) -- "abcdef" + /= "babcdefcde" then + Report.Failed("Index_Error not raised by Insert - 3A"); + else + Report.Failed("Index_Error not raised by Insert - 3B"); + end if; + exception + when Ada.Strings.Index_Error => null; -- OK, expected exception. + when others => + Report.Failed("Incorrect exception from Insert - 3"); + end; + + + -- Procedure Insert + + -- Drop = Right + + ASW.Insert(Source => Insert_String, + Before => 6, + New_Item => Source_String2, -- "abcdef" + Drop => Ada.Strings.Right); + + if Insert_String /= " abcde" then -- last char of New_Item dropped. + Report.Failed("Incorrect result from Insert with Drop = Right"); + end if; + + -- Drop = Left + + ASW.Insert(Source => Insert_String, -- 10 char string + Before => 2, -- 9 chars, 2..10 available + New_Item => Source_String3, -- 12 characters long. + Drop => Ada.Strings.Left); -- truncate from Left. + + if Insert_String /= "l abcde" then -- 10 chars, leading blank. + Report.Failed("Incorrect result from Insert with Drop=Left"); + end if; + + -- Drop = Error + + begin + ASW.Insert(Source => Result_String, -- 10 chars + Before => Result_String'Last, + New_Item => "abcdefghijk", + Drop => Ada.Strings.Error); + Report.Failed("Exception not raised by Procedure Insert"); + exception + when Ada.Strings.Length_Error => null; -- OK, expected exception + when others => + Report.Failed("Incorrect exception raised by Procedure Insert"); + end; + + + + -- Function Overwrite + + TC_Set_Name ("Overwrite"); + + Overwrite_String := TC_Check ( + ASW.Overwrite(Result_String, -- 10 chars + 1, -- starting at pos=1 + Source_String3(1..10))); + + if Overwrite_String /= Source_String3(1..10) then + Report.Failed("Incorrect result from Function Overwrite - 1"); + end if; + + + if TC_Check (ASW.Overwrite("abcdef", 4, "xyz")) /= "abcxyz" or + TC_Check (ASW.Overwrite("a", 1, "xyz")) + /= "xyz" or -- chars appended + TC_Check (ASW.Overwrite("abc", 3, " ")) + /= "ab " or -- blanks appended + TC_Check (ASW.Overwrite("abcde", 1, "z" )) /= "zbcde" + then + Report.Failed("Incorrect result from Function Overwrite - 2"); + end if; + + + + -- Procedure Overwrite, with truncation. + + ASW.Overwrite(Source => Overwrite_String, -- 10 characters. + Position => 1, + New_Item => Source_String3, -- 12 characters. + Drop => Ada.Strings.Left); + + if Overwrite_String /= "cdefghijkl" then + Report.Failed("Incorrect result from Overwrite with Drop=Left"); + end if; + + -- The default drop value is Right, used here. + + ASW.Overwrite(Source => Overwrite_String, -- 10 characters. + Position => 1, + New_Item => Source_String3); -- 12 characters. + + if Overwrite_String /= "abcdefghij" then + Report.Failed("Incorrect result from Overwrite with Drop=Right"); + end if; + + -- Drop = Error + + begin + ASW.Overwrite(Source => Overwrite_String, -- 10 characters. + Position => 1, + New_Item => Source_String3, -- 12 characters. + Drop => Ada.Strings.Error); + Report.Failed("Exception not raised by Procedure Overwrite"); + exception + when Ada.Strings.Length_Error => null; -- OK, expected exception. + when others => + Report.Failed + ("Incorrect exception raised by Procedure Overwrite"); + end; + + Overwrite_String := "ababababab"; + ASW.Overwrite(Overwrite_String, Overwrite_String'Last, "z"); + ASW.Overwrite(Overwrite_String, Overwrite_String'First,"z"); + ASW.Overwrite(Overwrite_String, 5, "zz"); + + if Overwrite_String /= "zbabzzabaz" then + Report.Failed("Incorrect result from Procedure Overwrite"); + end if; + + + + -- Function Delete + + TC_Set_Name ("Delete"); + + declare + New_String1 : constant Wide_String := -- Returns a 4 char wide str. + TC_Check (ASW.Delete(Source => Source_String3, + From => 3, + Through => 10)); + New_String2 : constant Wide_String := -- This returns Source. + TC_Check (ASW.Delete(Source_String3, 10, 3)); + begin + if New_String1 /= "abkl" or + New_String2 /= Source_String3 + then + Report.Failed("Incorrect result from Function Delete - 1"); + end if; + end; + + if TC_Check (ASW.Delete("a", 1, 1)) + /= "" or -- Source length = 1 + TC_Check (ASW.Delete("abc", 1, 2)) + /= "c" or -- From = Source'First + TC_Check (ASW.Delete("abc", 3, 3)) + /= "ab" or -- From = Source'Last + TC_Check (ASW.Delete("abc", 3, 1)) + /= "abc" -- From > Through + then + Report.Failed("Incorrect result from Function Delete - 2"); + end if; + + + + -- Procedure Delete + + -- Justify = Left + + Delete_String := Source_String3(1..10); -- Initialize to "abcdefghij" + + ASW.Delete(Source => Delete_String, + From => 6, + Through => Delete_String'Last, + Justify => Ada.Strings.Left, + Pad => 'x'); -- pad with char 'x' + + if Delete_String /= "abcdexxxxx" then + Report.Failed("Incorrect result from Delete - Justify = Left"); + end if; + + -- Justify = Right + + ASW.Delete(Source => Delete_String, -- Remove x"s from end and + From => 6, -- shift right. + Through => Delete_String'Last, + Justify => Ada.Strings.Right, + Pad => 'x'); -- pad with char 'x' on left. + + if Delete_String /= "xxxxxabcde" then + Report.Failed("Incorrect result from Delete - Justify = Right"); + end if; + + -- Justify = Center + + ASW.Delete(Source => Delete_String, + From => 1, + Through => 5, + Justify => Ada.Strings.Center, + Pad => 'z'); + + if Delete_String /= "zzabcdezzz" then -- extra pad char on right side. + Report.Failed("Incorrect result from Delete - Justify = Center"); + end if; + + + + -- Function Trim + -- Use non-identity character sets to perform the trim operation. + + TC_Set_Name ("Trim"); + + Trim_String := "cdabcdefcd"; + + -- Remove the "cd" from each end of the string. This will not effect + -- the "cd" slice at 5..6. + + declare + New_String : constant Wide_String := + TC_Check (ASW.Trim(Source => Trim_String, + Left => CD_Set, Right => CD_Set)); + begin + if New_String /= Source_String2 then -- string "abcdef" + Report.Failed + ("Incorrect result from Trim with wide character sets"); + end if; + end; + + if TC_Check (ASW.Trim("abcdef", Wide_Maps.Null_Set, Wide_Maps.Null_Set)) + /= "abcdef" then + Report.Failed("Incorrect result from Trim with Null sets"); + end if; + + if TC_Check (ASW.Trim("cdxx", CD_Set, X_Set)) /= "" then + Report.Failed("Incorrect result from Trim, wide string removal"); + end if; + + + -- Procedure Trim + + -- Justify = Right + + ASW.Trim(Source => Trim_String, + Left => CD_Set, + Right => CD_Set, + Justify => Ada.Strings.Right, + Pad => 'x'); + + if Trim_String /= "xxxxabcdef" then + Report.Failed("Incorrect result from Trim with Justify = Right"); + end if; + + -- Justify = Left + + ASW.Trim(Source => Trim_String, + Left => X_Set, + Right => Wide_Maps.Null_Set, + Justify => Ada.Strings.Left, + Pad => ' '); + + if Trim_String /= "abcdef " then -- Padded with 4 blanks on right. + Report.Failed("Incorrect result from Trim with Justify = Left"); + end if; + + -- Justify = Center + + ASW.Trim(Source => Trim_String, + Left => ABCD_Set, + Right => CD_Set, + Justify => Ada.Strings.Center, + Pad => 'x'); + + if Trim_String /= "xxef xx" then -- Padded with 4 pad chars on L/R + Report.Failed("Incorrect result from Trim with Justify = Center"); + end if; + + + + -- Function Head, testing use of padding. + + TC_Set_Name ("Head"); + + -- Use the wide characters of Source_String1 ("abcde") and pad the + -- last five wide characters of Result_String with 'x' wide characters. + + Result_String := TC_CHeck (ASW.Head(Source_String1, 10, 'x')); + + if Result_String /= "abcdexxxxx" then + Report.Failed("Incorrect result from Function Head with padding"); + end if; + + if TC_Check (ASW.Head(" ab ", 2)) /= " " or + TC_Check (ASW.Head("a", 6, 'A')) /= "aAAAAA" or + TC_Check (ASW.Head(ASW.Head("abc ", 7, 'x'), 10, 'X')) + /= "abc xxXXX" + then + Report.Failed("Incorrect result from Function Head"); + end if; + + + + -- Function Tail, testing use of padding. + + TC_Set_Name ("Tail"); + + -- Use the wide characters of Source_String1 ("abcde") and pad the + -- first five wide characters of Result_String with 'x' wide characters. + + Result_String := TC_Check (ASW.Tail(Source_String1, 10, 'x')); + + if Result_String /= "xxxxxabcde" then + Report.Failed("Incorrect result from Function Tail with padding"); + end if; + + if TC_Check (ASW.Tail("abcde ", 5)) + /= "cde " or -- blanks, back + TC_Check (ASW.Tail(" abc ", 8, ' ')) + /= " abc " or -- blanks, front/back + TC_Check (ASW.Tail("", 5, 'Z')) + /= "ZZZZZ" or -- pad characters only + TC_Check (ASW.Tail("abc", 0)) + /= "" or -- null result + TC_Check (ASW.Tail(ASW.Tail(" abc ", 6, 'x'), + 10, + 'X')) /= "XXXXx abc " + then + Report.Failed("Incorrect result from Function Tail"); + end if; + + + + -- Function "*" - with (Natural, Wide_String) parameters + + TC_Set_Name ("""*"""); + + if TC_Check (ASW."*"(3, Source_String1)) /= "abcdeabcdeabcde" or + TC_Check (ASW."*"(2, Source_String2)) /= Source_String6 or + TC_Check (ASW."*"(4, Source_String1(1..2))) /= "abababab" or + TC_Check (ASW."*"(0, Source_String1)) /= "" + then + Report.Failed + ("Incorrect result from Function ""*"" with wide strings"); + end if; + + exception + when others => Report.Failed("Exception raised in Test_Block"); + end Test_Block; + + Report.Result; + +end CXA4016; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxa4017.a b/gcc/testsuite/ada/acats/tests/cxa/cxa4017.a new file mode 100644 index 000000000..8d6886897 --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxa4017.a @@ -0,0 +1,337 @@ +-- CXA4017.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 subprograms defined in package Ada.Strings.Wide_Bounded +-- are available, and that they produce correct results. Specifically, +-- check the subprograms Append, Delete, Index, Insert , Length, +-- Overwrite, Replace_Slice, Slice, "&", To_Bounded_Wide_String, +-- To_Wide_String, Translate, and Trim. +-- +-- TEST DESCRIPTION: +-- This test demonstrates the uses of a variety of the Wide_String +-- functions found in the package Ada.Strings.Wide_Bounded, simulating +-- the operations found in a text processing environment. +-- With bounded wide strings, the length of each "line" of text can vary +-- up to the instantiated maximum, allowing one to view a page of text as +-- a series of expandable lines. This provides flexibility in text +-- formatting of individual lines (wide strings). +-- Several subprograms are defined, all of which attempt to take +-- advantage of as many different bounded wide string utilities as +-- possible. Often, an operation that is being performed in a subprogram +-- using a certain bounded wide string utility could more efficiently be +-- performed using a different utility. However, in the interest of +-- including as broad coverage as possible, a mixture of utilities is +-- invoked in this test. +-- A simulated page of text is provided as a parameter to the test +-- defined subprograms, and the appropriate processing performed. The +-- processed page of text is then compared to a predefined "finished" +-- page, and test passage/failure is based on the results of this +-- comparison. +-- +-- +-- CHANGE HISTORY: +-- 06 Dec 94 SAIC ACVC 2.0 +-- 06 Nov 95 SAIC Corrected initialization error for ACVC 2.0.1. +-- +--! + +with Ada.Strings; +with Ada.Strings.Wide_Bounded; +with Ada.Strings.Wide_Maps; +with Report; + +procedure CXA4017 is + +begin + + Report.Test ("CXA4017", "Check that the subprograms defined in package " & + "Ada.Strings.Wide_Bounded are available, and " & + "that they produce correct results"); + + Test_Block: + declare + + Characters_Per_Line : constant Positive := 40; + Lines_Per_Page : constant Natural := 4; + + + package BS_40 is new + Ada.Strings.Wide_Bounded.Generic_Bounded_Length(Characters_Per_Line); + + use type BS_40.Bounded_Wide_String; + + type Page_Type is array (1..Lines_Per_Page) of + BS_40.Bounded_Wide_String; + + -- Note: Misspellings below are intentional. + + Line1 : BS_40.Bounded_Wide_String := + BS_40.To_Bounded_Wide_String + ("ada is a progrraming language designed"); + Line2 : BS_40.Bounded_Wide_String := + BS_40.To_Bounded_Wide_String("to support the construction of long-"); + Line3 : BS_40.Bounded_Wide_String := + BS_40.To_Bounded_Wide_String("lived, highly reliabel software "); + Line4 : BS_40.Bounded_Wide_String := + BS_40.To_Bounded_Wide_String("systems"); + + Page : Page_Type := (1 => Line1, 2 => Line2, 3 => Line3, 4 => Line4); + + Finished_Page : Page_Type := + (BS_40.To_Bounded_Wide_String + ("Ada is a programming language designed"), + BS_40.To_Bounded_Wide_String("to support the construction of long-"), + BS_40.To_Bounded_Wide_String + ("lived, HIGHLY RELIABLE software systems."), + BS_40.To_Bounded_Wide_String("")); + + --- + + procedure Compress (Page : in out Page_Type) is + Clear_Line : Natural := Lines_Per_Page; + begin + -- If two consecutive lines on the page are together less than the + -- maximum line length, then append those two lines, move up all + -- lower lines on the page, and blank out the last line. + -- This algorithm works one time through the page, does not perform + -- repetitive compression, and is designed for use with this test + -- program only. + for i in 1..Lines_Per_Page - 1 loop + if BS_40.Length(Page(i)) + BS_40.Length(Page(i+1)) <= + BS_40.Max_Length + then + Page(i) := BS_40."&"(Page(i), + Page(i+1)); -- "&" (wd bnd, wd bnd) + + for j in i+1..Lines_Per_Page - 1 loop + Page(j) := + BS_40.To_Bounded_Wide_String + (BS_40.Slice(Page(j+1), + 1, + BS_40.Length(Page(j+1)))); + Clear_Line := j + 1; + end loop; + Page(Clear_Line) := BS_40.Null_Bounded_Wide_String; + end if; + end loop; + end Compress; + + --- + + procedure Format (Page : in out Page_Type) is + Sm_Ada : BS_40.Bounded_Wide_String := + BS_40.To_Bounded_Wide_String("ada"); + Cap_Ada : constant Wide_String := "Ada"; + Char_Pos : Natural := 0; + Finished : Boolean := False; + Line : Natural := Page_Type'Last; + begin + + -- Add a period to the end of the last line. + while Line >= Page_Type'First and not Finished loop + if Page(Line) /= BS_40.Null_Bounded_Wide_String and + BS_40.Length(Page(Line)) <= BS_40.Max_Length + then + Page(Line) := BS_40.Append(Page(Line), '.'); + Finished := True; + end if; + Line := Line - 1; + end loop; + + -- Replace all occurrences of "ada" with "Ada". + for Line in Page_Type'First .. Page_Type'Last loop + Finished := False; + while not Finished loop + Char_Pos := + BS_40.Index (Source => Page(Line), + Pattern => BS_40.To_Wide_String(Sm_Ada), + Going => Ada.Strings.Backward); + -- A zero is returned by function Index if no occurrences of + -- the pattern wide string are found. + Finished := (Char_Pos = 0); + if not Finished then + BS_40.Replace_Slice + (Source => Page(Line), + Low => Char_Pos, + High => Char_Pos + BS_40.Length(Sm_Ada) - 1, + By => Cap_Ada); + end if; + end loop; -- while loop + end loop; -- for loop + + end Format; + + --- + + procedure Spell_Check (Page : in out Page_Type) is + type Spelling_Type is (Incorrect, Correct); + type Word_Array_Type is array (Spelling_Type) + of BS_40.Bounded_Wide_String; + type Dictionary_Type is array (1..2) of Word_Array_Type; + + -- Note that the "words" in the dictionary will require various + -- amounts of Trimming prior to their use in the bounded wide string + -- functions. + Dictionary : Dictionary_Type := + (1 => (BS_40.To_Bounded_Wide_String(" reliabel "), + BS_40.To_Bounded_Wide_String(" reliable ")), + 2 => (BS_40.To_Bounded_Wide_String(" progrraming "), + BS_40.To_Bounded_Wide_String(" programming "))); + + Pos : Natural := Natural'First; + Finished : Boolean := False; + + begin + + for Line in Page_Type'Range loop + + -- Search for the first incorrectly spelled word in the + -- Dictionary, if it is found, replace it with the correctly + -- spelled word, using the Overwrite function. + + while not Finished loop + Pos := + BS_40.Index(Page(Line), + BS_40.To_Wide_String + (BS_40.Trim(Dictionary(1)(Incorrect), + Ada.Strings.Both)), + Ada.Strings.Forward); + Finished := (Pos = 0); + if not Finished then + Page(Line) := + BS_40.Overwrite(Page(Line), + Pos, + BS_40.To_Wide_String + (BS_40.Trim(Dictionary(1)(Correct), + Ada.Strings.Both))); + end if; + end loop; + + Finished := False; + + -- Search for the second incorrectly spelled word in the + -- Dictionary, if it is found, replace it with the correctly + -- spelled word, using the Delete procedure and Insert function. + + while not Finished loop + Pos := + BS_40.Index(Page(Line), + BS_40.To_Wide_String( + BS_40.Trim(Dictionary(2)(Incorrect), + Ada.Strings.Both)), + Ada.Strings.Forward); + + Finished := (Pos = 0); + + if not Finished then + BS_40.Delete + (Page(Line), + Pos, + Pos + BS_40.To_Wide_String + (BS_40.Trim(Dictionary(2)(Incorrect), + Ada.Strings.Both))'Length-1); + Page(Line) := + BS_40.Insert(Page(Line), + Pos, + BS_40.To_Wide_String + (BS_40.Trim(Dictionary(2)(Correct), + Ada.Strings.Both))); + end if; + end loop; + + Finished := False; + + end loop; + end Spell_Check; + + --- + + procedure Bold (Page : in out Page_Type) is + Key_Word : constant Wide_String := "highly reliable"; + Bold_Mapping : constant + Ada.Strings.Wide_Maps.Wide_Character_Mapping := + Ada.Strings.Wide_Maps.To_Mapping + (From => " abcdefghijklmnopqrstuvwxyz", + To => " ABCDEFGHIJKLMNOPQRSTUVWXYZ"); + Pos : Natural := Natural'First; + Finished : Boolean := False; + begin + -- This procedure is designed to change the case of the phrase + -- "highly reliable" into upper case (a type of "Bolding"). + -- All instances of the phrase on all lines of the page will be + -- modified. + + for Line in Page_Type'First .. Page_Type'Last loop + while not Finished loop + Pos := BS_40.Index(Page(Line), Key_Word); + Finished := (Pos = 0); + if not Finished then + + BS_40.Overwrite + (Page(Line), + Pos, + BS_40.To_Wide_String + (BS_40.Translate + (BS_40.To_Bounded_Wide_String + (BS_40.Slice(Page(Line), + Pos, + Pos + Key_Word'Length - 1)), + Bold_Mapping))); + + end if; + end loop; + Finished := False; + end loop; + end Bold; + + + begin + + Compress(Page); + Format(Page); + Spell_Check(Page); + Bold(Page); + + for i in 1..Lines_Per_Page loop + if BS_40.To_Wide_String(Page(i)) /= + BS_40.To_Wide_String(Finished_Page(i)) or + BS_40.Length(Page(i)) /= + BS_40.Length(Finished_Page(i)) + then + Report.Failed("Incorrect modification of Page, Line " & + Integer'Image(i)); + end if; + end loop; + + + exception + when others => Report.Failed ("Exception raised in Test_Block"); + end Test_Block; + + + Report.Result; + +end CXA4017; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxa4018.a b/gcc/testsuite/ada/acats/tests/cxa/cxa4018.a new file mode 100644 index 000000000..98e0ded4a --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxa4018.a @@ -0,0 +1,379 @@ +-- CXA4018.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 subprograms defined in package +-- Ada.Strings.Wide_Bounded are available, and that they produce +-- correct results. Specifically, check the subprograms Append, +-- Count, Element, Find_Token, Head, Index_Non_Blank, Replace_Element, +-- Replicate, Tail, To_Bounded_Wide_String, "&", ">", "<", ">=", "<=", +-- and "*". +-- +-- TEST DESCRIPTION: +-- This test, when taken in conjunction with test CXA40[17,19,20], will +-- constitute a test of all the functionality contained in package +-- Ada.Strings.Wide_Bounded. This test uses a variety of the +-- subprograms defined in the wide bounded string package in ways typical +-- of common usage. Different combinations of available subprograms +-- are used to accomplish similar wide bounded string processing goals. +-- +-- +-- CHANGE HISTORY: +-- 06 Dec 94 SAIC ACVC 2.0 +-- 22 Dec 94 SAIC Changed obsolete constant to Strings.Wide_Space. +-- 06 Nov 95 SAIC Corrected evaluation string used in Head/Tail +-- subtests for ACVC 2.0.1. +-- +--! + +with Ada.Strings; +with Ada.Strings.Wide_Bounded; +with Ada.Characters.Handling; +with Ada.Strings.Wide_Maps; +with Report; + +procedure CXA4018 is + + -- The following two functions are used to translate character and string + -- values to "Wide" values. They will be applied to all the Wide_Bounded + -- subprogram parameters to simulate the use of Wide_Characters and + -- Wide_Strings in actual practice. Blanks are translated to Wide_Character + -- blanks and all other characters are translated into Wide_Characters with + -- position values 256 greater than their (narrow) character position + -- values. + + function Translate (Ch : Character) return Wide_Character is + C : Character := Ch; + begin + if Ch = ' ' then + return Ada.Characters.Handling.To_Wide_Character(C); + else + return Wide_Character'Val(Character'Pos(Ch) + + Character'Pos(Character'Last) + 1); + end if; + end Translate; + + function Translate (Str : String) return Wide_String is + WS : Wide_String(Str'First..Str'Last); + begin + for i in Str'First..Str'Last loop + WS(i) := Translate(Str(i)); + end loop; + return WS; + end Translate; + + +begin + + Report.Test ("CXA4018", "Check that the subprograms defined in package " & + "Ada.Strings.Wide_Bounded are available, and " & + "that they produce correct results"); + + Test_Block: + declare + + package BS80 is new Ada.Strings.Wide_Bounded.Generic_Bounded_Length(80); + use type BS80.Bounded_Wide_String; + + Part1 : constant Wide_String := Translate("Rum"); + Part2 : Wide_Character := Translate('p'); + Part3 : BS80.Bounded_Wide_String := + BS80.To_Bounded_Wide_String(Translate("el")); + Part4 : Wide_Character := Translate('s'); + Part5 : BS80.Bounded_Wide_String := + BS80.To_Bounded_Wide_String(Translate("tilt")); + Part6 : Wide_String(1..3) := Translate("ski"); + + Full_Catenate_String, + Full_Append_String, + Constructed_String, + Drop_String, + Replicated_String, + Token_String : BS80.Bounded_Wide_String; + + CharA : Wide_Character := Translate('A'); + CharB : Wide_Character := Translate('B'); + CharC : Wide_Character := Translate('C'); + CharD : Wide_Character := Translate('D'); + CharE : Wide_Character := Translate('E'); + CharF : Wide_Character := Translate('F'); + + ABStr : Wide_String(1..15) := Translate("AAAAABBBBBBBBBB"); + StrB : Wide_String(1..2) := Translate("BB"); + StrE : Wide_String(1..2) := Translate("EE"); + + + begin + + -- Evaluation of the overloaded forms of the "&" operator. + + Full_Catenate_String := + BS80."&"(Part2, -- WChar & Bnd WStr + BS80."&"(Part3, -- Bnd WStr & Bnd WStr + BS80."&"(Part4, -- WChar & Bnd WStr + BS80."&"(Part5, -- Bnd WStr & Bnd WStr + BS80.To_Bounded_Wide_String + (Part6))))); + + Full_Catenate_String := + BS80."&"(Part1, Full_Catenate_String); -- WStr & Bnd WStr + Full_Catenate_String := + BS80."&"(Left => Full_Catenate_String, + Right => Translate('n')); -- Bnd WStr & WChar + + + -- Evaluation of the overloaded forms of function Append. + + Full_Append_String := + BS80.Append(Part2, -- WChar,Bnd WStr + BS80.Append(Part3, -- Bnd WStr, Bnd WStr + BS80.Append(Part4, -- WChar,Bnd WStr + BS80.Append(BS80.To_Wide_String(Part5), -- WStr,Bnd WStr + BS80.To_Bounded_Wide_String(Part6))))); + + Full_Append_String := + BS80.Append(BS80.To_Bounded_Wide_String(Part1), -- Bnd WStr, WStr + BS80.To_Wide_String(Full_Append_String)); + + Full_Append_String := + BS80.Append(Left => Full_Append_String, + Right => Translate('n')); -- Bnd WStr, WChar + + + -- Validate the resulting bounded wide strings. + + if BS80."<"(Full_Catenate_String, Full_Append_String) or + BS80.">"(Full_Catenate_String, Full_Append_String) or + not (Full_Catenate_String = Full_Append_String and + BS80."<="(Full_Catenate_String, Full_Append_String) and + BS80.">="(Full_Catenate_String, Full_Append_String)) + then + Report.Failed + ("Incorrect results from bounded wide string catenation" & + " and comparison"); + end if; + + + -- Evaluate the overloaded forms of the Constructor function "*" and + -- the Replicate function. + + Constructed_String := + BS80."*"(2,CharA) & -- "AA" + BS80."*"(2,StrB) & -- "AABBBB" + BS80."*"(3, BS80."*"(2, CharC)) & -- "AABBBBCCCCCC" + BS80.Replicate(3, + BS80.Replicate(2, CharD)) & -- "AABBBBCCCCCCDDDDDD" + BS80.Replicate(2, StrE) & -- "AABBBBCCCCCCDDDDDDEEEE" + BS80.Replicate(2, CharF); -- "AABBBBCCCCCCDDDDDDEEEEFF" + + + -- Use of Function Replicate that involves dropping wide characters. + -- The attempt to replicate the 15 character wide string six times will + -- exceed the 80 wide character bound of the wide string. Therefore, + -- the result should be the catenation of 5 copies of the 15 character + -- wide string, followed by 5 'A' wide characters (the first five wide + -- characters of the 6th replication) with the remaining wide + -- characters of the 6th replication dropped. + + Drop_String := + BS80.Replicate(Count => 6, + Item => ABStr, -- "AAAAABBBBBBBBBB" + Drop => Ada.Strings.Right); + + if BS80.Element(Drop_String, 1) /= Translate('A') or + BS80.Element(Drop_String, 6) /= Translate('B') or + BS80.Element(Drop_String, 76) /= Translate('A') or + BS80.Element(Drop_String, 80) /= Translate('A') + then + Report.Failed("Incorrect result from Replicate with Drop"); + end if; + + + -- Use function Index_Non_Blank in the evaluation of the + -- Constructed_String. + + if BS80.Index_Non_Blank(Constructed_String, Ada.Strings.Forward) /= + BS80.To_Wide_String(Constructed_String)'First or + BS80.Index_Non_Blank(Constructed_String, Ada.Strings.Backward) /= + BS80.Length(Constructed_String) + then + Report.Failed("Incorrect results from constructor functions"); + end if; + + + + declare + + -- Define wide character set objects for use with the Count function. + -- Constructed_String = "AABBBBCCCCCCDDDDDDEEEEFF" from above. + + A_Set : Ada.Strings.Wide_Maps.Wide_Character_Set := + Ada.Strings.Wide_Maps.To_Set(BS80.Element(Constructed_String, + 1)); + B_Set : Ada.Strings.Wide_Maps.Wide_Character_Set := + Ada.Strings.Wide_Maps.To_Set(BS80.Element(Constructed_String, + 3)); + C_Set : Ada.Strings.Wide_Maps.Wide_Character_Set := + Ada.Strings.Wide_Maps.To_Set(BS80.Element(Constructed_String, + 7)); + D_Set : Ada.Strings.Wide_Maps.Wide_Character_Set := + Ada.Strings.Wide_Maps.To_Set(BS80.Element(Constructed_String, + 13)); + E_Set : Ada.Strings.Wide_Maps.Wide_Character_Set := + Ada.Strings.Wide_Maps.To_Set(BS80.Element(Constructed_String, + 19)); + F_Set : Ada.Strings.Wide_Maps.Wide_Character_Set := + Ada.Strings.Wide_Maps.To_Set(BS80.Element(Constructed_String, + 23)); + Start : Positive; + Stop : Natural := 0; + + begin + + -- Evaluate the results from function Count by comparing the number + -- of A's to the number of F's, B's to E's, and C's to D's in the + -- Constructed_String. + -- There should be an equal number of each of the wide characters that + -- are being compared (i.e., 2 A's and F's, 4 B's and E's, etc) + + if BS80.Count(Constructed_String, A_Set) /= + BS80.Count(Constructed_String, F_Set) or + BS80.Count(Constructed_String, B_Set) /= + BS80.Count(Constructed_String, E_Set) or + not (BS80.Count(Constructed_String, C_Set) = + BS80.Count(Constructed_String, D_Set)) + then + Report.Failed("Incorrect result from function Count"); + end if; + + + -- Evaluate the functions Head, Tail, and Find_Token. + -- Create the Token_String from the Constructed_String above. + + Token_String := + BS80.Tail(BS80.Head(Constructed_String, 3), 2) & -- "AB" & + BS80.Head(BS80.Tail(Constructed_String, 13), 2) & -- "CD" & + BS80.Head(BS80.Tail(Constructed_String, 3), 2); -- "EF" + + if Token_String /= + BS80.To_Bounded_Wide_String(Translate("ABCDEF")) then + Report.Failed("Incorrect result from Catenation of Token_String"); + end if; + + + -- Find the starting/ending position of the first A in the + -- Token_String (both should be 1, only one A appears in string). + -- The Function Head uses the default pad character to return a + -- bounded wide string longer than its input parameter bounded + -- wide string. + + BS80.Find_Token(BS80.Head(Token_String, 10), -- Default pad. + A_Set, + Ada.Strings.Inside, + Start, + Stop); + + if Start /= 1 and Stop /= 1 then + Report.Failed("Incorrect result from Find_Token - 1"); + end if; + + + -- Find the starting/ending position of the first non-AB slice in + -- the "head" five wide characters of Token_String (slice CDE at + -- positions 3-5) + + BS80.Find_Token(BS80.Head(Token_String, 5), -- "ABCDE" + Ada.Strings.Wide_Maps."OR"(A_Set, B_Set), -- Set (AB) + Ada.Strings.Outside, + Start, + Stop); + + if Start /= 3 and Stop /= 5 then + Report.Failed("Incorrect result from Find_Token - 2"); + end if; + + + -- Find the starting/ending position of the first CD slice in + -- the "tail" eight wide characters (including two pad wide + -- characters) of Token_String (slice CD at positions 5-6 of + -- the tail portion specified) + + BS80.Find_Token(BS80.Tail(Token_String, 8, + Ada.Strings.Wide_Space), + Ada.Strings.Wide_Maps."OR"(C_Set, D_Set), + Ada.Strings.Inside, + Start, + Stop); + + if Start /= 5 and Stop /= 6 then + Report.Failed("Incorrect result from Find_Token - 3"); + end if; + + + -- Evaluate the Replace_Element function. + + -- Token_String = "ABCDEF" + + BS80.Replace_Element(Token_String, 3, BS80.Element(Token_String,4)); + + -- Token_String = "ABDDEF" + + BS80.Replace_Element(Source => Token_String, + Index => 2, + By => BS80.Element(Token_String, 5)); + + -- Token_String = "AEDDEF" + + BS80.Replace_Element(Token_String, + 1, + BS80.Element(BS80.Tail(Token_String, 2), 2)); + + -- Token_String = "FEDDEF" + -- Evaluate this result. + + if BS80.Element(Token_String, + BS80.To_Wide_String(Token_String)'First) /= + BS80.Element(Token_String, + BS80.To_Wide_String(Token_String)'Last) or + BS80.Count(Token_String, D_Set) /= + BS80.Count(Token_String, E_Set) or + BS80.Index_Non_Blank(BS80.Head(Token_String,6)) /= + BS80.Index_Non_Blank(BS80.Tail(Token_String,6)) or + BS80.Head(Token_String, 1) /= + BS80.Tail(Token_String, 1) + then + Report.Failed("Incorrect result from operations in combination"); + end if; + + end; + + exception + when others => Report.Failed ("Exception raised in Test_Block"); + end Test_Block; + + + Report.Result; + +end CXA4018; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxa4019.a b/gcc/testsuite/ada/acats/tests/cxa/cxa4019.a new file mode 100644 index 000000000..943e3e73b --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxa4019.a @@ -0,0 +1,1027 @@ +-- CXA4019.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 subprograms defined in package Ada.Strings.Wide_Bounded +-- are available, and that they produce correct results, especially +-- under conditions where truncation of the result is required. +-- Specifically, check the subprograms Append, Count with non-Identity +-- maps, Index with non-Identity maps, Index with Set parameters, +-- Insert (function and procedure), Replace_Slice (function and +-- procedure), To_Bounded_Wide_String, and Translate (function and +-- procedure). +-- +-- TEST DESCRIPTION: +-- This test, in conjunction with tests CXA4017, CXA4018, and CXA4020, +-- will provide coverage of the most common usages of the functionality +-- found in the Ada.Strings.Wide_Bounded package. It deals in large part +-- with truncation effects and options. This test contains many small, +-- specific test cases, situations that are often difficult to generate +-- in large numbers in an application-based test. These cases represent +-- specific usage paradigms in-the-small. +-- +-- +-- CHANGE HISTORY: +-- 06 Dec 94 SAIC ACVC 2.0 +-- 06 Nov 95 SAIC Corrected expected result string in subtest for +-- ACVC 2.0.1. +-- Moved function Dog_to_Cat_Mapping to library +-- level to correct accessibility problem in test. +-- 22 Aug 96 SAIC Corrected three subtests identified in reviewer +-- comments. +-- 17 Feb 97 PWB.CTA Corrected result strings for Translate and Insert +-- +--! + +package CXA40190 is + + -- Wide Character mapping function defined for use with specific + -- versions of functions Index and Count. + + function Dog_to_Cat_Mapping (From : Wide_Character) + return Wide_Character; + +end CXA40190; + +package body CXA40190 is + + -- Translates "dog" to "cat". + function Dog_to_Cat_Mapping (From : Wide_Character) + return Wide_Character is + begin + if From = 'd' then + return 'c'; + elsif From = 'o' then + return 'a'; + elsif From = 'g' then + return 't'; + else + return From; + end if; + end Dog_to_Cat_Mapping; + +end CXA40190; + + +with CXA40190; +with Report; +with Ada.Characters.Handling; +with Ada.Strings.Wide_Bounded; +with Ada.Strings.Wide_Maps; +with Ada.Strings.Wide_Maps.Wide_Constants; + +procedure CXA4019 is + + -- The following two functions are used to translate character and string + -- values to "Wide" values. They will be applied to all the Wide_Bounded + -- subprogram parameters to simulate the use of Wide_Characters and + -- Wide_Strings in actual practice. + + function Equiv (Ch : Character) return Wide_Character is + C : Character := Ch; + begin + if Ch = ' ' then + return Ada.Characters.Handling.To_Wide_Character(C); + else + return Wide_Character'Val(Character'Pos(Ch) + + Character'Pos(Character'Last) + 1); + end if; + end Equiv; + + + function Equiv (Str : String) return Wide_String is + WS : Wide_String(Str'First..Str'Last); + begin + for i in Str'First..Str'Last loop + WS(i) := Equiv(Str(i)); + end loop; + return WS; + end Equiv; + +begin + + Report.Test("CXA4019", "Check that the subprograms defined in " & + "package Ada.Strings.Wide_Bounded are " & + "available, and that they produce correct " & + "results, especially under conditions where " & + "truncation of the result is required"); + + Test_Block: + declare + + use CXA40190; + + package AS renames Ada.Strings; + package ASB renames Ada.Strings.Wide_Bounded; + package ASWC renames Ada.Strings.Wide_Maps.Wide_Constants; + package Maps renames Ada.Strings.Wide_Maps; + + package B10 is new ASB.Generic_Bounded_Length(Max => 10); + use type B10.Bounded_Wide_String; + + Result_String : B10.Bounded_Wide_String; + Test_String : B10.Bounded_Wide_String; + AtoE_Bnd_Str : B10.Bounded_Wide_String := + B10.To_Bounded_Wide_String(Equiv("abcde")); + FtoJ_Bnd_Str : B10.Bounded_Wide_String := + B10.To_Bounded_Wide_String(Equiv("fghij")); + AtoJ_Bnd_Str : B10.Bounded_Wide_String := + B10.To_Bounded_Wide_String(Equiv("abcdefghij")); + + Location : Natural := 0; + Total_Count : Natural := 0; + + CD_Set : Maps.Wide_Character_Set := Maps.To_Set("cd"); + Wide_CD_Set : Maps.Wide_Character_Set := Maps.To_Set(Equiv("cd")); + + AB_to_YZ_Map : Maps.Wide_Character_Mapping := + Maps.To_Mapping(From => "ab", To => "yz"); + + Wide_AB_to_YZ_Map : Maps.Wide_Character_Mapping := + Maps.To_Mapping(From => Equiv("ab"), + To => Equiv("yz")); + + CD_to_XY_Map : Maps.Wide_Character_Mapping := + Maps.To_Mapping(From => "cd", To => "xy"); + + Wide_CD_to_XY_Map : Maps.Wide_Character_Mapping := + Maps.To_Mapping(From => Equiv("cd"), + To => Equiv("xy")); + + + -- Access-to-Subprogram object defined for use with specific versions of + -- functions Index, Count Translate, and procedure Translate. + + Map_Ptr : Maps.Wide_Character_Mapping_Function := + Dog_to_Cat_Mapping'Access; + + + + begin + + -- Function To_Bounded_Wide_String with Truncation + -- Evaluate the function Append with parameters that will + -- cause the truncation of the result. + + -- Drop = Error (default case, Length_Error will be raised) + + begin + Test_String := + B10.To_Bounded_Wide_String + (Equiv("Much too long for this bounded wide string")); + Report.Failed("Length Error not raised by To_Bounded_Wide_String"); + exception + when AS.Length_Error => null; -- Expected exception raised. + when others => + Report.Failed + ("Incorrect exception raised by To_Bounded_Wide_String"); + end; + + -- Drop = Left + + Test_String := + B10.To_Bounded_Wide_String(Source => Equiv("abcdefghijklmn"), + Drop => Ada.Strings.Left); + + if Test_String /= B10.To_Bounded_Wide_String(Equiv("efghijklmn")) then + Report.Failed + ("Incorrect result from To_Bounded_Wide_String, Drop = Left"); + end if; + + -- Drop = Right + + Test_String := + B10.To_Bounded_Wide_String(Source => Equiv("abcdefghijklmn"), + Drop => Ada.Strings.Right); + + if not(Test_String = AtoJ_Bnd_Str) then + Report.Failed + ("Incorrect result from To_Bounded_Wide_String, Drop = Right"); + end if; + + + + + -- Function Append with Truncation + -- Evaluate the function Append with parameters that will + -- cause the truncation of the result. + + -- Drop = Error (default case, Length_Error will be raised) + + begin + -- Append (Bnd Str, Bnd Str); + Result_String := + B10.Append(B10.To_Bounded_Wide_String(Equiv("abcde")), + B10.To_Bounded_Wide_String(Equiv("fghijk"))); -- 11 char + Report.Failed("Length_Error not raised by Append - 1"); + exception + when AS.Length_Error => null; -- OK, correct exception raised. + when others => + Report.Failed("Incorrect exception raised by Append - 1"); + end; + + begin + -- Append (Str, Bnd Str); + Result_String := + B10.Append(B10.To_Wide_String(AtoE_Bnd_Str), + B10.To_Bounded_Wide_String(Equiv("fghijk")), + AS.Error); + Report.Failed("Length_Error not raised by Append - 2"); + exception + when AS.Length_Error => null; -- OK, correct exception raised. + when others => + Report.Failed("Incorrect exception raised by Append - 2"); + end; + + begin + -- Append (Bnd Str, Char); + Result_String := + B10.Append(B10.To_Bounded_Wide_String("abcdefghij"), 'k'); + Report.Failed("Length_Error not raised by Append - 3"); + exception + when AS.Length_Error => null; -- OK, correct exception raised. + when others => + Report.Failed("Incorrect exception raised by Append - 3"); + end; + + -- Drop = Left + + -- Append (Bnd Str, Bnd Str) + Result_String := + B10.Append(B10.To_Bounded_Wide_String(Equiv("abcdefgh")), -- 8 chs + B10.To_Bounded_Wide_String(Equiv("ijklmn")), -- 6 chs + Ada.Strings.Left); + + if Result_String /= + B10.To_Bounded_Wide_String(Equiv("efghijklmn")) -- 10 chars + then + Report.Failed("Incorrect truncation performed by Append - 4"); + end if; + + -- Append (Bnd Str, Str) + Result_String := + B10.Append(B10.To_Bounded_Wide_String("abcdefghij"), + "xyz", + Ada.Strings.Left); + + if Result_String /= B10.To_Bounded_Wide_String("defghijxyz") then + Report.Failed("Incorrect truncation performed by Append - 5"); + end if; + + -- Append (Char, Bnd Str) + + Result_String := + B10.Append(Equiv('A'), + B10.To_Bounded_Wide_String(Equiv("abcdefghij")), + Ada.Strings.Left); + + if Result_String /= B10.To_Bounded_Wide_String(Equiv("abcdefghij")) + then + Report.Failed("Incorrect truncation performed by Append - 6"); + end if; + + -- Drop = Right + + -- Append (Bnd Str, Bnd Str) + Result_String := B10.Append(FtoJ_Bnd_Str, + AtoJ_Bnd_Str, + Ada.Strings.Right); + + if Result_String /= + B10.To_Bounded_Wide_String(Equiv("fghijabcde")) + then + Report.Failed("Incorrect truncation performed by Append - 7"); + end if; + + -- Append (Str, Bnd Str) + Result_String := B10.Append(B10.To_Wide_String(AtoE_Bnd_Str), + AtoJ_Bnd_Str, + Ada.Strings.Right); + + if Result_String /= + B10.To_Bounded_Wide_String(Equiv("abcdeabcde")) + then + Report.Failed("Incorrect truncation performed by Append - 8"); + end if; + + -- Append (Char, Bnd Str) + Result_String := B10.Append(Equiv('A'), AtoJ_Bnd_Str, Ada.Strings.Right); + + if Result_String /= B10.To_Bounded_Wide_String(Equiv("Aabcdefghi")) then + Report.Failed("Incorrect truncation performed by Append - 9"); + end if; + + + + -- Function Index with non-Identity map. + -- Evaluate the function Index with a non-identity map + -- parameter which will cause mapping of the source parameter + -- prior to the evaluation of the index position search. + + Location := + B10.Index(Source => B10.To_Bounded_Wide_String("foxy fox 2"), + Pattern => "FOX", + Going => Ada.Strings.Backward, + Mapping => ASWC.Upper_Case_Map); + + if Location /= 6 then + Report.Failed("Incorrect result from Index, non-Identity map - 1"); + end if; + + Location := + B10.Index(B10.To_Bounded_Wide_String("THE QUICK "), + "quick", + Ada.Strings.Forward, + Ada.Strings.Wide_Maps.Wide_Constants.Lower_Case_Map); + + if Location /= 5 then + Report.Failed("Incorrect result from Index, non-Identity map - 2"); + end if; + + Location := B10.Index(Source => B10.To_Bounded_Wide_String("The the"), + Pattern => "the", + Going => Ada.Strings.Forward, + Mapping => ASWC.Lower_Case_Map); + + if Location /= 1 then + Report.Failed("Incorrect result from Index, non-Identity map - 3"); + end if; + + + + if B10.Index(B10.To_Bounded_Wide_String("abcd"), -- Pattern = Source + "abcd") /= 1 or + B10.Index(B10.To_Bounded_Wide_String("abc"), -- Pattern < Source + "abcd") /= 0 or + B10.Index(B10.Null_Bounded_Wide_String, -- Source = Null + "abc") /= 0 + then + Report.Failed("Incorrect result from Index with string patterns"); + end if; + + + + -- Function Index with access-to-subprogram mapping value. + -- Evaluate the function Index with a wide character mapping function + -- object that performs the mapping operation. + + Location := B10.Index(Source => B10.To_Bounded_Wide_String("My dog"), + Pattern => "cat", + Going => Ada.Strings.Forward, + Mapping => Map_Ptr); -- change "dog" to "cat" + + if Location /= 4 then + Report.Failed("Incorrect result from Index, w/map ptr - 1"); + end if; + + Location := B10.Index(B10.To_Bounded_Wide_String("cat or dog"), + "cat", + Ada.Strings.Backward, + Map_Ptr); + + if Location /= 8 then + Report.Failed("Incorrect result from Index, w/map ptr - 2"); + end if; + + if B10.Index(B10.To_Bounded_Wide_String("dog"), -- Pattern = Source + "cat", + Ada.Strings.Forward, + Map_Ptr) /= 1 or + B10.Index(B10.To_Bounded_Wide_String("dog"), -- Pattern < Source + "cats", + Ada.Strings.Backward, + Map_Ptr) /= 0 or + B10.Index(B10.Null_Bounded_Wide_String, -- Source = Null + "cat", + Ada.Strings.Forward, + Map_Ptr) /= 0 or + B10.Index(B10.To_Bounded_Wide_String("hot dog"), + "dog", + Ada.Strings.Backward, + Map_Ptr) /= 0 or + B10.Index(B10.To_Bounded_Wide_String(" cat dog "), + " cat", + Ada.Strings.Backward, + Map_Ptr) /= 5 or + B10.Index(B10.To_Bounded_Wide_String("dog CatDog"), + "cat", + Ada.Strings.Backward, + Map_Ptr) /= 1 or + B10.Index(B10.To_Bounded_Wide_String("CatandDog"), + "cat", + Ada.Strings.Forward, + Map_Ptr) /= 0 or + B10.Index(B10.To_Bounded_Wide_String("dddd"), + "ccccc", + Ada.Strings.Backward, + Map_Ptr) /= 0 + then + Report.Failed("Incorrect result from Index w/map ptr - 3"); + end if; + + + + -- Function Index (for Sets). + -- This version of Index uses Sets as the basis of the search. + + -- Test = Inside, Going = Forward (Default case). + Location := + B10.Index(Source => B10.To_Bounded_Wide_String(Equiv("abcdeabcde")), + Set => Wide_CD_Set, + Test => Ada.Strings.Inside, + Going => Ada.Strings.Forward); + + if not (Location = 3) then -- position of first 'c' equivalent in source. + Report.Failed("Incorrect result from Index using Sets - 1"); + end if; + + -- Test = Inside, Going = Backward. + Location := + B10.Index(Source => B10."&"(AtoE_Bnd_Str, AtoE_Bnd_Str), + Set => Wide_CD_Set, + Test => Ada.Strings.Inside, + Going => Ada.Strings.Backward); + + if not (Location = 9) then -- position of last 'd' in source. + Report.Failed("Incorrect result from Index using Sets - 2"); + end if; + + -- Test = Outside, Going = Forward. + Location := B10.Index(B10.To_Bounded_Wide_String("deddacd"), + CD_Set, + Test => Ada.Strings.Outside, + Going => Ada.Strings.Forward); + + if Location /= 2 then -- position of 'e' in source. + Report.Failed("Incorrect result from Index using Sets - 3"); + end if; + + -- Test = Outside, Going = Backward. + Location := B10.Index(B10.To_Bounded_Wide_String(Equiv("deddacd")), + Wide_CD_Set, + Ada.Strings.Outside, + Ada.Strings.Backward); + + if Location /= 5 then -- position of 'a', correct. + Report.Failed("Incorrect result from Index using Sets - 4"); + end if; + + if B10.Index(B10.To_Bounded_Wide_String("cd"), -- Source = Set + CD_Set) /= 1 or + B10.Index(B10.To_Bounded_Wide_String("c"), -- Source < Set + CD_Set) /= 1 or + B10.Index(B10.Null_Bounded_Wide_String, -- Source = Null + Wide_CD_Set) /= 0 or + B10.Index(AtoE_Bnd_Str, + Maps.To_Set('x')) /= 0 -- No match. + then + Report.Failed("Incorrect result from Index using Sets - 5"); + end if; + + + + -- Function Count with non-Identity mapping. + -- Evaluate the function Count with a non-identity map + -- parameter which will cause mapping of the source parameter + -- prior to the evaluation of the number of matching patterns. + + Total_Count := + B10.Count(Source => B10.To_Bounded_Wide_String("THE THE TH"), + Pattern => "th", + Mapping => ASWC.Lower_Case_Map); + + if Total_Count /= 3 then + Report.Failed + ("Incorrect result from function Count, non-Identity map - 1"); + end if; + + -- And a few with identity maps as well. + + if B10.Count(B10.To_Bounded_Wide_String(Equiv("ABABABABAB")), + Equiv("ABA"), + Maps.Identity) /= 2 or + B10.Count(B10.To_Bounded_Wide_String("ADCBADABCD"), + "AB", + Maps.To_Mapping("CD", "AB")) /= 5 or + B10.Count(B10.To_Bounded_Wide_String(Equiv("aaaaaaaaaa")), + Equiv("aaa")) /= 3 or + B10.Count(B10.To_Bounded_Wide_String(Equiv("XX")), + Equiv("XXX"), + Maps.Identity) /= 0 or + B10.Count(AtoE_Bnd_Str, -- Source = Pattern + Equiv("abcde")) /= 1 or + B10.Count(B10.Null_Bounded_Wide_String, -- Source = Null + " ") /= 0 + then + Report.Failed + ("Incorrect result from function Count, w,w/o mapping"); + end if; + + + + + + -- Function Count with access-to-subprogram mapping. + -- Evaluate the version function Count that uses an access-to-subprogram + -- map parameter. + + Total_Count := + B10.Count(Source => B10.To_Bounded_Wide_String("dogdogdo"), + Pattern => "ca", + Mapping => Map_Ptr); + + if Total_Count /= 3 then + Report.Failed + ("Incorrect result from function Count, w/map ptr - 1"); + end if; + + + if B10.Count(B10.To_Bounded_Wide_String("DdOoGgod"), + "c", + Map_Ptr) /= 2 or + B10.Count(B10.To_Bounded_Wide_String("dododododo"), + "do", + Map_Ptr) /= 0 or + B10.Count(B10.To_Bounded_Wide_String("Dog or dog"), + "cat", + Map_Ptr) /= 1 or + B10.Count(B10.To_Bounded_Wide_String("dddddddddd"), + "ccccc", + Map_Ptr) /= 2 or + B10.Count(B10.To_Bounded_Wide_String("do"), -- Source < Pattern + "cat", + Map_Ptr) /= 0 or + B10.Count(B10.To_Bounded_Wide_String(" dog "), -- Source = Pattern + " cat ", + Map_Ptr) /= 1 or + B10.Count(B10.Null_Bounded_Wide_String, -- Source = Null + " ", + Map_Ptr) /= 0 + then + Report.Failed + ("Incorrect result from function Count, w/map ptr - 2"); + end if; + + + + + -- Procedure Translate + + -- Partial mapping of source. + + Test_String := B10.To_Bounded_Wide_String("abcdeabcab"); + + B10.Translate(Source => Test_String, Mapping => AB_to_YZ_Map); + + if Test_String /= B10.To_Bounded_Wide_String("yzcdeyzcyz") then + Report.Failed("Incorrect result from procedure Translate - 1"); + end if; + + -- Total mapping of source. + + Test_String := B10.To_Bounded_Wide_String("abbaaababb"); + + B10.Translate(Source => Test_String, Mapping => ASWC.Upper_Case_Map); + + if Test_String /= B10.To_Bounded_Wide_String("ABBAAABABB") then + Report.Failed("Incorrect result from procedure Translate - 2"); + end if; + + -- No mapping of source. + + Test_String := B10.To_Bounded_Wide_String(Equiv("xyzsypcc")); + + B10.Translate(Source => Test_String, Mapping => Wide_AB_to_YZ_Map); + + if Test_String /= B10.To_Bounded_Wide_String(Equiv("xyzsypcc")) then + Report.Failed("Incorrect result from procedure Translate - 3"); + end if; + + -- Map > 2 characters, partial mapping. + + Test_String := B10.To_Bounded_Wide_String("opabcdelmn"); + + B10.Translate(Test_String, + Maps.To_Mapping("abcde", "lmnop")); + + if Test_String /= B10.To_Bounded_Wide_String("oplmnoplmn") then + Report.Failed("Incorrect result from procedure Translate - 4"); + end if; + + + + + -- Procedure Translate with access-to-subprogram mapping. + -- Use the version of Procedure Translate that takes an + -- access-to-subprogram parameter to perform the Source mapping. + + -- Partial mapping of source. + + Test_String := B10.To_Bounded_Wide_String("dogeatdog"); + + B10.Translate(Source => Test_String, Mapping => Map_Ptr); + + if Test_String /= B10.To_Bounded_Wide_String("cateatcat") then + Report.Failed + ("Incorrect result from procedure Translate w/map ptr - 1"); + end if; + + Test_String := B10.To_Bounded_Wide_String("odogcatlmn"); + + B10.Translate(Test_String, Map_Ptr); + + if Test_String /= B10.To_Bounded_Wide_String("acatcatlmn") then + Report.Failed + ("Incorrect result from procedure Translate w/map ptr - 2"); + end if; + + + -- Total mapping of source. + + Test_String := B10.To_Bounded_Wide_String("gggooooddd"); + + B10.Translate(Source => Test_String, Mapping => Map_Ptr); + + if Test_String /= B10.To_Bounded_Wide_String("tttaaaaccc") then + Report.Failed + ("Incorrect result from procedure Translate w/map ptr- 3"); + end if; + + -- No mapping of source. + + Test_String := B10.To_Bounded_Wide_String(" DOG cat "); + + B10.Translate(Source => Test_String, Mapping => Map_Ptr); + + if Test_String /= B10.To_Bounded_Wide_String(" DOG cat ") then + Report.Failed + ("Incorrect result from procedure Translate w/map ptr - 4"); + end if; + + Test_String := B10.Null_Bounded_Wide_String; + + B10.Translate(Source => Test_String, Mapping => Map_Ptr); + + if Test_String /= B10.To_Bounded_Wide_String("") then + Report.Failed + ("Incorrect result from procedure Translate w/map ptr - 5"); + end if; + + + + + -- Function Translate with access-to-subprogram mapping. + -- Use the version of Function Translate that takes an + -- access-to-subprogram parameter to perform the Source mapping. + + -- Partial mapping of source. + + if B10.Translate(Source => B10.To_Bounded_Wide_String("cateatdog"), + Mapping => Map_Ptr) /= + B10.To_Bounded_Wide_String("cateatcat") + then + Report.Failed + ("Incorrect result from function Translate w/map ptr - 1"); + end if; + + if B10.Translate(B10.To_Bounded_Wide_String("cadogtac"), + Map_Ptr) /= + B10.To_Bounded_Wide_String("cacattac") + then + Report.Failed + ("Incorrect result from function Translate w/map ptr - 2"); + end if; + + -- Total mapping of source. + + if B10.Translate(Source => B10.To_Bounded_Wide_String("dogodggdo"), + Mapping => Map_Ptr) /= + B10.To_Bounded_Wide_String("catacttca") + then + Report.Failed + ("Incorrect result from function Translate w/map ptr- 3"); + end if; + + -- No mapping of source. + + if B10.Translate(Source => B10.To_Bounded_Wide_String(" DOG cat "), + Mapping => Map_Ptr) /= + B10.To_Bounded_Wide_String(" DOG cat ") + then + Report.Failed + ("Incorrect result from function Translate w/map ptr - 4"); + end if; + + if B10.Translate(B10.To_Bounded_Wide_String("d "), Map_Ptr) /= + B10.To_Bounded_Wide_String("c ") or + B10.Translate(B10.To_Bounded_Wide_String(" god"), Map_Ptr) /= + B10.To_Bounded_Wide_String(" tac") or + B10.Translate(B10.To_Bounded_Wide_String("d o g D og"), Map_Ptr) /= + B10.To_Bounded_Wide_String("c a t D at") or + B10.Translate(B10.To_Bounded_Wide_String(" "), Map_Ptr) /= + B10.To_Bounded_Wide_String(" ") or + B10.Translate(B10.To_Bounded_Wide_String("dddddddddd"), Map_Ptr) /= + B10.To_Bounded_Wide_String("cccccccccc") + then + Report.Failed + ("Incorrect result from function Translate w/map ptr - 5"); + end if; + + if B10.Translate(Source => B10.Null_Bounded_Wide_String, + Mapping => Map_Ptr) /= + B10.To_Bounded_Wide_String("") + then + Report.Failed + ("Incorrect result from function Translate w/map ptr - 6"); + end if; + + + + + -- Function Replace_Slice + -- Evaluate function Replace_Slice with + -- a variety of Truncation options. + + -- Drop = Error (Default) + + begin + Test_String := AtoJ_Bnd_Str; + Result_String := + B10.Replace_Slice(Source => Test_String, + Low => 3, + High => 5, -- 3-5, 3 chars. + By => Equiv("xxxxxx")); -- more than 3. + Report.Failed("Length_Error not raised by Function Replace_Slice"); + exception + when AS.Length_Error => null; -- Correct exception raised. + when others => + Report.Failed + ("Incorrect exception raised by Function Replace_Slice"); + end; + + -- Drop = Left + + Result_String := + B10.Replace_Slice(Source => Test_String, + Low => 7, + High => 10, -- 7-10, 4 chars. + By => Equiv("xxxxxx"), -- 6 chars. + Drop => Ada.Strings.Left); + + if Result_String /= + B10.To_Bounded_Wide_String(Equiv("cdefxxxxxx")) -- drop a,b + then + Report.Failed + ("Incorrect result from Function Replace Slice, Drop = Left"); + end if; + + -- Drop = Right + + Result_String := + B10.Replace_Slice(Source => Test_String, + Low => 2, + High => 5, -- 2-5, 4 chars. + By => Equiv("xxxxxx"), -- 6 chars. + Drop => Ada.Strings.Right); + + if Result_String /= + B10.To_Bounded_Wide_String(Equiv("axxxxxxfgh")) -- drop i,j + then + Report.Failed + ("Incorrect result from Function Replace Slice, Drop = Right"); + end if; + + -- Low = High = Source'Last, "By" length = 1. + + if B10.Replace_Slice(AtoE_Bnd_Str, + B10.To_Wide_String(AtoE_Bnd_Str)'Last, + B10.To_Wide_String(AtoE_Bnd_Str)'Last, + Equiv("X"), + Ada.Strings.Error) /= + B10.To_Bounded_Wide_String(Equiv("abcdX")) + then + Report.Failed("Incorrect result from Function Replace_Slice"); + end if; + + -- Index_Error raised when High < Source'First - 1. + begin + Test_String := + B10.Replace_Slice(AtoE_Bnd_Str, + B10.To_Wide_String(AtoE_Bnd_Str)'First, + B10.To_Wide_String(AtoE_Bnd_Str)'First - 2, + Equiv("hijklm")); + Report.Failed("Index_Error not raised by Function Replace_Slice"); + exception + when AS.Index_Error => null; -- OK, expected exception + when Constraint_Error => null; -- Also OK, since RM is not clear + when others => + Report.Failed + ("Incorrect exception raised by Function Replace_Slice"); + end; + + + + -- Procedure Replace_Slice + -- Evaluate procedure Replace_Slice with + -- a variety of Truncation options. + + -- Drop = Error (Default) + + begin + Test_String := AtoJ_Bnd_Str; + B10.Replace_Slice(Source => Test_String, + Low => 3, + High => 5, -- 3-5, 3 chars. + By => Equiv("xxxxxx")); -- more than 3. + Report.Failed("Length_Error not raised by Procedure Replace_Slice"); + exception + when AS.Length_Error => null; -- Correct exception raised. + when others => + Report.Failed + ("Incorrect exception raised by Procedure Replace_Slice"); + end; + + -- Drop = Left + + Test_String := AtoJ_Bnd_Str; + B10.Replace_Slice(Source => Test_String, + Low => 7, + High => 9, -- 7-9, 3 chars. + By => Equiv("xxxxx"), -- 5 chars. + Drop => Ada.Strings.Left); + + if Test_String /= + B10.To_Bounded_Wide_String(Equiv("cdefxxxxxj")) -- drop a,b + then + Report.Failed + ("Incorrect result from Procedure Replace Slice, Drop = Left"); + end if; + + -- Drop = Right + + Test_String := AtoJ_Bnd_Str; + B10.Replace_Slice(Source => Test_String, + Low => 1, + High => 3, -- 1-3, 3chars. + By => Equiv("xxxx"), -- 4 chars. + Drop => Ada.Strings.Right); + + if Test_String /= + B10.To_Bounded_Wide_String(Equiv("xxxxdefghi")) -- drop j + then + Report.Failed + ("Incorrect result from Procedure Replace Slice, Drop = Right"); + end if; + + -- High = Source'First, Low > High (Insert before Low). + + Test_String := AtoE_Bnd_Str; + B10.Replace_Slice(Source => Test_String, + Low => B10.To_Wide_String(Test_String)'Last, + High => B10.To_Wide_String(Test_String)'First, + By => Equiv("XXXX"), -- 4 chars. + Drop => Ada.Strings.Right); + + if Test_String /= B10.To_Bounded_Wide_String(Equiv("abcdXXXXe")) then + Report.Failed + ("Incorrect result from Procedure Replace Slice"); + end if; + + + + + -- Function Insert with Truncation + -- Drop = Error (Default). + + begin + Result_String := + B10.Insert(Source => AtoJ_Bnd_Str, -- "abcdefghij" + Before => 2, + New_Item => Equiv("xyz")); + Report.Failed("Length_Error not raised by Function Insert"); + exception + when AS.Length_Error => null; -- Correct exception raised. + when others => + Report.Failed("Incorrect exception raised by Function Insert"); + end; + + -- Drop = Left + + Result_String := + B10.Insert(Source => AtoJ_Bnd_Str, -- "abcdefghij" + Before => 5, + New_Item => Equiv("xyz"), -- 3 additional chars. + Drop => Ada.Strings.Left); + + if B10.To_Wide_String(Result_String) /= Equiv("dxyzefghij") then + Report.Failed("Incorrect result from Function Insert, Drop = Left"); + end if; + + -- Drop = Right + + Result_String := + B10.Insert(Source => B10.To_Bounded_Wide_String("abcdef"), + Before => 2, + New_Item => "vwxyz", -- 5 additional chars. + Drop => Ada.Strings.Right); + + if B10.To_Wide_String(Result_String) /= "avwxyzbcde" then -- drop f. + Report.Failed("Incorrect result from Function Insert, Drop = Right"); + end if; + + -- Additional cases. + + if B10.Insert(B10.To_Bounded_Wide_String("a"), 1, " B") /= + B10.To_Bounded_Wide_String(" Ba") or + B10.Insert(B10.Null_Bounded_Wide_String, 1, Equiv("abcde")) /= + AtoE_Bnd_Str or + B10.Insert(B10.To_Bounded_Wide_String("ab"), 2, "") /= + B10.To_Bounded_Wide_String("ab") + then + Report.Failed("Incorrect result from Function Insert"); + end if; + + + + -- Procedure Insert + + -- Drop = Error (Default). + begin + Test_String := AtoJ_Bnd_Str; + B10.Insert(Source => Test_String, + Before => 9, + New_Item => Equiv("wxyz"), + Drop => Ada.Strings.Error); + Report.Failed("Length_Error not raised by Procedure Insert"); + exception + when AS.Length_Error => null; -- Correct exception raised. + when others => + Report.Failed("Incorrect exception raised by Procedure Insert"); + end; + + -- Drop = Left + + Test_String := AtoJ_Bnd_Str; + B10.Insert(Source => Test_String, + Before => B10.Length(Test_String), -- before last char + New_Item => Equiv("xyz"), -- 3 additional chars. + Drop => Ada.Strings.Left); + + if B10.To_Wide_String(Test_String) /= Equiv("defghixyzj") then + Report.Failed("Incorrect result from Procedure Insert, Drop = Left"); + end if; + + -- Drop = Right + + Test_String := AtoJ_Bnd_Str; + B10.Insert(Source => Test_String, + Before => 4, + New_Item => Equiv("yz"), -- 2 additional chars. + Drop => Ada.Strings.Right); + + if B10.To_Wide_String(Test_String) /= Equiv("abcyzdefgh") then + Report.Failed + ("Incorrect result from Procedure Insert, Drop = Right"); + end if; + + -- Before = Source'First, New_Item length = 1. + + Test_String := B10.To_Bounded_Wide_String(" abc "); + B10.Insert(Test_String, + B10.To_Wide_String(Test_String)'First, + "Z"); + + if Test_String /= B10.To_Bounded_Wide_String("Z abc ") then + Report.Failed("Incorrect result from Procedure Insert"); + end if; + + + exception + when others => Report.Failed("Exception raised in Test_Block"); + end Test_Block; + + Report.Result; + +end CXA4019; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxa4020.a b/gcc/testsuite/ada/acats/tests/cxa/cxa4020.a new file mode 100644 index 000000000..24036f171 --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxa4020.a @@ -0,0 +1,688 @@ +-- CXA4020.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 subprograms defined in package Ada.Strings.Wide_Bounded +-- are available, and that they produce correct results, especially under +-- conditions where truncation of the result is required. Specifically, +-- check the subprograms Overwrite (function and procedure), Delete, +-- Function Trim (blanks), Trim (Set wide characters, function and +-- procedure), Head, Tail, and Replicate (wide characters and wide +-- strings). +-- +-- TEST DESCRIPTION: +-- This test, in conjunction with tests CXA4017, CXA4018, CXA4019, +-- will provide coverage of the most common usages of the functionality +-- found in the Ada.Strings.Wide_Bounded package. It deals in large part +-- with truncation effects and options. This test contains many small, +-- specific test cases, situations that are often difficult to generate +-- in large numbers in an application-based test. These cases represent +-- specific usage paradigms in-the-small. +-- +-- +-- CHANGE HISTORY: +-- 06 Dec 94 SAIC ACVC 2.0 +-- 22 Dec 94 SAIC Changed obsolete constant to Strings.Wide_Space. +-- 13 Apr 95 SAIC Corrected certain subtest acceptance conditions. +-- +--! + +with Report; +with Ada.Characters.Handling; +with Ada.Strings.Wide_Bounded; +with Ada.Strings.Wide_Maps; + +procedure CXA4020 is + + -- The following two functions are used to translate character and string + -- values to "Wide" values. They will be applied to all the Wide_Bounded + -- subprogram parameters to simulate the use of Wide_Characters and + -- Wide_Strings in actual practice. Blanks are translated to Wide_Character + -- blanks and all other characters are translated into Wide_Characters with + -- position values 256 greater than their (narrow) character position + -- values. + + function Translate (Ch : Character) return Wide_Character is + C : Character := Ch; + begin + if Ch = ' ' then + return Ada.Characters.Handling.To_Wide_Character(C); + else + return Wide_Character'Val(Character'Pos(Ch) + + Character'Pos(Character'Last) + 1); + end if; + end Translate; + + + function Translate (Str : String) return Wide_String is + WS : Wide_String(Str'First..Str'Last); + begin + for i in Str'First..Str'Last loop + WS(i) := Translate(Str(i)); + end loop; + return WS; + end Translate; + + +begin + + Report.Test("CXA4020", "Check that the subprograms defined in " & + "package Ada.Strings.Wide_Bounded are " & + "available, and that they produce correct " & + "results, especially under conditions where " & + "truncation of the result is required"); + + Test_Block: + declare + + package AS renames Ada.Strings; + package ASW renames Ada.Strings.Wide_Bounded; + package Maps renames Ada.Strings.Wide_Maps; + + package B10 is new ASW.Generic_Bounded_Length(Max => 10); + use type B10.Bounded_Wide_String; + + Result_String : B10.Bounded_Wide_String; + Test_String : B10.Bounded_Wide_String; + AtoE_Bnd_Str : B10.Bounded_Wide_String := + B10.To_Bounded_Wide_String(Translate("abcde")); + FtoJ_Bnd_Str : B10.Bounded_Wide_String := + B10.To_Bounded_Wide_String(Translate("fghij")); + AtoJ_Bnd_Str : B10.Bounded_Wide_String := + B10.To_Bounded_Wide_String(Translate("abcdefghij")); + + Location : Natural := 0; + Total_Count : Natural := 0; + + CD_Set : Maps.Wide_Character_Set := Maps.To_Set(Translate("cd")); + XY_Set : Maps.Wide_Character_Set := Maps.To_Set(Translate("xy")); + + + begin + + -- Function Overwrite with Truncation + -- Drop = Error (Default). + + begin + Test_String := AtoJ_Bnd_Str; + Result_String := + B10.Overwrite(Source => Test_String, -- "abcdefghij" + Position => 9, + New_Item => Translate("xyz"), + Drop => AS.Error); + Report.Failed("Exception not raised by Function Overwrite"); + exception + when AS.Length_Error => null; -- Expected exception raised. + when others => + Report.Failed("Incorrect exception raised by Function Overwrite"); + end; + + -- Drop = Left + + Result_String := + B10.Overwrite(Source => Test_String, -- "abcdefghij" + Position => B10.Length(Test_String), -- 10 + New_Item => Translate("xyz"), + Drop => Ada.Strings.Left); + + if B10.To_Wide_String(Result_String) /= + Translate("cdefghixyz") then -- drop a,b + Report.Failed + ("Incorrect result from Function Overwrite, Drop = Left"); + end if; + + -- Drop = Right + + Result_String := B10.Overwrite(Test_String, -- "abcdefghij" + 3, + Translate("xxxyyyzzz"), + Ada.Strings.Right); + + if B10.To_Wide_String(Result_String) /= + Translate("abxxxyyyzz") + then + Report.Failed + ("Incorrect result from Function Overwrite, Drop = Right"); + end if; + + -- Additional cases of function Overwrite. + + if B10.Overwrite(B10.To_Bounded_Wide_String(Translate("a")), + 1, -- Source length = 1 + Translate(" abc ")) /= + B10.To_Bounded_Wide_String(Translate(" abc ")) or + B10.Overwrite(B10.Null_Bounded_Wide_String, -- Null source + 1, + Translate("abcdefghij")) /= + AtoJ_Bnd_Str or + B10.Overwrite(AtoE_Bnd_Str, + B10.To_Wide_String(AtoE_Bnd_Str)'First, + Translate(" ")) /= -- New_Item = 1 + B10.To_Bounded_Wide_String(Translate(" bcde")) + then + Report.Failed("Incorrect result from Function Overwrite"); + end if; + + + + -- Procedure Overwrite + -- Correct usage, no truncation. + + Test_String := AtoE_Bnd_Str; -- "abcde" + B10.Overwrite(Test_String, 2, Translate("xyz")); + + if Test_String /= B10.To_Bounded_Wide_String(Translate("axyze")) then + Report.Failed("Incorrect result from Procedure Overwrite - 1"); + end if; + + Test_String := B10.To_Bounded_Wide_String(Translate("abc")); + B10.Overwrite(Test_String, 2, ""); -- New_Item is null string. + + if Test_String /= B10.To_Bounded_Wide_String(Translate("abc")) then + Report.Failed("Incorrect result from Procedure Overwrite - 2"); + end if; + + -- Drop = Error (Default). + + begin + Test_String := AtoJ_Bnd_Str; + B10.Overwrite(Source => Test_String, -- "abcdefghij" + Position => 8, + New_Item => Translate("uvwxyz")); + Report.Failed("Exception not raised by Procedure Overwrite"); + exception + when AS.Length_Error => null; -- Expected exception raised. + when others => + Report.Failed("Incorrect exception raised by Procedure Overwrite"); + end; + + -- Drop = Left + + Test_String := AtoJ_Bnd_Str; + B10.Overwrite(Source => Test_String, -- "abcdefghij" + Position => B10.Length(Test_String) - 2, -- 8 + New_Item => Translate("uvwxyz"), + Drop => Ada.Strings.Left); + + if B10.To_Wide_String(Test_String) /= + Translate("defguvwxyz") + then + Report.Failed + ("Incorrect result from Procedure Overwrite, Drop = Left"); + end if; + + -- Drop = Right + + Test_String := AtoJ_Bnd_Str; + B10.Overwrite(Test_String, -- "abcdefghij" + 3, + Translate("xxxyyyzzz"), + Ada.Strings.Right); + + if B10.To_Wide_String(Test_String) /= Translate("abxxxyyyzz") then + Report.Failed + ("Incorrect result from Procedure Overwrite, Drop = Right"); + end if; + + + + -- Function Delete + + if B10.Delete(Source => AtoJ_Bnd_Str, -- "abcdefghij" + From => 3, + Through => 8) /= + B10."&"(B10.Head(AtoJ_Bnd_Str, 2), + B10.Tail(AtoJ_Bnd_Str, 2)) or + B10.Delete(AtoJ_Bnd_Str, 6, B10.Length(AtoJ_Bnd_Str)) /= + AtoE_Bnd_Str or + B10.Delete(AtoJ_Bnd_Str, 1, 5) /= + FtoJ_Bnd_Str + then + Report.Failed("Incorrect result from Function Delete - 1"); + end if; + + if B10.Delete(B10.To_Bounded_Wide_String(Translate("a")), 1, 1) /= + B10.Null_Bounded_Wide_String or + B10.Delete(AtoE_Bnd_Str, + 5, + B10.To_Wide_String(AtoE_Bnd_Str)'First) /= + AtoE_Bnd_Str or + B10.Delete(AtoE_Bnd_Str, + B10.To_Wide_String(AtoE_Bnd_Str)'Last, + B10.To_Wide_String(AtoE_Bnd_Str)'Last) /= + B10.To_Bounded_Wide_String(Translate("abcd")) + then + Report.Failed("Incorrect result from Function Delete - 2"); + end if; + + + + -- Function Trim + + declare + + Text : B10.Bounded_Wide_String := + B10.To_Bounded_Wide_String(Translate("Text")); + type Bnd_Array_Type is array (1..5) of B10.Bounded_Wide_String; + Bnd_Array : Bnd_Array_Type := + (B10.To_Bounded_Wide_String(Translate(" Text")), + B10.To_Bounded_Wide_String(Translate("Text ")), + B10.To_Bounded_Wide_String(Translate(" Text ")), + B10.To_Bounded_Wide_String(Translate("Text Text")), + B10.To_Bounded_Wide_String(Translate(" Text Text"))); + + begin + + for i in Bnd_Array_Type'Range loop + case i is + when 4 => + if B10.Trim(Bnd_Array(i), AS.Both) /= + Bnd_Array(i) then -- no change + Report.Failed("Incorrect result from Function Trim - 4"); + end if; + when 5 => + if B10.Trim(Bnd_Array(i), AS.Both) /= + B10."&"(Text, B10."&"(Translate(' '), Text)) + then + Report.Failed("Incorrect result from Function Trim - 5"); + end if; + when others => + if B10.Trim(Bnd_Array(i), AS.Both) /= Text then + Report.Failed("Incorrect result from Function Trim - " & + Integer'Image(i)); + end if; + end case; + end loop; + + end; + + + + -- Function Trim using Sets + + -- Trim characters in sets from both sides of the bounded wide string. + if B10.Trim(Source => B10.To_Bounded_Wide_String(Translate("ddabbaxx")), + Left => CD_Set, + Right => XY_Set) /= + B10.To_Bounded_Wide_String(Translate("abba")) + then + Report.Failed + ("Incorrect result from Fn Trim - Sets, Left & Right side - 1"); + end if; + + -- Ensure that the characters in the set provided as the actual to + -- parameter Right are not trimmed from the left side of the bounded + -- wide string; likewise for the opposite side. Only "cd" trimmed + -- from left side, and only "xy" trimmed from right side. + + if B10.Trim(B10.To_Bounded_Wide_String(Translate("cdxyabcdxy")), + CD_Set, + XY_Set) /= + B10.To_Bounded_Wide_String(Translate("xyabcd")) + then + Report.Failed + ("Incorrect result from Fn Trim - Sets, Left & Right side - 2"); + end if; + + -- Ensure that characters contained in the sets are not trimmed from + -- the "interior" of the bounded wide string, just the appropriate ends. + + if B10.Trim(B10.To_Bounded_Wide_String(Translate("cdabdxabxy")), + CD_Set, + XY_Set) /= + B10.To_Bounded_Wide_String(Translate("abdxab")) + then + Report.Failed + ("Incorrect result from Fn Trim - Sets, Left & Right side - 3"); + end if; + + -- Trim characters in set from right side only. No change to Left side. + + if B10.Trim(B10.To_Bounded_Wide_String(Translate("abxyzddcd")), + XY_Set, + CD_Set) /= + B10.To_Bounded_Wide_String(Translate("abxyz")) + then + Report.Failed + ("Incorrect result from Fn Trim - Sets, Right side"); + end if; + + -- Trim no characters on either side of the bounded string. + + Result_String := B10.Trim(AtoJ_Bnd_Str, CD_Set, XY_Set); + if Result_String /= AtoJ_Bnd_Str then + Report.Failed("Incorrect result from Fn Trim - Sets, Neither side"); + end if; + + if B10.Trim(AtoE_Bnd_Str, Maps.Null_Set, Maps.Null_Set) /= + AtoE_Bnd_Str or + B10.Trim(B10.To_Bounded_Wide_String(Translate("dcddcxyyxx")), + CD_Set, + XY_Set) /= + B10.Null_Bounded_Wide_String + then + Report.Failed("Incorrect result from Function Trim"); + end if; + + + + -- Procedure Trim using Sets + + -- Trim characters in sets from both sides of the bounded wide string. + + Test_String := B10.To_Bounded_Wide_String(Translate("dcabbayx")); + B10.Trim(Source => Test_String, + Left => CD_Set, + Right => XY_Set); + + if Test_String /= B10.To_Bounded_Wide_String(Translate("abba")) then + Report.Failed + ("Incorrect result from Proc Trim - Sets, Left & Right side - 1"); + end if; + + -- Ensure that the characters in the set provided as the actual to + -- parameter Right are not trimmed from the left side of the bounded + -- wide string; likewise for the opposite side. Only "cd" trimmed + -- from left side, and only "xy" trimmed from right side. + + Test_String := B10.To_Bounded_Wide_String(Translate("cdxyabcdxy")); + B10.Trim(Test_String, CD_Set, XY_Set); + + if Test_String /= B10.To_Bounded_Wide_String(Translate("xyabcd")) then + Report.Failed + ("Incorrect result from Proc Trim - Sets, Left & Right side - 2"); + end if; + + -- Ensure that characters contained in the sets are not trimmed from + -- the "interior" of the bounded wide string, just the appropriate ends. + + Test_String := B10.To_Bounded_Wide_String(Translate("cdabdxabxy")); + B10.Trim(Test_String, CD_Set, XY_Set); + + if not + (Test_String = B10.To_Bounded_Wide_String(Translate("abdxab"))) then + Report.Failed + ("Incorrect result from Proc Trim - Sets, Left & Right side - 3"); + end if; + + -- Trim characters in set from Left side only. No change to Right side. + + Test_String := B10.To_Bounded_Wide_String(Translate("cccdabxyz")); + B10.Trim(Test_String, CD_Set, XY_Set); + + if Test_String /= B10.To_Bounded_Wide_String(Translate("abxyz")) then + Report.Failed + ("Incorrect result from Proc Trim for Sets, Left side only"); + end if; + + -- Trim no characters on either side of the bounded wide string. + + Test_String := AtoJ_Bnd_Str; + B10.Trim(Test_String, CD_Set, CD_Set); + + if Test_String /= AtoJ_Bnd_Str then + Report.Failed("Incorrect result from Proc Trim-Sets, Neither side"); + end if; + + + + -- Function Head with Truncation + -- Drop = Error (Default). + + begin + Result_String := B10.Head(Source => AtoJ_Bnd_Str, -- max length + Count => B10.Length(AtoJ_Bnd_Str) + 1, + Pad => Translate('X')); + Report.Failed("Length_Error not raised by Function Head"); + exception + when AS.Length_Error => null; -- Expected exception raised. + when others => + Report.Failed("Incorrect exception raised by Function Head"); + end; + + -- Drop = Left + + -- Pad characters (5) are appended to the right end of the bounded + -- wide string (which is initially at its maximum length), then the + -- first five characters of the intermediate result are dropped to + -- conform to the maximum size limit of the bounded wide string (10). + + Result_String := + B10.Head(B10.To_Bounded_Wide_String(Translate("ABCDEFGHIJ")), + 15, + Translate('x'), + Ada.Strings.Left); + + if Result_String /= + B10.To_Bounded_Wide_String(Translate("FGHIJxxxxx")) + then + Report.Failed("Incorrect result from Function Head, Drop = Left"); + end if; + + -- Drop = Right + + -- Pad characters (6) are appended to the left end of the bounded + -- wide string (which is initially at one less than its maximum length), + -- then the last five characters of the intermediate result are dropped + -- (which in this case are the pad characters) to conform to the + -- maximum size limit of the bounded wide string (10). + + Result_String := + B10.Head(B10.To_Bounded_Wide_String(Translate("ABCDEFGHI")), + 15, + Translate('x'), + Ada.Strings.Right); + + if Result_String /= + B10.To_Bounded_Wide_String(Translate("ABCDEFGHIx")) + then + Report.Failed("Incorrect result from Function Head, Drop = Right"); + end if; + + -- Additional cases. + + if B10.Head(B10.Null_Bounded_Wide_String, 5, Translate('a')) /= + B10.To_Bounded_Wide_String(Translate("aaaaa")) or + B10.Head(AtoE_Bnd_Str, + B10.Length(AtoE_Bnd_Str)) /= + AtoE_Bnd_Str + then + Report.Failed("Incorrect result from Function Head"); + end if; + + + + -- Function Tail with Truncation + -- Drop = Error (Default Case) + + begin + Result_String := B10.Tail(Source => AtoJ_Bnd_Str, -- max length + Count => B10.Length(AtoJ_Bnd_Str) + 1, + Pad => Ada.Strings.Wide_Space, + Drop => Ada.Strings.Error); + Report.Failed("Length_Error not raised by Function Tail"); + exception + when AS.Length_Error => null; -- Expected exception raised. + when others => + Report.Failed("Incorrect exception raised by Function Tail"); + end; + + -- Drop = Left + + -- Pad characters (5) are appended to the left end of the bounded wide + -- string (which is initially at two less than its maximum length), + -- then the first three characters of the intermediate result (in this + -- case, 3 pad characters) are dropped. + + Result_String := + B10.Tail(B10.To_Bounded_Wide_String(Translate("ABCDEFGH")), + 13, + Translate('x'), + Ada.Strings.Left); + + if Result_String /= + B10.To_Bounded_Wide_String(Translate("xxABCDEFGH")) + then + Report.Failed("Incorrect result from Function Tail, Drop = Left"); + end if; + + -- Drop = Right + + -- Pad characters (3) are appended to the left end of the bounded wide + -- string (which is initially at its maximum length), then the last + -- three characters of the intermediate result are dropped. + + Result_String := + B10.Tail(B10.To_Bounded_Wide_String(Translate("ABCDEFGHIJ")), + 13, + Translate('x'), + Ada.Strings.Right); + + if Result_String /= + B10.To_Bounded_Wide_String(Translate("xxxABCDEFG")) + then + Report.Failed("Incorrect result from Function Tail, Drop = Right"); + end if; + + -- Additional cases. + + if B10.Tail(B10.Null_Bounded_Wide_String, 3, Translate(' ')) /= + B10.To_Bounded_Wide_String(Translate(" ")) or + B10.Tail(AtoE_Bnd_Str, + B10.To_Wide_String(AtoE_Bnd_Str)'First) /= + B10.To_Bounded_Wide_String(Translate("e")) + then + Report.Failed("Incorrect result from Function Tail"); + end if; + + + + -- Function Replicate (#, Char) with Truncation + -- Drop = Error (Default). + + begin + Result_String := B10.Replicate(Count => B10.Max_Length + 5, + Item => Translate('A'), + Drop => AS.Error); + Report.Failed + ("Length_Error not raised by Replicate for characters"); + exception + when AS.Length_Error => null; -- Expected exception raised. + when others => + Report.Failed + ("Incorrect exception raised by Replicate for characters"); + end; + + -- Drop = Left, Right + -- Since this version of Replicate uses wide character parameters, the + -- result after truncation from left or right will appear the same. + -- The result will be a 10 character bounded wide string, composed of + -- 10 "Item" wide characters. + + if B10.Replicate(Count => 20, + Item => Translate('A'), + Drop => Ada.Strings.Left) /= + B10.Replicate(15, Translate('A'), Ada.Strings.Right) + then + Report.Failed("Incorrect result from Replicate for characters - 1"); + end if; + + -- Blank-filled, 10 character bounded wide strings. + + if B10.Replicate(B10.Max_Length + 1, + Translate(' '), + Drop => Ada.Strings.Left) /= + B10.Replicate(B10.Max_Length, Ada.Strings.Wide_Space) + then + Report.Failed("Incorrect result from Replicate for characters - 2"); + end if; + + -- Additional cases. + + if B10.Replicate(0, Translate('a')) /= B10.Null_Bounded_Wide_String or + B10.Replicate(1, Translate('a')) /= + B10.To_Bounded_Wide_String(Translate("a")) + then + Report.Failed("Incorrect result from Replicate for characters - 3"); + end if; + + + + -- Function Replicate (#, String) with Truncation + -- Drop = Error (Default). + + begin + Result_String := B10.Replicate(Count => 5, -- result would be 15. + Item => Translate("abc")); + Report.Failed + ("Length_Error not raised by Replicate for wide strings"); + exception + when AS.Length_Error => null; -- Expected exception raised. + when others => + Report.Failed + ("Incorrect exception raised by Replicate for wide strings"); + end; + + -- Drop = Left + + Result_String := B10.Replicate(3, Translate("abcd"), Ada.Strings.Left); + + if Result_String /= + B10.To_Bounded_Wide_String(Translate("cdabcdabcd")) + then + Report.Failed + ("Incorrect result from Replicate for wide strings, Drop = Left"); + end if; + + -- Drop = Right + + Result_String := B10.Replicate(3, Translate("abcd"), Ada.Strings.Right); + + if Result_String /= + B10.To_Bounded_Wide_String(Translate("abcdabcdab")) then + Report.Failed + ("Incorrect result from Replicate for wide strings, Drop = Right"); + end if; + + -- Additional cases. + + if B10.Replicate(5, Translate("X")) /= + B10.To_Bounded_Wide_String(Translate("XXXXX")) or + B10.Replicate(10, "") /= + B10.Null_Bounded_Wide_String or + B10.Replicate(0, Translate("ab")) /= + B10.Null_Bounded_Wide_String + then + Report.Failed("Incorrect result from Replicate for wide strings"); + end if; + + + exception + when others => Report.Failed("Exception raised in Test_Block"); + end Test_Block; + + Report.Result; + +end CXA4020; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxa4021.a b/gcc/testsuite/ada/acats/tests/cxa/cxa4021.a new file mode 100644 index 000000000..345a77c68 --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxa4021.a @@ -0,0 +1,311 @@ +-- CXA4021.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 subprograms defined in package +-- Ada.Strings.Wide_Unbounded are available, and that they produce +-- correct results. Specifically, check the subprograms Head, Index, +-- Index_Non_Blank, Insert, Length, Overwrite, Replace_Slice, Slice, +-- Tail, To_Wide_String, To_Unbounded_Wide_String, "*", "&", +-- and "=", "<=", ">=". +-- +-- TEST DESCRIPTION: +-- This test demonstrates the uses of many of the subprograms defined +-- in package Ada.Strings.Wide_Unbounded for use with unbounded wide +-- strings. +-- The test attempts to simulate how unbounded wide strings could be used +-- to simulate paragraphs of text. Modifications could be easily be +-- performed using the provided subprograms (although in this test, the +-- main modification performed was the addition of more text to the +-- string). One would not have to worry about the formatting of the +-- paragraph until it was finished and correct in content. Then, once +-- all required editing is complete, the unbounded strings can be divided +-- up into the appropriate lengths based on particular formatting +-- requirements. The test then compares the formatted text product +-- with a predefined "finished product". +-- +-- This test attempts to use a large number of the subprograms provided +-- by package Ada.Strings.Wide_Unbounded. Often, the processing involved +-- could have been performed more efficiently using a minimum number +-- of the subprograms, in conjunction with loops, etc. However, for +-- testing purposes, and in the interest of minimizing the number of +-- tests developed, subprogram variety and feature mixing was stressed. +-- +-- +-- CHANGE HISTORY: +-- 06 Dec 94 SAIC ACVC 2.0 +-- +--! + +with Report; +with Ada.Characters.Handling; +with Ada.Strings.Wide_Maps; +with Ada.Strings.Wide_Unbounded; + +procedure CXA4021 is + + -- The following two functions are used to translate character and string + -- values to "Wide" values. They will be applied to all the Wide_Bounded + -- subprogram character and string parameters to simulate the use of non- + -- character Wide_Characters and Wide_Strings in actual practice. + -- Note: These functions do not actually return "equivalent" wide + -- characters to their character inputs, just "non-character" + -- wide characters. + + function Equiv (Ch : Character) return Wide_Character is + C : Character := Ch; + begin + if Ch = ' ' then + return Ada.Characters.Handling.To_Wide_Character(C); + else + return Wide_Character'Val(Character'Pos(Ch) + + Character'Pos(Character'Last) + 1); + end if; + end Equiv; + + + function Equiv (Str : String) return Wide_String is + WS : Wide_String(Str'First..Str'Last); + begin + for i in Str'First..Str'Last loop + WS(i) := Equiv(Str(i)); + end loop; + return WS; + end Equiv; + +begin + + Report.Test ("CXA4021", "Check that the subprograms defined in " & + "package Ada.Strings.Wide_Unbounded are " & + "available, and that they produce correct " & + "results"); + + Test_Block: + declare + + package ASW renames Ada.Strings.Wide_Unbounded; + use type ASW.Unbounded_Wide_String; + use Ada.Strings; + + Pamphlet_Paragraph_Count : constant := 2; + Lines : constant := 4; + Line_Length : constant := 40; + + type Document_Type is array (Positive range <>) + of ASW.Unbounded_Wide_String; + + type Camera_Ready_Copy_Type is array (1..Lines) + of Wide_String (1..Line_Length); + + Pamphlet : Document_Type (1..Pamphlet_Paragraph_Count); + + Camera_Ready_Copy : Camera_Ready_Copy_Type := + (others => (others => Ada.Strings.Wide_Space)); + + TC_Finished_Product : Camera_Ready_Copy_Type := + ( 1 => Equiv("Ada is a programming language designed "), + 2 => Equiv("to support long-lived, reliable software"), + 3 => Equiv(" systems. "), + 4 => Equiv("Go with Ada! ")); + + ----- + + + procedure Enter_Text_Into_Document (Document : in out Document_Type) is + begin + + -- Fill in both "paragraphs" of the document. Each unbounded wide + -- string functions as an individual paragraph, containing an + -- unspecified number of characters. + -- Use a variety of different unbounded wide string subprograms to + -- load the data. + + Document(1) := + ASW.To_Unbounded_Wide_String(Equiv("Ada is a language")); + + -- Insert the word "programming" prior to "language". + Document(1) := + ASW.Insert(Document(1), + ASW.Index(Document(1), + Equiv("language")), + ASW.To_Wide_String(Equiv("progra") & -- Wd Str & + ASW."*"(2,Equiv('m')) & -- Wd Unbd & + Equiv("ing "))); -- Wd Str + + + -- Overwrite the word "language" with "language" + additional text. + Document(1) := + ASW.Overwrite(Document(1), + ASW.Index(Document(1), + ASW.To_Wide_String( + ASW.Tail(Document(1), 8, Equiv(' '))), + Ada.Strings.Backward), + Equiv("language designed to support long-lifed")); + + + -- Replace the word "lifed" with "lived". + Document(1) := + ASW.Replace_Slice(Document(1), + ASW.Index(Document(1), Equiv("lifed")), + ASW.Length(Document(1)), + Equiv("lived")); + + + -- Overwrite the word "lived" with "lived" + additional text. + Document(1) := + ASW.Overwrite(Document(1), + ASW.Index(Document(1), + ASW.To_Wide_String + (ASW.Tail(Document(1), 5, Equiv(' '))), + Ada.Strings.Backward), + Equiv("lived, reliable software systems.")); + + + -- Use several of the overloaded versions of "&" to form this + -- unbounded wide string. + + Document(2) := Equiv('G') & + ASW.To_Unbounded_Wide_String(Equiv("o ")) & + ASW.To_Unbounded_Wide_String(Equiv("with")) & + Equiv(' ') & + Equiv("Ada!"); + + end Enter_Text_Into_Document; + + + ----- + + + procedure Create_Camera_Ready_Copy + (Document : in Document_Type; + Camera_Copy : out Camera_Ready_Copy_Type) is + begin + -- Break the unbounded wide strings into fixed lengths. + + -- Search the first unbounded wide string for portions of text that + -- are less than or equal to the length of a wide string in the + -- Camera_Ready_Copy_Type object. + + Camera_Copy(1) := -- Take characters 1-39, + ASW.Slice(Document(1), -- and append a blank space. + 1, + ASW.Index(ASW.To_Unbounded_Wide_String + (ASW.Slice(Document(1), + 1, + Line_Length)), + Ada.Strings.Wide_Maps.To_Set(Equiv(' ')), + Ada.Strings.Inside, + Ada.Strings.Backward)) & Equiv(' '); + + Camera_Copy(2) := -- Take characters 40-79. + ASW.Slice(Document(1), + 40, + (ASW.Index_Non_Blank -- Should return 79 + (ASW.To_Unbounded_Wide_String + (ASW.Slice(Document(1), -- Slice (40..79) + 40, + 79)), + Ada.Strings.Backward) + 39)); -- Increment since + -- this slice starts + -- at 40. + + Camera_Copy(3)(1..9) := ASW.Slice(Document(1), -- Characters 80-88 + 80, + ASW.Length(Document(1))); + + + -- Break the second unbounded wide string into the appropriate + -- length. It is only twelve characters in length, so the entire + -- unbounded wide string will be placed on one string of the output + -- object. + + Camera_Copy(4)(1..ASW.Length(Document(2))) := + ASW.To_Wide_String(ASW.Head(Document(2), + ASW.Length(Document(2)))); + + end Create_Camera_Ready_Copy; + + + ----- + + + function Valid_Proofread (Draft, Master : Camera_Ready_Copy_Type) + return Boolean is + begin + + -- Evaluate wide strings for equality, using the operators defined + -- in package Ada.Strings.Wide_Unbounded. The less than/greater + -- than or equal comparisons should evaluate to "equals => True". + + if ASW.To_Unbounded_Wide_String(Draft(1)) = -- "="(WUnb,WUnb) + ASW.To_Unbounded_Wide_String(Master(1)) and + ASW.To_Unbounded_Wide_String(Draft(2)) <= -- "<="(WUnb,WUnb) + ASW.To_Unbounded_Wide_String(Master(2)) and + ASW.To_Unbounded_Wide_String(Draft(3)) >= -- ">="(WUnb,WUnb) + ASW.To_Unbounded_Wide_String(Master(3)) and + ASW.To_Unbounded_Wide_String(Draft(4)) = -- "="(WUnb,WUnb) + ASW.To_Unbounded_Wide_String(Master(4)) + then + return True; + else + return False; + end if; + + end Valid_Proofread; + + + ----- + + + begin + + -- Enter text into the unbounded wide string paragraphs of the document. + + Enter_Text_Into_Document (Pamphlet); + + + -- Reformat the unbounded wide strings into fixed wide string format. + + Create_Camera_Ready_Copy (Document => Pamphlet, + Camera_Copy => Camera_Ready_Copy); + + + -- Verify the conversion process. + + if not Valid_Proofread (Draft => Camera_Ready_Copy, + Master => TC_Finished_Product) + then + Report.Failed ("Incorrect unbounded wide string processing result"); + end if; + + + exception + when others => Report.Failed ("Exception raised in Test_Block"); + end Test_Block; + + + Report.Result; + +end CXA4021; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxa4022.a b/gcc/testsuite/ada/acats/tests/cxa/cxa4022.a new file mode 100644 index 000000000..3c649a1a2 --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxa4022.a @@ -0,0 +1,531 @@ +-- CXA4022.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 subprograms defined in package +-- Ada.Strings.Wide_Unbounded are available, and that they produce +-- correct results. Specifically, check the subprograms Count, Element, +-- Index, Replace_Element, To_Unbounded_Wide_String, and "&", ">", "<". +-- +-- TEST DESCRIPTION: +-- This test demonstrates the uses of many of the subprograms defined +-- in package Ada.Strings.Wide_Unbounded for use with unbounded wide +-- strings. The test simulates how unbounded wide strings +-- will be processed in a user environment, using the subprograms +-- provided in this package. +-- +-- Taken in conjunction with tests CXA4021 and CXA4023, this test will +-- constitute a test of the functionality contained in package +-- Ada.Strings.Wide Unbounded. This test uses a variety +-- of the subprograms defined in the unbounded wide string package +-- in ways typical of common usage, with different combinations of +-- available subprograms being used to accomplish similar +-- unbounded wide string processing goals. +-- +-- +-- CHANGE HISTORY: +-- 06 Dec 94 SAIC ACVC 2.0 +-- 08 Nov 95 SAIC Corrected accessibility level, type visibility, +-- and subtest acceptance criteria problems for +-- ACVC 2.0.1 +-- +--! + +with Ada.Characters.Handling; +with Ada.Strings; + +package CXA40220 is + + -- The following two functions are used to translate character and string + -- values to "Wide" values. They will be applied to all the Wide_Bounded + -- subprogram character and string parameters to simulate the use of non- + -- character Wide_Characters and Wide_Strings in actual practice. + -- Note: These functions do not actually return "equivalent" wide + -- characters to their character inputs, just "non-character" + -- wide characters. + + function Equiv (Ch : Character) return Wide_Character; + + function Equiv (Str : String) return Wide_String; + + + -- Functions and access-to-subprogram value used to supply mapping + -- capability to the appropriate versions of Count, Index, and + -- Translate. + + function AB_to_US_Mapping_Function (From : Wide_Character) + return Wide_Character; + + function AB_to_Blank_Mapping_Function (From : Wide_Character) + return Wide_Character; + +end CXA40220; + +package body CXA40220 is + + function Equiv (Ch : Character) return Wide_Character is + C : Character := Ch; + begin + if Ch = ' ' then + return Ada.Characters.Handling.To_Wide_Character(C); + else + return Wide_Character'Val(Character'Pos(Ch) + + Character'Pos(Character'Last) + 1); + end if; + end Equiv; + + + function Equiv (Str : String) return Wide_String is + WS : Wide_String(Str'First..Str'Last); + begin + for i in Str'First..Str'Last loop + WS(i) := Equiv(Str(i)); + end loop; + return WS; + end Equiv; + + + function AB_to_US_Mapping_Function (From : Wide_Character) + return Wide_Character is + UnderScore : constant Wide_Character := Equiv('_'); + begin + if From = Equiv('a') or From = Equiv('b') then + return UnderScore; + else + return From; + end if; + end AB_to_US_Mapping_Function; + + + function AB_to_Blank_Mapping_Function (From : Wide_Character) + return Wide_Character is + begin + if From = Equiv('a') or From = Equiv('b') then + return Ada.Strings.Wide_Space; + else + return From; + end if; + end AB_to_Blank_Mapping_Function; + +end CXA40220; + + +with CXA40220; +with Report; +with Ada.Characters.Handling; +with Ada.Strings.Wide_Maps; +with Ada.Strings.Wide_Unbounded; + +procedure CXA4022 is +begin + + Report.Test ("CXA4022", "Check that the subprograms defined in " & + "package Ada.Strings.Wide_Unbounded are " & + "available, and that they produce correct " & + "results"); + + Test_Block: + declare + + use CXA40220; + + package ASW renames Ada.Strings.Wide_Unbounded; + use Ada.Strings; + use type Wide_Maps.Wide_Character_Set; + use type ASW.Unbounded_Wide_String; + + Test_String : ASW.Unbounded_Wide_String; + AtoE_Str : ASW.Unbounded_Wide_String := + ASW.To_Unbounded_Wide_String(Equiv("abcde")); + + Complete_String : ASW.Unbounded_Wide_String := + ASW."&"(ASW.To_Unbounded_Wide_String(Equiv("Incomplete")), + ASW."&"(Ada.Strings.Wide_Space, + ASW.To_Unbounded_Wide_String(Equiv("String")))); + + Incomplete_String : ASW.Unbounded_Wide_String := + ASW.To_Unbounded_Wide_String + (Equiv("ncomplete Strin")); + + Incorrect_Spelling : ASW.Unbounded_Wide_String := + ASW.To_Unbounded_Wide_String(Equiv("Guob Dai")); + + Magic_String : ASW.Unbounded_Wide_String := + ASW.To_Unbounded_Wide_String(Equiv("abracadabra")); + + Incantation : ASW.Unbounded_Wide_String := Magic_String; + + + A_Small_G : Wide_Character := Equiv('g'); + A_Small_D : Wide_Character := Equiv('d'); + + ABCD_Set : Wide_Maps.Wide_Character_Set := + Wide_Maps.To_Set(Equiv("abcd")); + B_Set : Wide_Maps.Wide_Character_Set := + Wide_Maps.To_Set(Equiv('b')); + CD_Set : Wide_Maps.Wide_Character_Set := + Wide_Maps.To_Set(Equiv("cd")); + + CD_to_XY_Map : Wide_Maps.Wide_Character_Mapping := + Wide_Maps.To_Mapping(From => Equiv("cd"), + To => Equiv("xy")); + AB_to_YZ_Map : Wide_Maps.Wide_Character_Mapping := + Wide_Maps.To_Mapping(Equiv("ab"), Equiv("yz")); + + + Matching_Letters : Natural := 0; + Location, + Total_Count : Natural := 0; + + + Map_Ptr : Wide_Maps.Wide_Character_Mapping_Function := + AB_to_US_Mapping_Function'Access; + + + begin + + + -- Function "&" + + -- Prepend an 'I' and append a 'g' to the wide string. + Incomplete_String := ASW."&"(Equiv('I'), + Incomplete_String); -- Ch & W Unb + Incomplete_String := ASW."&"(Incomplete_String, + A_Small_G); -- W Unb & Ch + + if ASW."<"(Incomplete_String, Complete_String) or + ASW.">"(Incomplete_String, Complete_String) or + Incomplete_String /= Complete_String + then + Report.Failed("Incorrect result from use of ""&"" operator"); + end if; + + + + -- Function Element + + -- Last element of the unbounded wide string should be a 'g'. + if ASW.Element(Incomplete_String, ASW.Length(Incomplete_String)) /= + A_Small_G + then + Report.Failed("Incorrect result from use of Function Element - 1"); + end if; + + if ASW.Element(Incomplete_String, 2) /= + ASW.Element(ASW.Tail(Incomplete_String, 2), 1) or + ASW.Element(ASW.Head(Incomplete_String, 4), 2) /= + ASW.Element(ASW.To_Unbounded_Wide_String(Equiv("wnqz")), 2) + then + Report.Failed("Incorrect result from use of Function Element - 2"); + end if; + + + + -- Procedure Replace_Element + + -- The unbounded wide string Incorrect_Spelling starts as "Guob Dai", + -- and is transformed by the following three procedure calls to + -- "Good Day". + + ASW.Replace_Element(Incorrect_Spelling, 2, Equiv('o')); + + ASW.Replace_Element(Incorrect_Spelling, + ASW.Index(Incorrect_Spelling, B_Set), + A_Small_D); + + ASW.Replace_Element(Source => Incorrect_Spelling, + Index => ASW.Length(Incorrect_Spelling), + By => Equiv('y')); + + if Incorrect_Spelling /= + ASW.To_Unbounded_Wide_String(Equiv("Good Day")) + then + Report.Failed("Incorrect result from Procedure Replace_Element"); + end if; + + + + -- Function Index with non-Identity map. + -- Evaluate the function Index with a non-identity map + -- parameter which will cause mapping of the source parameter + -- prior to the evaluation of the index position search. + + Location := ASW.Index(Source => ASW.To_Unbounded_Wide_String + (Equiv("abcdefghij")), + Pattern => Equiv("xy"), + Going => Ada.Strings.Forward, + Mapping => CD_to_XY_Map); -- change "cd" to "xy" + + if Location /= 3 then + Report.Failed("Incorrect result from Index, non-Identity map - 1"); + end if; + + Location := ASW.Index(ASW.To_Unbounded_Wide_String(Equiv("abcdabcdab")), + Equiv("yz"), + Ada.Strings.Backward, + AB_to_YZ_Map); -- change all "ab" to "yz" + + if Location /= 9 then + Report.Failed("Incorrect result from Index, non-Identity map - 2"); + end if; + + -- A couple with identity maps (default) as well. + + if ASW.Index(ASW.To_Unbounded_Wide_String(Equiv("abcd")), -- Pat = Src + Equiv("abcd")) /= 1 or + ASW.Index(ASW.To_Unbounded_Wide_String(Equiv("abc")), -- Pat < Src + Equiv("abcd")) /= 0 or + ASW.Index(ASW.Null_Unbounded_Wide_String, -- Src = Null + Equiv("abc")) /= 0 + then + Report.Failed + ("Incorrect result from Index with wide string patterns"); + end if; + + + + -- Function Index (for Sets). + -- This version of Index uses Sets as the basis of the search. + + -- Test = Inside, Going = Forward (Default case). + Location := + ASW.Index(Source => ASW.To_Unbounded_Wide_String(Equiv("abcdeabcde")), + Set => CD_Set); -- set containing 'c' and 'd' + + if not (Location = 3) then -- position of first 'c' in source. + Report.Failed("Incorrect result from Index using Sets - 1"); + end if; + + -- Test = Inside, Going = Backward. + Location := + ASW.Index(Source => ASW."&"(AtoE_Str, AtoE_Str), + Set => CD_Set, -- set containing 'c' and 'd' + Test => Ada.Strings.Inside, + Going => Ada.Strings.Backward); + + if not (Location = 9) then -- position of last 'd' in source. + Report.Failed("Incorrect result from Index using Sets - 2"); + end if; + + -- Test = Outside, Going = Forward, Backward + if ASW.Index(ASW.To_Unbounded_Wide_String(Equiv("deddacd")), + Wide_Maps.To_Set(Equiv("xydcgf")), + Test => Ada.Strings.Outside, + Going => Ada.Strings.Forward) /= 2 or + ASW.Index(ASW.To_Unbounded_Wide_String(Equiv("deddacd")), + Wide_Maps.To_Set(Equiv("xydcgf")), + Test => Ada.Strings.Outside, + Going => Ada.Strings.Backward) /= 5 or + ASW.Index(ASW.To_Unbounded_Wide_String(Equiv("deddacd")), + CD_Set, + Ada.Strings.Outside, + Ada.Strings.Backward) /= 5 + then + Report.Failed("Incorrect result from Index using Sets - 3"); + end if; + + -- Default direction (forward) and mapping (identity). + + if ASW.Index(ASW.To_Unbounded_Wide_String(Equiv("cd")), -- Source = Set + CD_Set) /= 1 or + ASW.Index(ASW.To_Unbounded_Wide_String(Equiv("c")), -- Source < Set + CD_Set) /= 1 or + ASW.Index(ASW.Null_Unbounded_Wide_String, -- Source = Null + CD_Set) /= 0 or + ASW.Index(AtoE_Str, + Wide_Maps.Null_Set) /= 0 or -- Null set + ASW.Index(AtoE_Str, + Wide_Maps.To_Set(Equiv('x'))) /= 0 -- No match. + then + Report.Failed("Incorrect result from Index using Sets - 4"); + end if; + + + + -- Function Index using access-to-subprogram mapping. + -- Evaluate the function Index with an access value that supplies the + -- mapping function for this version of Index. + + Map_Ptr := AB_to_US_Mapping_Function'Access; + + Location := ASW.Index(Source => ASW.To_Unbounded_Wide_String + (Equiv("xAxabbxax xaax _cx")), + Pattern => Equiv("_x"), + Going => Ada.Strings.Forward, + Mapping => Map_Ptr); -- change 'a'or 'b' to '_' + + if Location /= 6 then -- location of "bx" substring + Report.Failed("Incorrect result from Index, access value map - 1"); + end if; + + Map_Ptr := AB_to_Blank_Mapping_Function'Access; + + Location := ASW.Index(ASW.To_Unbounded_Wide_String + (Equiv("ccacdcbbcdacc")), + Equiv("cd "), + Ada.Strings.Backward, + Map_Ptr); -- change 'a' or 'b' to ' ' + + if Location /= 9 then + Report.Failed("Incorrect result from Index, access value map - 2"); + end if; + + if ASW.Index(ASW.To_Unbounded_Wide_String(Equiv("abcd")), + Equiv(" cd"), + Ada.Strings.Forward, + Map_Ptr) /= 1 or + ASW.Index(ASW.To_Unbounded_Wide_String(Equiv("abc")), + Equiv(" c "), -- No match + Ada.Strings.Backward, + Map_Ptr) /= 0 + then + Report.Failed("Incorrect result from Index, access value map - 3"); + end if; + + + + -- Function Count + + -- Determine the number of characters in the unbounded wide string that + -- are contained in the set. + + Matching_Letters := ASW.Count(Source => Magic_String, + Set => ABCD_Set); + + if Matching_Letters /= 9 then + Report.Failed + ("Incorrect result from Function Count with Set parameter"); + end if; + + -- Determine the number of occurrences of the following pattern wide + -- strings in the unbounded wide string Magic_String. + + if ASW.Count(Magic_String, Equiv("ab")) /= + (ASW.Count(Magic_String, Equiv("ac")) + + ASW.Count(Magic_String, Equiv("ad"))) or + ASW.Count(Magic_String, Equiv("ab")) /= 2 + then + Report.Failed + ("Incorrect result from Function Count, wide string parameter"); + end if; + + + + -- Function Count with non-Identity mapping. + -- Evaluate the function Count with a non-identity map + -- parameter which will cause mapping of the source parameter + -- prior to the evaluation of the number of matching patterns. + + Total_Count := + ASW.Count(ASW.To_Unbounded_Wide_String(Equiv("abbabbabbabba")), + Pattern => Equiv("yz"), + Mapping => AB_to_YZ_Map); + + if Total_Count /= 4 then + Report.Failed + ("Incorrect result from function Count, non-Identity map - 1"); + end if; + + if ASW.Count(ASW.To_Unbounded_Wide_String(Equiv("ADCBADABCD")), + Equiv("AB"), + Wide_Maps.To_Mapping(Equiv("CD"), Equiv("AB"))) /= 5 or + ASW.Count(ASW.To_Unbounded_Wide_String(Equiv("dcccddcdccdddccccd")), + Equiv("xxy"), + CD_to_XY_Map) /= 3 + then + Report.Failed + ("Incorrect result from function Count, non-Identity map - 2"); + end if; + + -- And a few with identity Wide_Maps as well. + + if ASW.Count(ASW.To_Unbounded_Wide_String(Equiv("ABABABABAB")), + Equiv("ABA"), + Wide_Maps.Identity) /= 2 or + ASW.Count(ASW.To_Unbounded_Wide_String(Equiv("aaaaaaaaaa")), + Equiv("aaa")) /= 3 or + ASW.Count(ASW.To_Unbounded_Wide_String(Equiv("XX")), -- Src < Pat + Equiv("XXX"), + Wide_Maps.Identity) /= 0 or + ASW.Count(AtoE_Str, -- Source = Pattern + Equiv("abcde")) /= 1 or + ASW.Count(ASW.Null_Unbounded_Wide_String, -- Source = Null + Equiv(" ")) /= 0 + then + Report.Failed + ("Incorrect result from function Count, w,w/o mapping"); + end if; + + + + -- Function Count using access-to-subprogram mapping. + -- Evaluate the function Count with an access value specifying the + -- mapping that is going to occur to Source. + + Map_Ptr := AB_to_US_Mapping_Function'Access; + + Total_Count := + ASW.Count(ASW.To_Unbounded_Wide_String(Equiv("abcbacbadbaAbbB")), + Pattern => Equiv("__"), + Mapping => Map_Ptr); -- change 'a' and 'b' to '_' + + if Total_Count /= 5 then + Report.Failed + ("Incorrect result from function Count, access value map - 1"); + end if; + + Map_Ptr := AB_to_Blank_Mapping_Function'Access; + + if ASW.Count(ASW.To_Unbounded_Wide_String(Equiv("cccaccBcbcaccacAc")), + Equiv("c c"), + Map_Ptr) /= 3 or + ASW.Count(ASW.To_Unbounded_Wide_String + (Equiv("aBBAAABaBBBBAaBABBABaBBbBB")), + Equiv(" BB"), + Map_Ptr) /= 4 or + ASW.Count(ASW.To_Unbounded_Wide_String(Equiv("aaaaaaaaaa")), + Equiv(" "), + Map_Ptr) /= 3 or + ASW.Count(ASW.To_Unbounded_Wide_String(Equiv("XX")), -- Src < Pat + Equiv("XX "), + Map_Ptr) /= 0 or + ASW.Count(AtoE_Str, -- Source'Length = Pattern'Length + Equiv(" cde"), + Map_Ptr) /= 1 + then + Report.Failed + ("Incorrect result from function Count, access value map - 3"); + end if; + + + + exception + when others => Report.Failed ("Exception raised in Test_Block"); + end Test_Block; + + + Report.Result; + +end CXA4022; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxa4023.a b/gcc/testsuite/ada/acats/tests/cxa/cxa4023.a new file mode 100644 index 000000000..d0325fc88 --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxa4023.a @@ -0,0 +1,585 @@ +-- CXA4023.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 subprograms defined in package +-- Ada.Strings.Wide_Unbounded are available, and that they produce +-- correct results. Specifically, check the subprograms Delete, +-- Find_Token, Translate, Trim, and "*". +-- +-- TEST DESCRIPTION: +-- This test demonstrates the uses of many of the subprograms defined +-- in package Ada.Strings.Wide_Unbounded for use with unbounded wide +-- strings. The test simulates how unbounded wide strings +-- will be processed in a user environment, using the subprograms +-- provided in this package. +-- +-- This test, when taken in conjunction with tests CXA4021-22, will +-- constitute a test of the functionality contained in package +-- Ada.Strings.Wide_Unbounded. This test uses a variety +-- of the subprograms defined in the unbounded wide string package +-- in ways typical of common usage, with different combinations of +-- available subprograms being used to accomplish similar +-- unbounded wide string processing goals. +-- +-- +-- CHANGE HISTORY: +-- 06 Dec 94 SAIC ACVC 2.0 +-- 08 Nov 95 SAIC Corrected accessibility level and type +-- visibility problems for ACVC 2.0.1. +-- +--! + +with Ada.Characters.Handling; +with Ada.Strings; + +package CXA40230 is + + -- The following two functions are used to translate character and string + -- values to non-character "Wide" values. They will be applied to all the + -- Wide_Bounded subprogram character and string parameters to simulate the + -- use of Wide_Characters and Wide_Strings in actual practice. + -- Note: These functions do not actually return "equivalent" wide + -- characters to their character inputs, just "non-character" + -- wide characters. + + function Equiv (Ch : Character) return Wide_Character; + + function Equiv (Str : String) return Wide_String; + + -- Functions and access-to-subprogram object used to supply mapping + -- capability to the appropriate versions of Translate. + + function AB_to_US_Mapping_Function (From : Wide_Character) + return Wide_Character; + + function AB_to_Blank_Mapping_Function (From : Wide_Character) + return Wide_Character; + +end CXA40230; + + +package body CXA40230 is + + function Equiv (Ch : Character) return Wide_Character is + C : Character := Ch; + begin + if Ch = ' ' then + return Ada.Characters.Handling.To_Wide_Character(C); + else + return Wide_Character'Val(Character'Pos(Ch) + + Character'Pos(Character'Last) + 1); + end if; + end Equiv; + + + function Equiv (Str : String) return Wide_String is + WS : Wide_String(Str'First..Str'Last); + begin + for i in Str'First..Str'Last loop + WS(i) := Equiv(Str(i)); + end loop; + return WS; + end Equiv; + + + function AB_to_US_Mapping_Function (From : Wide_Character) + return Wide_Character is + UnderScore : constant Wide_Character := Equiv('_'); + begin + if From = Equiv('a') or From = Equiv('b') then + return UnderScore; + else + return From; + end if; + end AB_to_US_Mapping_Function; + + + function AB_to_Blank_Mapping_Function (From : Wide_Character) + return Wide_Character is + begin + if From = Equiv('a') or From = Equiv('b') then + return Ada.Strings.Wide_Space; + else + return From; + end if; + end AB_to_Blank_Mapping_Function; + +end CXA40230; + + +with CXA40230; +with Report; +with Ada.Characters.Handling; +with Ada.Strings.Wide_Maps; +with Ada.Strings.Wide_Unbounded; + +procedure CXA4023 is +begin + + Report.Test ("CXA4023", "Check that the subprograms defined in " & + "package Ada.Strings.Wide_Unbounded are " & + "available, and that they produce correct " & + "results"); + + Test_Block: + declare + + use CXA40230; + + package ASW renames Ada.Strings.Wide_Unbounded; + use Ada.Strings; + use type Wide_Maps.Wide_Character_Set; + use type ASW.Unbounded_Wide_String; + + Test_String : ASW.Unbounded_Wide_String; + AtoE_Str : ASW.Unbounded_Wide_String := + ASW.To_Unbounded_Wide_String(Equiv("abcde")); + + Cad_String : ASW.Unbounded_Wide_String := + ASW.To_Unbounded_Wide_String(Equiv("cad")); + + Magic_String : ASW.Unbounded_Wide_String := + ASW.To_Unbounded_Wide_String(Equiv("abracadabra")); + + Incantation : ASW.Unbounded_Wide_String := Magic_String; + + + A_Small_G : Wide_Character := Equiv('g'); + + ABCD_Set : Wide_Maps.Wide_Character_Set := + Wide_Maps.To_Set(Equiv("abcd")); + B_Set : Wide_Maps.Wide_Character_Set := + Wide_Maps.To_Set(Equiv('b')); + AB_Set : Wide_Maps.Wide_Character_Set := + Wide_Maps."OR"(Wide_Maps.To_Set(Equiv('a')), B_Set); + + + AB_to_YZ_Map : Wide_Maps.Wide_Character_Mapping := + Wide_Maps.To_Mapping(From => Equiv("ab"), + To => Equiv("yz")); + Code_Map : Wide_Maps.Wide_Character_Mapping := + Wide_Maps.To_Mapping(Equiv("abcd"), Equiv("wxyz")); + Reverse_Code_Map : Wide_Maps.Wide_Character_Mapping := + Wide_Maps.To_Mapping(Equiv("wxyz"), Equiv("abcd")); + Non_Existent_Map : Wide_Maps.Wide_Character_Mapping := + Wide_Maps.To_Mapping(Equiv("jkl"), Equiv("mno")); + + + Token_Start : Positive; + Token_End : Natural := 0; + + Map_Ptr : Wide_Maps.Wide_Character_Mapping_Function := + AB_to_US_Mapping_Function'Access; + + + begin + + -- Find_Token + + ASW.Find_Token(Magic_String, -- Find location of first "ab" equiv. + AB_Set, -- Should be (1..2). + Ada.Strings.Inside, + Token_Start, + Token_End); + + if Natural(Token_Start) /= ASW.To_Wide_String(Magic_String)'First or + Token_End /= ASW.Index(Magic_String, B_Set) or + Token_End /= 2 + then + Report.Failed("Incorrect result from Procedure Find_Token - 1"); + end if; + + + ASW.Find_Token(Source => Magic_String, -- Find location of char 'r'equiv + Set => ABCD_Set, -- in wide str, should be (3..3) + Test => Ada.Strings.Outside, + First => Token_Start, + Last => Token_End); + + if Natural(Token_Start) /= 3 or Token_End /= 3 then + Report.Failed("Incorrect result from Procedure Find_Token - 2"); + end if; + + + ASW.Find_Token(Magic_String, -- No 'g' "equivalent in + Wide_Maps.To_Set(A_Small_G), -- the wide str, so the + Ada.Strings.Inside, -- result params should be + First => Token_Start, -- First = Source'First and + Last => Token_End); -- Last = 0. + + + if Token_Start /= ASW.To_Wide_String(Magic_String)'First or + Token_End /= 0 + then + Report.Failed("Incorrect result from Procedure Find_Token - 3"); + end if; + + + ASW.Find_Token(ASW.To_Unbounded_Wide_String(Equiv("abpqpqrttrcpqr")), + Wide_Maps.To_Set(Equiv("trpq")), + Ada.Strings.Inside, + Token_Start, + Token_End); + + if Token_Start /= 3 or + Token_End /= 10 + then + Report.Failed("Incorrect result from Procedure Find_Token - 4"); + end if; + + ASW.Find_Token(ASW.To_Unbounded_Wide_String(Equiv("abpqpqrttrcpqr")), + Wide_Maps.To_Set(Equiv("abpq")), + Ada.Strings.Outside, + Token_Start, + Token_End); + + if Token_Start /= 7 or + Token_End /= 11 + then + Report.Failed("Incorrect result from Procedure Find_Token - 5"); + end if; + + + + -- Translate + + -- Use a mapping ("abcd" -> "wxyz") to transform the contents of + -- the unbounded wide string. + -- Magic_String = "abracadabra" + + Incantation := ASW.Translate(Magic_String, Code_Map); + + if Incantation /= + ASW.To_Unbounded_Wide_String(Equiv("wxrwywzwxrw")) + then + Report.Failed("Incorrect result from Function Translate - 1"); + end if; + + -- (Note: See below for additional testing of Function Translate) + + -- Use the inverse mapping of the one above to return the "translated" + -- unbounded wide string to its original form. + + ASW.Translate(Incantation, Reverse_Code_Map); + + -- The map contained in the following call to Translate contains three + -- elements, and these elements are not found in the unbounded wide + -- string, so this call to Translate should have no effect on it. + + if Incantation /= ASW.Translate(Magic_String, Non_Existent_Map) then + Report.Failed("Incorrect result from Procedure Translate - 1"); + end if; + + -- Partial mapping of source. + + Test_String := ASW.To_Unbounded_Wide_String(Equiv("abcdeabcab")); + + ASW.Translate(Source => Test_String, Mapping => AB_to_YZ_Map); + + if Test_String /= ASW.To_Unbounded_Wide_String(Equiv("yzcdeyzcyz")) then + Report.Failed("Incorrect result from Procedure Translate - 2"); + end if; + + -- Total mapping of source. + + Test_String := ASW.To_Unbounded_Wide_String(Equiv("abbaaababb")); + + ASW.Translate(Source => Test_String, Mapping => AB_to_YZ_Map); + + if Test_String /= ASW.To_Unbounded_Wide_String(Equiv("yzzyyyzyzz")) then + Report.Failed("Incorrect result from Procedure Translate - 3"); + end if; + + -- No mapping of source. + + Test_String := ASW.To_Unbounded_Wide_String(Equiv("xyzsypcc")); + + ASW.Translate(Source => Test_String, Mapping => AB_to_YZ_Map); + + if Test_String /= ASW.To_Unbounded_Wide_String(Equiv("xyzsypcc")) then + Report.Failed("Incorrect result from Procedure Translate - 4"); + end if; + + -- Map > 2 characters, partial mapping. + + Test_String := ASW.To_Unbounded_Wide_String(Equiv("opabcdelmn")); + + ASW.Translate(Test_String, + Wide_Maps.To_Mapping(Equiv("abcde"), Equiv("lmnop"))); + + if Test_String /= ASW.To_Unbounded_Wide_String(Equiv("oplmnoplmn")) then + Report.Failed("Incorrect result from Procedure Translate - 5"); + end if; + + + + -- Various degrees of mapping of source (full, partial, none) used + -- with Function Translate. + + if ASW.Translate( + ASW.To_Unbounded_Wide_String(Equiv("abcdeabcabbbaaacaa")), + AB_to_YZ_Map) /= + ASW.To_Unbounded_Wide_String(Equiv("yzcdeyzcyzzzyyycyy")) or + + ASW.Translate( + ASW.To_Unbounded_Wide_String(Equiv("abbaaababbaaaaba")), + AB_to_YZ_Map) /= + ASW.To_Unbounded_Wide_String(Equiv("yzzyyyzyzzyyyyzy")) or + + ASW.Translate(ASW.To_Unbounded_Wide_String(Equiv("cABcABBAc")), + Mapping => AB_to_YZ_Map) /= + ASW.To_Unbounded_Wide_String(Equiv("cABcABBAc")) or + + ASW.Translate(ASW.To_Unbounded_Wide_String("opabcdelmnddeaccabec"), + Wide_Maps.To_Mapping("abcde", "lmnop")) /= + ASW.To_Unbounded_Wide_String("oplmnoplmnooplnnlmpn") + then + Report.Failed("Incorrect result from Function Translate - 2"); + end if; + + + + -- Procedure Translate using access-to-subprogram mapping. + -- Partial mapping of source. + + Map_Ptr := AB_to_Blank_Mapping_Function'Access; + + Test_String := ASW.To_Unbounded_Wide_String(Equiv("abABaABbaBAbba")); + + ASW.Translate(Source => Test_String, -- change equivalent of 'a' and + Mapping => Map_Ptr); -- 'b' to ' ' + + if Test_String /= + ASW.To_Unbounded_Wide_String(Equiv(" AB AB BA ")) + then + Report.Failed + ("Incorrect result from Proc Translate, w/ access value map - 1"); + end if; + + -- Total mapping of source to blanks. + + Test_String := ASW.To_Unbounded_Wide_String(Equiv("abbbab")); + + ASW.Translate(Source => Test_String, + Mapping => Map_Ptr); + + if Test_String /= + ASW.To_Unbounded_Wide_String(Equiv(" ")) + then + Report.Failed + ("Incorrect result from Proc Translate, w/ access value map - 2"); + end if; + + -- No mapping of source. + + Map_Ptr := AB_to_US_Mapping_Function'Access; + + Test_String := ASW.To_Unbounded_Wide_String(Equiv("xyzsypcc")); + + ASW.Translate(Source => Test_String, + Mapping => Map_Ptr); + + if Test_String /= + ASW.To_Unbounded_Wide_String(Equiv("xyzsypcc")) -- no change + then + Report.Failed + ("Incorrect result from Proc Translate, w/ access value map - 3"); + end if; + + + -- Function Translate using access-to-subprogram mapping value. + + Map_Ptr := AB_to_Blank_Mapping_Function'Access; + + Test_String := ASW.To_Unbounded_Wide_String(Equiv("abAbBBAabbacD")); + + if ASW.Translate(ASW.Translate(Test_String, Map_Ptr), Map_Ptr) /= + ASW.To_Unbounded_Wide_String(Equiv(" A BBA cD")) + then + Report.Failed + ("Incorrect result from Function Translate, access value map - 1"); + end if; + + if ASW.Translate(Source => ASW.To_Unbounded_Wide_String(Equiv("a")), + Mapping => Map_Ptr) /= + ASW.To_Unbounded_Wide_String(Equiv(" ")) or + ASW.Translate(ASW.To_Unbounded_Wide_String + (Equiv(" aa Aa A AAaaa a aA")), + Map_Ptr) /= + ASW.To_Unbounded_Wide_String(Equiv(" A A AA A")) or + ASW.Translate(Source => ASW.To_Unbounded_Wide_String(Equiv("a ")), + Mapping => Map_Ptr) /= + ASW.To_Unbounded_Wide_String(Equiv(" ")) or + ASW.Translate(Source => ASW.To_Unbounded_Wide_String(Equiv("xyz")), + Mapping => Map_Ptr) /= + ASW.To_Unbounded_Wide_String(Equiv("xyz")) + then + Report.Failed + ("Incorrect result from Function Translate, access value map - 2"); + end if; + + + + -- Trim + + Trim_Block: + declare + + XYZ_Set : Wide_Maps.Wide_Character_Set := + Wide_Maps.To_Set(Equiv("xyz")); + PQR_Set : Wide_Maps.Wide_Character_Set := + Wide_Maps.To_Set(Equiv("pqr")); + + Pad : constant ASW.Unbounded_Wide_String := + ASW.To_Unbounded_Wide_String(Equiv("Pad")); + + The_New_Ada : constant ASW.Unbounded_Wide_String := + ASW.To_Unbounded_Wide_String(Equiv("Ada9X")); + + Space_Array : array (1..4) of ASW.Unbounded_Wide_String := + (ASW.To_Unbounded_Wide_String(Equiv(" Pad ")), + ASW.To_Unbounded_Wide_String(Equiv("Pad ")), + ASW.To_Unbounded_Wide_String(Equiv(" Pad")), + Pad); + + String_Array : array (1..5) of ASW.Unbounded_Wide_String := + (ASW.To_Unbounded_Wide_String(Equiv("xyzxAda9Xpqr")), + ASW.To_Unbounded_Wide_String(Equiv("Ada9Xqqrp")), + ASW.To_Unbounded_Wide_String(Equiv("zxyxAda9Xqpqr")), + ASW.To_Unbounded_Wide_String(Equiv("xxxyAda9X")), + The_New_Ada); + + begin + + -- Examine the version of Trim that removes blanks from + -- the left and/or right of a wide string. + + for i in 1..4 loop + if ASW.Trim(Space_Array(i), Ada.Strings.Both) /= Pad then + Report.Failed("Incorrect result from Trim for spaces - " & + Integer'Image(i)); + end if; + end loop; + + -- Examine the version of Trim that removes set characters from + -- the left and right of a wide string. + + for i in 1..5 loop + if ASW.Trim(String_Array(i), + Left => XYZ_Set, + Right => PQR_Set) /= The_New_Ada then + Report.Failed + ("Incorrect result from Trim for set characters - " & + Integer'Image(i)); + end if; + end loop; + + -- No trimming. + + if ASW.Trim( + ASW.To_Unbounded_Wide_String(Equiv("prqqprAda9Xyzzxyzzyz")), + XYZ_Set, + PQR_Set) /= + ASW.To_Unbounded_Wide_String(Equiv("prqqprAda9Xyzzxyzzyz")) + then + Report.Failed + ("Incorrect result from Trim for set, no trimming"); + end if; + + end Trim_Block; + + + + -- Delete + + -- Use the Delete function to remove the first four and last four + -- characters from the wide string. + + if ASW.Delete(Source => ASW.Delete(Magic_String, + 8, + ASW.Length(Magic_String)), + From => ASW.To_Wide_String(Magic_String)'First, + Through => 4) /= + Cad_String + then + Report.Failed("Incorrect results from Function Delete"); + end if; + + + + -- Constructors ("*") + + Constructor_Block: + declare + + SOS : ASW.Unbounded_Wide_String; + + Dot : constant ASW.Unbounded_Wide_String := + ASW.To_Unbounded_Wide_String(Equiv("Dot_")); + Dash : constant Wide_String := Equiv("Dash_"); + + Distress : ASW.Unbounded_Wide_String := + ASW."&"(ASW.To_Unbounded_Wide_String + (Equiv("Dot_Dot_Dot_")), + ASW."&"(ASW.To_Unbounded_Wide_String + (Equiv("Dash_Dash_Dash_")), + ASW.To_Unbounded_Wide_String + (Equiv("Dot_Dot_Dot")))); + + Repeat : constant Natural := 3; + Separator : constant Wide_Character := Equiv('_'); + + Separator_Set : Wide_Maps.Wide_Character_Set := + Wide_Maps.To_Set(Separator); + + begin + + -- Use the following constructor forms to construct the wide string + -- "Dot_Dot_Dot_Dash_Dash_Dash_Dot_Dot_Dot". Note that the + -- trailing underscore in the wide string is removed in the call to + -- Trim in the If statement condition. + + SOS := ASW."*"(Repeat, Dot); -- "*"(#, W Unb Str) + + SOS := ASW."&"(SOS, + ASW."&"(ASW."*"(Repeat, Dash), -- "*"(#, W Str) + ASW."*"(Repeat, Dot))); -- "*"(#, W Unb Str) + + if ASW.Trim(SOS, Wide_Maps.Null_Set, Separator_Set) /= Distress then + Report.Failed("Incorrect results from Function ""*"""); + end if; + + end Constructor_Block; + + + exception + when others => Report.Failed ("Exception raised in Test_Block"); + end Test_Block; + + + Report.Result; + +end CXA4023; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxa4024.a b/gcc/testsuite/ada/acats/tests/cxa/cxa4024.a new file mode 100644 index 000000000..1b0af9ce9 --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxa4024.a @@ -0,0 +1,350 @@ +-- CXA4024.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 function "-", To_Ranges, To_Domain, and To_Range are +-- available in the package Ada.Strings.Maps, and that they produce +-- correct results based on the Character_Set/Character_Mapping input +-- provided. +-- +-- TEST DESCRIPTION: +-- This test examines the operation of four functions from within the +-- Ada.Strings.Maps package. A variety of Character_Sequence, +-- Character_Set, and Character_Mapping objects are created and +-- initialized for use with these functions. In each subtest of +-- function operation, specific inputs are provided to the functions as +-- input parameters, and the results are evaluated against expected +-- values. Wherever appropriate, additional characteristics of the +-- function results are verified against the prescribed result +-- characteristics. +-- +-- +-- CHANGE HISTORY: +-- 03 Feb 95 SAIC Initial prerelease version +-- 10 Mar 95 SAIC Incorporated reviewer comments. +-- 15 Apr 96 SAIC Incorporated reviewer comments for ACVC 2.1. +-- 05 Oct 96 SAIC Incorporated reviewer comments for ACVC 2.1. +-- +--! + +with Ada.Strings.Maps; +with Ada.Strings.Maps.Constants; +with Ada.Characters.Latin_1; +with Report; + +procedure CXA4024 is + +begin + + Report.Test ("CXA4024", "Check that the function ""-"", To_Ranges, " & + "To_Domain, and To_Range are available in " & + "the package Ada.Strings.Maps, and that " & + "they produce correct results"); + + Test_Block: + declare + + use Ada.Strings, Ada.Strings.Maps; + use type Maps.Character_Set; -- To allow logical set operator + -- infix notation. + package ACL1 renames Ada.Characters.Latin_1; + + MidPoint_Letter : constant := 13; + Last_Letter : constant := 26; + + Vowels : constant Maps.Character_Sequence := "aeiou"; + Quasi_Vowel : constant Character := 'y'; + + Alphabet : Maps.Character_Sequence (1..Last_Letter); + Half_Alphabet : Maps.Character_Sequence (1..MidPoint_Letter); + + Alphabet_Set, + Consonant_Set, + Vowel_Set, + First_Half_Set, + Second_Half_Set : Maps.Character_Set; + + + begin + + -- Load the alphabet strings for use in creating sets. + for i in 0..12 loop + Half_Alphabet(i+1) := Character'Val(Character'Pos('a') + i); + end loop; + + for i in 0..25 loop + Alphabet(i+1) := Character'Val(Character'Pos('a') + i); + end loop; + + -- Initialize a series of Character_Set objects. + + Alphabet_Set := Maps.To_Set(Alphabet); + Vowel_Set := Maps.To_Set(Vowels); + Consonant_Set := Vowel_Set XOR Alphabet_Set; + First_Half_Set := Maps.To_Set(Half_Alphabet); + Second_Half_Set := Alphabet_Set XOR First_Half_Set; + + + + -- Evaluation of Set operator "-". + + if Consonant_Set /= "-"(Alphabet_Set, Vowel_Set) or + Vowel_Set /= (Alphabet_Set - Consonant_Set) or + Alphabet_Set /= Alphabet_Set - Maps.Null_Set or + First_Half_Set /= "-"(Alphabet_Set, Second_Half_Set) or + (Alphabet_Set - Vowel_Set) /= "AND"(Alphabet_Set, "NOT"(Vowel_Set)) + then + Report.Failed("Incorrect result from ""-"" operator for sets"); + end if; + + + + -- Evaluation of Function "To_Ranges". + + declare + + use type Maps.Character_Range; + use type Maps.Character_Ranges; + + Set_A_to_C : Maps.Character_Set := Maps.To_Set("ABC"); + Set_J : Maps.Character_Set := Maps.To_Set("J"); + Set_M_to_P : Maps.Character_Set := Maps.To_Set("MNOP"); + Set_X_to_Z : Maps.Character_Set := Maps.To_Set("XYZ"); + Set_Of_Five : Maps.Character_Set := Set_A_to_C OR -- Union of the + Set_M_to_P OR -- five sets. + Set_X_to_Z OR + Set_J OR + Maps.Null_Set; + + TC_Range_A_to_C : Maps.Character_Range := (Low => 'A', High => 'C'); + TC_Range_J : Maps.Character_Range := ('J', 'J'); + TC_Range_M_to_P : Maps.Character_Range := ('M', 'P'); + TC_Range_X_to_Z : Maps.Character_Range := (Low => 'X', High => 'Z'); + + TC_Ranges : Maps.Character_Ranges (1..4) := + (1 => TC_Range_A_to_C, + 2 => TC_Range_J, + 3 => TC_Range_M_to_P, + 4 => TC_Range_X_to_Z); + + begin + + -- Based on input of a set containing four separate "spans" of + -- character sequences, Function To_Ranges is required to produce + -- the shortest array of contiguous ranges of Character values in + -- the input set, in increasing order of Low. + + declare + + -- This Character_Ranges constant should consist of array + -- components, each component being a Character_Range from Low + -- to High containing the appropriate characters. + + Ranges_Result : constant Maps.Character_Ranges := + Maps.To_Ranges(Set => Set_Of_Five); + begin + + -- Check the structure and components of the Character_Ranges + -- constant. + + if Ranges_Result(1) /= TC_Range_A_to_C or + Ranges_Result(1).Low /= TC_Ranges(1).Low or + Ranges_Result(2) /= TC_Range_J or + Ranges_Result(2).High /= TC_Ranges(2).High or + Ranges_Result(3) /= TC_Range_M_to_P or + Ranges_Result(3).Low /= TC_Ranges(3).Low or + Ranges_Result(3).High /= TC_Ranges(3).High or + Ranges_Result(4) /= TC_Range_X_To_Z or + Ranges_Result(4).Low /= TC_Ranges(4).Low or + Ranges_Result(4).High /= TC_Ranges(4).High + then + Report.Failed ("Incorrect structure or components in " & + "Character_Ranges constant"); + end if; + + exception + when others => + Report.Failed("Exception raised using the Function To_Ranges " & + "to initialize a Character_Ranges constant"); + end; + end; + + + + -- Evaluation of Functions To_Domain and To_Range. + + declare + + Null_Sequence : constant Maps.Character_Sequence := ""; + + TC_Upper_Case_Sequence : constant Maps.Character_Sequence := + "ZYXWVUTSRQPONMABCDEFGHIJKL"; + TC_Lower_Case_Sequence : constant Maps.Character_Sequence := + "zyxwvutsrqponmabcdefghijkl"; + TC_Unordered_Sequence : Maps.Character_Sequence(1..6) := + "BxACzy"; + + TC_Upper_to_Lower_Map : Maps.Character_Mapping := + Maps.To_Mapping(TC_Upper_Case_Sequence, + TC_Lower_Case_Sequence); + + TC_Lower_to_Upper_Map : Maps.Character_Mapping := + Maps.To_Mapping(TC_Lower_Case_Sequence, + TC_Upper_Case_Sequence); + + TC_Unordered_Map : Maps.Character_Mapping := + Maps.To_Mapping(TC_Unordered_Sequence, + "ikglja"); + begin + + declare + + TC_Domain_1 : constant Maps.Character_Sequence := + Maps.To_Domain(TC_Upper_to_Lower_Map); + + TC_Domain_2 : constant Maps.Character_Sequence := + Maps.To_Domain(TC_Lower_to_Upper_Map); + + TC_Domain_3 : Maps.Character_Sequence(1..6); + + TC_Range_1 : constant Maps.Character_Sequence := + Maps.To_Range(TC_Upper_to_Lower_Map); + + TC_Range_2 : constant Maps.Character_Sequence := + Maps.To_Range(TC_Lower_to_Upper_Map); + + TC_Range_3 : Maps.Character_Sequence(1..6); + + begin + + -- Function To_Domain returns the shortest Character_Sequence + -- value such that each character not in the result maps to + -- itself, and all characters in the result are in ascending + -- order. + + TC_Domain_3 := Maps.To_Domain(TC_Unordered_Map); + + -- Check contents of result of To_Domain, must be in ascending + -- order. + + if TC_Domain_1 /= "ABCDEFGHIJKLMNOPQRSTUVWXYZ" then + Report.Failed("Incorrect result from To_Domain with " & + "TC_Upper_to_Lower_Map as input"); + end if; + + if TC_Domain_2 /= "abcdefghijklmnopqrstuvwxyz" then + Report.Failed("Incorrect result from To_Domain with " & + "TC_Lower_to_Upper_Map as input"); + end if; + + if TC_Domain_3 /= "ABCxyz" then + Report.Failed("Incorrect result from To_Domain with " & + "an unordered mapping as input"); + end if; + + + -- The lower bound on the returned Character_Sequence value + -- from To_Domain must be 1. + + if TC_Domain_1'First /= 1 or + TC_Domain_2'First /= 1 or + TC_Domain_3'First /= 1 + then + Report.Failed("Incorrect lower bound returned from To_Domain"); + end if; + + + -- Check contents of result of To_Range. + + TC_Range_3 := Maps.To_Range(TC_Unordered_Map); + + if TC_Range_1 /= "abcdefghijklmnopqrstuvwxyz" then + Report.Failed("Incorrect result from To_Range with " & + "TC_Upper_to_Lower_Map as input"); + end if; + + if TC_Range_2 /= "ABCDEFGHIJKLMNOPQRSTUVWXYZ" then + Report.Failed("Incorrect result from To_Range with " & + "TC_Lower_to_Upper_Map as input"); + end if; + + if TC_Range_3 /= "gilkaj" then + Report.Failed("Incorrect result from To_Range with " & + "an unordered mapping as input"); + end if; + + + -- The lower bound on the returned Character_Sequence value + -- must be 1. + + if TC_Range_1'First /= 1 or + TC_Range_2'First /= 1 or + TC_Range_3'First /= 1 + then + Report.Failed("Incorrect lower bound returned from To_Range"); + end if; + + + -- The upper bound on the returned Character_Sequence value + -- must be Map'Length. + + if TC_Range_1'Last /= TC_Lower_Case_Sequence'Length or + TC_Range_2'Last /= TC_Upper_Case_Sequence'Length or + TC_Range_3'Last /= TC_Unordered_Sequence'Length + then + Report.Failed("Incorrect upper bound returned from To_Range"); + end if; + + end; + + -- Both function To_Domain and To_Range return the null string + -- when provided the Identity character map as an input parameter. + + if Maps.To_Domain(Maps.Identity) /= Null_Sequence then + Report.Failed("Function To_Domain did not return the null " & + "string when provided the Identity map as " & + "input"); + end if; + + if Maps.To_Range(Maps.Identity) /= Null_Sequence then + Report.Failed("Function To_Range did not return the null " & + "string when provided the Identity map as " & + "input"); + end if; + + exception + when others => + Report.Failed("Exception raised during the evaluation of " & + "Function To_Domain and To_Range"); + end; + + exception + when others => Report.Failed ("Exception raised in Test_Block"); + end Test_Block; + + + Report.Result; + +end CXA4024; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxa4025.a b/gcc/testsuite/ada/acats/tests/cxa/cxa4025.a new file mode 100644 index 000000000..1665f7a46 --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxa4025.a @@ -0,0 +1,376 @@ +-- CXA4025.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 functionality found in packages Ada.Strings.Wide_Maps, +-- Ada.Strings.Wide_Fixed, and Ada.Strings.Wide_Maps.Wide_Constants +-- is available and produces correct results. +-- +-- TEST DESCRIPTION: +-- This test validates the subprograms found in the various Wide_Map +-- and Wide_String packages. It is based on the tests CXA4024 and +-- CXA4026, which are tests for the complementary "non-wide" packages. +-- +-- The functions found in CXA4025_0 provide mapping capability, when +-- used in conjunction with Wide_Character_Mapping_Function objects. +-- +-- +-- CHANGE HISTORY: +-- 23 Jun 95 SAIC Initial prerelease version. +-- 15 Apr 96 SAIC Incorporated reviewer comments for ACVC 2.1. +-- +--! + +package CXA4025_0 is + -- Functions used to supply mapping capability. + function Map_To_Lower_Case (From : Wide_Character) return Wide_Character; + function Map_To_Upper_Case (From : Wide_Character) return Wide_Character; +end CXA4025_0; + +with Ada.Characters.Handling; +package body CXA4025_0 is + -- Function Map_To_Lower_Case will return the lower case form of + -- Wide_Characters in the range 'A'..'Z' only, and return the input + -- wide_character otherwise. + + function Map_To_Lower_Case (From : Wide_Character) + return Wide_Character is + begin + return Ada.Characters.Handling.To_Wide_Character( + Ada.Characters.Handling.To_Lower( + Ada.Characters.Handling.To_Character(From))); + end Map_To_Lower_Case; + + -- Function Map_To_Upper_Case will return the upper case form of + -- Wide_Characters in the range 'a'..'z', or whose position is in one + -- of the ranges 223..246 or 248..255, provided the wide_character has + -- an upper case form. + + function Map_To_Upper_Case (From : Wide_Character) + return Wide_Character is + begin + return Ada.Characters.Handling.To_Wide_Character( + Ada.Characters.Handling.To_Upper( + Ada.Characters.Handling.To_Character(From))); + end Map_To_Upper_Case; + +end CXA4025_0; + + +with CXA4025_0; +with Report; +with Ada.Characters.Handling; +with Ada.Characters.Latin_1; +with Ada.Exceptions; +with Ada.Strings; +with Ada.Strings.Wide_Maps; +with Ada.Strings.Wide_Maps.Wide_Constants; +with Ada.Strings.Wide_Fixed; + +procedure CXA4025 is +begin + Report.Test ("CXA4025", + "Check that subprograms defined in packages " & + "Ada.Strings.Wide_Maps and Ada.Strings.Wide_Fixed " & + "produce correct results"); + + Test_Block: + declare + + package ACL1 renames Ada.Characters.Latin_1; + + use Ada.Characters, Ada.Strings; + use Ada.Exceptions; + use type Wide_Maps.Wide_Character_Set; + + subtype LC_Characters is Wide_Character range 'a'..'z'; + + Last_Letter : constant := 26; + Vowels : constant Wide_Maps.Wide_Character_Sequence := "aeiou"; + TC_String : constant Wide_String := "A Standard String"; + + Alphabet : Wide_Maps.Wide_Character_Sequence (1..Last_Letter); + Alphabet_Set, + Consonant_Set, + Vowel_Set : Wide_Maps.Wide_Character_Set; + + String_20 : Wide_String(1..20) := "ABCDEFGHIJKLMNOPQRST"; + String_40 : Wide_String(1..40) := "abcdefghijklmnopqrst" & + String_20; + String_80 : Wide_String(1..80) := String_40 & String_40; + TC_String_5 : Wide_String(1..5) := "ABCDE"; + + -- The following strings are used in examination of the Translation + -- subprograms. + New_Character_String : Wide_String(1..12) := + Handling.To_Wide_String( + ACL1.LC_A_Grave & ACL1.LC_A_Ring & ACL1.LC_AE_Diphthong & + ACL1.LC_C_Cedilla & ACL1.LC_E_Acute & ACL1.LC_I_Circumflex & + ACL1.LC_Icelandic_Eth & ACL1.LC_N_Tilde & + ACL1.LC_O_Oblique_Stroke & ACL1.LC_Icelandic_Thorn & + ACL1.LC_German_Sharp_S & ACL1.LC_Y_Diaeresis); + + -- Note that there is no upper case version of the last two + -- characters from above. + + TC_New_Character_String : Wide_String(1..12) := + Handling.To_Wide_String( + ACL1.UC_A_Grave & ACL1.UC_A_Ring & ACL1.UC_AE_Diphthong & + ACL1.UC_C_Cedilla & ACL1.UC_E_Acute & ACL1.UC_I_Circumflex & + ACL1.UC_Icelandic_Eth & ACL1.UC_N_Tilde & + ACL1.UC_O_Oblique_Stroke & ACL1.UC_Icelandic_Thorn & + ACL1.LC_German_Sharp_S & ACL1.LC_Y_Diaeresis); + + -- Access objects that will be provided as parameters to the + -- subprograms. + Map_To_Lower_Case_Ptr : Wide_Maps.Wide_Character_Mapping_Function := + CXA4025_0.Map_To_Lower_Case'Access; + Map_To_Upper_Case_Ptr : Wide_Maps.Wide_Character_Mapping_Function := + CXA4025_0.Map_To_Upper_Case'Access; + + begin + + -- + -- Testing of functionality found in Package Ada.Strings.Wide_Maps. + -- + + -- Load the alphabet strings for use in creating sets. + for i in 0..25 loop + Alphabet(i+1) := Wide_Character'Val(Wide_Character'Pos('a')+i); + end loop; + + -- Initialize a series of Character_Set objects. + Alphabet_Set := Wide_Maps.To_Set(Alphabet); + Vowel_Set := Wide_Maps.To_Set(Vowels); + Consonant_Set := Vowel_Set XOR Alphabet_Set; + + -- Evaluation of Set operator "-". + if + (Alphabet_Set - Consonant_Set) /= + "AND"(Alphabet_Set, "NOT"(Consonant_Set)) or + (Alphabet_Set - Vowel_Set) /= "AND"(Alphabet_Set, "NOT"(Vowel_Set)) + then + Report.Failed("Incorrect result from ""-"" operator for sets"); + end if; + + -- Evaluation of Functions To_Domain and To_Range. + declare + Null_Sequence : constant Wide_Maps.Wide_Character_Sequence := ""; + TC_UC_Sequence : constant Wide_Maps.Wide_Character_Sequence := + "ZYXWVUTSRQPONMABCDEFGHIJKL"; + TC_LC_Sequence : constant Wide_Maps.Wide_Character_Sequence := + "zyxwvutsrqponmabcdefghijkl"; + TC_Upper_to_Lower_Map : Wide_Maps.Wide_Character_Mapping := + Wide_Maps.To_Mapping(TC_UC_Sequence, + TC_LC_Sequence); + TC_Lower_to_Upper_Map : Wide_Maps.Wide_Character_Mapping := + Wide_Maps.To_Mapping(TC_LC_Sequence, + TC_UC_Sequence); + begin + declare + TC_Domain : constant Wide_Maps.Wide_Character_Sequence := + Wide_Maps.To_Domain(TC_Upper_to_Lower_Map); + TC_Range : constant Wide_Maps.Wide_Character_Sequence := + Wide_Maps.To_Range(TC_Lower_to_Upper_Map); + begin + -- Function To_Domain returns the shortest Wide_Character_Sequence + -- value such that each wide character not in the result maps to + -- itself, and all wide characters in the result are in ascending + -- order. + if TC_Domain /= "ABCDEFGHIJKLMNOPQRSTUVWXYZ" then + Report.Failed("Incorrect result from To_Domain with " & + "TC_Upper_to_Lower_Map as input"); + end if; + + -- The lower bound on the returned Wide_Character_Sequence value + -- from To_Domain must be 1. + if TC_Domain'First /= 1 then + Report.Failed("Incorrect lower bound returned from To_Domain"); + end if; + + -- Check contents of result of To_Range. + if TC_Range /= "ABCDEFGHIJKLMNOPQRSTUVWXYZ" then + Report.Failed("Incorrect result from To_Range with " & + "TC_Lower_to_Upper_Map as input"); + end if; + + -- The lower bound on the returned Character_Sequence value + -- must be 1. + if TC_Range'First /= 1 then + Report.Failed("Incorrect lower bound returned from To_Range"); + end if; + + if TC_Range'Last /= TC_LC_Sequence'Length then + Report.Failed("Incorrect upper bound returned from To_Range"); + end if; + end; + + -- Both function To_Domain and To_Range return the null string + -- when provided the Identity character map as an input parameter. + if Wide_Maps.To_Domain(Wide_Maps.Identity) /= Null_Sequence or + Wide_Maps.To_Range(Wide_Maps.Identity) /= Null_Sequence + then + Report.Failed("Null sequence not returned from To_Domain or " & + "To_Range when provided the Identity map as input"); + end if; + exception + when others => + Report.Failed("Exception raised during the evaluation of " & + "Function To_Domain and To_Range"); + end; + + -- Testing of functionality found in Package Ada.Strings.Wide_Fixed. + -- + -- Function Index, Forward direction search. + + if Wide_Fixed.Index("CoMpLeTeLy MiXeD CaSe StRiNg", + "MIXED CASE STRING", + Ada.Strings.Forward, + Map_To_Upper_Case_Ptr) /= 12 or + Wide_Fixed.Index("STRING WITH NO MATCHING PATTERNS", + "WITH", + Ada.Strings.Forward, + Map_To_Lower_Case_Ptr) /= 0 + then + Report.Failed("Incorrect results from Function Index, going " & + "in Forward direction, using a Character Mapping " & + "Function parameter"); + end if; + + -- Function Index, Backward direction search. + if Wide_Fixed.Index("Case of a Mixed Case String", + "case", + Ada.Strings.Backward, + Map_To_Lower_Case_Ptr) /= 17 or + Wide_Fixed.Index("WOULD MATCH BUT FOR THE CASE", + "WOULD MATCH BUT FOR THE CASE", + Ada.Strings.Backward, + Map_To_Lower_Case_Ptr) /= 0 + then + Report.Failed("Incorrect results from Function Index, going " & + "in Backward direction, using a Character Mapping " & + "Function parameter"); + end if; + + -- Function Count. + if Wide_Fixed.Count("ABABABA", "ABA", Map_To_Upper_Case_Ptr) /= 2 or + Wide_Fixed.Count("", "match", Map_To_Lower_Case_Ptr) /= 0 + then + Report.Failed("Incorrect results from Function Count, using " & + "a Character Mapping Function parameter"); + end if; + + -- Function Translate. + if Wide_Fixed.Translate(Source => "A Sample Mixed Case String", + Mapping => Map_To_Lower_Case_Ptr) /= + "a sample mixed case string" or + Wide_Fixed.Translate(New_Character_String, + Map_To_Upper_Case_Ptr) /= + TC_New_Character_String + then + Report.Failed("Incorrect results from Function Translate, using " & + "a Wide_Character Mapping Function parameter"); + end if; + + -- Procedure Translate. + declare + use Ada.Strings.Wide_Fixed; + Str : Wide_String(1..19) := "A Mixed Case String"; + begin + Translate(Source => Str, Mapping => Map_To_Lower_Case_Ptr); + if Str /= "a mixed case string" then + Report.Failed("Incorrect result from Procedure Translate - 1"); + end if; + + Translate(New_Character_String, Map_To_Upper_Case_Ptr); + if New_Character_String /= TC_New_Character_String then + Report.Failed("Incorrect result from Procedure Translate - 2"); + end if; + end; + + -- Procedure Trim. + declare + use Ada.Strings.Wide_Fixed; + Trim_String : Wide_String(1..30) := " A string of characters "; + begin + Trim(Trim_String, Ada.Strings.Left, Ada.Strings.Right, 'x'); + if Trim_String /= "xxxxA string of characters " then + Report.Failed("Incorrect result from Procedure Trim, trim " & + "side = left, justify = right, pad = x"); + end if; + + Trim(Trim_String, Ada.Strings.Right, Ada.Strings.Center); + if Trim_String /= " xxxxA string of characters " then + Report.Failed("Incorrect result from Procedure Trim, trim " & + "side = right, justify = center, default pad"); + end if; + end; + + -- Procedure Head. + declare + Fixed_String : Wide_String(1..20) := "A sample test string"; + begin + Wide_Fixed.Head(Source => Fixed_String, Count => 14, + Justify => Ada.Strings.Center, Pad => '$'); + if Fixed_String /= "$$$A sample test $$$" then + Report.Failed("Incorrect result from Procedure Head, " & + "justify = center, pad = $"); + end if; + + Wide_Fixed.Head(Fixed_String, 11, Ada.Strings.Right); + if Fixed_String /= " $$$A sample" then + Report.Failed("Incorrect result from Procedure Head, " & + "justify = right, default pad"); + end if; + end; + + -- Procedure Tail. + declare + use Ada.Strings.Wide_Fixed; + Tail_String : Wide_String(1..20) := "ABCDEFGHIJKLMNOPQRST"; + begin + -- Default left justify. + Tail(Source => Tail_String, Count => 10, Pad => '-'); + if Tail_String /= "KLMNOPQRST----------" then + Report.Failed("Incorrect result from Procedure Tail, " & + "default justify, pad = -"); + end if; + + Tail(Tail_String, 6, Ada.Strings.Center, 'a'); + if Tail_String /= "aaaaaaa------aaaaaaa" then + Report.Failed("Incorrect result from Procedure Tail, " & + "justify = center, pad = a"); + end if; + end; + + exception + when The_Error : others => + Report.Failed ("The following exception was raised in the " & + "Test_Block: " & Exception_Name(The_Error)); + end Test_Block; + + Report.Result; + +end CXA4025; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxa4026.a b/gcc/testsuite/ada/acats/tests/cxa/cxa4026.a new file mode 100644 index 000000000..766979ad0 --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxa4026.a @@ -0,0 +1,526 @@ +-- CXA4026.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.Strings.Fixed procedures Head, Tail, and Trim, as well +-- as the versions of subprograms Translate (procedure and function), +-- Index, and Count, available in the package which use a +-- Maps.Character_Mapping_Function input parameter, produce correct +-- results. +-- +-- TEST DESCRIPTION: +-- This test examines the operation of several subprograms contained in +-- the Ada.Strings.Fixed package. +-- This includes procedure versions of Head, Tail, and Trim, as well as +-- four subprograms that use a Character_Mapping_Function as a parameter +-- to provide the mapping capability. +-- +-- Two functions are defined to provide the mapping. Access values +-- are defined to refer to these functions. One of the functions will +-- map upper case characters in the range 'A'..'Z' to their lower case +-- counterparts, while the other function will map lower case characters +-- ('a'..'z', or a character whose position is in one of the ranges +-- 223..246 or 248..255, provided the character has an upper case form) +-- to their upper case form. +-- +-- Function Index uses the mapping function access value to map the input +-- string prior to searching for the appropriate index value to return. +-- Function Count uses the mapping function access value to map the input +-- string prior to counting the occurrences of the pattern string. +-- Both the Procedure and Function version of Translate use the mapping +-- function access value to perform the translation. +-- +-- Results of all subprograms are compared with expected results. +-- +-- +-- CHANGE HISTORY: +-- 10 Feb 95 SAIC Initial prerelease version +-- 21 Apr 95 SAIC Modified definition of string variable Str_2. +-- +--! + + +package CXA4026_0 is + + -- Function Map_To_Lower_Case will return the lower case form of + -- Characters in the range 'A'..'Z' only, and return the input + -- character otherwise. + + function Map_To_Lower_Case (From : Character) return Character; + + + -- Function Map_To_Upper_Case will return the upper case form of + -- Characters in the range 'a'..'z', or whose position is in one + -- of the ranges 223..246 or 248..255, provided the character has + -- an upper case form. + + function Map_To_Upper_Case (From : Character) return Character; + +end CXA4026_0; + + +with Ada.Characters.Handling; +package body CXA4026_0 is + + function Map_To_Lower_Case (From : Character) return Character is + begin + if From in 'A'..'Z' then + return Character'Val(Character'Pos(From) - + (Character'Pos('A') - Character'Pos('a'))); + else + return From; + end if; + end Map_To_Lower_Case; + + function Map_To_Upper_Case (From : Character) return Character is + begin + return Ada.Characters.Handling.To_Upper(From); + end Map_To_Upper_Case; + +end CXA4026_0; + + +with CXA4026_0; +with Ada.Strings.Fixed; +with Ada.Strings.Maps; +with Ada.Characters.Handling; +with Ada.Characters.Latin_1; +with Report; + +procedure CXA4026 is + +begin + + Report.Test ("CXA4026", "Check that procedures Trim, Head, and Tail, " & + "as well as the versions of subprograms " & + "Translate, Index, and Count, which use the " & + "Character_Mapping_Function input parameter," & + "produce correct results"); + + Test_Block: + declare + + use Ada.Strings, CXA4026_0; + + -- The following strings are used in examination of the Translation + -- subprograms. + + New_Character_String : String(1..10) := + Ada.Characters.Latin_1.LC_A_Grave & + Ada.Characters.Latin_1.LC_A_Ring & + Ada.Characters.Latin_1.LC_AE_Diphthong & + Ada.Characters.Latin_1.LC_C_Cedilla & + Ada.Characters.Latin_1.LC_E_Acute & + Ada.Characters.Latin_1.LC_I_Circumflex & + Ada.Characters.Latin_1.LC_Icelandic_Eth & + Ada.Characters.Latin_1.LC_N_Tilde & + Ada.Characters.Latin_1.LC_O_Oblique_Stroke & + Ada.Characters.Latin_1.LC_Icelandic_Thorn; + + + TC_New_Character_String : String(1..10) := + Ada.Characters.Latin_1.UC_A_Grave & + Ada.Characters.Latin_1.UC_A_Ring & + Ada.Characters.Latin_1.UC_AE_Diphthong & + Ada.Characters.Latin_1.UC_C_Cedilla & + Ada.Characters.Latin_1.UC_E_Acute & + Ada.Characters.Latin_1.UC_I_Circumflex & + Ada.Characters.Latin_1.UC_Icelandic_Eth & + Ada.Characters.Latin_1.UC_N_Tilde & + Ada.Characters.Latin_1.UC_O_Oblique_Stroke & + Ada.Characters.Latin_1.UC_Icelandic_Thorn; + + + -- Functions used to supply mapping capability. + + + -- Access objects that will be provided as parameters to the + -- subprograms. + + Map_To_Lower_Case_Ptr : Maps.Character_Mapping_Function := + Map_To_Lower_Case'Access; + + Map_To_Upper_Case_Ptr : Maps.Character_Mapping_Function := + Map_To_Upper_Case'Access; + + + begin + + -- Function Index, Forward direction search. + -- Note: Several of the following cases use the default value + -- Forward for the Going parameter. + + if Fixed.Index(Source => "The library package Strings.Fixed", + Pattern => "fix", + Going => Ada.Strings.Forward, + Mapping => Map_To_Lower_Case_Ptr) /= 29 or + Fixed.Index("THE RAIN IN SPAIN FALLS MAINLY ON THE PLAIN", + "ain", + Mapping => Map_To_Lower_Case_Ptr) /= 6 or + Fixed.Index("maximum number", + "um", + Ada.Strings.Forward, + Map_To_Lower_Case_Ptr) /= 6 or + Fixed.Index("CoMpLeTeLy MiXeD CaSe StRiNg", + "MIXED CASE STRING", + Ada.Strings.Forward, + Map_To_Upper_Case_Ptr) /= 12 or + Fixed.Index("STRING WITH NO MATCHING PATTERNS", + "WITH", + Ada.Strings.Forward, + Map_To_Lower_Case_Ptr) /= 0 or + Fixed.Index("THIS STRING IS IN UPPER CASE", + "IS", + Ada.Strings.Forward, + Map_To_Upper_Case_Ptr) /= 3 or + Fixed.Index("", -- Null string. + "is", + Mapping => Map_To_Lower_Case_Ptr) /= 0 or + Fixed.Index("AAABBBaaabbb", + "aabb", + Mapping => Map_To_Lower_Case_Ptr) /= 2 + then + Report.Failed("Incorrect results from Function Index, going " & + "in Forward direction, using a Character Mapping " & + "Function parameter"); + end if; + + + + -- Function Index, Backward direction search. + + if Fixed.Index("Case of a Mixed Case String", + "case", + Ada.Strings.Backward, + Map_To_Lower_Case_Ptr) /= 17 or + Fixed.Index("Case of a Mixed Case String", + "CASE", + Ada.Strings.Backward, + Map_To_Upper_Case_Ptr) /= 17 or + Fixed.Index("rain, Rain, and more RAIN", + "rain", + Ada.Strings.Backward, + Map_To_Lower_Case_Ptr) /= 22 or + Fixed.Index("RIGHT place, right time", + "RIGHT", + Ada.Strings.Backward, + Map_To_Upper_Case_Ptr) /= 14 or + Fixed.Index("WOULD MATCH BUT FOR THE CASE", + "WOULD MATCH BUT FOR THE CASE", + Ada.Strings.Backward, + Map_To_Lower_Case_Ptr) /= 0 + then + Report.Failed("Incorrect results from Function Index, going " & + "in Backward direction, using a Character Mapping " & + "Function parameter"); + end if; + + + + -- Function Index, Pattern_Error if Pattern = Null_String + + declare + use Ada.Strings.Fixed; + Null_Pattern_String : constant String := ""; + TC_Natural : Natural := 1000; + begin + TC_Natural := Index("A Valid String", + Null_Pattern_String, + Ada.Strings.Forward, + Map_To_Lower_Case_Ptr); + Report.Failed("Pattern_Error not raised by Function Index when " & + "given a null pattern string"); + exception + when Pattern_Error => null; -- OK, expected exception. + when others => + Report.Failed("Incorrect exception raised by Function Index " & + "using a Character Mapping Function parameter " & + "when given a null pattern string"); + end; + + + + -- Function Count. + + if Fixed.Count(Source => "ABABABA", + Pattern => "aba", + Mapping => Map_To_Lower_Case_Ptr) /= 2 or + Fixed.Count("ABABABA", "ABA", Map_To_Lower_Case_Ptr) /= 0 or + Fixed.Count("This IS a MISmatched issue", + "is", + Map_To_Lower_Case_Ptr) /= 4 or + Fixed.Count("ABABABA", "ABA", Map_To_Upper_Case_Ptr) /= 2 or + Fixed.Count("This IS a MISmatched issue", + "is", + Map_To_Upper_Case_Ptr) /= 0 or + Fixed.Count("She sells sea shells by the sea shore", + "s", + Map_To_Lower_Case_Ptr) /= 8 or + Fixed.Count("", -- Null string. + "match", + Map_To_Upper_Case_Ptr) /= 0 + then + Report.Failed("Incorrect results from Function Count, using " & + "a Character Mapping Function parameter"); + end if; + + + + -- Function Count, Pattern_Error if Pattern = Null_String + + declare + use Ada.Strings.Fixed; + Null_Pattern_String : constant String := ""; + TC_Natural : Natural := 1000; + begin + TC_Natural := Count("A Valid String", + Null_Pattern_String, + Map_To_Lower_Case_Ptr); + Report.Failed("Pattern_Error not raised by Function Count using " & + "a Character Mapping Function parameter when " & + "given a null pattern string"); + exception + when Pattern_Error => null; -- OK, expected exception. + when others => + Report.Failed("Incorrect exception raised by Function Count " & + "using a Character Mapping Function parameter " & + "when given a null pattern string"); + end; + + + + -- Function Translate. + + if Fixed.Translate(Source => "A Sample Mixed Case String", + Mapping => Map_To_Lower_Case_Ptr) /= + "a sample mixed case string" or + + Fixed.Translate("ALL LOWER CASE", + Map_To_Lower_Case_Ptr) /= + "all lower case" or + + Fixed.Translate("end with lower case", + Map_To_Lower_Case_Ptr) /= + "end with lower case" or + + Fixed.Translate("", Map_To_Lower_Case_Ptr) /= + "" or + + Fixed.Translate("start with lower case", + Map_To_Upper_Case_Ptr) /= + "START WITH LOWER CASE" or + + Fixed.Translate("ALL UPPER CASE STRING", + Map_To_Upper_Case_Ptr) /= + "ALL UPPER CASE STRING" or + + Fixed.Translate("LoTs Of MiXeD CaSe ChArAcTeRs", + Map_To_Upper_Case_Ptr) /= + "LOTS OF MIXED CASE CHARACTERS" or + + Fixed.Translate("", Map_To_Upper_Case_Ptr) /= + "" or + + Fixed.Translate(New_Character_String, + Map_To_Upper_Case_Ptr) /= + TC_New_Character_String + then + Report.Failed("Incorrect results from Function Translate, using " & + "a Character Mapping Function parameter"); + end if; + + + + -- Procedure Translate. + + declare + + use Ada.Strings.Fixed; + + Str_1 : String(1..24) := "AN ALL UPPER CASE STRING"; + Str_2 : String(1..19) := "A Mixed Case String"; + Str_3 : String(1..32) := "a string with lower case letters"; + TC_Str_1 : constant String := Str_1; + TC_Str_3 : constant String := Str_3; + + begin + + Translate(Source => Str_1, Mapping => Map_To_Lower_Case_Ptr); + + if Str_1 /= "an all upper case string" then + Report.Failed("Incorrect result from Procedure Translate - 1"); + end if; + + Translate(Source => Str_1, Mapping => Map_To_Upper_Case_Ptr); + + if Str_1 /= TC_Str_1 then + Report.Failed("Incorrect result from Procedure Translate - 2"); + end if; + + Translate(Source => Str_2, Mapping => Map_To_Lower_Case_Ptr); + + if Str_2 /= "a mixed case string" then + Report.Failed("Incorrect result from Procedure Translate - 3"); + end if; + + Translate(Source => Str_2, Mapping => Map_To_Upper_Case_Ptr); + + if Str_2 /= "A MIXED CASE STRING" then + Report.Failed("Incorrect result from Procedure Translate - 4"); + end if; + + Translate(Source => Str_3, Mapping => Map_To_Lower_Case_Ptr); + + if Str_3 /= TC_Str_3 then + Report.Failed("Incorrect result from Procedure Translate - 5"); + end if; + + Translate(Source => Str_3, Mapping => Map_To_Upper_Case_Ptr); + + if Str_3 /= "A STRING WITH LOWER CASE LETTERS" then + Report.Failed("Incorrect result from Procedure Translate - 6"); + end if; + + Translate(New_Character_String, Map_To_Upper_Case_Ptr); + + if New_Character_String /= TC_New_Character_String then + Report.Failed("Incorrect result from Procedure Translate - 6"); + end if; + + end; + + + -- Procedure Trim. + + declare + Use Ada.Strings.Fixed; + Trim_String : String(1..30) := " A string of characters "; + begin + + Trim(Source => Trim_String, + Side => Ada.Strings.Left, + Justify => Ada.Strings.Right, + Pad => 'x'); + + if Trim_String /= "xxxxA string of characters " then + Report.Failed("Incorrect result from Procedure Trim, trim " & + "side = left, justify = right, pad = x"); + end if; + + Trim(Trim_String, Ada.Strings.Right, Ada.Strings.Center); + + if Trim_String /= " xxxxA string of characters " then + Report.Failed("Incorrect result from Procedure Trim, trim " & + "side = right, justify = center, default pad"); + end if; + + Trim(Trim_String, Ada.Strings.Both, Pad => '*'); + + if Trim_String /= "xxxxA string of characters****" then + Report.Failed("Incorrect result from Procedure Trim, trim " & + "side = both, default justify, pad = *"); + end if; + + end; + + + -- Procedure Head. + + declare + Fixed_String : String(1..20) := "A sample test string"; + begin + + Fixed.Head(Source => Fixed_String, + Count => 14, + Justify => Ada.Strings.Center, + Pad => '$'); + + if Fixed_String /= "$$$A sample test $$$" then + Report.Failed("Incorrect result from Procedure Head, " & + "justify = center, pad = $"); + end if; + + Fixed.Head(Fixed_String, 11, Ada.Strings.Right); + + if Fixed_String /= " $$$A sample" then + Report.Failed("Incorrect result from Procedure Head, " & + "justify = right, default pad"); + end if; + + Fixed.Head(Fixed_String, 9, Pad => '*'); + + if Fixed_String /= " ***********" then + Report.Failed("Incorrect result from Procedure Head, " & + "default justify, pad = *"); + end if; + + end; + + + -- Procedure Tail. + + declare + Use Ada.Strings.Fixed; + Tail_String : String(1..20) := "ABCDEFGHIJKLMNOPQRST"; + begin + + Tail(Source => Tail_String, Count => 10, Pad => '-'); + + if Tail_String /= "KLMNOPQRST----------" then + Report.Failed("Incorrect result from Procedure Tail, " & + "default justify, pad = -"); + end if; + + Tail(Tail_String, 6, Justify => Ada.Strings.Center, Pad => 'a'); + + if Tail_String /= "aaaaaaa------aaaaaaa" then + Report.Failed("Incorrect result from Procedure Tail, " & + "justify = center, pad = a"); + end if; + + Tail(Tail_String, 1, Ada.Strings.Right); + + if Tail_String /= " a" then + Report.Failed("Incorrect result from Procedure Tail, " & + "justify = right, default pad"); + end if; + + Tail(Tail_String, 19, Ada.Strings.Right, 'A'); + + if Tail_String /= "A a" then + Report.Failed("Incorrect result from Procedure Tail, " & + "justify = right, pad = A"); + end if; + + end; + + exception + when others => Report.Failed ("Exception raised in Test_Block"); + end Test_Block; + + + Report.Result; + +end CXA4026; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxa4027.a b/gcc/testsuite/ada/acats/tests/cxa/cxa4027.a new file mode 100644 index 000000000..05c66d4cc --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxa4027.a @@ -0,0 +1,342 @@ +-- CXA4027.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 versions of Ada.Strings.Bounded subprograms Translate, +-- (procedure and function), Index, and Count, which use the +-- Maps.Character_Mapping_Function input parameter, produce correct +-- results. +-- +-- TEST DESCRIPTION: +-- This test examines the operation of several subprograms from within +-- the Ada.Strings.Bounded package that use the +-- Character_Mapping_Function mapping parameter to provide a mapping +-- capability. +-- +-- Two functions are defined to provide the mapping. Access values +-- are defined to refer to these functions. One of the functions will +-- map upper case characters in the range 'A'..'Z' to their lower case +-- counterparts, while the other function will map lower case characters +-- ('a'..'z', or a character whose position is in one of the ranges +-- 223..246 or 248..255, provided the character has an upper case form) +-- to their upper case form. +-- +-- Function Index uses the mapping function access value to map the input +-- string prior to searching for the appropriate index value to return. +-- Function Count uses the mapping function access value to map the input +-- string prior to counting the occurrences of the pattern string. +-- Both the Procedure and Function version of Translate use the mapping +-- function access value to perform the translation. +-- +-- +-- CHANGE HISTORY: +-- 16 FEB 95 SAIC Initial prerelease version +-- 17 Jul 95 SAIC Incorporated reviewer comments. Replaced two +-- internally declared functions with two library +-- level functions to eliminate accessibility +-- problems. +-- +--! + + +-- Function CXA4027_0 will return the lower case form of +-- the character input if it is in upper case, and return the input +-- character otherwise. + +with Ada.Characters.Handling; +function CXA4027_0 (From : Character) return Character; + +function CXA4027_0 (From : Character) return Character is +begin + return Ada.Characters.Handling.To_Lower(From); +end CXA4027_0; + + + +-- Function CXA4027_1 will return the upper case form of +-- Characters in the range 'a'..'z', or whose position is in one +-- of the ranges 223..246 or 248..255, provided the character has +-- an upper case form. + +with Ada.Characters.Handling; +function CXA4027_1 (From : Character) return Character; + +function CXA4027_1 (From : Character) return Character is +begin + return Ada.Characters.Handling.To_Upper(From); +end CXA4027_1; + + +with CXA4027_0, CXA4027_1; +with Ada.Strings.Bounded; +with Ada.Strings.Maps; +with Ada.Characters.Handling; +with Report; + +procedure CXA4027 is +begin + + Report.Test ("CXA4027", "Check that Ada.Strings.Bounded subprograms " & + "Translate, Index, and Count, which use the " & + "Character_Mapping_Function input parameter, " & + "produce correct results"); + + Test_Block: + declare + + use Ada.Strings; + + -- Functions used to supply mapping capability. + + function Map_To_Lower_Case (From : Character) return Character + renames CXA4027_0; + + function Map_To_Upper_Case (From : Character) return Character + renames CXA4027_1; + + Map_To_Lower_Case_Ptr : Maps.Character_Mapping_Function := + Map_To_Lower_Case'Access; + + Map_To_Upper_Case_Ptr : Maps.Character_Mapping_Function := + Map_To_Upper_Case'Access; + + + -- Instantiations of Bounded String generic package. + + package BS1 is new Ada.Strings.Bounded.Generic_Bounded_Length(1); + package BS20 is new Ada.Strings.Bounded.Generic_Bounded_Length(20); + package BS40 is new Ada.Strings.Bounded.Generic_Bounded_Length(40); + package BS80 is new Ada.Strings.Bounded.Generic_Bounded_Length(80); + + use type BS1.Bounded_String, BS20.Bounded_String, + BS40.Bounded_String, BS80.Bounded_String; + + String_1 : String(1..1) := "A"; + String_20 : String(1..20) := "ABCDEFGHIJKLMNOPQRST"; + String_40 : String(1..40) := "abcdefghijklmnopqrst" & String_20; + String_80 : String(1..80) := String_40 & String_40; + + BString_1 : BS1.Bounded_String := BS1.Null_Bounded_String; + BString_20 : BS20.Bounded_String := BS20.Null_Bounded_String; + BString_40 : BS40.Bounded_String := BS40.Null_Bounded_String; + BString_80 : BS80.Bounded_String := BS80.Null_Bounded_String; + + + begin + + -- Function Index. + + if BS40.Index(BS40.To_Bounded_String("Package Strings.Bounded"), + Pattern => "s.b", + Going => Ada.Strings.Forward, + Mapping => Map_To_Lower_Case_Ptr) /= 15 or + BS80.Index(BS80.To_Bounded_String("STRING TRANSLATIONS SUBPROGRAMS"), + "tr", + Mapping => Map_To_Lower_Case_Ptr) /= 2 or + BS20.Index(BS20.To_Bounded_String("maximum number"), + "um", + Ada.Strings.Backward, + Map_To_Lower_Case_Ptr) /= 10 or + BS80.Index(BS80.To_Bounded_String("CoMpLeTeLy MiXeD CaSe StRiNg"), + "MIXED CASE STRING", + Ada.Strings.Forward, + Map_To_Upper_Case_Ptr) /= 12 or + BS40.Index(BS40.To_Bounded_String("STRING WITH NO MATCHING PATTERN"), + "WITH", + Ada.Strings.Backward, + Map_To_Lower_Case_Ptr) /= 0 or + BS80.Index(BS80.To_Bounded_String("THIS STRING IS IN UPPER CASE"), + "I", + Ada.Strings.Backward, + Map_To_Upper_Case_Ptr) /= 16 or + BS1.Index(BS1.Null_Bounded_String, + "i", + Mapping => Map_To_Lower_Case_Ptr) /= 0 or + BS40.Index(BS40.To_Bounded_String("AAABBBaaabbb"), + "aabb", + Mapping => Map_To_Lower_Case_Ptr) /= 2 or + BS80.Index(BS80.To_Bounded_String("WOULD MATCH BUT FOR THE CASE"), + "WOULD MATCH BUT FOR THE CASE", + Ada.Strings.Backward, + Map_To_Lower_Case_Ptr) /= 0 + then + Report.Failed("Incorrect results from Function Index, using a " & + "Character Mapping Function parameter"); + end if; + + + -- Function Index, Pattern_Error if Pattern = Null_String + + declare + use BS20; + TC_Natural : Natural := 1000; + begin + TC_Natural := Index(To_Bounded_String("A Valid String"), + "", + Ada.Strings.Forward, + Map_To_Lower_Case_Ptr); + Report.Failed("Pattern_Error not raised by Function Index when " & + "given a null pattern string"); + exception + when Pattern_Error => null; -- OK, expected exception. + when others => + Report.Failed("Incorrect exception raised by Function Index " & + "using a Character_Mapping_Function parameter " & + "when given a null pattern string"); + end; + + + -- Function Count. + + if BS20.Count(BS20.To_Bounded_String("ABABABA"), + Pattern => "aba", + Mapping => Map_To_Lower_Case_Ptr) /= 2 or + BS20.Count(BS20.To_Bounded_String("ABABABA"), + "ABA", + Map_To_Lower_Case_Ptr) /= 0 or + BS40.Count(BS40.To_Bounded_String("This IS a MISmatched issue"), + "is", + Map_To_Lower_Case_Ptr) /= 4 or + BS80.Count(BS80.To_Bounded_String("ABABABA"), + "ABA", + Map_To_Upper_Case_Ptr) /= 2 or + BS40.Count(BS40.To_Bounded_String("This IS a MISmatched issue"), + "is", + Map_To_Upper_Case_Ptr) /= 0 or + BS80.Count(BS80.To_Bounded_String + ("Peter Piper and his Pickled Peppers"), + "p", + Map_To_Lower_Case_Ptr) /= 7 or + BS20.Count(BS20.To_Bounded_String("She sells sea shells"), + "s", + Map_To_Upper_Case_Ptr) /= 0 or + BS80.Count(BS80.To_Bounded_String("No matches what-so-ever"), + "matches", + Map_To_Upper_Case_Ptr) /= 0 + then + Report.Failed("Incorrect results from Function Count, using " & + "a Character_Mapping_Function parameter"); + end if; + + + -- Function Count, Pattern_Error if Pattern = Null_String + + declare + use BS80; + TC_Natural : Natural := 1000; + begin + TC_Natural := Count(To_Bounded_String("A Valid String"), + "", + Map_To_Lower_Case_Ptr); + Report.Failed("Pattern_Error not raised by Function Count using " & + "a Character_Mapping_Function parameter when " & + "given a null pattern string"); + exception + when Pattern_Error => null; -- OK, expected exception. + when others => + Report.Failed("Incorrect exception raised by Function Count " & + "using a Character_Mapping_Function parameter " & + "when given a null pattern string"); + end; + + + -- Function Translate. + + if BS40.Translate(BS40.To_Bounded_String("A Mixed Case String"), + Mapping => Map_To_Lower_Case_Ptr) /= + BS40.To_Bounded_String("a mixed case string") or + + BS20."/="(BS20.Translate(BS20.To_Bounded_String("ALL LOWER CASE"), + Map_To_Lower_Case_Ptr), + "all lower case") or + + BS20."/="("end with lower case", + BS20.Translate( + BS20.To_Bounded_String("end with lower case"), + Map_To_Lower_Case_Ptr)) or + + BS1.Translate(BS1.Null_Bounded_String, + Map_To_Lower_Case_Ptr) /= + BS1.Null_Bounded_String or + + BS80."/="(BS80.Translate(BS80.To_Bounded_String + ("start with lower case, end with upper case"), + Map_To_Upper_Case_Ptr), + "START WITH LOWER CASE, END WITH UPPER CASE") or + + BS40.Translate(BS40.To_Bounded_String("ALL UPPER CASE STRING"), + Map_To_Upper_Case_Ptr) /= + BS40.To_Bounded_String("ALL UPPER CASE STRING") or + + BS80."/="(BS80.Translate(BS80.To_Bounded_String + ("LoTs Of MiXeD CaSe ChArAcTeRs In ThE StRiNg"), + Map_To_Upper_Case_Ptr), + "LOTS OF MIXED CASE CHARACTERS IN THE STRING") + + then + Report.Failed("Incorrect results from Function Translate, using " & + "a Character_Mapping_Function parameter"); + end if; + + + -- Procedure Translate. + + BString_1 := BS1.To_Bounded_String("A"); + + BS1.Translate(Source => BString_1, Mapping => Map_To_Lower_Case_Ptr); + + if not BS1."="(BString_1, "a") then -- "=" for Bounded_String, String + Report.Failed("Incorrect result from Procedure Translate - 1"); + end if; + + BString_20 := BS20.To_Bounded_String(String_20); + BS20.Translate(BString_20, Mapping => Map_To_Lower_Case_Ptr); + + if BString_20 /= BS20.To_Bounded_String("abcdefghijklmnopqrst") then + Report.Failed("Incorrect result from Procedure Translate - 2"); + end if; + + BString_40 := BS40.To_Bounded_String("String needing highlighting"); + BS40.Translate(BString_40, Map_To_Upper_Case_Ptr); + + if not (BString_40 = "STRING NEEDING HIGHLIGHTING") then + Report.Failed("Incorrect result from Procedure Translate - 3"); + end if; + + BString_80 := BS80.Null_Bounded_String; + BS80.Translate(BString_80, Map_To_Upper_Case_Ptr); + + if not (BString_80 = BS80.Null_Bounded_String) then + Report.Failed("Incorrect result from Procedure Translate - 4"); + end if; + + + exception + when others => Report.Failed ("Exception raised in Test_Block"); + end Test_Block; + + Report.Result; + +end CXA4027; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxa4028.a b/gcc/testsuite/ada/acats/tests/cxa/cxa4028.a new file mode 100644 index 000000000..bc6cac14c --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxa4028.a @@ -0,0 +1,331 @@ +-- CXA4028.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.Strings.Bounded procedures Append, Head, Tail, and +-- Trim, and relational operator functions "=", ">", ">=", "<", "<=" +-- with parameter combinations of type String and Bounded_String, +-- produce correct results. +-- +-- TEST DESCRIPTION: +-- This test examines the operation of several subprograms from within +-- the Ada.Strings.Bounded package. Four different instantiations of +-- Ada.Strings.Bounded.Generic_Bounded_Length provide packages defined +-- to manipulate bounded strings of lengths 1, 20, 40, and 80. +-- Examples of the above mentioned procedures and relational operators +-- from each of these instantiations are tested, with results compared +-- against expected output. +-- +-- Testing of the function versions of many of the subprograms tested +-- here is performed in tests CXA4006-CXA4009. +-- +-- +-- CHANGE HISTORY: +-- 16 Feb 95 SAIC Initial prerelease version +-- 10 Mar 95 SAIC Incorporated reviewer comments. +-- 15 Apr 96 SAIC Incorporated reviewer comments for ACVC 2.1. +-- +--! + +with Ada.Exceptions; +with Ada.Strings.Bounded; +with Report; + +procedure CXA4028 is + +begin + + Report.Test ("CXA4028", "Check that Ada.Strings.Bounded procedures " & + "Append, Head, Tail, and Trim, and relational " & + "operator functions =, >, >=, <, <= with " & + "parameter combinations of type String and " & + "Bounded_String, produce correct results"); + + Test_Block: + declare + + use Ada.Exceptions; + use Ada.Strings; + + -- Instantiations of Bounded String generic package. + + package BS1 is new Ada.Strings.Bounded.Generic_Bounded_Length(1); + package BS20 is new Ada.Strings.Bounded.Generic_Bounded_Length(20); + package BS40 is new Ada.Strings.Bounded.Generic_Bounded_Length(40); + package BS80 is new Ada.Strings.Bounded.Generic_Bounded_Length(80); + + use type BS1.Bounded_String, BS20.Bounded_String, + BS40.Bounded_String, BS80.Bounded_String; + + String_1 : String(1..1) := "A"; + String_20 : String(1..20) := "ABCDEFGHIJKLMNOPQRST"; + String_40 : String(1..40) := "abcdefghijklmnopqrst" & String_20; + String_80 : String(1..80) := String_40 & String_40; + + BString_1 : BS1.Bounded_String := BS1.Null_Bounded_String; + BString_20 : BS20.Bounded_String := BS20.Null_Bounded_String; + BString_40 : BS40.Bounded_String := BS40.Null_Bounded_String; + BString_80 : BS80.Bounded_String := BS80.Null_Bounded_String; + + begin + + -- Procedure Append. + + declare + use BS1, BS20; + begin + Append(Source => BString_1, New_Item => To_Bounded_String("A")); + Append(BString_1, "B", Ada.Strings.Left); + Append(BString_1, 'C', Drop => Ada.Strings.Right); -- Drop appended + -- character. + if BString_1 /= To_Bounded_String("B") then + Report.Failed("Incorrect results from BS1 versions of " & + "procedure Append"); + end if; + + Append(BString_20, 'T'); -- Character. + Append(BString_20, "his string"); -- String. + Append(BString_20, + To_Bounded_String(" is complete."), -- Bounded string. + Drop => Ada.Strings.Right); -- Drop 4 characters. + + if BString_20 /= To_Bounded_String("This string is compl") then + Report.Failed("Incorrect results from BS20 versions of " & + "procedure Append"); + end if; + end; + + + -- Operator "=". + + BString_40 := BS40.To_Bounded_String(String_40); + BString_80 := BS80.To_Bounded_String( + BS40.To_String(BString_40) & + BS40.To_String(BString_40)); + + if not (BString_40 = String_40 and -- (Bounded_String, String) + BS80."="(String_80, BString_80)) -- (String, Bounded_String) + then + Report.Failed("Incorrect results from function ""="" with " & + "string - bounded string parameter combinations"); + end if; + + + -- Operator "<". + + BString_1 := BS1.To_Bounded_String("cat", -- string "c" only. + Drop => Ada.Strings.Right); + BString_20 := BS20.To_Bounded_String("Santa Claus"); + + if BString_1 < "C" or -- (Bounded_String, String) + BS1."<"(BString_1,"c") or -- (Bounded_String, String) + "x" < BString_1 or -- (String, Bounded_String) + BString_20 < "Santa " or -- (Bounded_String, String) + "Santa and his Elves" < BString_20 -- (String, Bounded_String) + then + Report.Failed("Incorrect results from function ""<"" with " & + "string - bounded string parameter combinations"); + end if; + + + -- Operator "<=". + + BString_20 := BS20.To_Bounded_String("Sample string"); + + if BString_20 <= "Sample strin" or -- (Bounded_String, String) + "sample string" <= BString_20 or -- (String, Bounded_String) + not("Sample string" <= BString_20) -- (String, Bounded_String) + then + Report.Failed("Incorrect results from function ""<="" with " & + "string - bounded string parameter combinations"); + end if; + + + -- Operator ">". + + BString_40 := BS40.To_Bounded_String("A MUCH LONGER SAMPLE STRING."); + + if BString_40 > "A much longer sample string" or -- (Bnd_Str, Str) + String_20 > BS40.To_Bounded_String(String_40) or -- (Str, Bnd_Str) + BS40.To_Bounded_String("ABCDEFGH") > "abcdefgh" -- (Str, Bnd_Str) + then + Report.Failed("Incorrect results from function "">"" with " & + "string - bounded string parameter combinations"); + end if; + + + -- Operator ">=". + + BString_80 := BS80.To_Bounded_String(String_80); + + if not (BString_80 >= String_80 and + BS80.To_Bounded_String("Programming") >= "PROGRAMMING" and + "test" >= BS80.To_Bounded_String("tess")) + then + Report.Failed("Incorrect results from function "">="" with " & + "string - bounded string parameter combinations"); + end if; + + + -- Procedure Trim + + BString_20 := BS20.To_Bounded_String(" Left Spaces "); + BS20.Trim(Source => BString_20, + Side => Ada.Strings.Left); + + if "Left Spaces " /= BString_20 then + Report.Failed("Incorrect results from Procedure Trim with " & + "Side = Left"); + end if; + + BString_40 := BS40.To_Bounded_String(" Right Spaces "); + BS40.Trim(BString_40, Side => Ada.Strings.Right); + + if BString_40 /= " Right Spaces" then + Report.Failed("Incorrect results from Procedure Trim with " & + "Side = Right"); + end if; + + BString_20 := BS20.To_Bounded_String(" Both Sides "); + BS20.Trim(BString_20, Ada.Strings.Both); + + if BString_20 /= BS20.To_Bounded_String("Both Sides") then + Report.Failed("Incorrect results from Procedure Trim with " & + "Side = Both"); + end if; + + BString_80 := BS80.To_Bounded_String("Centered Spaces"); + BS80.Trim(BString_80, Ada.Strings.Both); + + if BString_80 /= BS80.To_Bounded_String("Centered Spaces") then + Report.Failed("Incorrect results from Procedure Trim with " & + "no blank spaces on the ends of the string"); + end if; + + + -- Procedure Head + + BString_40 := BS40.To_Bounded_String("Test String"); + BS40.Head(Source => BString_40, + Count => 4); -- Count < Source'Length + + if BString_40 /= BS40.To_Bounded_String("Test") then + Report.Failed("Incorrect results from Procedure Head with " & + "the Count parameter less than Source'Length"); + end if; + + BString_1 := BS1.To_Bounded_String("X"); + BS1.Head(BString_1, BS1.Length(BString_1)); -- Count = Source'Length + + if BString_1 /= "X" then + Report.Failed("Incorrect results from Procedure Head with " & + "the Count parameter equal to Source'Length"); + end if; + + BString_20 := BS20.To_Bounded_String("Sample string"); + BS20.Head(BString_20, + Count => BS20.Max_Length, -- Count > Source'Length + Pad => '*'); + + if BString_20 /= BS20.To_Bounded_String("Sample string*******") then + Report.Failed("Incorrect results from Procedure Head with " & + "the Count parameter greater than Source'Length"); + end if; + + BString_20 := BS20.To_Bounded_String("Twenty Characters 20"); + BS20.Head(BString_20, 22, Pad => '*', Drop => Ada.Strings.Left); + + if BString_20 /= "enty Characters 20**" then + Report.Failed("Incorrect results from Procedure Head with " & + "the Count parameter greater than Source'Length, " & + "and the Drop parameter = Left"); + end if; + + BString_20 := BS20.To_Bounded_String("Short String"); + BS20.Head(BString_20, 23, '-', Ada.Strings.Right); + + if ("Short String--------") /= BString_20 then + Report.Failed("Incorrect results from Procedure Head with " & + "the Count parameter greater than Source'Length, " & + "and the Drop parameter = Right"); + end if; + + + -- Procedure Tail + + BString_40 := BS40.To_Bounded_String("Test String"); + BS40.Tail(Source => BString_40, + Count => 6); -- Count < Source'Length + + if BString_40 /= BS40.To_Bounded_String("String") then + Report.Failed("Incorrect results from Procedure Tail with " & + "the Count parameter less than Source'Length"); + end if; + + BString_1 := BS1.To_Bounded_String("X"); + BS1.Tail(BString_1, BS1.Length(BString_1)); -- Count = Source'Length + + if BString_1 /= "X" then + Report.Failed("Incorrect results from Procedure Tail with " & + "the Count parameter equal to Source'Length"); + end if; + + BString_20 := BS20.To_Bounded_String("Sample string"); + BS20.Tail(BString_20, + Count => BS20.Max_Length, -- Count > Source'Length + Pad => '*'); + + if BString_20 /= BS20.To_Bounded_String("*******Sample string") then + Report.Failed("Incorrect results from Procedure Tail with " & + "the Count parameter greater than Source'Length"); + end if; + + BString_20 := BS20.To_Bounded_String("Twenty Characters"); -- Len = 17 + BS20.Tail(BString_20, 22, Pad => '*', Drop => Ada.Strings.Left); + + if BString_20 /= "***Twenty Characters" then + Report.Failed("Incorrect results from Procedure Tail with " & + "the Count parameter greater than Source'Length, " & + "and the Drop parameter = Left"); + end if; + + BString_20 := BS20.To_Bounded_String("Maximum Length Chars"); + BS20.Tail(BString_20, 23, '-', Ada.Strings.Right); + + if ("---Maximum Length Ch") /= BString_20 then + Report.Failed("Incorrect results from Procedure Tail with " & + "the Count parameter greater than Source'Length, " & + "and the Drop parameter = Right"); + end if; + + exception + when The_Error : others => + Report.Failed ("The following exception was raised in the " & + "Test_Block: " & Exception_Name(The_Error)); + end Test_Block; + + Report.Result; + +end CXA4028; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxa4029.a b/gcc/testsuite/ada/acats/tests/cxa/cxa4029.a new file mode 100644 index 000000000..714067454 --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxa4029.a @@ -0,0 +1,333 @@ +-- CXA4029.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 functionality found in packages Ada.Strings.Wide_Maps, +-- Ada.Strings.Wide_Bounded, and Ada.Strings.Wide_Maps.Wide_Constants +-- is available and produces correct results. +-- +-- TEST DESCRIPTION: +-- This test tests the subprograms found in the +-- Ada.Strings.Wide_Bounded package. It is based on the tests +-- CXA4027-28, which are tests for the complementary "non-wide" +-- packages. +-- +-- The functions found in CXA4029_0 provide mapping capability, when +-- used in conjunction with Wide_Character_Mapping_Function objects. +-- +-- +-- CHANGE HISTORY: +-- 23 Jun 95 SAIC Initial prerelease version. +-- 18 Apr 96 SAIC Incorporated reviewer comments for ACVC 2.1. +-- +--! + +package CXA4029_0 is + -- Functions used to supply mapping capability. + function Map_To_Lower_Case (From : Wide_Character) return Wide_Character; + function Map_To_Upper_Case (From : Wide_Character) return Wide_Character; +end CXA4029_0; + +with Ada.Characters.Handling; +package body CXA4029_0 is + -- Function Map_To_Lower_Case will return the lower case form of + -- Wide_Characters in the range 'A'..'Z' only, and return the input + -- wide_character otherwise. + + function Map_To_Lower_Case (From : Wide_Character) + return Wide_Character is + begin + return Ada.Characters.Handling.To_Wide_Character( + Ada.Characters.Handling.To_Lower( + Ada.Characters.Handling.To_Character(From))); + end Map_To_Lower_Case; + + -- Function Map_To_Upper_Case will return the upper case form of + -- Wide_Characters in the range 'a'..'z', or whose position is in one + -- of the ranges 223..246 or 248..255, provided the wide_character has + -- an upper case form. + + function Map_To_Upper_Case (From : Wide_Character) + return Wide_Character is + begin + return Ada.Characters.Handling.To_Wide_Character( + Ada.Characters.Handling.To_Upper( + Ada.Characters.Handling.To_Character(From))); + end Map_To_Upper_Case; + +end CXA4029_0; + + +with CXA4029_0; +with Report; +with Ada.Characters.Handling; +with Ada.Characters.Latin_1; +with Ada.Strings; +with Ada.Strings.Wide_Maps; +with Ada.Strings.Wide_Maps.Wide_Constants; +with Ada.Strings.Wide_Fixed; +with Ada.Strings.Wide_Bounded; + +procedure CXA4029 is +begin + Report.Test ("CXA4029", + "Check that subprograms defined in package " & + "Ada.Strings.Wide_Bounded produce correct results"); + + Test_Block: + declare + + package ACL1 renames Ada.Characters.Latin_1; + package BS1 is new Ada.Strings.Wide_Bounded.Generic_Bounded_Length(1); + package BS20 is new Ada.Strings.Wide_Bounded.Generic_Bounded_Length(20); + package BS40 is new Ada.Strings.Wide_Bounded.Generic_Bounded_Length(40); + package BS80 is new Ada.Strings.Wide_Bounded.Generic_Bounded_Length(80); + + subtype LC_Characters is Wide_Character range 'a'..'z'; + + use Ada.Characters, Ada.Strings; + use type Wide_Maps.Wide_Character_Set; + use type BS1.Bounded_Wide_String, BS20.Bounded_Wide_String, + BS40.Bounded_Wide_String, BS80.Bounded_Wide_String; + + TC_String : constant Wide_String := "A Standard String"; + + BString_1 : BS1.Bounded_Wide_String := + BS1.Null_Bounded_Wide_String; + BString_20 : BS20.Bounded_Wide_String := + BS20.Null_Bounded_Wide_String; + BString_40 : BS40.Bounded_Wide_String := + BS40.Null_Bounded_Wide_String; + BString_80 : BS80.Bounded_Wide_String := + BS80.Null_Bounded_Wide_String; + String_20 : Wide_String(1..20) := "ABCDEFGHIJKLMNOPQRST"; + String_40 : Wide_String(1..40) := "abcdefghijklmnopqrst" & + String_20; + String_80 : Wide_String(1..80) := String_40 & String_40; + TC_String_5 : Wide_String(1..5) := "ABCDE"; + + -- The following strings are used in examination of the Translation + -- subprograms. + New_Character_String : Wide_String(1..10) := + Handling.To_Wide_String( + ACL1.LC_A_Grave & ACL1.LC_A_Ring & ACL1.LC_AE_Diphthong & + ACL1.LC_C_Cedilla & ACL1.LC_E_Acute & ACL1.LC_I_Circumflex & + ACL1.LC_Icelandic_Eth & ACL1.LC_N_Tilde & + ACL1.LC_O_Oblique_Stroke & ACL1.LC_Icelandic_Thorn); + + TC_New_Character_String : Wide_String(1..10) := + Handling.To_Wide_String( + ACL1.UC_A_Grave & ACL1.UC_A_Ring & ACL1.UC_AE_Diphthong & + ACL1.UC_C_Cedilla & ACL1.UC_E_Acute & ACL1.UC_I_Circumflex & + ACL1.UC_Icelandic_Eth & ACL1.UC_N_Tilde & + ACL1.UC_O_Oblique_Stroke & ACL1.UC_Icelandic_Thorn); + + -- Access objects that will be provided as parameters to the + -- subprograms. + Map_To_Lower_Case_Ptr : Wide_Maps.Wide_Character_Mapping_Function := + CXA4029_0.Map_To_Lower_Case'Access; + Map_To_Upper_Case_Ptr : Wide_Maps.Wide_Character_Mapping_Function := + CXA4029_0.Map_To_Upper_Case'Access; + + begin + + -- Testing of functionality found in Package Ada.Strings.Wide_Bounded. + -- + -- Function Index. + + if BS80.Index(BS80.To_Bounded_Wide_String("CoMpLeTeLy MiXeD CaSe"), + "MIXED CASE", + Ada.Strings.Forward, + Map_To_Upper_Case_Ptr) /= 12 or + BS1.Index(BS1.Null_Bounded_Wide_String, + "i", + Mapping => Map_To_Lower_Case_Ptr) /= 0 + then + Report.Failed("Incorrect results from BND Function Index, going " & + "in Forward direction, using a Character Mapping " & + "Function parameter"); + end if; + + -- Function Count. + if BS40.Count(BS40.To_Bounded_Wide_String("This IS a MISmatched issue"), + "is", + Map_To_Lower_Case_Ptr) /= 4 or + BS80.Count(BS80.To_Bounded_Wide_String("ABABABA"), + "ABA", + Map_To_Upper_Case_Ptr) /= 2 + then + Report.Failed("Incorrect results from BND Function Count, using " & + "a Character_Mapping_Function parameter"); + end if; + + -- Function Translate. + if BS40.Translate(BS40.To_Bounded_Wide_String("A Mixed Case String"), + Mapping => Map_To_Lower_Case_Ptr) /= + BS40.To_Bounded_Wide_String("a mixed case string") or + BS20."/="("end with lower case", + BS20.Translate( + BS20.To_Bounded_Wide_String("end with lower case"), + Map_To_Lower_Case_Ptr)) + then + Report.Failed("Incorrect results from BND Function Translate, " & + "using a Character_Mapping_Function parameter"); + end if; + + -- Procedure Translate. + BString_20 := BS20.To_Bounded_Wide_String(String_20); + BS20.Translate(BString_20, Mapping => Map_To_Lower_Case_Ptr); + if BString_20 /= BS20.To_Bounded_Wide_String("abcdefghijklmnopqrst") + then + Report.Failed("Incorrect result from BND Procedure Translate - 1"); + end if; + + BString_80 := BS80.Null_Bounded_Wide_String; + BS80.Translate(BString_80, Map_To_Upper_Case_Ptr); + if not (BString_80 = BS80.Null_Bounded_Wide_String) then + Report.Failed("Incorrect result from BND Procedure Translate - 2"); + end if; + + -- Procedure Append. + declare + use BS20; + begin + BString_20 := BS20.Null_Bounded_Wide_String; + Append(BString_20, 'T'); + Append(BString_20, "his string"); + Append(BString_20, + To_Bounded_Wide_String(" is complete."), + Drop => Ada.Strings.Right); -- Drop 4 characters. + if BString_20 /= To_Bounded_Wide_String("This string is compl") then + Report.Failed("Incorrect results from BS20 versions of " & + "procedure Append"); + end if; + exception + when others => Report.Failed("Exception raised in block checking " & + "BND Procedure Append"); + end; + + -- Operator "=". + BString_40 := BS40.To_Bounded_Wide_String(String_40); + BString_80 := BS80.To_Bounded_Wide_String( + BS40.To_Wide_String(BString_40) & + BS40.To_Wide_String(BString_40)); + if not (BString_40 = String_40 and + BS80."="(String_80, BString_80)) then + Report.Failed("Incorrect results from BND Function ""="" with " & + "string - bounded string parameter combinations"); + end if; + + -- Operator "<". + BString_1 := BS1.To_Bounded_Wide_String("cat", + Drop => Ada.Strings.Right); + BString_20 := BS20.To_Bounded_Wide_String("Santa Claus"); + if BString_1 < "C" or + BS1."<"(BString_1,"c") or + BS1."<"("x", BString_1) or + BS20."<"(BString_20,"Santa ") or + BS20."<"("Santa and his Elves", BString_20) + then + Report.Failed("Incorrect results from BND Function ""<"" with " & + "string - bounded string parameter combinations"); + end if; + + -- Operator "<=". + BString_20 := BS20.To_Bounded_Wide_String("Sample string"); + if BS20."<="(BString_20,"Sample strin") or + not(BS20."<="("Sample string",BString_20)) + then + Report.Failed("Incorrect results from BND Function ""<="" with " & + "string - bounded string parameter combinations"); + end if; + + -- Operator ">". + BString_40 := BS40.To_Bounded_Wide_String( + "A MUCH LONGER SAMPLE STRING."); + if BString_40 > "A much longer sample string" or + BS40.To_Bounded_Wide_String("ABCDEFGH") > "abcdefgh" + then + Report.Failed("Incorrect results from BND Function "">"" with " & + "string - bounded string parameter combinations"); + end if; + + -- Operator ">=". + BString_80 := BS80.To_Bounded_Wide_String(String_80); + if not (BString_80 >= String_80 and + BS80.To_Bounded_Wide_String("Programming") >= "PROGRAMMING" and + BS80.">="("test", BS80.To_Bounded_Wide_String("tess"))) + then + Report.Failed("Incorrect results from BND Function "">="" with " & + "string - bounded string parameter combinations"); + end if; + + -- Procedure Trim + BString_20 := BS20.To_Bounded_Wide_String(" Both Sides "); + BS20.Trim(BString_20, Ada.Strings.Both); + if BString_20 /= BS20.To_Bounded_Wide_String("Both Sides") then + Report.Failed("Incorrect results from BND Procedure Trim with " & + "Side = Both"); + end if; + + -- Procedure Head + BString_40 := BS40.To_Bounded_Wide_String("Test String"); + BS40.Head(Source => BString_40, + Count => 4); -- Count < Source'Length + if BString_40 /= BS40.To_Bounded_Wide_String("Test") then + Report.Failed("Incorrect results from BND Procedure Head with " & + "the Count parameter less than Source'Length"); + end if; + + BString_20 := BS20.To_Bounded_Wide_String("Short String"); + BS20.Head(BString_20, 23, '-', Ada.Strings.Right); + if BS20.To_Bounded_Wide_String("Short String--------") /= BString_20 then + Report.Failed("Incorrect results from BND Procedure Head with " & + "the Count parameter greater than Source'Length, " & + "and the Drop parameter = Right"); + end if; + + -- Procedure Tail + BString_40 := BS40.To_Bounded_Wide_String("Test String"); + BS40.Tail(Source => BString_40, + Count => 6); + if BString_40 /= BS40.To_Bounded_Wide_String("String") then + Report.Failed("Incorrect results from BND Procedure Tail with " & + "the Count parameter less than Source'Length"); + end if; + + BString_20 := BS20.To_Bounded_Wide_String("Maximum Length Chars"); + BS20.Tail(BString_20, 23, '-', Ada.Strings.Right); + if BS20.To_Bounded_Wide_String("---Maximum Length Ch") /= BString_20 then + Report.Failed("Incorrect results from BND Procedure Tail with " & + "the Count parameter greater than Source'Length, " & + "and the Drop parameter = Right"); + end if; + + exception + when others => Report.Failed ("Exception raised in Test_Block"); + end Test_Block; + + Report.Result; + +end CXA4029; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxa4030.a b/gcc/testsuite/ada/acats/tests/cxa/cxa4030.a new file mode 100644 index 000000000..475d00899 --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxa4030.a @@ -0,0 +1,414 @@ +-- CXA4030.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.Strings.Unbounded versions of subprograms Translate +-- (procedure and function), Index, and Count, which use a +-- Maps.Character_Mapping_Function input parameter, produce correct +-- results. +-- +-- TEST DESCRIPTION: +-- This test examines the operation of the four subprograms contained +-- in the Ada.Strings.Unbounded package that use a +-- Character_Mapping_Function parameter to provide the mapping +-- capability. +-- Two Character_Mapping_Function objects are defined that reference +-- subprograms contained in the Ada.Characters.Handling package; +-- To_Lower will return the lower-case form of the character provided +-- as the input parameter, To_Upper will return the upper-case form +-- of the character input parameter (provided there is an upper-case +-- form). +-- In several instances in this test, the character handling functions +-- are referenced directly in the parameter list of the subprograms +-- under test, demonstrating another form of expected common usage. +-- +-- Results of all subprograms are compared with expected results. +-- +-- This test, when taken in conjunction with tests CXA4010, CXA4011, +-- CXA4031, and CXA4032 will constitute a test of all the functionality +-- contained in package Ada.Strings.Unbounded. This test uses a variety +-- of the subprograms defined in the unbounded string package in ways +-- typical of common usage. +-- +-- +-- CHANGE HISTORY: +-- 21 Feb 95 SAIC Initial prerelease version +-- 21 Apr 95 SAIC Modified header commentary. +-- +--! + +with Ada.Strings.Unbounded; +with Ada.Strings.Maps; +with Ada.Characters.Handling; +with Ada.Characters.Latin_1; +with Report; + +procedure CXA4030 is + +begin + + Report.Test ("CXA4030", "Check that Ada.Strings.Unbounded versions " & + "of subprograms Translate (procedure and " & + "function), Index, and Count, which use a " & + "Maps.Character_Mapping_Function input " & + "parameter, produce correct results"); + + Test_Block: + declare + + package Unb renames Ada.Strings.Unbounded; + use type Unb.Unbounded_String; + use Ada.Strings; + use Ada.Characters; + + + -- The following strings are used in examination of the Translation + -- subprograms. + + New_Character_String : Unb.Unbounded_String := + Unb.To_Unbounded_String( + Latin_1.LC_A_Grave & + Latin_1.LC_A_Ring & + Latin_1.LC_AE_Diphthong & + Latin_1.LC_C_Cedilla & + Latin_1.LC_E_Acute & + Latin_1.LC_I_Circumflex & + Latin_1.LC_Icelandic_Eth & + Latin_1.LC_N_Tilde & + Latin_1.LC_O_Oblique_Stroke & + Latin_1.LC_Icelandic_Thorn); + + + TC_New_Character_String : Unb.Unbounded_String := + Unb.To_Unbounded_String( + Latin_1.UC_A_Grave & + Latin_1.UC_A_Ring & + Latin_1.UC_AE_Diphthong & + Latin_1.UC_C_Cedilla & + Latin_1.UC_E_Acute & + Latin_1.UC_I_Circumflex & + Latin_1.UC_Icelandic_Eth & + Latin_1.UC_N_Tilde & + Latin_1.UC_O_Oblique_Stroke & + Latin_1.UC_Icelandic_Thorn); + + + -- In this test, access objects are defined to refer to two functions + -- from the Ada.Characters.Handling package. These access objects + -- will be provided as parameters to the subprograms under test. + -- Note: There will be several examples in this test of these character + -- handling functions being referenced directly within the + -- parameter list of the subprograms under test. + + Map_To_Lower_Case_Ptr : Maps.Character_Mapping_Function := + Handling.To_Lower'Access; + + Map_To_Upper_Case_Ptr : Maps.Character_Mapping_Function := + Handling.To_Upper'Access; + + begin + + -- Function Index, Forward direction search. + -- Note: Several of the following cases use the default value + -- Forward for the Going parameter. + + if Unb.Index(Source => Unb.To_Unbounded_String( + "The library package Strings.Unbounded"), + Pattern => "unb", + Going => Ada.Strings.Forward, + Mapping => Map_To_Lower_Case_Ptr) /= 29 or + + Unb.Index(Unb.To_Unbounded_String( + "THE RAIN IN SPAIN FALLS MAINLY ON THE PLAIN"), + "ain", + Mapping => Map_To_Lower_Case_Ptr) /= 6 or + + Unb.Index(Unb.To_Unbounded_String("maximum number"), + "um", + Ada.Strings.Forward, + Handling.To_Lower'Access) /= 6 or + + Unb.Index(Unb.To_Unbounded_String("CoMpLeTeLy MiXeD CaSe StRiNg"), + "MIXED CASE STRING", + Ada.Strings.Forward, + Map_To_Upper_Case_Ptr) /= 12 or + + Unb.Index(Unb.To_Unbounded_String( + "STRING WITH NO MATCHING PATTERNS"), + "WITH", + Mapping => Map_To_Lower_Case_Ptr) /= 0 or + + Unb.Index(Unb.To_Unbounded_String("THIS STRING IS IN UPPER CASE"), + "IS", + Ada.Strings.Forward, + Handling.To_Upper'Access) /= 3 or + + Unb.Index(Unb.Null_Unbounded_String, + "is", + Mapping => Map_To_Lower_Case_Ptr) /= 0 or + + Unb.Index(Unb.To_Unbounded_String("AAABBBaaabbb"), + "aabb", + Mapping => Handling.To_Lower'Access) /= 2 + then + Report.Failed("Incorrect results from Function Index, going " & + "in Forward direction, using a Character Mapping " & + "Function parameter"); + end if; + + + + -- Function Index, Backward direction search. + + if Unb.Index(Unb.To_Unbounded_String("Case of a Mixed Case String"), + "case", + Ada.Strings.Backward, + Map_To_Lower_Case_Ptr) /= 17 or + + Unb.Index(Unb.To_Unbounded_String("Case of a Mixed Case String"), + "CASE", + Ada.Strings.Backward, + Mapping => Map_To_Upper_Case_Ptr) /= 17 or + + Unb.Index(Unb.To_Unbounded_String("rain, Rain, and more RAIN"), + "rain", + Ada.Strings.Backward, + Handling.To_Lower'Access) /= 22 or + + Unb.Index(Unb.To_Unbounded_String("RIGHT place, right time"), + "RIGHT", + Ada.Strings.Backward, + Handling.To_Upper'Access) /= 14 or + + Unb.Index(Unb.To_Unbounded_String("WOULD MATCH BUT FOR THE CASE"), + "WOULD MATCH BUT FOR THE CASE", + Going => Ada.Strings.Backward, + Mapping => Map_To_Lower_Case_Ptr) /= 0 + then + Report.Failed("Incorrect results from Function Index, going " & + "in Backward direction, using a Character Mapping " & + "Function parameter"); + end if; + + + + -- Function Index, Pattern_Error if Pattern = Null_String + + declare + use Unbounded; + Null_String : constant String := ""; + TC_Natural : Natural := 1000; + begin + TC_Natural := Index(To_Unbounded_String("A Valid Unbounded String"), + Null_String, + Going => Ada.Strings.Forward, + Mapping => Handling.To_Lower'Access); + Report.Failed("Pattern_Error not raised by Function Index when " & + "given a null pattern string"); + exception + when Pattern_Error => null; -- OK, expected exception. + when others => + Report.Failed("Incorrect exception raised by Function Index " & + "using a Character Mapping Function parameter " & + "when given a null pattern string"); + end; + + + + -- Function Count. + + if Unb.Count(Source => Unb.To_Unbounded_String("ABABABA"), + Pattern => "aba", + Mapping => Map_To_Lower_Case_Ptr) /= 2 or + + Unb.Count(Unb.To_Unbounded_String("ABABABA"), + "ABA", + Mapping => Map_To_Lower_Case_Ptr) /= 0 or + + Unb.Count(Unb.To_Unbounded_String("This IS a MISmatched issue"), + "is", + Handling.To_Lower'Access) /= 4 or + + Unb.Count(Unb.To_Unbounded_String("ABABABA"), + "ABA", + Map_To_Upper_Case_Ptr) /= 2 or + + Unb.Count(Unb.To_Unbounded_String("This IS a MISmatched issue"), + "is", + Mapping => Map_To_Upper_Case_Ptr) /= 0 or + + Unb.Count(Unb.To_Unbounded_String( + "She sells sea shells by the sea shore"), + "s", + Handling.To_Lower'Access) /= 8 or + + Unb.Count(Unb.Null_Unbounded_String, + "match", + Map_To_Upper_Case_Ptr) /= 0 + then + Report.Failed("Incorrect results from Function Count, using " & + "a Character Mapping Function parameter"); + end if; + + + + -- Function Count, Pattern_Error if Pattern = Null_String + + declare + use Ada.Strings.Unbounded; + Null_Pattern_String : constant String := ""; + TC_Natural : Natural := 1000; + begin + TC_Natural := Count(To_Unbounded_String("A Valid String"), + Null_Pattern_String, + Map_To_Lower_Case_Ptr); + Report.Failed("Pattern_Error not raised by Function Count using " & + "a Character Mapping Function parameter when " & + "given a null pattern string"); + exception + when Pattern_Error => null; -- OK, expected exception. + when others => + Report.Failed("Incorrect exception raised by Function Count " & + "using a Character Mapping Function parameter " & + "when given a null pattern string"); + end; + + + + -- Function Translate. + + if Unb.Translate(Source => Unb.To_Unbounded_String( + "A Sample Mixed Case String"), + Mapping => Map_To_Lower_Case_Ptr) /= + Unb.To_Unbounded_String("a sample mixed case string") or + + Unb.Translate(Unb.To_Unbounded_String("ALL LOWER CASE"), + Handling.To_Lower'Access) /= + Unb.To_Unbounded_String("all lower case") or + + Unb.Translate(Unb.To_Unbounded_String("end with lower case"), + Map_To_Lower_Case_Ptr) /= + Unb.To_Unbounded_String("end with lower case") or + + Unb.Translate(Unb.Null_Unbounded_String, + Handling.To_Lower'Access) /= + Unb.Null_Unbounded_String or + + Unb.Translate(Unb.To_Unbounded_String("start with lower case"), + Map_To_Upper_Case_Ptr) /= + Unb.To_Unbounded_String("START WITH LOWER CASE") or + + Unb.Translate(Unb.To_Unbounded_String("ALL UPPER CASE STRING"), + Handling.To_Upper'Access) /= + Unb.To_Unbounded_String("ALL UPPER CASE STRING") or + + Unb.Translate(Unb.To_Unbounded_String( + "LoTs Of MiXeD CaSe ChArAcTeRs"), + Map_To_Upper_Case_Ptr) /= + Unb.To_Unbounded_String("LOTS OF MIXED CASE CHARACTERS") or + + Unb.Translate(New_Character_String, + Handling.To_Upper'Access) /= + TC_New_Character_String + + then + Report.Failed("Incorrect results from Function Translate, using " & + "a Character Mapping Function parameter"); + end if; + + + + -- Procedure Translate. + + declare + + use Ada.Strings.Unbounded; + use Ada.Characters.Handling; + + Str_1 : Unbounded_String := + To_Unbounded_String("AN ALL UPPER CASE STRING"); + Str_2 : Unbounded_String := + To_Unbounded_String("A Mixed Case String"); + Str_3 : Unbounded_String := + To_Unbounded_String("a string with lower case letters"); + TC_Str_1 : constant Unbounded_String := Str_1; + TC_Str_3 : constant Unbounded_String := Str_3; + + begin + + Translate(Source => Str_1, Mapping => Map_To_Lower_Case_Ptr); + + if Str_1 /= To_Unbounded_String("an all upper case string") then + Report.Failed("Incorrect result from Procedure Translate - 1"); + end if; + + Translate(Source => Str_1, Mapping => Map_To_Upper_Case_Ptr); + + if Str_1 /= TC_Str_1 then + Report.Failed("Incorrect result from Procedure Translate - 2"); + end if; + + Translate(Str_2, Mapping => Map_To_Lower_Case_Ptr); + + if Str_2 /= To_Unbounded_String("a mixed case string") then + Report.Failed("Incorrect result from Procedure Translate - 3"); + end if; + + Translate(Str_2, Mapping => To_Upper'Access); + + if Str_2 /= To_Unbounded_String("A MIXED CASE STRING") then + Report.Failed("Incorrect result from Procedure Translate - 4"); + end if; + + Translate(Str_3, To_Lower'Access); + + if Str_3 /= TC_Str_3 then + Report.Failed("Incorrect result from Procedure Translate - 5"); + end if; + + Translate(Str_3, To_Upper'Access); + + if Str_3 /= + To_Unbounded_String("A STRING WITH LOWER CASE LETTERS") + then + Report.Failed("Incorrect result from Procedure Translate - 6"); + end if; + + Translate(New_Character_String, Map_To_Upper_Case_Ptr); + + if New_Character_String /= TC_New_Character_String then + Report.Failed("Incorrect result from Procedure Translate - 6"); + end if; + + end; + + + exception + when others => Report.Failed ("Exception raised in Test_Block"); + end Test_Block; + + Report.Result; + +end CXA4030; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxa4031.a b/gcc/testsuite/ada/acats/tests/cxa/cxa4031.a new file mode 100644 index 000000000..91bc68ce6 --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxa4031.a @@ -0,0 +1,291 @@ +-- CXA4031.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 subprograms defined in package Ada.Strings.Unbounded +-- are available, and that they produce correct results. Specifically, +-- check the functions To_Unbounded_String (version with Length +-- parameter), "=", "<", "<=", ">", ">=" (all with String-Unbounded +-- String parameter mix), as well as three versions of Procedure Append. +-- +-- TEST DESCRIPTION: +-- This test demonstrates the uses of many of the subprograms defined +-- in package Ada.Strings.Unbounded for use with unbounded strings. +-- The test simulates how unbounded strings could be processed in a +-- user environment, using the subprograms provided in this package. +-- +-- This test, when taken in conjunction with tests CXA4010, CXA4011, +-- CXA4030, and CXA4032 will constitute a test of all the functionality +-- contained in package Ada.Strings.Unbounded. This test uses a variety +-- of the subprograms defined in the unbounded string package in ways +-- typical of common usage. +-- +-- +-- CHANGE HISTORY: +-- 27 Feb 95 SAIC Initial prerelease version. +-- 18 Apr 96 SAIC Incorporated reviewer comments for ACVC 2.1. +-- +--! + +with Report; +with Ada.Exceptions; +with Ada.Strings.Maps; +with Ada.Strings.Unbounded; + +procedure CXA4031 is +begin + + Report.Test ("CXA4031", "Check that the subprograms defined in " & + "package Ada.Strings.Unbounded are available, " & + "and that they produce correct results"); + + Test_Block: + declare + + package Unb renames Ada.Strings.Unbounded; + use Unb; + use Ada.Exceptions; + + subtype LC_Characters is Character range 'a'..'z'; + + Null_String : constant String := ""; + TC_String : constant String := "A Standard String"; + + TC_Unb_String, + TC_New_Unb_String : Unb.Unbounded_String := Unb.Null_Unbounded_String; + + begin + + -- Function To_Unbounded_String (version with Length parameter) + -- returns an unbounded string that represents an uninitialized String + -- whose length is Length. + -- Note: Unbounded_String length can vary conceptually between 0 and + -- Natural'Last. + + if Unb.Length(Unb.To_Unbounded_String(Length => 10)) /= 10 or + Unb.Length(Unb.To_Unbounded_String(1)) /= 1 or + Unb.Length(Unb.To_Unbounded_String(0)) /= 0 or + Unb.Length(Unb."&"(Unb.To_Unbounded_String(Length => 10), + Unb."&"(Unb.To_Unbounded_String(1), + Unb.To_Unbounded_String(0) ))) /= 10+1+0 + then + Report.Failed + ("Incorrect results from Function To_Unbounded_String with " & + "Length parameter"); + end if; + + + -- Procedure Append (Unbounded - Unbounded) + -- Note: For each of the Append procedures, the resulting string + -- represented by the Source parameter is given by the + -- concatenation of the original value of Source and the value + -- of New_Item. + + TC_Unb_String := Unb.To_Unbounded_String("Sample string of length L"); + TC_New_Unb_String := Unb.To_Unbounded_String(" and then some"); + + Unb.Append(Source => TC_Unb_String, New_Item => TC_New_Unb_String); + + if TC_Unb_String /= + Unb.To_Unbounded_String("Sample string of length L and then some") + then + Report.Failed("Incorrect results from Procedure Append with " & + "unbounded string parameters - 1"); + end if; + + + TC_Unb_String := Unb.To_Unbounded_String("Sample string of length L"); + TC_New_Unb_String := Unb.Null_Unbounded_String; + + Unb.Append(TC_Unb_String, TC_New_Unb_String); + + if TC_Unb_String /= + Unb.To_Unbounded_String("Sample string of length L") + then + Report.Failed("Incorrect results from Procedure Append with " & + "unbounded string parameters - 2"); + end if; + + + TC_Unb_String := Unb.Null_Unbounded_String; + + Unb.Append(TC_Unb_String, + Unb.To_Unbounded_String("New Unbounded String")); + + if TC_Unb_String /= + Unb.To_Unbounded_String("New Unbounded String") + then + Report.Failed("Incorrect results from Procedure Append with " & + "unbounded string parameters - 3"); + end if; + + + -- Procedure Append (Unbounded - String) + + TC_Unb_String := Unb.To_Unbounded_String("An Unbounded String and "); + + Unb.Append(Source => TC_Unb_String, New_Item => TC_String); + + if TC_Unb_String /= + Unb.To_Unbounded_String("An Unbounded String and A Standard String") + then + Report.Failed("Incorrect results from Procedure Append with " & + "an unbounded string parameter and a string " & + "parameter - 1"); + end if; + + + TC_Unb_String := Unb.To_Unbounded_String("An Unbounded String"); + + Unb.Append(TC_Unb_String, New_Item => Null_String); + + if TC_Unb_String /= + Unb.To_Unbounded_String("An Unbounded String") + then + Report.Failed("Incorrect results from Procedure Append with " & + "an unbounded string parameter and a string " & + "parameter - 2"); + end if; + + + TC_Unb_String := Unb.Null_Unbounded_String; + + Unb.Append(TC_Unb_String, TC_String); + + if TC_Unb_String /= Unb.To_Unbounded_String("A Standard String") then + Report.Failed("Incorrect results from Procedure Append with " & + "an unbounded string parameter and a string " & + "parameter - 3"); + end if; + + + -- Procedure Append (Unbounded - Character) + + TC_Unb_String := Unb.To_Unbounded_String("Lower Case = "); + + for i in LC_Characters'Range loop + Unb.Append(Source => TC_Unb_String, New_Item => LC_Characters(i)); + end loop; + + if TC_Unb_String /= + Unb.To_Unbounded_String("Lower Case = abcdefghijklmnopqrstuvwxyz") + then + Report.Failed("Incorrect results from Procedure Append with " & + "an unbounded string parameter and a character " & + "parameter - 1"); + end if; + + + TC_Unb_String := Unb.Null_Unbounded_String; + + Unb.Append(TC_Unb_String, New_Item => 'a'); + + if TC_Unb_String /= Unb.To_Unbounded_String("a") then + Report.Failed("Incorrect results from Procedure Append with " & + "an unbounded string parameter and a character " & + "parameter - 2"); + end if; + + + -- Function "=" + + TC_Unb_String := Unb.To_Unbounded_String(TC_String); + + if not (TC_Unb_String = TC_String) or -- (Unb_Str, Str) + not Unb."="("A Standard String", TC_Unb_String) or -- (Str, Unb_Str) + not ((Unb.Null_Unbounded_String = "") and -- (Unb_Str, Str) + ("Test String" = -- (Str, Unb_Str) + Unb.To_Unbounded_String("Test String"))) + then + Report.Failed("Incorrect results from function ""="" with " & + "string - unbounded string parameter combinations"); + end if; + + + -- Function "<" + + if not ("Extra Space" < Unb.To_Unbounded_String("Extra Space ") and + Unb.To_Unbounded_String("tess") < "test" and + Unb.To_Unbounded_String("best") < "test") or + Unb.Null_Unbounded_String < Null_String or + " leading blank" < Unb.To_Unbounded_String(" leading blank") or + "ending blank " < Unb.To_Unbounded_String("ending blank ") + then + Report.Failed("Incorrect results from function ""<"" with " & + "string - unbounded string parameter combinations"); + end if; + + + -- Function "<=" + + TC_Unb_String := Unb.To_Unbounded_String("Sample string"); + + if TC_Unb_String <= "Sample strin" or -- (Unb_Str, Str) + "sample string" <= TC_Unb_String or -- (Str, Unb_Str) + not(Unb.Null_Unbounded_String <= "") or -- (Unb_Str, Str) + not("Sample string" <= TC_Unb_String) -- (Str, Unb_Str) + then + Report.Failed("Incorrect results from function ""<="" with " & + "string - unbounded string parameter combinations"); + end if; + + + -- Function ">" + + TC_Unb_String := Unb.To_Unbounded_String("A MUCH LONGER STRING"); + + if not ("A much longer string" > TC_Unb_String and + Unb.To_Unbounded_String(TC_String) > "A Standard Strin" and + "abcdefgh" > Unb.To_Unbounded_String("ABCDEFGH")) or + Unb.Null_Unbounded_String > Null_String + then + Report.Failed("Incorrect results from function "">"" with " & + "string - unbounded string parameter combinations"); + end if; + + + -- Function ">=" + + TC_Unb_String := Unb.To_Unbounded_String(TC_String); + + if not (TC_Unb_String >= TC_String and + Null_String >= Unb.Null_Unbounded_String and + "test" >= Unb.To_Unbounded_String("tess") and + Unb.To_Unbounded_String("Programming") >= "PROGRAMMING") + then + Report.Failed("Incorrect results from function "">="" with " & + "string - unbounded string parameter combinations"); + end if; + + + exception + when The_Error : others => + Report.Failed ("The following exception was raised in the " & + "Test_Block: " & Exception_Name(The_Error)); + end Test_Block; + + Report.Result; + +end CXA4031; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxa4032.a b/gcc/testsuite/ada/acats/tests/cxa/cxa4032.a new file mode 100644 index 000000000..031d01c6c --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxa4032.a @@ -0,0 +1,457 @@ +-- CXA4032.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 procedures defined in package Ada.Strings.Unbounded +-- are available, and that they produce correct results. Specifically, +-- check the procedures Replace_Slice, Insert, Overwrite, Delete, +-- Trim (2 versions), Head, and Tail. +-- +-- TEST DESCRIPTION: +-- This test demonstrates the uses of many of the procedures defined +-- in package Ada.Strings.Unbounded for use with unbounded strings. +-- The test simulates how unbounded strings could be processed in a +-- user environment, using the procedures provided in this package. +-- +-- This test, when taken in conjunction with tests CXA4010, CXA4011, +-- CXA4030, and CXA4031 will constitute a test of all the functionality +-- contained in package Ada.Strings.Unbounded. This test uses a variety +-- of the procedures defined in the unbounded string package in ways +-- typical of common usage. +-- +-- +-- CHANGE HISTORY: +-- 02 Mar 95 SAIC Initial prerelease version. +-- +--! + +with Report; +with Ada.Strings; +with Ada.Strings.Maps; +with Ada.Strings.Maps.Constants; +with Ada.Strings.Unbounded; + +procedure CXA4032 is +begin + + Report.Test ("CXA4032", "Check that the subprograms defined in " & + "package Ada.Strings.Unbounded are available, " & + "and that they produce correct results"); + + Test_Block: + declare + + package Unb renames Ada.Strings.Unbounded; + use Unb; + use Ada.Strings; + + TC_Null_String : constant String := ""; + TC_String_5 : String(1..5) := "ABCDE"; + + TC_Unb_String : Unb.Unbounded_String := + Unb.To_Unbounded_String("Test String"); + + begin + + -- Procedure Replace_Slice + + begin -- Low > Source'Last+1 + Unb.Replace_Slice(Source => TC_Unb_String, + Low => Unb.Length(TC_Unb_String) + 2, + High => Unb.Length(TC_Unb_String), + By => TC_String_5); + Report.Failed("Index_Error not raised by Replace_Slice when Low " & + "> Source'Last+1"); + exception + when Index_Error => null; -- OK, expected exception. + when others => + Report.Failed("Unexpected exception raised by Replace_Slice" & + "when Low > Source'Last+1"); + end; + + -- High >= Low + + TC_Unb_String := Unb.To_Unbounded_String("Test String"); + + Unb.Replace_Slice(TC_Unb_String, 5, 5, TC_String_5); + + if TC_Unb_String /= Unb.To_Unbounded_String("TestABCDEString") then + Report.Failed("Incorrect results from Replace_Slice - 1"); + end if; + + Unb.Replace_Slice(TC_Unb_String, 1, 4, TC_String_5); + + if TC_Unb_String /= Unb.To_Unbounded_String("ABCDEABCDEString") then + Report.Failed("Incorrect results from Replace_Slice - 2"); + end if; + + Unb.Replace_Slice(TC_Unb_String, + 11, + Unb.Length(TC_Unb_String), + TC_Null_String); + + if TC_Unb_String /= Unb.To_Unbounded_String("ABCDEABCDE") then + Report.Failed("Incorrect results from Replace_Slice - 3"); + end if; + + -- High < Low + + Unb.Replace_Slice(TC_Unb_String, Low => 4, High => 1, By => "xxx"); + + if TC_Unb_String /= Unb.To_Unbounded_String("ABCxxxDEABCDE") then + Report.Failed("Incorrect results from Replace_Slice - 4"); + end if; + + Unb.Replace_Slice(TC_Unb_String, Low => 1, High => 0, By => "yyy"); + + if TC_Unb_String /= Unb.To_Unbounded_String("yyyABCxxxDEABCDE") then + Report.Failed("Incorrect results from Replace_Slice - 5"); + end if; + + Unb.Replace_Slice(TC_Unb_String, + Unb.Length(TC_Unb_String) + 1, + Unb.Length(TC_Unb_String), + By => "zzz"); + + if TC_Unb_String /= Unb.To_Unbounded_String("yyyABCxxxDEABCDEzzz") then + Report.Failed("Incorrect results from Replace_Slice - 6"); + end if; + + + -- Procedure Insert + + TC_Unb_String := Unb.To_Unbounded_String("Test String"); + + begin -- Before not in Source'First..Source'Last + 1 + Unb.Insert(Source => TC_Unb_String, + Before => Unb.Length(TC_Unb_String) + 2, + New_Item => TC_String_5); + Report.Failed("Index_Error not raised by Insert when Before " & + "not in the range Source'First..Source'Last+1"); + exception + when Index_Error => null; -- OK, expected exception. + when others => + Report.Failed + ("Unexpected exception raised by Insert when Before not in " & + "the range Source'First..Source'Last+1"); + end; + + Unb.Insert(TC_Unb_String, 1, "**"); + + if TC_Unb_String /= Unb.To_Unbounded_String("**Test String") then + Report.Failed("Incorrect results from Insert - 1"); + end if; + + Unb.Insert(TC_Unb_String, Unb.Length(TC_Unb_String)+1, "**"); + + if TC_Unb_String /= Unb.To_Unbounded_String("**Test String**") then + Report.Failed("Incorrect results from Insert - 2"); + end if; + + Unb.Insert(TC_Unb_String, 8, "---"); + + if TC_Unb_String /= Unb.To_Unbounded_String("**Test ---String**") then + Report.Failed("Incorrect results from Insert - 3"); + end if; + + Unb.Insert(TC_Unb_String, 3, TC_Null_String); + + if TC_Unb_String /= Unb.To_Unbounded_String("**Test ---String**") then + Report.Failed("Incorrect results from Insert - 4"); + end if; + + + -- Procedure Overwrite + + begin -- Position not in Source'First..Source'Last + 1 + Unb.Overwrite(Source => TC_Unb_String, + Position => Unb.Length(TC_Unb_String) + 2, + New_Item => TC_String_5); + Report.Failed("Index_Error not raised by Overwrite when Position " & + "not in the range Source'First..Source'Last+1"); + exception + when Index_Error => null; -- OK, expected exception. + when others => + Report.Failed + ("Unexpected exception raised by Overwrite when Position not " & + "in the range Source'First..Source'Last+1"); + end; + + TC_Unb_String := Unb.To_Unbounded_String("Test String"); + + Unb.Overwrite(Source => TC_Unb_String, + Position => 1, + New_Item => "XXXX"); + + if TC_Unb_String /= Unb.To_Unbounded_String("XXXX String") then + Report.Failed("Incorrect results from Overwrite - 1"); + end if; + + Unb.Overwrite(TC_Unb_String, Unb.Length(TC_Unb_String)+1, "**"); + + if TC_Unb_String /= Unb.To_Unbounded_String("XXXX String**") then + Report.Failed("Incorrect results from Overwrite - 2"); + end if; + + Unb.Overwrite(TC_Unb_String, 3, TC_Null_String); + + if TC_Unb_String /= Unb.To_Unbounded_String("XXXX String**") then + Report.Failed("Incorrect results from Overwrite - 3"); + end if; + + Unb.Overwrite(TC_Unb_String, 1, "abcdefghijklmn"); + + if TC_Unb_String /= Unb.To_Unbounded_String("abcdefghijklmn") then + Report.Failed("Incorrect results from Overwrite - 4"); + end if; + + + -- Procedure Delete + + TC_Unb_String := Unb.To_Unbounded_String("Test String"); + + -- From > Through (No change to Source) + + Unb.Delete(Source => TC_Unb_String, + From => Unb.Length(TC_Unb_String), + Through => Unb.Length(TC_Unb_String)-1); + + if TC_Unb_String /= Unb.To_Unbounded_String("Test String") then + Report.Failed("Incorrect results from Delete - 1"); + end if; + + Unb.Delete(TC_Unb_String, 1, 0); + + if TC_Unb_String /= Unb.To_Unbounded_String("Test String") then + Report.Failed("Incorrect results from Delete - 2"); + end if; + + -- From <= Through + + Unb.Delete(TC_Unb_String, 1, 5); + + if TC_Unb_String /= Unb.To_Unbounded_String("String") then + Report.Failed("Incorrect results from Delete - 3"); + end if; + + Unb.Delete(TC_Unb_String, 3, 3); + + if TC_Unb_String /= Unb.To_Unbounded_String("Sting") then + Report.Failed("Incorrect results from Delete - 4"); + end if; + + + -- Procedure Trim + + TC_Unb_String := Unb.To_Unbounded_String("No Spaces"); + + Unb.Trim(Source => TC_Unb_String, Side => Ada.Strings.Both); + + if TC_Unb_String /= Unb.To_Unbounded_String("No Spaces") then + Report.Failed("Incorrect results from Trim - 1"); + end if; + + TC_Unb_String := Unb.To_Unbounded_String(" Leading Spaces "); + + Unb.Trim(TC_Unb_String, Ada.Strings.Left); + + if TC_Unb_String /= Unb.To_Unbounded_String("Leading Spaces ") then + Report.Failed("Incorrect results from Trim - 2"); + end if; + + TC_Unb_String := Unb.To_Unbounded_String(" Ending Spaces "); + + Unb.Trim(TC_Unb_String, Ada.Strings.Right); + + if TC_Unb_String /= Unb.To_Unbounded_String(" Ending Spaces") then + Report.Failed("Incorrect results from Trim - 3"); + end if; + + TC_Unb_String := + Unb.To_Unbounded_String(" Spaces on both ends "); + + Unb.Trim(TC_Unb_String, Ada.Strings.Both); + + if TC_Unb_String /= + Unb.To_Unbounded_String("Spaces on both ends") + then + Report.Failed("Incorrect results from Trim - 4"); + end if; + + + -- Procedure Trim (with Character Set parameters) + + TC_Unb_String := Unb.To_Unbounded_String("lowerCASEletters"); + + Unb.Trim(Source => TC_Unb_String, + Left => Ada.Strings.Maps.Constants.Lower_Set, + Right => Ada.Strings.Maps.Constants.Lower_Set); + + if TC_Unb_String /= Unb.To_Unbounded_String("CASE") then + Report.Failed("Incorrect results from Trim with Sets - 1"); + end if; + + TC_Unb_String := Unb.To_Unbounded_String("lowerCASEletters"); + + Unb.Trim(TC_Unb_String, + Ada.Strings.Maps.Constants.Upper_Set, + Ada.Strings.Maps.Constants.Upper_Set); + + if TC_Unb_String /= Unb.To_Unbounded_String("lowerCASEletters") then + Report.Failed("Incorrect results from Trim with Sets - 2"); + end if; + + TC_Unb_String := Unb.To_Unbounded_String("012abcdefghGFEDCBA789ab"); + + Unb.Trim(TC_Unb_String, + Ada.Strings.Maps.Constants.Hexadecimal_Digit_Set, + Ada.Strings.Maps.Constants.Hexadecimal_Digit_Set); + + if TC_Unb_String /= Unb.To_Unbounded_String("ghG") then + Report.Failed("Incorrect results from Trim with Sets - 3"); + end if; + + + -- Procedure Head + + -- Count <= Source'Length + + TC_Unb_String := Unb.To_Unbounded_String("Test String"); + + Unb.Head(Source => TC_Unb_String, + Count => 0, + Pad => '*'); + + if TC_Unb_String /= Unb.Null_Unbounded_String then + Report.Failed("Incorrect results from Head - 1"); + end if; + + TC_Unb_String := Unb.To_Unbounded_String("Test String"); + + Unb.Head(Source => TC_Unb_String, + Count => 4, + Pad => '*'); + + if TC_Unb_String /= Unb.To_Unbounded_String("Test") then + Report.Failed("Incorrect results from Head - 2"); + end if; + + TC_Unb_String := Unb.To_Unbounded_String("Test String"); + + Unb.Head(Source => TC_Unb_String, + Count => Unb.Length(TC_Unb_String), + Pad => '*'); + + if TC_Unb_String /= Unb.To_Unbounded_String("Test String") then + Report.Failed("Incorrect results from Head - 3"); + end if; + + -- Count > Source'Length + + TC_Unb_String := Unb.To_Unbounded_String("Test String"); + + Unb.Head(Source => TC_Unb_String, + Count => Unb.Length(TC_Unb_String) + 4, + Pad => '*'); + + if TC_Unb_String /= Unb.To_Unbounded_String("Test String****") then + Report.Failed("Incorrect results from Head - 4"); + end if; + + TC_Unb_String := Unb.Null_Unbounded_String; + + Unb.Head(Source => TC_Unb_String, + Count => Unb.Length(TC_Unb_String) + 3, + Pad => '*'); + + if TC_Unb_String /= Unb.To_Unbounded_String("***") then + Report.Failed("Incorrect results from Head - 5"); + end if; + + + -- Procedure Tail + + -- Count <= Source'Length + + TC_Unb_String := Unb.To_Unbounded_String("Test String"); + + Unb.Tail(Source => TC_Unb_String, + Count => 0, + Pad => '*'); + + if TC_Unb_String /= Unb.Null_Unbounded_String then + Report.Failed("Incorrect results from Tail - 1"); + end if; + + TC_Unb_String := Unb.To_Unbounded_String("Test String"); + + Unb.Tail(Source => TC_Unb_String, + Count => 6, + Pad => '*'); + + if TC_Unb_String /= Unb.To_Unbounded_String("String") then + Report.Failed("Incorrect results from Tail - 2"); + end if; + + TC_Unb_String := Unb.To_Unbounded_String("Test String"); + + Unb.Tail(Source => TC_Unb_String, + Count => Unb.Length(TC_Unb_String), + Pad => '*'); + + if TC_Unb_String /= Unb.To_Unbounded_String("Test String") then + Report.Failed("Incorrect results from Tail - 3"); + end if; + + -- Count > Source'Length + + TC_Unb_String := Unb.To_Unbounded_String("Test String"); + + Unb.Tail(Source => TC_Unb_String, + Count => Unb.Length(TC_Unb_String) + 5, + Pad => 'x'); + + if TC_Unb_String /= Unb.To_Unbounded_String("xxxxxTest String") then + Report.Failed("Incorrect results from Tail - 4"); + end if; + + TC_Unb_String := Unb.Null_Unbounded_String; + + Unb.Tail(Source => TC_Unb_String, + Count => Unb.Length(TC_Unb_String) + 3, + Pad => 'X'); + + if TC_Unb_String /= Unb.To_Unbounded_String("XXX") then + Report.Failed("Incorrect results from Tail - 5"); + end if; + + + exception + when others => Report.Failed ("Exception raised in Test_Block"); + end Test_Block; + + Report.Result; + +end CXA4032; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxa4033.a b/gcc/testsuite/ada/acats/tests/cxa/cxa4033.a new file mode 100644 index 000000000..8f39b4cff --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxa4033.a @@ -0,0 +1,405 @@ +-- CXA4033.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 functionality found in packages Ada.Strings.Wide_Maps, +-- Ada.Strings.Wide_Unbounded, and Ada.Strings.Wide_Maps.Wide_Constants +-- is available and produces correct results. +-- +-- TEST DESCRIPTION: +-- This test tests the subprograms found in the +-- Ada.Strings.Wide_Unbounded package. It is based on the tests +-- CXA4030-32, which are tests for the complementary "non-wide" +-- packages. +-- +-- The functions found in CXA4033_0 provide mapping capability, when +-- used in conjunction with Wide_Character_Mapping_Function objects. +-- +-- +-- CHANGE HISTORY: +-- 23 Jun 95 SAIC Initial prerelease version. +-- 24 Feb 97 PWB.CTA Removed attempt to create wide string of length +-- Natural'Last +--! + +package CXA4033_0 is + -- Functions used to supply mapping capability. + function Map_To_Lower_Case (From : Wide_Character) return Wide_Character; + function Map_To_Upper_Case (From : Wide_Character) return Wide_Character; +end CXA4033_0; + +with Ada.Characters.Handling; +package body CXA4033_0 is + -- Function Map_To_Lower_Case will return the lower case form of + -- Wide_Characters in the range 'A'..'Z' only, and return the input + -- wide_character otherwise. + + function Map_To_Lower_Case (From : Wide_Character) + return Wide_Character is + begin + return Ada.Characters.Handling.To_Wide_Character( + Ada.Characters.Handling.To_Lower( + Ada.Characters.Handling.To_Character(From))); + end Map_To_Lower_Case; + + -- Function Map_To_Upper_Case will return the upper case form of + -- Wide_Characters in the range 'a'..'z', or whose position is in one + -- of the ranges 223..246 or 248..255, provided the wide_character has + -- an upper case form. + + function Map_To_Upper_Case (From : Wide_Character) + return Wide_Character is + begin + return Ada.Characters.Handling.To_Wide_Character( + Ada.Characters.Handling.To_Upper( + Ada.Characters.Handling.To_Character(From))); + end Map_To_Upper_Case; + +end CXA4033_0; + + +with CXA4033_0; +with Report; +with Ada.Characters.Handling; +with Ada.Characters.Latin_1; +with Ada.Strings; +with Ada.Strings.Wide_Maps; +with Ada.Strings.Wide_Maps.Wide_Constants; +with Ada.Strings.Wide_Fixed; +with Ada.Strings.Wide_Unbounded; + +procedure CXA4033 is +begin + Report.Test ("CXA4033", + "Check that subprograms defined in the package " & + "Ada.Strings.Wide_Unbounded produce correct results"); + + Test_Block: + declare + + package ACL1 renames Ada.Characters.Latin_1; + package Unb renames Ada.Strings.Wide_Unbounded; + + subtype LC_Characters is Wide_Character range 'a'..'z'; + + use Ada.Characters, Ada.Strings, Unb; + use type Wide_Maps.Wide_Character_Set; + + TC_String : constant Wide_String := "A Standard String"; + + String_20 : Wide_String(1..20) := "ABCDEFGHIJKLMNOPQRST"; + String_40 : Wide_String(1..40) := "abcdefghijklmnopqrst" & + String_20; + String_80 : Wide_String(1..80) := String_40 & String_40; + TC_String_5 : Wide_String(1..5) := "ABCDE"; + TC_Unb_String : Unbounded_Wide_String := Null_Unbounded_Wide_String; + + -- The following strings are used in examination of the Translation + -- subprograms. + New_Character_String : Wide_String(1..10) := + Handling.To_Wide_String( + ACL1.LC_A_Grave & ACL1.LC_A_Ring & ACL1.LC_AE_Diphthong & + ACL1.LC_C_Cedilla & ACL1.LC_E_Acute & ACL1.LC_I_Circumflex & + ACL1.LC_Icelandic_Eth & ACL1.LC_N_Tilde & + ACL1.LC_O_Oblique_Stroke & ACL1.LC_Icelandic_Thorn); + + TC_New_Character_String : Wide_String(1..10) := + Handling.To_Wide_String( + ACL1.UC_A_Grave & ACL1.UC_A_Ring & ACL1.UC_AE_Diphthong & + ACL1.UC_C_Cedilla & ACL1.UC_E_Acute & ACL1.UC_I_Circumflex & + ACL1.UC_Icelandic_Eth & ACL1.UC_N_Tilde & + ACL1.UC_O_Oblique_Stroke & ACL1.UC_Icelandic_Thorn); + + New_UB_Character_String : Unbounded_Wide_String := + To_Unbounded_Wide_String(New_Character_String); + + TC_New_UB_Character_String : Unbounded_Wide_String := + To_Unbounded_Wide_String(TC_New_Character_String); + + -- Access objects that will be provided as parameters to the + -- subprograms. + Map_To_Lower_Case_Ptr : Wide_Maps.Wide_Character_Mapping_Function := + CXA4033_0.Map_To_Lower_Case'Access; + Map_To_Upper_Case_Ptr : Wide_Maps.Wide_Character_Mapping_Function := + CXA4033_0.Map_To_Upper_Case'Access; + + begin + + -- Testing functionality found in Package Ada.Strings.Wide_Unbounded. + -- + -- Function Index. + + if Index(To_Unbounded_Wide_String("AAABBBaaabbb"), + "aabb", + Mapping => Map_To_Lower_Case_Ptr) /= 2 or + Index(To_Unbounded_Wide_String("Case of a Mixed Case String"), + "case", + Ada.Strings.Backward, + Map_To_Lower_Case_Ptr) /= 17 + then + Report.Failed("Incorrect results from Function Index, " & + "using a Wide Character Mapping Function parameter"); + end if; + + -- Function Count. + if Count(Source => To_Unbounded_Wide_String("ABABABA"), + Pattern => "aba", + Mapping => Map_To_Lower_Case_Ptr) /= 2 or + Count(Null_Unbounded_Wide_String, "mat", Map_To_Upper_Case_Ptr) /= 0 + then + Report.Failed("Incorrect results from Function Count, using " & + "a Character Mapping Function parameter"); + end if; + + -- Function Translate. + if Translate(To_Unbounded_Wide_String("A Sample Mixed Case String"), + Mapping => Map_To_Lower_Case_Ptr) /= + To_Unbounded_Wide_String("a sample mixed case string") or + Translate(New_UB_Character_String, Map_To_Upper_Case_Ptr) /= + TC_New_UB_Character_String + then + Report.Failed("Incorrect results from Function Translate, " & + "using a Character Mapping Function parameter"); + end if; + + -- Procedure Translate. + declare + use Ada.Characters.Handling; + Str : Unbounded_Wide_String := + To_Unbounded_Wide_String("AN ALL UPPER CASE STRING"); + begin + Translate(Source => Str, Mapping => Map_To_Lower_Case_Ptr); + if Str /= To_Unbounded_Wide_String("an all upper case string") then + Report.Failed("Incorrect result from Procedure Translate 1"); + end if; + + Translate(New_UB_Character_String, Map_To_Upper_Case_Ptr); + if New_UB_Character_String /= TC_New_UB_Character_String then + Report.Failed("Incorrect result from Procedure Translate 2"); + end if; + end; + + -- Function To_Unbounded_Wide_String (version with Length parameter) + if Length(To_Unbounded_Wide_String(Length => 10)) /= 10 or + Length(To_Unbounded_Wide_String(0)) /= 0 or + Length( To_Unbounded_Wide_String(10) & + To_Unbounded_Wide_String(1) & + To_Unbounded_Wide_String(0) ) /= 10 + 1 + 0 + then + Report.Failed + ("Incorrect results from Function To_Unbounded_Wide_String " & + "with Length parameter"); + end if; + + -- Procedure Append (Wide_Unbounded - Wide_Unbounded) + TC_Unb_String := Null_Unbounded_Wide_String; + Append(TC_Unb_String, To_Unbounded_Wide_String("New Unbounded String")); + if TC_Unb_String /= To_Unbounded_Wide_String("New Unbounded String") + then + Report.Failed("Incorrect results from Procedure Append with " & + "unbounded wide string parameters"); + end if; + + + -- Procedure Append (Wide_Unbounded - Wide_String) + TC_Unb_String := To_Unbounded_Wide_String("An Unbounded String and "); + Append(Source => TC_Unb_String, New_Item => TC_String); + if TC_Unb_String /= + To_Unbounded_Wide_String("An Unbounded String and A Standard String") + then + Report.Failed("Incorrect results from Procedure Append with " & + "an unbounded wide string parameter and a wide " & + "string parameter"); + end if; + + -- Procedure Append (Wide_Unbounded - Wide_Character) + TC_Unb_String := To_Unbounded_Wide_String("Lower Case = "); + for i in LC_Characters'Range loop + Append(Source => TC_Unb_String, New_Item => LC_Characters(i)); + end loop; + if TC_Unb_String /= + Unb.To_Unbounded_Wide_String + ("Lower Case = abcdefghijklmnopqrstuvwxyz") + then + Report.Failed("Incorrect results from Procedure Append with " & + "an unbounded wide string parameter and a wide " & + "character parameter"); + end if; + + -- Function "=" + TC_Unb_String := To_Unbounded_Wide_String(TC_String); + if not (TC_Unb_String = TC_String) or + not "="("A Standard String", TC_Unb_String) or + not ((Null_Unbounded_Wide_String = "") and + ("Test String" = To_Unbounded_Wide_String("Test String"))) + then + Report.Failed("Incorrect results from Function ""="" with " & + "wide_string - unbounded wide string parameters"); + end if; + + -- Function "<" + if not ("Extra Space" < To_Unbounded_Wide_String("Extra Space ") and + To_Unbounded_Wide_String("tess") < "test" and + To_Unbounded_Wide_String("best") < "test") + then + Report.Failed("Incorrect results from Function ""<"" with " & + "wide string - unbounded wide string parameters"); + end if; + + -- Function "<=" + TC_Unb_String := To_Unbounded_Wide_String("Sample string"); + if TC_Unb_String <= "Sample strin" or + not("Sample string" <= TC_Unb_String) + then + Report.Failed("Incorrect results from Function ""<="" with " & + "wide string - unbounded wide string parameters"); + end if; + + -- Function ">" + TC_Unb_String := To_Unbounded_Wide_String("A MUCH LONGER STRING"); + if not ("A much longer string" > TC_Unb_String and + To_Unbounded_Wide_String(TC_String) > "A Standard Strin" and + "abcdefgh" > To_Unbounded_Wide_String("ABCDEFGH")) + then + Report.Failed("Incorrect results from Function "">"" with " & + "wide string - unbounded wide string parameters"); + end if; + + -- Function ">=" + TC_Unb_String := To_Unbounded_Wide_String(TC_String); + if not (TC_Unb_String >= TC_String and + "test" >= To_Unbounded_Wide_String("tess") and + To_Unbounded_Wide_String("Programming") >= "PROGRAMMING") + then + Report.Failed("Incorrect results from Function "">="" with " & + "wide string - unbounded wide string parameters"); + end if; + + -- Procedure Replace_Slice + TC_Unb_String := To_Unbounded_Wide_String("Test String"); + Replace_Slice(TC_Unb_String, 5, 5, TC_String_5); + if TC_Unb_String /= To_Unbounded_Wide_String("TestABCDEString") then + Report.Failed("Incorrect results from Replace_Slice - 1"); + end if; + + Replace_Slice(TC_Unb_String, 1, 4, TC_String_5); + if TC_Unb_String /= To_Unbounded_Wide_String("ABCDEABCDEString") then + Report.Failed("Incorrect results from Replace_Slice - 2"); + end if; + + -- Procedure Insert + TC_Unb_String := To_Unbounded_Wide_String("Test String"); + Insert(TC_Unb_String, 1, "**"); + if TC_Unb_String /= To_Unbounded_Wide_String("**Test String") then + Report.Failed("Incorrect results from Procedure Insert - 1"); + end if; + + Insert(TC_Unb_String, Length(TC_Unb_String)+1, "**"); + if TC_Unb_String /= To_Unbounded_Wide_String("**Test String**") then + Report.Failed("Incorrect results from Procedure Insert - 2"); + end if; + + -- Procedure Overwrite + TC_Unb_String := To_Unbounded_Wide_String("Test String"); + Overwrite(TC_Unb_String, 1, New_Item => "XXXX"); + if TC_Unb_String /= To_Unbounded_Wide_String("XXXX String") then + Report.Failed("Incorrect results from Procedure Overwrite - 1"); + end if; + + Overwrite(TC_Unb_String, Length(TC_Unb_String)+1, "**"); + if TC_Unb_String /= To_Unbounded_Wide_String("XXXX String**") then + Report.Failed("Incorrect results from Procedure Overwrite - 2"); + end if; + + -- Procedure Delete + TC_Unb_String := To_Unbounded_Wide_String("Test String"); + Delete(TC_Unb_String, 1, 0); + if TC_Unb_String /= To_Unbounded_Wide_String("Test String") then + Report.Failed("Incorrect results from Procedure Delete - 1"); + end if; + + Delete(TC_Unb_String, 1, 5); + if TC_Unb_String /= To_Unbounded_Wide_String("String") then + Report.Failed("Incorrect results from Procedure Delete - 2"); + end if; + + -- Procedure Trim + TC_Unb_String := To_Unbounded_Wide_String(" Leading Spaces "); + Trim(TC_Unb_String, Ada.Strings.Left); + if TC_Unb_String /= To_Unbounded_Wide_String("Leading Spaces ") then + Report.Failed("Incorrect results from Procedure Trim - 1"); + end if; + + TC_Unb_String := + To_Unbounded_Wide_String(" Spaces on both ends "); + Trim(TC_Unb_String, Ada.Strings.Both); + if TC_Unb_String /= + To_Unbounded_Wide_String("Spaces on both ends") + then + Report.Failed("Incorrect results from Procedure Trim - 2"); + end if; + + -- Procedure Trim (with Wide_Character_Set parameters) + TC_Unb_String := To_Unbounded_Wide_String("012abcdefghGFEDCBA789ab"); + Trim(TC_Unb_String, + Ada.Strings.Wide_Maps.Wide_Constants.Hexadecimal_Digit_Set, + Ada.Strings.Wide_Maps.Wide_Constants.Hexadecimal_Digit_Set); + if TC_Unb_String /= To_Unbounded_Wide_String("ghG") then + Report.Failed("Incorrect results from Procedure Trim with Sets"); + end if; + + -- Procedure Head + TC_Unb_String := To_Unbounded_Wide_String("Test String"); + Head(Source => TC_Unb_String, Count => 0, Pad => '*'); + if TC_Unb_String /= Null_Unbounded_Wide_String then + Report.Failed("Incorrect results from Procedure Head - 1"); + end if; + + TC_Unb_String := To_Unbounded_Wide_String("Test String"); + Head(Source => TC_Unb_String, Count => 4, Pad => '*'); + if TC_Unb_String /= To_Unbounded_Wide_String("Test") then + Report.Failed("Incorrect results from Procedure Head - 2"); + end if; + + -- Procedure Tail + TC_Unb_String := To_Unbounded_Wide_String("Test String"); + Tail(Source => TC_Unb_String, Count => 0, Pad => '*'); + if TC_Unb_String /= Null_Unbounded_Wide_String then + Report.Failed("Incorrect results from Procedure Tail - 1"); + end if; + + TC_Unb_String := To_Unbounded_Wide_String("Test String"); + Tail(TC_Unb_String, Length(TC_Unb_String) + 5, 'x'); + if TC_Unb_String /= To_Unbounded_Wide_String("xxxxxTest String") then + Report.Failed("Incorrect results from Procedure Tail - 2"); + end if; + + exception + when others => Report.Failed ("Exception raised in Test_Block"); + end Test_Block; + + Report.Result; + +end CXA4033; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxa4034.a b/gcc/testsuite/ada/acats/tests/cxa/cxa4034.a new file mode 100644 index 000000000..a1ed53de0 --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxa4034.a @@ -0,0 +1,281 @@ +-- CXA4034.A +-- +-- Grant of Unlimited Rights +-- +-- The Ada Conformity Assessment Authority (ACAA) holds unlimited +-- rights in the software and documentation contained herein. Unlimited +-- rights are the same as those granted by the U.S. Government for older +-- parts of the Ada Conformity Assessment Test Suite, and are defined +-- in DFAR 252.227-7013(a)(19). By making this public release, the ACAA +-- intends to confer upon all recipients unlimited rights equal to those +-- held by the ACAA. 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.Strings.Bounded.Slice raises Index_Error if +-- High > Length (Source) or Low > Length (Source) + 1. +-- (Defect Report 8652/0049). +-- +-- Check that Ada.Strings.Wide_Bounded.Slice raises Index_Error if +-- High > Length (Source) or Low > Length (Source) + 1. +-- +-- CHANGE HISTORY: +-- 12 FEB 2001 PHL Initial version +-- 14 MAR 2001 RLB Added Wide_Bounded subtest. +-- +--! +with Ada.Exceptions; +use Ada.Exceptions; +with Ada.Strings.Bounded; +with Ada.Strings.Wide_Bounded; +use Ada.Strings; +with Report; +use Report; +procedure CXA4034 is + + package Bs is new Ada.Strings.Bounded.Generic_Bounded_Length (40); + + package WBs is new Ada.Strings.Wide_Bounded.Generic_Bounded_Length (32); + + Source : String (Ident_Int (1) .. Ident_Int (30)); + + Wide_Source : Wide_String (Ident_Int (1) .. Ident_Int (24)); + + X : Bs.Bounded_String; + + WX : WBs.Bounded_Wide_String; + +begin + Test ("CXA4034", + "Check that Slice raises Index_Error if either Low or High is " & + "greater than the Length(Source) for Ada.Strings.Bounded and " & + "Ada.Strings.Wide_Bounded"); + + -- Fill Source with "ABC..." + for I in Source'Range loop + Source (I) := Ident_Char (Character'Val (I + + Character'Pos ('A') - Source'First)); + end loop; + -- and W with "ABC..." + for I in Wide_Source'Range loop + Wide_Source (I) := Ident_Wide_Char (Wide_Character'Val (I + + Wide_Character'Pos ('A') - Wide_Source'First)); + end loop; + + X := Bs.To_Bounded_String (Source); + + begin + declare + S : constant String := + Bs.Slice (X, Low => Ident_Int (28), High => Ident_Int (41)); + begin + Failed ("No exception raised by Slice - 1"); + if S = Source then + Comment ("Don't optimize S"); + end if; + end; + exception + when Index_Error => + null; -- Expected exception. + when E: others => + Failed ("Exception raised - " & Exception_Name (E) & + " - " & Exception_Message (E) & " - 1"); + end; + + begin + declare + S : constant String := + Bs.Slice (X, Low => Ident_Int (8), High => Ident_Int (31)); + begin + Failed ("No exception raised by Slice - 2"); + if S = Source then + Comment ("Don't optimize S"); + end if; + end; + exception + when Index_Error => + null; -- Expected exception. + when E: others => + Failed ("Exception raised - " & Exception_Name (E) & + " - " & Exception_Message (E) & " - 2"); + end; + + begin + declare + S : constant String := + Bs.Slice (X, Low => Ident_Int (15), High => Ident_Int (30)); + begin + if S /= Source(15..30) then + Failed ("Wrong result - 3"); + end if; + end; + exception + when E: others => + Failed ("Exception raised - " & Exception_Name (E) & + " - " & Exception_Message (E) & " - 3"); + end; + + begin + declare + S : constant String := + Bs.Slice (X, Low => Ident_Int (42), High => Ident_Int (28)); + begin + Failed ("No exception raised by Slice - 4"); + if S = Source then + Comment ("Don't optimize S"); + end if; + end; + exception + when Index_Error => + null; -- Expected exception. + when E: others => + Failed ("Exception raised - " & Exception_Name (E) & + " - " & Exception_Message (E) & " - 4"); + end; + + begin + declare + S : constant String := + Bs.Slice (X, Low => Ident_Int (31), High => Ident_Int (28)); + begin + if S /= "" then + Failed ("Wrong result - 5"); + end if; + end; + exception + when E: others => + Failed ("Exception raised - " & Exception_Name (E) & + " - " & Exception_Message (E) & " - 5"); + end; + + begin + declare + S : constant String := + Bs.Slice (X, Low => Ident_Int (30), High => Ident_Int (30)); + begin + if S /= Source(30..30) then + Failed ("Wrong result - 6"); + end if; + end; + exception + when E: others => + Failed ("Exception raised - " & Exception_Name (E) & + " - " & Exception_Message (E) & " - 6"); + end; + + WX := WBs.To_Bounded_Wide_String (Wide_Source); + + begin + declare + W : constant Wide_String := + WBs.Slice (WX, Low => Ident_Int (21), High => Ident_Int (33)); + begin + Failed ("No exception raised by Slice - 7"); + if W = Wide_Source then + Comment ("Don't optimize W"); + end if; + end; + exception + when Index_Error => + null; -- Expected exception. + when E: others => + Failed ("Exception raised - " & Exception_Name (E) & + " - " & Exception_Message (E) & " - 7"); + end; + + begin + declare + W : constant Wide_String := + WBs.Slice (WX, Low => Ident_Int (8), High => Ident_Int (25)); + begin + Failed ("No exception raised by Slice - 8"); + if W = Wide_Source then + Comment ("Don't optimize W"); + end if; + end; + exception + when Index_Error => + null; -- Expected exception. + when E: others => + Failed ("Exception raised - " & Exception_Name (E) & + " - " & Exception_Message (E) & " - 8"); + end; + + begin + declare + W : constant Wide_String := + WBs.Slice (WX, Low => Ident_Int (15), High => Ident_Int (24)); + begin + if W /= Wide_Source(15..24) then + Failed ("Wrong result - 8"); + end if; + end; + exception + when E: others => + Failed ("Exception raised - " & Exception_Name (E) & + " - " & Exception_Message (E) & " - 9"); + end; + + begin + declare + W : constant Wide_String := + WBs.Slice (WX, Low => Ident_Int (36), High => Ident_Int (20)); + begin + Failed ("No exception raised by Slice - 10"); + if W = Wide_Source then + Comment ("Don't optimize W"); + end if; + end; + exception + when Index_Error => + null; -- Expected exception. + when E: others => + Failed ("Exception raised - " & Exception_Name (E) & + " - " & Exception_Message (E) & " - 10"); + end; + + begin + declare + W : constant Wide_String := + WBs.Slice (WX, Low => Ident_Int (25), High => Ident_Int (21)); + begin + if W /= "" then + Failed ("Wrong result - 11"); + end if; + end; + exception + when E: others => + Failed ("Exception raised - " & Exception_Name (E) & + " - " & Exception_Message (E) & " - 11"); + end; + + begin + declare + W : constant Wide_String := + WBs.Slice (WX, Low => Ident_Int (24), High => Ident_Int (24)); + begin + if W /= Wide_Source(24..24) then + Failed ("Wrong result - 12"); + end if; + end; + exception + when E: others => + Failed ("Exception raised - " & Exception_Name (E) & + " - " & Exception_Message (E) & " - 12"); + end; + + Result; +end CXA4034; + diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxa5011.a b/gcc/testsuite/ada/acats/tests/cxa/cxa5011.a new file mode 100644 index 000000000..c9a007e52 --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxa5011.a @@ -0,0 +1,471 @@ +-- CXA5011.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, for both Float_Random and Discrete_Random packages, +-- the following are true: +-- 1) two objects of type Generator are initialized to the same state. +-- 2) when the Function Reset is used to reset two generators +-- to different time-dependent states, the resulting random values +-- from each generator are different. +-- 3) when the Function Reset uses the same integer initiator +-- to reset two generators to the same state, the resulting random +-- values from each generator are identical. +-- 4) when the Function Reset uses different integer initiator +-- values to reset two generators, the resulting random numbers are +-- different. +-- +-- TEST DESCRIPTION: +-- This test evaluates components of the Ada.Numerics.Float_Random and +-- Ada.Numerics.Discrete_Random packages. +-- This test checks to see that objects of type Generator are initialized +-- to the same state. In addition, the functionality of Function Reset is +-- validated. +-- For each of the objectives above, evaluation of the various generators +-- is performed using each of the following techniques. When the states of +-- two generators are to be compared, each state is saved, then +-- transformed to a bounded-string variable. The bounded-strings can +-- then be compared for equality. In this case, matching bounded-strings +-- are evidence that the states of two generators are the same. +-- In addition, two generators are compared by evaluating a series of +-- random numbers they produce. A matching series of random numbers +-- implies that the generators were in the same state prior to producing +-- the numbers. +-- +-- +-- CHANGE HISTORY: +-- 20 Apr 95 SAIC Initial prerelease version. +-- 07 Jul 95 SAIC Incorporated reviewer comments/suggestions. +-- 22 Apr 96 SAIC Incorporated reviewer comments for ACVC 2.1. +-- 17 Aug 96 SAIC Deleted Subtest #2. +-- 09 Feb 01 RLB Repaired to work on implementations with a 16-bit +-- Integer. + +--! + +with Ada.Exceptions; +with Ada.Numerics.Float_Random; +with Ada.Numerics.Discrete_Random; +with Ada.Strings.Bounded; +with ImpDef; +with Report; + +procedure CXA5011 is +begin + + Report.Test ("CXA5011", "Check the effect of Function Reset on the " & + "state of random number generators"); + + Test_Block: + declare + + use Ada.Exceptions; + use Ada.Numerics; + use Ada.Strings.Bounded; + + -- Declare an modular subtype, and use it to instantiate the discrete + -- random number generator generic package. + + type Discrete_Range is mod 2**(Integer'Size-1); + package Discrete_Package is new Discrete_Random(Discrete_Range); + + -- Declaration of random number generator objects. + + Discrete_Generator_1, + Discrete_Generator_2 : Discrete_Package.Generator; + Float_Generator_1, + Float_Generator_2 : Float_Random.Generator; + + -- Declaration of bounded string packages instantiated with the + -- value of Max_Image_Width constant from each random number generator + -- package, and bounded string variables used to hold the image of + -- random number generator states. + + package Discrete_String_Pack is + new Generic_Bounded_Length(Discrete_Package.Max_Image_Width); + + package Float_String_Pack is + new Generic_Bounded_Length(Float_Random.Max_Image_Width); + + use Discrete_String_Pack, Float_String_Pack; + + TC_Seed : Integer; + TC_Max_Loop_Count : constant Natural := 1000; + Allowed_Matches : constant Natural := 2; + -- + -- In a sequence of TC_Max_Loop_Count random numbers that should + -- not match, some may match by chance. Up to Allowed_Matches + -- numbers may match before the test is considered to fail. + -- + + + procedure Check_Float_State (Gen_1, Gen_2 : Float_Random.Generator; + Sub_Test : Integer; + States_Should_Match : Boolean) is + + use type Float_Random.State; + + State_1, + State_2 : Float_Random.State; + + State_String_1, + State_String_2 : Float_String_Pack.Bounded_String := + Float_String_Pack.Null_Bounded_String; + begin + + Float_Random.Save(Gen => Gen_1, To_State => State_1); + Float_Random.Save(Gen_2, State_2); + + State_String_1 := + Float_String_Pack.To_Bounded_String(Source => + Float_Random.Image(Of_State => State_1)); + + State_String_2 := + Float_String_Pack.To_Bounded_String(Float_Random.Image(State_2)); + + case States_Should_Match is + when True => + if State_1 /= State_2 then + Report.Failed("Subtest #" & Integer'Image(Sub_Test) & + " State values from Float generators " & + "are not the same"); + end if; + if State_String_1 /= State_String_2 then + Report.Failed("Subtest #" & Integer'Image(Sub_Test) & + " State strings from Float generators " & + "are not the same"); + end if; + when False => + if State_1 = State_2 then + Report.Failed("Subtest #" & Integer'Image(Sub_Test) & + " State values from Float generators " & + "are the same"); + end if; + if State_String_1 = State_String_2 then + Report.Failed("Subtest #" & Integer'Image(Sub_Test) & + " State strings from Float generators " & + "are the same"); + end if; + end case; + end Check_Float_State; + + + + procedure Check_Discrete_State (Gen_1, + Gen_2 : Discrete_Package.Generator; + Sub_Test : Integer; + States_Should_Match : Boolean) is + + use type Discrete_Package.State; + + State_1, State_2 : Discrete_Package.State; + + State_String_1, + State_String_2 : Discrete_String_Pack.Bounded_String := + Discrete_String_Pack.Null_Bounded_String; + begin + + Discrete_Package.Save(Gen => Gen_1, + To_State => State_1); + Discrete_Package.Save(Gen_2, To_State => State_2); + + State_String_1 := + Discrete_String_Pack.To_Bounded_String(Source => + Discrete_Package.Image(Of_State => State_1)); + + State_String_2 := + Discrete_String_Pack.To_Bounded_String(Source => + Discrete_Package.Image(Of_State => State_2)); + + case States_Should_Match is + when True => + if State_1 /= State_2 then + Report.Failed("Subtest #" & Integer'Image(Sub_Test) & + " State values from Discrete " & + "generators are not the same"); + end if; + if State_String_1 /= State_String_2 then + Report.Failed("Subtest #" & Integer'Image(Sub_Test) & + " State strings from Discrete " & + "generators are not the same"); + end if; + when False => + if State_1 = State_2 then + Report.Failed("Subtest #" & Integer'Image(Sub_Test) & + " State values from Discrete " & + "generators are the same"); + end if; + if State_String_1 = State_String_2 then + Report.Failed("Subtest #" & Integer'Image(Sub_Test) & + " State strings from Discrete " & + "generators are the same"); + end if; + end case; + end Check_Discrete_State; + + + + procedure Check_Float_Values (Gen_1, Gen_2 : Float_Random.Generator; + Sub_Test : Integer; + Values_Should_Match : Boolean) is + Matches : Natural := 0; + Check_Failed : Boolean := False; + begin + case Values_Should_Match is + when True => + for i in 1..TC_Max_Loop_Count loop + if Float_Random.Random(Gen_1) /= Float_Random.Random(Gen_2) + then + Check_Failed := True; + exit; + end if; + end loop; + if Check_Failed then + Report.Failed("Sub_Test # " & Integer'Image(Sub_Test) & + " Random numbers from Float generators " & + "Failed check"); + end if; + when False => + for i in 1..TC_Max_Loop_Count loop + if Float_Random.Random(Gen_1) = Float_Random.Random(Gen_2) + then + Matches := Matches + 1; + end if; + end loop; + end case; + + if (Values_Should_Match and Check_Failed) or + (not Values_Should_Match and Matches > Allowed_Matches) + then + Report.Failed("Sub_Test # " & Integer'Image(Sub_Test) & + " Random numbers from Float generators " & + "Failed check"); + end if; + + end Check_Float_Values; + + + + procedure Check_Discrete_Values (Gen_1, + Gen_2 : Discrete_Package.Generator; + Sub_Test : Integer; + Values_Should_Match : Boolean) is + Matches : Natural := 0; + Check_Failed : Boolean := False; + begin + case Values_Should_Match is + when True => + for i in 1..TC_Max_Loop_Count loop + if Discrete_Package.Random(Gen_1) /= + Discrete_Package.Random(Gen_2) + then + Check_Failed := True; + exit; + end if; + end loop; + when False => + for i in 1..TC_Max_Loop_Count loop + if Discrete_Package.Random(Gen_1) = + Discrete_Package.Random(Gen_2) + then + Matches := Matches + 1; + end if; + end loop; + end case; + + if (Values_Should_Match and Check_Failed) or + (not Values_Should_Match and Matches > Allowed_Matches) + then + Report.Failed("Sub_Test # " & Integer'Image(Sub_Test) & + " Random numbers from Discrete generators " & + "Failed check"); + end if; + + end Check_Discrete_Values; + + + + begin + + Sub_Test_1: + -- Check that two objects of type Generator are initialized to the + -- same state. + begin + + -- Since the discrete and float random generators are in the initial + -- state, using Procedure Save to save the states of the generator + -- objects, and transforming these states into strings using + -- Function Image, should yield identical strings. + + Check_Discrete_State (Discrete_Generator_1, + Discrete_Generator_2, + Sub_Test => 1, + States_Should_Match => True); + + Check_Float_State (Float_Generator_1, + Float_Generator_2, + Sub_Test => 1, + States_Should_Match => True); + + -- Since the two random generator objects are in their initial + -- state, the values produced from each (upon calls to Random) + -- should be identical. + + Check_Discrete_Values (Discrete_Generator_1, + Discrete_Generator_2, + Sub_Test => 1, + Values_Should_Match => True); + + Check_Float_Values (Float_Generator_1, + Float_Generator_2, + Sub_Test => 1, + Values_Should_Match => True); + + end Sub_Test_1; + + + + Sub_Test_3: + -- Check that when the Function Reset uses the same integer + -- initiator to reset two generators to the same state, the + -- resulting random values and the state from each generator + -- are identical. + declare + use Discrete_Package, Float_Random; + begin + + -- Reset the generators to the same states, using the version of + -- Function Reset with both generator parameter and initiator + -- specified. + + TC_Seed := Integer(Random(Discrete_Generator_1)); + Reset(Gen => Discrete_Generator_1, Initiator => TC_Seed); + Reset(Discrete_Generator_2, Initiator => TC_Seed); + Reset(Float_Generator_1, TC_Seed); + Reset(Float_Generator_2, TC_Seed); + + -- Since the random generators have been reset to identical states, + -- bounded string images of these states should yield identical + -- strings. + + Check_Discrete_State (Discrete_Generator_1, + Discrete_Generator_2, + Sub_Test => 3, + States_Should_Match => True); + + Check_Float_State (Float_Generator_1, + Float_Generator_2, + Sub_Test => 3, + States_Should_Match => True); + + -- Since the random generators have been reset to identical states, + -- the values produced from each (upon calls to Random) should + -- be identical. + + Check_Discrete_Values (Discrete_Generator_1, + Discrete_Generator_2, + Sub_Test => 3, + Values_Should_Match => True); + + Check_Float_Values (Float_Generator_1, + Float_Generator_2, + Sub_Test => 3, + Values_Should_Match => True); + + end Sub_Test_3; + + + + Sub_Test_4: + -- Check that when the Function Reset uses different integer + -- initiator values to reset two generators, the resulting random + -- numbers and states are different. + begin + + -- Reset the generators to different states. + + TC_Seed := + Integer(Discrete_Package.Random(Discrete_Generator_1)); + + Discrete_Package.Reset(Gen => Discrete_Generator_1, + Initiator => TC_Seed); + + -- Set the seed value to a different value for the second call + -- to Reset. + -- Note: A second call to Random could be made, as above, but that + -- would not ensure that the resulting seed value was + -- different from the first. + + if TC_Seed /= Integer'Last then + TC_Seed := TC_Seed + 1; + else + TC_Seed := TC_Seed - 1; + end if; + + Discrete_Package.Reset(Gen => Discrete_Generator_2, + Initiator => TC_Seed); + + Float_Random.Reset(Float_Generator_1, 16#FF#); -- 255 + Float_Random.Reset(Float_Generator_2, 2#1110_0000#); -- 224 + + -- Since the two float random generators are in different + -- states, the bounded string images depicting their states should + -- differ. + + Check_Discrete_State (Discrete_Generator_1, + Discrete_Generator_2, + Sub_Test => 4, + States_Should_Match => False); + + Check_Float_State (Float_Generator_1, + Float_Generator_2, + Sub_Test => 4, + States_Should_Match => False); + + -- Since the two discrete random generator objects were reset + -- to different states, the values produced from each (upon calls + -- to Random) should differ. + + Check_Discrete_Values (Discrete_Generator_1, + Discrete_Generator_2, + Sub_Test => 4, + Values_Should_Match => False); + + Check_Float_Values (Float_Generator_1, + Float_Generator_2, + Sub_Test => 4, + Values_Should_Match => False); + + end Sub_Test_4; + + exception + when The_Error : others => + Report.Failed ("The following exception was raised in the " & + "Test_Block: " & Exception_Name(The_Error)); + end Test_Block; + + Report.Result; + +end CXA5011; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxa5012.a b/gcc/testsuite/ada/acats/tests/cxa/cxa5012.a new file mode 100644 index 000000000..a286fa71e --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxa5012.a @@ -0,0 +1,536 @@ +-- CXA5012.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, for both Float_Random and Discrete_Random packages, +-- the following are true: +-- 1) the procedures Save and Reset can be used to save the +-- specific state of a random number generator, and then restore +-- the specific state to the generator following some intermediate +-- generator activity. +-- 2) the Function Image can be used to obtain a string +-- representation of the state of a generator; and that the +-- Function Value will transform a string representation of the +-- state of a random number generator into the actual state object. +-- 3) a call to Function Value, with a string value that is +-- not the image of any generator state, is a bounded error. This +-- error either raises Constraint_Error or Program_Error, or is +-- accepted. (See Technical Corrigendum 1). +-- +-- TEST DESCRIPTION: +-- This test evaluates components of the Ada.Numerics.Float_Random and +-- Ada.Numerics.Discrete_Random packages. +-- The first objective block of this test uses Procedure Save to +-- save the particular state of a random number generator. The random +-- number generator then generates a series of random numbers. The +-- saved state variable is then used to reset (using Procedure Reset) +-- the generator back to the state it was in at the point of the call +-- to Save. Random values are then generated from this restored +-- generator, and compared with expected values. +-- The second objective block of this test uses Function Image to +-- provide a string representation of a state code. This string is +-- then transformed back to a state code value, and used to reset a +-- random number generator to the saved state. Random values are +-- likewise generated from this restored generator, and compared with +-- expected values. +-- +-- +-- CHANGE HISTORY: +-- 25 Apr 95 SAIC Initial prerelease version. +-- 17 Jul 95 SAIC Incorporated reviewer comments. +-- 17 Dec 97 EDS Change subtype upper limit from 100_000 to 10_000. +-- 16 Sep 99 RLB Updated objective 3 for Technical Corrigendum 1 +-- changes. + +--! + +with Ada.Numerics.Float_Random; +with Ada.Numerics.Discrete_Random; +with Ada.Strings.Bounded; +with ImpDef; +with Report; + +procedure CXA5012 is + +begin + + Report.Test ("CXA5012", "Check the effect of Procedures Save and " & + "Reset, and Functions Image and Value " & + "from the Ada.Numerics.Discrete_Random " & + "and Float_Random packages"); + + Test_Block: + declare + + use Ada.Numerics, Ada.Strings.Bounded; + + -- Declare an integer subtype and an enumeration subtype, and use them + -- to instantiate the discrete random number generator generic package. + + subtype Discrete_Range is Integer range 1..10_000; + type Suit_Of_Cards is (Ace, One, Two, Three, Four, Five, Six, + Seven, Eight, Nine, Ten, Jack, Queen, King); + package Discrete_Pack is new Discrete_Random(Discrete_Range); + package Card_Pack is new Discrete_Random(Suit_Of_Cards); + + -- Declaration of random number generator objects. + + DGen_1, DGen_2 : Discrete_Pack.Generator; + EGen_1, EGen_2 : Card_Pack.Generator; + FGen_1, FGen_2 : Float_Random.Generator; + + -- Variables declared to hold random numbers over the inclusive range + -- of their corresponding type. + + DVal_1, DVal_2 : Discrete_Range; + EVal_1, EVal_2 : Suit_Of_Cards; + FVal_1, FVal_2 : Float_Random.Uniformly_Distributed; + + -- Declaration of State variables used to hold the state of the + -- random number generators. + + DState_1, DState_2 : Discrete_Pack.State; + EState_1, EState_2 : Card_Pack.State; + FState_1, FState_2 : Float_Random.State; + + -- Declaration of bounded string packages instantiated with the + -- value of Max_Image_Width constant, and bounded string variables + -- used to hold the image of random number generator states. + + package DString_Pack is + new Generic_Bounded_Length(Discrete_Pack.Max_Image_Width); + package EString_Pack is + new Generic_Bounded_Length(Card_Pack.Max_Image_Width); + package FString_Pack is + new Generic_Bounded_Length(Float_Random.Max_Image_Width); + + use DString_Pack, EString_Pack, FString_Pack; + + DString_1, DString_2 : DString_Pack.Bounded_String := + DString_Pack.Null_Bounded_String; + EString_1, EString_2 : EString_Pack.Bounded_String := + EString_Pack.Null_Bounded_String; + FString_1, FString_2 : FString_Pack.Bounded_String := + FString_Pack.Null_Bounded_String; + + -- Test variables. + + TC_Count : Natural; + TC_Discrete_Check_Failed, + TC_Enum_Check_Failed, + TC_Float_Check_Failed : Boolean := False; + TC_Seed : Integer; + + begin + + Objective_1: + -- Check that the procedures Save and Reset can be used to save the + -- specific state of a random number generator, and then restore the + -- specific state to the generator following some intermediate + -- generator activity. + declare + + First_Row : constant := 1; + Second_Row : constant := 2; + TC_Max_Values : constant := 100; + + TC_Discrete_Array : array (First_Row..Second_Row, 1..TC_Max_Values) + of Discrete_Range; + TC_Enum_Array : array (First_Row..Second_Row, 1..TC_Max_Values) + of Suit_Of_Cards; + TC_Float_Array : array (First_Row..Second_Row, 1..TC_Max_Values) + of Float_Random.Uniformly_Distributed; + begin + + -- The state of the random number generators are saved to state + -- variables using the procedure Save. + + Discrete_Pack.Save(Gen => DGen_1, To_State => DState_1); + Card_Pack.Save (Gen => EGen_1, To_State => EState_1); + Float_Random.Save (Gen => FGen_1, To_State => FState_1); + + -- Random number generators are used to fill the first half of the + -- first row of the arrays with randomly generated values. + + for i in 1..TC_Max_Values/2 loop + TC_Discrete_Array(First_Row, i) := Discrete_Pack.Random(DGen_1); + TC_Enum_Array(First_Row, i) := Card_Pack.Random(EGen_1); + TC_Float_Array(First_Row, i) := Float_Random.Random(FGen_1); + end loop; + + -- The random number generators are reset to the states saved in the + -- state variables, using the procedure Reset. + + Discrete_Pack.Reset(Gen => DGen_1, From_State => DState_1); + Card_Pack.Reset (Gen => EGen_1, From_State => EState_1); + Float_Random.Reset (Gen => FGen_1, From_State => FState_1); + + -- The same random number generators are used to fill the first half + -- of the second row of the arrays with randomly generated values. + + for i in 1..TC_Max_Values/2 loop + TC_Discrete_Array(Second_Row, i) := Discrete_Pack.Random(DGen_1); + TC_Enum_Array(Second_Row, i) := Card_Pack.Random(EGen_1); + TC_Float_Array(Second_Row, i) := Float_Random.Random(FGen_1); + end loop; + + -- Run the random number generators many times (not using results). + + for i in Discrete_Range'Range loop + DVal_1 := Discrete_Pack.Random(DGen_1); + EVal_1 := Card_Pack.Random(EGen_1); + FVal_1 := Float_Random.Random(FGen_1); + end loop; + + -- The states of the random number generators are saved to state + -- variables using the procedure Save. + + Discrete_Pack.Save(Gen => DGen_1, To_State => DState_1); + Card_Pack.Save(Gen => EGen_1, To_State => EState_1); + Float_Random.Save (Gen => FGen_1, To_State => FState_1); + + -- The last half of the first row of the arrays are filled with + -- values generated from the same random number generators. + + for i in (TC_Max_Values/2 + 1)..TC_Max_Values loop + TC_Discrete_Array(First_Row, i) := Discrete_Pack.Random(DGen_1); + TC_Enum_Array(First_Row, i) := Card_Pack.Random(EGen_1); + TC_Float_Array(First_Row, i) := Float_Random.Random(FGen_1); + end loop; + + -- The random number generators are reset to the states saved in the + -- state variables, using the procedure Reset. + + Discrete_Pack.Reset(Gen => DGen_1, From_State => DState_1); + Card_Pack.Reset(Gen => EGen_1, From_State => EState_1); + Float_Random.Reset (Gen => FGen_1, From_State => FState_1); + + -- The last half of the second row of the arrays are filled with + -- values generated from the same random number generator. + -- These values should exactly mirror the values in the last half + -- of the first row of the arrays that had been previously generated. + + for i in (TC_Max_Values/2 + 1)..TC_Max_Values loop + TC_Discrete_Array(Second_Row, i) := Discrete_Pack.Random(DGen_1); + TC_Enum_Array(Second_Row, i) := Card_Pack.Random(EGen_1); + TC_Float_Array(Second_Row, i) := Float_Random.Random(FGen_1); + end loop; + + -- Check that the values in the two rows of the arrays are identical. + + for i in 1..TC_Max_Values loop + if TC_Discrete_Array(First_Row,i) /= + TC_Discrete_Array(Second_Row,i) + then + TC_Discrete_Check_Failed := True; + exit; + end if; + end loop; + + for i in 1..TC_Max_Values loop + if TC_Enum_Array(First_Row,i) /= TC_Enum_Array(Second_Row,i) then + TC_Enum_Check_Failed := True; + exit; + end if; + end loop; + + for i in 1..TC_Max_Values loop + if TC_Float_Array(First_Row,i) /= TC_Float_Array(Second_Row,i) + then + TC_Float_Check_Failed := True; + exit; + end if; + end loop; + + if TC_Discrete_Check_Failed then + Report.Failed("Discrete random values generated following use " & + "of procedures Save and Reset were not the same"); + TC_Discrete_Check_Failed := False; + end if; + + if TC_Enum_Check_Failed then + Report.Failed("Enumeration random values generated following " & + "use of procedures Save and Reset were not the " & + "same"); + TC_Enum_Check_Failed := False; + end if; + + if TC_Float_Check_Failed then + Report.Failed("Float random values generated following use " & + "of procedures Save and Reset were not the same"); + TC_Float_Check_Failed := False; + end if; + + end Objective_1; + + + + Objective_2: + -- Check that the Function Image can be used to obtain a string + -- representation of the state of a generator. + -- Check that the Function Value will transform a string + -- representation of the state of a random number generator + -- into the actual state object. + begin + + -- Use two discrete and float random number generators to generate + -- a series of values (so that the generators are no longer in their + -- initial states, and they have generated the same number of + -- random values). + + TC_Seed := Integer(Discrete_Pack.Random(DGen_1)); + Discrete_Pack.Reset(DGen_1, TC_Seed); + Discrete_Pack.Reset(DGen_2, TC_Seed); + Card_Pack.Reset (EGen_1, TC_Seed); + Card_Pack.Reset (EGen_2, TC_Seed); + Float_Random.Reset (FGen_1, TC_Seed); + Float_Random.Reset (FGen_2, TC_Seed); + + for i in 1..1000 loop + DVal_1 := Discrete_Pack.Random(DGen_1); + DVal_2 := Discrete_Pack.Random(DGen_2); + EVal_1 := Card_Pack.Random(EGen_1); + EVal_2 := Card_Pack.Random(EGen_2); + FVal_1 := Float_Random.Random(FGen_1); + FVal_2 := Float_Random.Random(FGen_2); + end loop; + + -- Use the Procedure Save to save the states of the generators + -- to state variables. + + Discrete_Pack.Save(Gen => DGen_1, To_State => DState_1); + Discrete_Pack.Save(DGen_2, To_State => DState_2); + Card_Pack.Save (Gen => EGen_1, To_State => EState_1); + Card_Pack.Save (EGen_2, To_State => EState_2); + Float_Random.Save (FGen_1, To_State => FState_1); + Float_Random.Save (FGen_2, FState_2); + + -- Use the Function Image to produce a representation of the state + -- codes as (bounded) string objects. + + DString_1 := DString_Pack.To_Bounded_String( + Discrete_Pack.Image(Of_State => DState_1)); + DString_2 := DString_Pack.To_Bounded_String( + Discrete_Pack.Image(DState_2)); + EString_1 := EString_Pack.To_Bounded_String( + Card_Pack.Image(Of_State => EState_1)); + EString_2 := EString_Pack.To_Bounded_String( + Card_Pack.Image(EState_2)); + FString_1 := FString_Pack.To_Bounded_String( + Float_Random.Image(Of_State => FState_1)); + FString_2 := FString_Pack.To_Bounded_String( + Float_Random.Image(FState_2)); + + -- Compare the bounded string objects for equality. + + if DString_1 /= DString_2 then + Report.Failed("String values returned from Function Image " & + "depict different states of Discrete generators"); + end if; + if EString_1 /= EString_2 then + Report.Failed("String values returned from Function Image " & + "depict different states of Enumeration " & + "generators"); + end if; + if FString_1 /= FString_2 then + Report.Failed("String values returned from Function Image " & + "depict different states of Float generators"); + end if; + + -- The string representation of a state code is transformed back + -- to a state code variable using the Function Value. + + DState_1 := Discrete_Pack.Value(Coded_State => + DString_Pack.To_String(DString_1)); + EState_1 := Card_Pack.Value(EString_Pack.To_String(EString_1)); + FState_1 := Float_Random.Value(FString_Pack.To_String(FString_1)); + + -- One of the (pair of each type of ) generators is used to generate + -- a series of random values, getting them "out of synch" with the + -- specific generation sequence of the other generators. + + for i in 1..100 loop + DVal_1 := Discrete_Pack.Random(DGen_1); + EVal_1 := Card_Pack.Random(EGen_1); + FVal_1 := Float_Random.Random (FGen_1); + end loop; + + -- The "out of synch" generators are reset to the previous state they + -- had when their states were saved, and they should now have the same + -- states as the generators that did not generate the values above. + + Discrete_Pack.Reset(Gen => DGen_1, From_State => DState_1); + Card_Pack.Reset (Gen => EGen_1, From_State => EState_1); + Float_Random.Reset (Gen => FGen_1, From_State => FState_1); + + -- All generators should now be in the same state, so the + -- random values they produce should be the same. + + for i in 1..1000 loop + if Discrete_Pack.Random(DGen_1) /= Discrete_Pack.Random(DGen_2) + then + TC_Discrete_Check_Failed := True; + exit; + end if; + end loop; + + for i in 1..1000 loop + if Card_Pack.Random(EGen_1) /= Card_Pack.Random(EGen_2) then + TC_Enum_Check_Failed := True; + exit; + end if; + end loop; + + for i in 1..1000 loop + if Float_Random.Random(FGen_1) /= Float_Random.Random(FGen_2) + then + TC_Float_Check_Failed := True; + exit; + end if; + end loop; + + if TC_Discrete_Check_Failed then + Report.Failed("Random values generated following use of " & + "procedures Image and Value were not the same " & + "for Discrete generator"); + end if; + if TC_Enum_Check_Failed then + Report.Failed("Random values generated following use of " & + "procedures Image and Value were not the same " & + "for Enumeration generator"); + end if; + if TC_Float_Check_Failed then + Report.Failed("Random values generated following use of " & + "procedures Image and Value were not the same " & + "for Float generator"); + end if; + + end Objective_2; + + + + Objective_3: + -- Check that a call to Function Value, with a string value that is + -- not the image of any generator state, is a bounded error. This + -- error either raises Constraint_Error or Program_Error, or is + -- accepted. (See Technical Corrigendum 1). + declare + Not_A_State : constant String := ImpDef.Non_State_String; + begin + + begin + DState_1 := Discrete_Pack.Value(Not_A_State); + if Not_A_State /= "**NONE**" then + Report.Failed("Exception not raised by Function " & + "Ada.Numerics.Discrete_Random.Value when " & + "provided a string input that does not " & + "represent the state of a random number " & + "generator"); + else + Report.Comment("All strings represent states for Function " & + "Ada.Numerics.Discrete_Random.Value"); + end if; + Discrete_Pack.Reset(DGen_1, DState_1); + exception + when Constraint_Error => null; -- OK, expected exception. + Report.Comment("Constraint_Error raised by Function " & + "Ada.Numerics.Discrete_Random.Value when " & + "provided a string input that does not " & + "represent the state of a random number " & + "generator"); + when Program_Error => -- OK, expected exception. + Report.Comment("Program_Error raised by Function " & + "Ada.Numerics.Discrete_Random.Value when " & + "provided a string input that does not " & + "represent the state of a random number " & + "generator"); + when others => + Report.Failed("Unexpected exception raised by Function " & + "Ada.Numerics.Discrete_Random.Value when " & + "provided a string input that does not " & + "represent the state of a random number " & + "generator"); + end; + + begin + EState_1 := Card_Pack.Value(Not_A_State); + if Not_A_State /= "**NONE**" then + Report.Failed("Exception not raised by Function " & + "Ada.Numerics.Discrete_Random.Value when " & + "provided a string input that does not " & + "represent the state of an enumeration " & + "random number generator"); + else + Report.Comment("All strings represent states for Function " & + "Ada.Numerics.Discrete_Random.Value"); + end if; + Card_Pack.Reset(EGen_1, EState_1); + exception + when Constraint_Error => null; -- OK, expected exception. + when Program_Error => null; -- OK, expected exception. + when others => + Report.Failed("Unexpected exception raised by Function " & + "Ada.Numerics.Discrete_Random.Value when " & + "provided a string input that does not " & + "represent the state of an enumeration " & + "random number generator"); + end; + + begin + FState_1 := Float_Random.Value(Not_A_State); + if Not_A_State /= "**NONE**" then + Report.Failed("Exception not raised by an " & + "instantiated version of " & + "Ada.Numerics.Float_Random.Value when " & + "provided a string input that does not " & + "represent the state of a random number " & + "generator"); + else + Report.Comment("All strings represent states for Function " & + "Ada.Numerics.Float_Random.Value"); + end if; + Float_Random.Reset(FGen_1, FState_1); + exception + when Constraint_Error => null; -- OK, expected exception. + when Program_Error => null; -- OK, expected exception. + when others => + Report.Failed("Unexpected exception raised by an " & + "instantiated version of " & + "Ada.Numerics.Float_Random.Value when " & + "provided a string input that does not " & + "represent the state of a random number " & + "generator"); + end; + + end Objective_3; + + + exception + when others => Report.Failed ("Exception raised in Test_Block"); + end Test_Block; + + Report.Result; + +end CXA5012; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxa5015.a b/gcc/testsuite/ada/acats/tests/cxa/cxa5015.a new file mode 100644 index 000000000..e1035db27 --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxa5015.a @@ -0,0 +1,342 @@ +-- CXA5015.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 following representation-oriented attributes are +-- available and that the produce correct results: +-- 'Denorm, 'Signed_Zeros, 'Exponent 'Fraction, 'Compose, 'Scaling, +-- 'Floor, 'Ceiling, 'Rounding, 'Unbiased_Rounding, 'Truncation, +-- 'Remainder, 'Adjacent, 'Copy_Sign, 'Leading_Part, 'Machine, and +-- 'Model_Small. +-- +-- TEST DESCRIPTION: +-- This test checks whether certain attributes of floating point types +-- are available from an implementation. Where attribute correctness +-- can be verified in a straight forward manner, the appropriate checks +-- are included here. However, this test is not intended to ensure the +-- correctness of the results returned from all of the attributes +-- examined in this test; that process will occur in the tests of the +-- Numerics_Annex. +-- +-- +-- CHANGE HISTORY: +-- 26 Jun 95 SAIC Initial prerelease version. +-- 29 Apr 96 SAIC Incorporated reviewer comments for ACVC 2.1. +-- 01 DEC 97 EDS Fix value for checking the S'Adjacent attribute +--! + +with Report; + +procedure CXA5015 is + + subtype Float_Subtype is Float range -10.0..10.0; + type Derived_Float_1 is digits 8; + type Derived_Float_2 is new Derived_Float_1 range -10.0..10.0E10; + + use type Float, Float_Subtype, Derived_Float_1, Derived_Float_2; + + TC_Boolean : Boolean; + TC_Float : Float; + TC_SFloat : Float_Subtype; + TC_DFloat_1 : Derived_Float_1; + TC_DFloat_2 : Derived_Float_2; + TC_Tolerance : Float := 0.001; + + function Not_Equal (Actual_Result, Expected_Result, Tolerance : Float) + return Boolean is + begin + return abs(Actual_Result - Expected_Result) > Tolerance; + end Not_Equal; + + +begin + + Report.Test ("CXA5015", "Check that certain representation-oriented " & + "attributes are available and that they " & + "produce correct results"); + + -- New Representation-Oriented Attributes. + -- + -- Check the S'Denorm attribute. + + TC_Boolean := Float'Denorm; + TC_Boolean := Float_Subtype'Denorm; + TC_Boolean := Derived_Float_1'Denorm; + TC_Boolean := Derived_Float_2'Denorm; + + + -- Check the S'Signed_Zeroes attribute. + + TC_Boolean := Float'Signed_Zeros; + TC_Boolean := Float_Subtype'Signed_Zeros; + TC_Boolean := Derived_Float_1'Signed_Zeros; + TC_Boolean := Derived_Float_2'Signed_Zeros; + + + -- New Primitive Function Attributes. + -- + -- Check the S'Exponent attribute. + + TC_Float := 0.5; + TC_SFloat := 0.99; + TC_DFloat_1 := 2.45; + TC_DFloat_2 := 2.65; + + if Float'Exponent(TC_Float) > Float_Subtype'Exponent(TC_SFloat) or + Float'Exponent(TC_Float) > 2 + then + Report.Failed("Incorrect result from the 'Exponent attribute"); + end if; + + + -- Check the S'Fraction attribute. + + if Not_Equal + (Float'Fraction(TC_Float), + TC_Float * Float(Float'Machine_Radix)**(-Float'Exponent(TC_Float)), + TC_Tolerance) + then + Report.Failed("Incorrect result from the 'Fraction attribute - 1"); + end if; + + if Float'Fraction(TC_Float) < + (1.0/Float(Float'Machine_Radix)) - TC_Tolerance or + Float'Fraction(TC_Float) >= 1.0 - TC_Tolerance + then + Report.Failed("Incorrect result from the 'Fraction attribute - 2"); + end if; + + + -- Check the S'Compose attribute. + + if Not_Equal + (Float'Compose(TC_Float, 3), + TC_Float * Float(Float'Machine_Radix)**(3-Float'Exponent(TC_Float)), + TC_Tolerance) + then + Report.Failed("Incorrect result from the 'Compose attribute"); + end if; + + + -- Check the S'Scaling attribute. + + if Not_Equal + (Float'Scaling(TC_Float, 2), + TC_Float * Float(Float'Machine_Radix)**2, + TC_Tolerance) + then + Report.Failed("Incorrect result from the 'Scaling attribute"); + end if; + + + -- Check the S'Floor attribute. + + TC_Float := 0.99; + TC_SFloat := 1.00; + TC_DFloat_1 := 2.50; + TC_DFloat_2 := -2.50; + + if Float'Floor(TC_Float) /= 0.0 or + Float_Subtype'Floor(TC_SFloat) /= 1.0 or + Derived_Float_1'Floor(TC_DFloat_1) /= 2.0 or + Derived_Float_2'Floor(TC_DFloat_2) /= -3.0 + then + Report.Failed("Incorrect result from the 'Floor attribute"); + end if; + + + -- Check the S'Ceiling attribute. + + TC_Float := 0.99; + TC_SFloat := 1.00; + TC_DFloat_1 := 2.50; + TC_DFloat_2 := -2.99; + + if Float'Ceiling(TC_Float) /= 1.0 or + Float_Subtype'Ceiling(TC_SFloat) /= 1.0 or + Derived_Float_1'Ceiling(TC_DFloat_1) /= 3.0 or + Derived_Float_2'Ceiling(TC_DFloat_2) /= -2.0 + then + Report.Failed("Incorrect result from the 'Ceiling attribute"); + end if; + + + -- Check the S'Rounding attribute. + + TC_Float := 0.49; + TC_SFloat := 1.00; + TC_DFloat_1 := 2.50; + TC_DFloat_2 := -2.50; + + if Float'Rounding(TC_Float) /= 0.0 or + Float_Subtype'Rounding(TC_SFloat) /= 1.0 or + Derived_Float_1'Rounding(TC_DFloat_1) /= 3.0 or + Derived_Float_2'Rounding(TC_DFloat_2) /= -3.0 + then + Report.Failed("Incorrect result from the 'Rounding attribute"); + end if; + + + -- Check the S'Unbiased_Rounding attribute. + + TC_Float := 0.50; + TC_SFloat := 1.50; + TC_DFloat_1 := 2.50; + TC_DFloat_2 := -2.50; + + if Float'Unbiased_Rounding(TC_Float) /= 0.0 or + Float_Subtype'Unbiased_Rounding(TC_SFloat) /= 2.0 or + Derived_Float_1'Unbiased_Rounding(TC_DFloat_1) /= 2.0 or + Derived_Float_2'Unbiased_Rounding(TC_DFloat_2) /= -2.0 + then + Report.Failed("Incorrect result from the 'Unbiased_Rounding " & + "attribute"); + end if; + + + -- Check the S'Truncation attribute. + + TC_Float := -0.99; + TC_SFloat := 1.50; + TC_DFloat_1 := 2.99; + TC_DFloat_2 := -2.50; + + if Float'Truncation(TC_Float) /= 0.0 or + Float_Subtype'Truncation(TC_SFloat) /= 1.0 or + Derived_Float_1'Truncation(TC_DFloat_1) /= 2.0 or + Derived_Float_2'Truncation(TC_DFloat_2) /= -2.0 + then + Report.Failed("Incorrect result from the 'Truncation attribute"); + end if; + + + -- Check the S'Remainder attribute. + + TC_Float := 9.0; + TC_SFloat := 7.5; + TC_DFloat_1 := 5.0; + TC_DFloat_2 := 8.0; + + if Float'Remainder(TC_Float, 2.0) /= 1.0 or + Float_Subtype'Remainder(TC_SFloat, 3.0) /= 1.5 or + Derived_Float_1'Remainder(TC_DFloat_1, 2.0) /= 1.0 or + Derived_Float_2'Remainder(TC_DFloat_2, 4.0) /= 0.0 + then + Report.Failed("Incorrect result from the 'Remainder attribute"); + end if; + + + -- Check the S'Adjacent attribute. + + TC_Float := 4.0; + TC_SFloat := -1.0; + + if Float'Adjacent(TC_Float, TC_Float) /= TC_Float or + Float_Subtype'Adjacent(TC_SFloat, -1.0) /= TC_SFloat + then + Report.Failed("Incorrect result from the 'Adjacent attribute"); + end if; + + + -- Check the S'Copy_Sign attribute. + + TC_Float := 0.0; + TC_SFloat := -1.0; + TC_DFloat_1 := 5.0; + TC_DFloat_2 := -2.5; + + if Float'Copy_Sign(TC_Float, -2.0) /= 0.0 or + Float_Subtype'Copy_Sign(TC_SFloat, 4.0) /= 1.0 or + Derived_Float_1'Copy_Sign(TC_DFloat_1, -2.0) /= -5.0 or + Derived_Float_2'Copy_Sign(TC_DFloat_2, -2.0) /= -2.5 + then + Report.Failed("Incorrect result from the 'Copy_Sign attribute"); + end if; + + + -- Check the S'Leading_Part attribute. + + TC_Float := 0.0; + TC_SFloat := -1.0; + TC_DFloat_1 := 5.88; + TC_DFloat_2 := -2.52; + + -- Leading part obtained in the variables. + TC_Float := Float'Leading_Part(TC_Float, 2); + TC_SFloat := Float_Subtype'Leading_Part(TC_SFloat, 2); + TC_DFloat_1 := Derived_Float_1'Leading_Part(TC_DFloat_1, 2); + TC_DFloat_2 := Derived_Float_2'Leading_Part(TC_DFloat_2, 2); + + -- Checking for the leading part of the variables at this point should + -- produce the same values. + if Float'Leading_Part(TC_Float, 2) /= TC_Float or + Float_Subtype'Leading_Part(TC_SFloat, 2) /= TC_SFloat or + Derived_Float_1'Leading_Part(TC_DFloat_1, 2) /= TC_DFloat_1 or + Derived_Float_2'Leading_Part(TC_DFloat_2, 2) /= TC_DFloat_2 + then + Report.Failed("Incorrect result from the 'Leading_Part attribute"); + end if; + + + -- Check the S'Machine attribute. + + TC_Float := 0.0; + TC_SFloat := -1.0; + TC_DFloat_1 := 5.88; + TC_DFloat_2 := -2.52; + + -- Closest machine number obtained in the variables. + TC_Float := Float'Machine(TC_Float); + TC_SFloat := Float_Subtype'Machine(TC_SFloat); + TC_DFloat_1 := Derived_Float_1'Machine(TC_DFloat_1); + TC_DFloat_2 := Derived_Float_2'Machine(TC_DFloat_2); + + -- Checking for the closest machine number to each of the variables at + -- this point should produce the same values. + if Float'Machine(TC_Float) /= TC_Float or + Float_Subtype'Machine(TC_SFloat) /= TC_SFloat or + Derived_Float_1'Machine(TC_DFloat_1) /= TC_DFloat_1 or + Derived_Float_2'Machine(TC_DFloat_2) /= TC_DFloat_2 + then + Report.Failed("Incorrect result from the 'Machine attribute"); + end if; + + + -- New Model-Oriented Attributes. + -- + -- Check the S'Model_Small attribute. + + if Not_Equal + (Float'Model_Small, + Float(Float'Machine_Radix)**(Float'Model_Emin-1), + TC_Tolerance) + then + Report.Failed("Incorrect result from the 'Model_Small attribute"); + end if; + + + Report.Result; + +end CXA5015; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxa5a01.a b/gcc/testsuite/ada/acats/tests/cxa/cxa5a01.a new file mode 100644 index 000000000..12db5e7e1 --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxa5a01.a @@ -0,0 +1,338 @@ +-- CXA5A01.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 functions Sin and Sinh provide correct results. +-- +-- TEST DESCRIPTION: +-- This test examines both the version of Sin and Sinh resulting from +-- the instantiation of the Ada.Numerics.Generic_Elementary_Functions +-- with a type derived from type Float, as well as the preinstantiated +-- version of this package for type Float. +-- Prescribed results, as well as instances prescribed to raise +-- exceptions, are examined in the test cases. In addition, +-- certain evaluations are performed where the actual function result +-- is compared with the expected result (within an epsilon range of +-- accuracy). +-- +-- TEST FILES: +-- The following files comprise this test: +-- +-- FXA5A00.A (foundation code) +-- CXA5A01.A +-- +-- +-- CHANGE HISTORY: +-- 06 Mar 95 SAIC Initial prerelease version. +-- 13 Jun 95 SAIC Incorporated use of Dont_Optimize procedure, and +-- use of Result_Within_Range function overloaded for +-- FXA5A00.New_Float_Type. +-- 26 Jun 98 EDS Protected exception tests by first testing +-- for 'Machine_Overflows +--! + +with Ada.Numerics.Elementary_Functions; +with Ada.Numerics.Generic_Elementary_Functions; +with FXA5A00; +with Report; + +procedure CXA5A01 is +begin + + Report.Test ("CXA5A01", "Check that the functions Sin and Sinh provide " & + "correct results"); + + Test_Block: + declare + + use Ada.Numerics; + use FXA5A00; + + package GEF is new Ada.Numerics.Generic_Elementary_Functions(New_Float); + package EF renames Ada.Numerics.Elementary_Functions; + + The_Result : Float; + New_Float_Result : New_Float; + + procedure Dont_Optimize_Float is new Dont_Optimize(Float); + procedure Dont_Optimize_New_Float is new Dont_Optimize(New_Float); + + begin + + -- Testing of Sin Function, both instantiated and pre-instantiated + -- version. + + -- Check that no exception occurs on computing the Sin with very + -- large (positive and negative) input values. + + begin + New_Float_Result := GEF.Sin (New_Float(FXA5A00.Large)); + Dont_Optimize_New_Float(New_Float_Result, 1); + exception + when others => + Report.Failed("Unexpected exception on GEF.Sin with large " & + "positive value"); + end; + + begin + The_Result := EF.Sin (FXA5A00.Minus_Large); + Dont_Optimize_Float(The_Result, 2); + exception + when others => + Report.Failed("Unexpected exception on GEF.Sin with large " & + "negative value"); + end; + + + -- Test of Sin for prescribed result at zero. + + if GEF.Sin (0.0) /= 0.0 or + EF.Sin (0.0) /= 0.0 + then + Report.Failed("Incorrect value returned from Sin(0.0)"); + end if; + + + -- Test of Sin with expected result value between 0.0 and 1.0. + + if not (GEF.Sin (Ada.Numerics.Pi/4.0) < 1.0) or + not ( EF.Sin (Ada.Numerics.Pi/4.0) < 1.0) or + not FXA5A00.Result_Within_Range(GEF.Sin(0.35), 0.343, 0.001) or + not FXA5A00.Result_Within_Range( EF.Sin(1.18), 0.924, 0.001) + then + Report.Failed("Incorrect value returned from Sin function when " & + "the expected result is between 0.0 and 1.0"); + end if; + + + -- Test of Sin with expected result value between -1.0 and 0.0. + + if not (GEF.Sin (-Ada.Numerics.Pi/4.0) > -1.0) or + not ( EF.Sin (-Ada.Numerics.Pi/4.0) > -1.0) or + not FXA5A00.Result_Within_Range(GEF.Sin(-0.24), -0.238, 0.001) or + not FXA5A00.Result_Within_Range( EF.Sin(-1.00), -0.841, 0.001) + then + Report.Failed("Incorrect value returned from Sin function when " & + "the expected result is between -1.0 and 0.0"); + end if; + + + -- Testing of the Sin function with Cycle parameter. + + -- Check that Argument_Error is raised when the value of the Cycle + -- parameter is zero. + + begin + New_Float_Result := GEF.Sin (X => 1.0, Cycle => 0.0); + Report.Failed("Argument_Error not raised by GEF.Sin function " & + "when the Cycle parameter is zero"); + Dont_Optimize_New_Float(New_Float_Result, 3); + exception + when Ada.Numerics.Argument_Error => null; -- OK, expected exception. + when others => + Report.Failed("Unexpected exception raised by GEF.Sin function " & + "when the Cycle parameter is zero"); + end; + + begin + The_Result := EF.Sin (X => 0.34, Cycle => 0.0); + Report.Failed("Argument_Error not raised by EF.Sin function when " & + "the Cycle parameter is zero"); + Dont_Optimize_Float(The_Result, 4); + exception + when Ada.Numerics.Argument_Error => null; -- OK, expected exception. + when others => + Report.Failed("Unexpected exception raised by EF.Sin function " & + "when the Cycle parameter is zero"); + end; + + -- Check that Argument_Error is raised when the value of the Cycle + -- parameter is negative. + + begin + New_Float_Result := GEF.Sin (X => 0.45, Cycle => -1.0); + Report.Failed("Argument_Error not raised by GEF.Sin function " & + "when the Cycle parameter is negative"); + Dont_Optimize_New_Float(New_Float_Result, 5); + exception + when Ada.Numerics.Argument_Error => null; -- OK, expected exception. + when others => + Report.Failed("Unexpected exception raised by GEF.Sin function " & + "when the Cycle parameter is negative"); + end; + + begin + The_Result := EF.Sin (X => 0.10, Cycle => -4.0); + Report.Failed("Argument_Error not raised by EF.Sin function when " & + "the Cycle parameter is negative"); + Dont_Optimize_Float(The_Result, 6); + exception + when Ada.Numerics.Argument_Error => null; -- OK, expected exception. + when others => + Report.Failed("Unexpected exception raised by EF.Sin function " & + "when the Cycle parameter is negative"); + end; + + + -- Check that no exception occurs on computing the Sin with very + -- large (positive and negative) input values and Cycle parameter. + + begin + New_Float_Result := GEF.Sin (New_Float(FXA5A00.Large), 360.0); + Dont_Optimize_New_Float(New_Float_Result, 7); + exception + when others => + Report.Failed("Unexpected exception on GEF.Sin with large " & + "positive value and Cycle parameter"); + end; + + begin + The_Result := EF.Sin (FXA5A00.Minus_Large, 720.0); + Dont_Optimize_Float(The_Result, 8); + exception + when others => + Report.Failed("Unexpected exception on EF.Sin with large " & + "negative value and Cycle parameter"); + end; + + + -- Test of Sin with Cycle parameter for prescribed result at zero. + + if GEF.Sin (0.0, 360.0) /= 0.0 or + EF.Sin (0.0, 180.0) /= 0.0 + then + Report.Failed("Incorrect value returned from Sin function with " & + "cycle parameter for a zero input parameter value"); + end if; + + + -- Tests of Sin function with Cycle parameter for prescribed results. + + if GEF.Sin(0.0, 360.0) /= 0.0 or + EF.Sin(180.0, 360.0) /= 0.0 or + GEF.Sin(90.0, 360.0) /= 1.0 or + EF.Sin(450.0, 360.0) /= 1.0 or + GEF.Sin(270.0, 360.0) /= -1.0 or + EF.Sin(630.0, 360.0) /= -1.0 + then + Report.Failed("Incorrect result from the Sin function with " & + "various cycle values for prescribed results"); + end if; + + + -- Testing of Sinh Function, both instantiated and pre-instantiated + -- version. + + -- Test for Constraint_Error on parameter with large positive magnitude. + + begin + + if New_Float'Machine_Overflows then + New_Float_Result := GEF.Sinh (New_Float(FXA5A00.Large)); + Report.Failed("Constraint_Error not raised when the GEF.Sinh " & + "function is provided a parameter with a large " & + "positive value"); + Dont_Optimize_New_Float(New_Float_Result, 9); + end if; + + exception + when Constraint_Error => null; -- OK, expected exception. + when others => + Report.Failed("Constraint_Error not raised when the GEF.Sinh " & + "function is provided a parameter with a large " & + "positive value"); + end; + + -- Test for Constraint_Error on parameter with large negative magnitude. + + begin + + if Float'Machine_Overflows then + The_Result := EF.Sinh (FXA5A00.Minus_Large); + Report.Failed("Constraint_Error not raised when the EF.Sinh " & + "function is provided a parameter with a " & + "large negative value"); + Dont_Optimize_Float(The_Result, 10); + end if; + + exception + when Constraint_Error => null; -- OK, expected exception. + when others => + Report.Failed("Constraint_Error not raised when the EF.Sinh " & + "function is provided a parameter with a " & + "large negative value"); + end; + + + -- Test that no exception occurs when the Sinh function is provided a + -- very small positive or negative value. + + begin + New_Float_Result := GEF.Sinh (New_Float(FXA5A00.Small)); + Dont_Optimize_New_Float(New_Float_Result, 11); + exception + when others => + Report.Failed("Unexpected exception on GEF.Sinh with a very" & + "small positive value"); + end; + + begin + The_Result := EF.Sinh (-FXA5A00.Small); + Dont_Optimize_Float(The_Result, 12); + exception + when others => + Report.Failed("Unexpected exception on EF.Sinh with a very" & + "small negative value"); + end; + + + -- Test for prescribed 0.0 result of Function Sinh with 0.0 parameter. + + if GEF.Sinh (0.0) /= 0.0 or + EF.Sinh (0.0) /= 0.0 + then + Report.Failed("Incorrect value returned from Sinh(0.0)"); + end if; + + + -- Test of Sinh function with various input parameters. + + if not FXA5A00.Result_Within_Range(GEF.Sinh(0.01), 0.010, 0.001) or + not FXA5A00.Result_Within_Range( EF.Sinh(0.61), 0.649, 0.001) or + not FXA5A00.Result_Within_Range(GEF.Sinh(1.70), 2.65, 0.01) or + not FXA5A00.Result_Within_Range( EF.Sinh(3.15), 11.65, 0.01) + then + Report.Failed("Incorrect result returned from Sinh function " & + "with various input parameters"); + end if; + + + exception + when others => Report.Failed ("Exception raised in Test_Block"); + end Test_Block; + + Report.Result; + +end CXA5A01; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxa5a02.a b/gcc/testsuite/ada/acats/tests/cxa/cxa5a02.a new file mode 100644 index 000000000..9e6c575dd --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxa5a02.a @@ -0,0 +1,328 @@ +-- CXA5A02.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 functions Cos and Cosh provide correct results. +-- +-- TEST DESCRIPTION: +-- This test examines both the version of Cos and Cosh resulting from +-- the instantiation of the Ada.Numerics.Generic_Elementary_Functions +-- with type derived from type Float, as well as the pre-instantiated +-- version of this package for type Float. +-- Prescribed results, including instances prescribed to raise +-- exceptions, are examined in the test cases. In addition, +-- certain evaluations are performed where the actual function result +-- is compared with the expected result (within an epsilon range of +-- accuracy). +-- +-- TEST FILES: +-- The following files comprise this test: +-- +-- FXA5A00.A (foundation code) +-- CXA5A02.A +-- +-- +-- CHANGE HISTORY: +-- 09 Mar 95 SAIC Initial prerelease version. +-- 03 Apr 95 SAIC Removed reference to derived type. +-- 13 Jun 95 SAIC Incorporated use of Dont_Optimize procedure, and +-- use of Result_Within_Range function overloaded for +-- FXA5A00.New_Float_Type. +-- 28 Feb 97 PWB.CTA Removed checks specifying Cycle => 2.0 * Pi +-- 26 Jun 98 EDS Protected exception checks by first testing +-- for 'Machine_Overflows. Removed code deleted +-- by comment. +-- CHANGE NOTE: +-- According to Ken Dritz, author of the Numerics Annex of the RM, +-- one should never specify the cycle 2.0*Pi for the trigonometric +-- functions. In particular, if the machine number for the first +-- argument is not an exact multiple of the machine number for the +-- explicit cycle, then the specified exact results cannot be +-- reasonably expected. The affected checks have been deleted. +--! + +with Ada.Numerics.Elementary_Functions; +with Ada.Numerics.Generic_Elementary_Functions; +with FXA5A00; +with Report; + +procedure CXA5A02 is +begin + + Report.Test ("CXA5A02", "Check that the functions Cos and Cosh provide " & + "correct results"); + + Test_Block: + declare + + use Ada.Numerics; + use FXA5A00; + + package GEF is new Ada.Numerics.Generic_Elementary_Functions(New_Float); + package EF renames Ada.Numerics.Elementary_Functions; + + The_Result : Float; + New_Float_Result : New_Float; + + procedure Dont_Optimize_Float is new Dont_Optimize(Float); + procedure Dont_Optimize_New_Float is new Dont_Optimize(New_Float); + + begin + + -- Testing of Cos Function, both instantiated and pre-instantiated + -- version. + + -- Check that no exception occurs on computing the Cos with very + -- large (positive and negative) input values. + + begin + New_Float_Result := GEF.Cos (New_Float(FXA5A00.Large)); + Dont_Optimize_New_Float(New_Float_Result, 1); + exception + when others => + Report.Failed("Unexpected exception on GEF.Cos with large " & + "positive value"); + end; + + begin + The_Result := EF.Cos (FXA5A00.Minus_Large); + Dont_Optimize_Float(The_Result, 2); + exception + when others => + Report.Failed("Unexpected exception on GEF.Cos with large " & + "negative value"); + end; + + + -- Test of Cos for prescribed result at zero. + + if GEF.Cos (0.0) /= 1.0 or + EF.Cos (0.0) /= 1.0 + then + Report.Failed("Incorrect value returned from Cos(0.0)"); + end if; + + + -- Test of Cos with expected result value between 1.0 and -1.0. + + if not (Result_Within_Range( EF.Cos(Ada.Numerics.Pi/3.0), + 0.500, + 0.001) and + Result_Within_Range(GEF.Cos(0.6166), 0.816, 0.001) and + Result_Within_Range(GEF.Cos(0.1949), 0.981, 0.001) and + Result_Within_Range( EF.Cos(Ada.Numerics.Pi/2.0), + 0.00, + 0.001) and + Result_Within_Range( EF.Cos(2.0*Ada.Numerics.Pi/3.0), + -0.500, + 0.001) and + Result_Within_Range(GEF.Cos(New_Float(Ada.Numerics.Pi)), + -1.00, + 0.001)) + then + Report.Failed("Incorrect value returned from Cos function when " & + "the expected result is between 1.0 and -1.0"); + end if; + + + -- Testing of the Cos function with Cycle parameter. + + -- Check that Argument_Error is raised when the value of the Cycle + -- parameter is zero. + + begin + New_Float_Result := GEF.Cos (X => 1.0, Cycle => 0.0); + Report.Failed("Argument_Error not raised by GEF.Cos function " & + "when the Cycle parameter is zero"); + Dont_Optimize_New_Float(New_Float_Result, 3); + exception + when Ada.Numerics.Argument_Error => null; -- OK, expected exception. + when others => + Report.Failed("Unexpected exception raised by GEF.cos function " & + "when the Cycle parameter is zero"); + end; + + begin + The_Result := EF.Cos (X => 0.55, Cycle => 0.0); + Report.Failed("Argument_Error not raised by EF.Cos function when " & + "the Cycle parameter is zero"); + Dont_Optimize_Float(The_Result, 4); + exception + when Ada.Numerics.Argument_Error => null; -- OK, expected exception. + when others => + Report.Failed("Unexpected exception raised by EF.Cos function " & + "when the Cycle parameter is zero"); + end; + + -- Check that Argument_Error is raised when the value of the Cycle + -- parameter is negative. + + begin + New_Float_Result := GEF.Cos (X => 0.45, Cycle => -2.0*Pi); + Report.Failed("Argument_Error not raised by GEF.Cos function " & + "when the Cycle parameter is negative"); + Dont_Optimize_New_Float(New_Float_Result, 5); + exception + when Ada.Numerics.Argument_Error => null; -- OK, expected exception. + when others => + Report.Failed("Unexpected exception raised by GEF.Cos function " & + "when the Cycle parameter is negative"); + end; + + begin + The_Result := EF.Cos (X => 0.10, Cycle => -Pi/2.0); + Report.Failed("Argument_Error not raised by EF.Cos function when " & + "the Cycle parameter is negative"); + Dont_Optimize_Float(The_Result, 6); + exception + when Ada.Numerics.Argument_Error => null; -- OK, expected exception. + when others => + Report.Failed("Unexpected exception raised by EF.Cos function " & + "when the Cycle parameter is negative"); + end; + + -- Test of Cos with Cycle parameter for prescribed result at zero. + + if GEF.Cos (0.0, 360.0) /= 1.0 or + EF.Cos (0.0, 360.0) /= 1.0 + then + Report.Failed("Incorrect value returned from Cos function with " & + "cycle parameter for a zero input parameter value"); + end if; + + + -- Tests of Cos function with specified Cycle, using various input + -- parameter values for prescribed results. + + if GEF.Cos(0.0, 360.0) /= 1.0 or + EF.Cos(360.0, 360.0) /= 1.0 or + GEF.Cos(90.0, 360.0) /= 0.0 or + EF.Cos(270.0, 360.0) /= 0.0 or + GEF.Cos(180.0, 360.0) /= -1.0 or + EF.Cos(540.0, 360.0) /= -1.0 + then + Report.Failed("Incorrect result from the Cos function with " & + "specified cycle for prescribed results"); + end if; + + + + -- Testing of Cosh Function, both instantiated and pre-instantiated + -- version. + + -- Test for Constraint_Error on parameter with large positive magnitude. + + begin + + if New_Float'Machine_Overflows then + + New_Float_Result := GEF.Cosh (New_Float(FXA5A00.Large)); + Report.Failed("Constraint_Error not raised when the GEF.Cosh " & + "function is provided a parameter with a large " & + "positive value"); + Dont_Optimize_New_Float(New_Float_Result, 9); + end if; + + exception + when Constraint_Error => null; -- OK, expected exception. + when others => + Report.Failed("Constraint_Error not raised when the GEF.Cosh " & + "function is provided a parameter with a large " & + "positive value"); + end; + + -- Test for Constraint_Error on parameter with large negative magnitude. + + begin + + if Float'Machine_Overflows then + The_Result := EF.Cosh (FXA5A00.Minus_Large); + Report.Failed("Constraint_Error not raised when the EF.Cosh " & + "function is provided a parameter with a " & + "large negative value"); + Dont_Optimize_Float(The_Result, 10); + end if; + + exception + when Constraint_Error => null; -- OK, expected exception. + when others => + Report.Failed("Constraint_Error not raised when the EF.Cosh " & + "function is provided a parameter with a " & + "large negative value"); + end; + + + -- Test that no exception occurs when the Cosh function is provided a + -- very small positive or negative value. + + begin + New_Float_Result := GEF.Cosh (New_Float(FXA5A00.Small)); + Dont_Optimize_New_Float(New_Float_Result, 11); + exception + when others => + Report.Failed("Unexpected exception on GEF.Cosh with a very" & + "small positive value"); + end; + + begin + The_Result := EF.Cosh (-FXA5A00.Small); + Dont_Optimize_Float(The_Result, 12); + exception + when others => + Report.Failed("Unexpected exception on EF.Cosh with a very" & + "small negative value"); + end; + + + -- Test for prescribed 1.0 result of Function Cosh with 0.0 parameter. + + if GEF.Cosh (0.0) /= 1.0 or + EF.Cosh (0.0) /= 1.0 + then + Report.Failed("Incorrect value returned from Cosh(0.0)"); + end if; + + + -- Test of Cosh function with various input parameters. + + if not FXA5A00.Result_Within_Range(GEF.Cosh(0.24), 1.029, 0.001) or + not FXA5A00.Result_Within_Range( EF.Cosh(0.59), 1.179, 0.001) or + not FXA5A00.Result_Within_Range(GEF.Cosh(1.06), 1.616, 0.001) or + not FXA5A00.Result_Within_Range( EF.Cosh(1.50), 2.352, 0.001) or + not FXA5A00.Result_Within_Range(GEF.Cosh(1.84), 3.228, 0.001) or + not FXA5A00.Result_Within_Range( EF.Cosh(3.40), 14.99, 0.01) + then + Report.Failed("Incorrect result from Cosh function with " & + "various input parameters"); + end if; + + + exception + when others => Report.Failed ("Exception raised in Test_Block"); + end Test_Block; + + Report.Result; + +end CXA5A02; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxa5a03.a b/gcc/testsuite/ada/acats/tests/cxa/cxa5a03.a new file mode 100644 index 000000000..d99ba9bdc --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxa5a03.a @@ -0,0 +1,426 @@ +-- CXA5A03.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 functions Tan, Tanh, and Arctanh provide correct +-- results. +-- +-- TEST DESCRIPTION: +-- This test examines both the version of Tan, Tanh, and Arctanh +-- the instantiation of the Ada.Numerics.Generic_Elementary_Functions +-- with a type derived from type Float, as well as the preinstantiated +-- version of this package for type Float. +-- Prescribed results, including instances prescribed to raise +-- exceptions, are examined in the test cases. In addition, +-- certain evaluations are performed where the actual function result +-- is compared with the expected result (within an epsilon range of +-- accuracy). +-- +-- TEST FILES: +-- The following files comprise this test: +-- +-- FXA5A00.A (foundation code) +-- CXA5A03.A +-- +-- +-- CHANGE HISTORY: +-- 14 Mar 95 SAIC Initial prerelease version. +-- 06 Apr 95 SAIC Corrected errors in context clause references +-- and usage of Cycle parameter. +-- 13 Jun 95 SAIC Incorporated use of Dont_Optimize procedure, and +-- use of Result_Within_Range function overloaded for +-- FXA5A00.New_Float_Type. +-- 29 Jun 98 EDS Protected exception tests by first testing +-- for 'Machine_Overflows +-- +--! + +with Ada.Numerics.Elementary_Functions; +with Ada.Numerics.Generic_Elementary_Functions; +with FXA5A00; +with Report; + +procedure CXA5A03 is +begin + + Report.Test ("CXA5A03", "Check that the functions Tan, Tanh, and " & + "Arctanh provide correct results"); + + Test_Block: + declare + + use Ada.Numerics; + use FXA5A00; + + package GEF is new Ada.Numerics.Generic_Elementary_Functions(New_Float); + package EF renames Ada.Numerics.Elementary_Functions; + + The_Result : Float; + New_Float_Result : New_Float; + + procedure Dont_Optimize_Float is new Dont_Optimize(Float); + procedure Dont_Optimize_New_Float is new Dont_Optimize(New_Float); + + begin + + -- Testing of Tan Function, both instantiated and pre-instantiated + -- version. + + -- Check that no exception occurs on computing the Tan with very + -- large (positive and negative) input values. + + begin + New_Float_Result := GEF.Tan (New_Float(FXA5A00.Large)); + Dont_Optimize_New_Float(New_Float_Result, 1); + exception + when others => + Report.Failed("Unexpected exception on GEF.Tan with large " & + "positive value"); + end; + + begin + The_Result := EF.Tan (FXA5A00.Minus_Large); + Dont_Optimize_Float(The_Result, 2); + exception + when others => + Report.Failed("Unexpected exception on EF.Tan with large " & + "negative value"); + end; + + + -- Check that no exception occurs on computing the Tan with very + -- small (positive and negative) input values. + + begin + New_Float_Result := GEF.Tan (New_Float(FXA5A00.Small)); + Dont_Optimize_New_Float(New_Float_Result, 3); + exception + when others => + Report.Failed("Unexpected exception on GEF.Tan with small " & + "positive value"); + end; + + begin + The_Result := EF.Tan (-FXA5A00.Small); + Dont_Optimize_Float(The_Result, 4); + exception + when others => + Report.Failed("Unexpected exception on EF.Tan with small " & + "negative value"); + end; + + + -- Check prescribed result from Tan function. When the parameter X + -- has the value zero, the Tan function yields a result of zero. + + if GEF.Tan(0.0) /= 0.0 or + EF.Tan(0.0) /= 0.0 + then + Report.Failed("Incorrect result from Tan function with zero " & + "value input parameter"); + end if; + + + -- Check the results of the Tan function with various input parameters. + + if not (Result_Within_Range(GEF.Tan(0.7854), 1.0, 0.001) and + Result_Within_Range(GEF.Tan(0.8436), 1.124, 0.001) and + Result_Within_Range( EF.Tan(Pi), 0.0, 0.001) and + Result_Within_Range( EF.Tan(-Pi), 0.0, 0.001) and + Result_Within_Range(GEF.Tan(0.5381), 0.597, 0.001) and + Result_Within_Range( EF.Tan(0.1978), 0.200, 0.001)) + then + Report.Failed("Incorrect result from Tan function with various " & + "input parameters"); + end if; + + + -- Testing of Tan function with cycle parameter. + + -- Check that Constraint_Error is raised by the Tan function with + -- specified cycle, when the value of the parameter X is an odd + -- multiple of the quarter cycle. + + if New_Float'Machine_Overflows = True then + begin + New_Float_Result := GEF.Tan(270.0, 360.0); + Report.Failed("Constraint_Error not raised by GEF.Tan on odd " & + "multiple of the quarter cycle"); + Dont_Optimize_New_Float(New_Float_Result, 5); + exception + when Constraint_Error => null; -- OK, expected exception. + when others => + Report.Failed("Unexpected exception raised by GEF.Tan on odd " & + "multiple of the quarter cycle"); + end; + end if; + + -- Check that the exception Numerics.Argument_Error is raised, when + -- the value of the parameter Cycle is zero or negative. + + begin + New_Float_Result := GEF.Tan(X => 1.0, Cycle => -360.0); + Report.Failed("Argument_Error not raised by GEF.Tan when Cycle " & + "parameter has negative value"); + Dont_Optimize_New_Float(New_Float_Result, 6); + exception + when Argument_Error => null; -- OK, expected exception. + when others => + Report.Failed("Unexpected exception raised by GEF.Tan when Cycle " & + "parameter has negative value"); + end; + + begin + The_Result := EF.Tan(1.0, Cycle => 0.0); + Report.Failed("Argument_Error not raised by GEF.Tan when Cycle " & + "parameter has a zero value"); + Dont_Optimize_Float(The_Result, 7); + exception + when Argument_Error => null; -- OK, expected exception. + when others => + Report.Failed("Unexpected exception raised by EF.Tan when Cycle " & + "parameter has a zero value"); + end; + + + -- Check that no exception occurs on computing the Tan with very + -- large (positive and negative) input values. + + begin + New_Float_Result := GEF.Tan (New_Float(FXA5A00.Large), 360.0); + Dont_Optimize_New_Float(New_Float_Result, 8); + exception + when others => + Report.Failed("Unexpected exception on GEF.Tan with large " & + "positive value"); + end; + + begin + The_Result := EF.Tan (FXA5A00.Minus_Large, Cycle => 360.0); + Dont_Optimize_Float(The_Result, 9); + exception + when others => + Report.Failed("Unexpected exception on EF.Tan with large " & + "negative value"); + end; + + + -- Check prescribed result from Tan function with Cycle parameter. + + if GEF.Tan(0.0, 360.0) /= 0.0 or + EF.Tan(0.0, Cycle => 360.0) /= 0.0 + then + Report.Failed("Incorrect result from Tan function with cycle " & + "parameter, using a zero value input parameter"); + end if; + + + -- Check the Tan function, with specified Cycle parameter, with a + -- variety of input parameters. + + if not Result_Within_Range(GEF.Tan(30.0, 360.0), 0.577, 0.001) or + not Result_Within_Range( EF.Tan(57.0, 360.0), 1.540, 0.001) or + not Result_Within_Range(GEF.Tan(115.0, 360.0), -2.145, 0.001) or + not Result_Within_Range( EF.Tan(299.0, 360.0), -1.804, 0.001) or + not Result_Within_Range(GEF.Tan(390.0, 360.0), 0.577, 0.001) or + not Result_Within_Range( EF.Tan(520.0, 360.0), -0.364, 0.001) + then + Report.Failed("Incorrect result from the Tan function with " & + "cycle parameter, with various input parameter " & + "values"); + end if; + + + + -- Testing of Tanh Function, both instantiated and pre-instantiated + -- version. + + -- Check that no exception occurs on computing the Tan with very + -- large (positive and negative) input values. + + begin + New_Float_Result := GEF.Tanh (New_Float(FXA5A00.Large)); + Dont_Optimize_New_Float(New_Float_Result, 10); + exception + when others => + Report.Failed("Unexpected exception on GEF.Tanh with large " & + "positive value"); + end; + + begin + The_Result := EF.Tanh (FXA5A00.Minus_Large); + Dont_Optimize_Float(The_Result, 11); + exception + when others => + Report.Failed("Unexpected exception on EF.Tanh with large " & + "negative value"); + end; + + + -- Check for prescribed result of Tanh with zero value input parameter. + + if GEF.Tanh (0.0) /= 0.0 or + EF.Tanh (0.0) /= 0.0 + then + Report.Failed("Incorrect result from Tanh with zero parameter"); + end if; + + + -- Check the results of the Tanh function with various input + -- parameters. + + if not (FXA5A00.Result_Within_Range(GEF.Tanh(2.99), 0.995, 0.001) and + FXA5A00.Result_Within_Range(GEF.Tanh(0.130), 0.129, 0.001) and + FXA5A00.Result_Within_Range( EF.Tanh(Pi), 0.996, 0.001) and + FXA5A00.Result_Within_Range( EF.Tanh(-Pi), -0.996, 0.001) and + FXA5A00.Result_Within_Range(GEF.Tanh(0.60), 0.537, 0.001) and + FXA5A00.Result_Within_Range( EF.Tanh(1.04), 0.778, 0.001) and + FXA5A00.Result_Within_Range(GEF.Tanh(1.55), 0.914, 0.001) and + FXA5A00.Result_Within_Range( EF.Tanh(-2.14), -0.973, 0.001)) + then + Report.Failed("Incorrect result from Tanh function with various " & + "input parameters"); + end if; + + + + -- Testing of Arctanh Function, both instantiated and pre-instantiated + -- version. + + -- Check that Constraint_Error is raised by the Arctanh function + -- when the absolute value of the parameter X is one. + + if New_Float'Machine_Overflows = True then + begin + New_Float_Result := GEF.Arctanh(X => 1.0); + Report.Failed("Constraint_Error not raised by Function Arctanh " & + "when provided a parameter value of 1.0"); + Dont_Optimize_New_Float(New_Float_Result, 12); + exception + when Constraint_Error => null; -- OK, expected exception. + when others => + Report.Failed("Unexpected exception raised by Function Arctanh " + & "when provided a parameter value of 1.0"); + end; + end if; + + if Float'Machine_Overflows = True then + begin + The_Result := EF.Arctanh(-1.0); + Report.Failed("Constraint_Error not raised by Function Arctanh " & + "when provided a parameter value of -1.0"); + Dont_Optimize_Float(The_Result, 13); + exception + when Constraint_Error => null; -- OK, expected exception. + when others => + Report.Failed("Unexpected exception raised by Function Arctanh " + & "when provided a parameter value of -1.0"); + end; + end if; + + -- Check that Function Arctanh raises Argument_Error when the absolute + -- value of the parameter X exceeds one. + + begin + New_Float_Result := GEF.Arctanh(New_Float(FXA5A00.One_Plus_Delta)); + Report.Failed("Argument_Error not raised by Function Arctanh " & + "when provided a parameter value greater than 1.0"); + Dont_Optimize_New_Float(New_Float_Result, 14); + exception + when Argument_Error => null; -- OK, expected exception. + when others => + Report.Failed("Unexpected exception raised by Function Arctanh " & + "when provided a parameter value greater than 1.0"); + end; + + + begin + The_Result := EF.Arctanh(FXA5A00.Minus_One_Minus_Delta); + Report.Failed("Argument_Error not raised by Function Arctanh " & + "when provided a parameter value less than -1.0"); + Dont_Optimize_Float(The_Result, 15); + exception + when Argument_Error => null; -- OK, expected exception. + when others => + Report.Failed("Unexpected exception raised by Function Arctanh " & + "when provided a parameter value less than -1.0"); + end; + + + begin + New_Float_Result := GEF.Arctanh(New_Float(FXA5A00.Large)); + Report.Failed("Argument_Error not raised by Function Arctanh " & + "when provided a large positive parameter value"); + Dont_Optimize_New_Float(New_Float_Result, 16); + exception + when Argument_Error => null; -- OK, expected exception. + when others => + Report.Failed("Unexpected exception raised by Function Arctanh " & + "when provided a large positive parameter value"); + end; + + + begin + The_Result := EF.Arctanh(FXA5A00.Minus_Large); + Report.Failed("Argument_Error not raised by Function Arctanh " & + "when provided a large negative parameter value"); + Dont_Optimize_Float(The_Result, 17); + exception + when Argument_Error => null; -- OK, expected exception. + when others => + Report.Failed("Unexpected exception raised by Function Arctanh " & + "when provided a large negative parameter value"); + end; + + + -- Prescribed results for Function Arctanh with zero input value. + + if GEF.Arctanh(0.0) /= 0.0 or + EF.Arctanh(0.0) /= 0.0 + then + Report.Failed("Incorrect result from Function Arctanh with a " & + "parameter value of zero"); + end if; + + + -- Check the results of the Arctanh function with various input + -- parameters. + + if not (Result_Within_Range(GEF.Arctanh(0.15), 0.151, 0.001) and + Result_Within_Range( EF.Arctanh(0.44), 0.472, 0.001) and + Result_Within_Range(GEF.Arctanh(0.81), 1.127, 0.001) and + Result_Within_Range( EF.Arctanh(0.99), 2.647, 0.001)) + then + Report.Failed("Incorrect result from Arctanh function with " & + "various input parameters"); + end if; + + exception + when others => Report.Failed ("Exception raised in Test_Block"); + end Test_Block; + + Report.Result; + +end CXA5A03; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxa5a04.a b/gcc/testsuite/ada/acats/tests/cxa/cxa5a04.a new file mode 100644 index 000000000..9b590a23c --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxa5a04.a @@ -0,0 +1,434 @@ +-- CXA5A04.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 functions Cot, Coth, and Arccoth provide correct +-- results. +-- +-- TEST DESCRIPTION: +-- This test examines both the version of Cot, Coth, and Arccoth +-- the instantiation of the Ada.Numerics.Generic_Elementary_Functions +-- with a type derived from type Float, as well as the preinstantiated +-- version of this package for type Float. +-- Prescribed results, including instances prescribed to raise +-- exceptions, are examined in the test cases. In addition, +-- certain evaluations are performed where the actual function result +-- is compared with the expected result (within an epsilon range of +-- accuracy). +-- +-- TEST FILES: +-- The following files comprise this test: +-- +-- FXA5A00.A (foundation code) +-- CXA5A04.A +-- +-- +-- CHANGE HISTORY: +-- 15 Mar 95 SAIC Initial prerelease version. +-- 07 Apr 95 SAIC Corrected errors in context clause reference, +-- added trigonometric relationship checks. +-- 13 Jun 95 SAIC Incorporated use of Dont_Optimize procedure, and +-- use of Result_Within_Range function overloaded for +-- FXA5A00.New_Float_Type. +-- 18 Apr 96 SAIC Incorporated reviewer comments for ACVC 2.1. +-- 28 Feb 97 PWB.CTA Removed checks with explicit Cycle => 2.0*Pi +-- 29 Jun 98 EDS Protected exception tests by first testing +-- for 'Machine_Overflows +-- +-- CHANGE NOTE: +-- According to Ken Dritz, author of the Numerics Annex of the RM, +-- one should never specify the cycle 2.0*Pi for the trigonometric +-- functions. In particular, if the machine number for the first +-- argument is not an exact multiple of the machine number for the +-- explicit cycle, then the specified exact results cannot be +-- reasonably expected. The affected checks in this test have been +-- marked as comments, with the additional notation "pwb-math". +-- Phil Brashear +--! + +with Ada.Exceptions; +with Ada.Numerics.Elementary_Functions; +with Ada.Numerics.Generic_Elementary_Functions; +with FXA5A00; +with Report; + +procedure CXA5A04 is +begin + + Report.Test ("CXA5A04", "Check that the functions Cot, Coth, and " & + "Arccoth provide correct results"); + + Test_Block: + declare + + use Ada.Exceptions; + use Ada.Numerics; + use FXA5A00; + + package GEF is new Ada.Numerics.Generic_Elementary_Functions(New_Float); + package EF renames Ada.Numerics.Elementary_Functions; + + The_Result : Float; + New_Float_Result : New_Float; + + procedure Dont_Optimize_Float is new Dont_Optimize(Float); + procedure Dont_Optimize_New_Float is new Dont_Optimize(New_Float); + + begin + + -- Testing of Cot Function, both instantiated and pre-instantiated + -- version. + + -- Check that Constraint_Error is raised with the Cot function is + -- given a parameter input value of 0.0. + + if New_Float'Machine_Overflows = True then + begin + New_Float_Result := GEF.Cot (0.0); + Report.Failed("Constraint_Error not raised by Function Cot " & + "when provided a zero input parameter value"); + Dont_Optimize_New_Float(New_Float_Result, 1); + exception + when Constraint_Error => null; -- OK, expected exception. + when others => + Report.Failed("Unexpected exception raised by Function Cot " & + "when provided a zero input parameter value"); + end; + end if; + + -- Check that no exception occurs on computing the Cot with very + -- large (positive and negative) input values. + + begin + New_Float_Result := GEF.Cot (New_Float(FXA5A00.Large)); + Dont_Optimize_New_Float(New_Float_Result, 2); + exception + when others => + Report.Failed("Unexpected exception on GEF.Cot with large " & + "positive value"); + end; + + begin + The_Result := EF.Cot (FXA5A00.Minus_Large); + Dont_Optimize_Float(The_Result, 3); + exception + when others => + Report.Failed("Unexpected exception on EF.Cot with large " & + "negative value"); + end; + + + -- Check the results of the Cot function with various input parameters. + + if not (FXA5A00.Result_Within_Range(GEF.Cot(Pi/4.0), 1.0, 0.001) and + FXA5A00.Result_Within_Range( EF.Cot(Pi/2.0), 0.0, 0.001) and + FXA5A00.Result_Within_Range(GEF.Cot(3.0*Pi/4.0),-1.0, 0.001) and + FXA5A00.Result_Within_Range( EF.Cot(3.0*Pi/2.0), 0.0, 0.001)) + then + Report.Failed("Incorrect result from Cot function with various " & + "input parameters"); + end if; + + + -- Check the results of the Cot function against the results of + -- various trigonometric relationships. + + if not FXA5A00.Result_Within_Range(GEF.Cot(New_Float(Pi/4.0)), + 1.0/EF.Tan(Pi/4.0), + 0.001) or + not FXA5A00.Result_Within_Range(EF.Cot(Pi/4.0), + EF.Cos(Pi/4.0)/EF.Sin(Pi/4.0), + 0.001) or + not FXA5A00.Result_Within_Range(EF.Cot(EF.Arccot(Pi/4.0)), + Pi/4.0, + 0.001) + then + Report.Failed("Incorrect result from Cot function with respect " & + "to various trigonometric relationship expected " & + "results"); + end if; + + + -- Testing of Cot with Cycle parameter. + + -- Check that Argument_Error is raised by the Cot function when the + -- value of the Cycle parameter is zero or negative. + + begin + New_Float_Result := GEF.Cot (1.0, Cycle => 0.0); + Report.Failed("Argument_Error not raised by the Cot Function " & + "with a specified cycle value of 0.0"); + Dont_Optimize_New_Float(New_Float_Result, 4); + exception + when Argument_Error => null; -- OK, expected exception. + when others => + Report.Failed + ("Unexpected exception raised by the Cot Function with " & + "a specified cycle value of 0.0"); + end; + + begin + The_Result := EF.Cot (X => 1.0, Cycle => -360.0); + Report.Failed("Argument_Error not raised by the Cot Function " & + "with a specified cycle value of -360.0"); + Dont_Optimize_Float(The_Result, 5); + exception + when Argument_Error => null; -- OK, expected exception. + when others => + Report.Failed + ("Unexpected exception raised by the Cot Function with " & + "a specified cycle value of -360.0"); + end; + + + -- Check that Constraint_Error is raised by the Cot Function with + -- specified cycle, when the value of the parameter X is 0.0. + + if New_Float'Machine_Overflows = True then + begin + New_Float_Result := GEF.Cot (0.0, 360.0); + Report.Failed("Constraint_Error not raised by Function Cot " & + "with specified cycle, when value of parameter " & + "X is 0.0"); + Dont_Optimize_New_Float(New_Float_Result, 6); + exception + when Constraint_Error => null; -- OK, expected exception. + when others => + Report.Failed("Unexpected exception raised by Function Cot " & + "with specified cycle, when value of parameter " & + "X is 0.0"); + end; + end if; + + -- Check that Constraint_Error is raised by the Cot Function with + -- specified cycle, when the value of the parameter X is a multiple + -- of the half cycle. + + if New_Float'Machine_Overflows = True then + begin + New_Float_Result := GEF.Cot (180.0, 360.0); + Report.Failed("Constraint_Error not raised by Function Cot " & + "with specified cycle, when value of parameter " & + "X is a multiple of the half cycle (180.0, 360.0)"); + Dont_Optimize_New_Float(New_Float_Result, 7); + exception + when Constraint_Error => null; -- OK, expected exception. + when others => + Report.Failed("Unexpected exception raised by Function Cot " & + "with specified cycle, when value of parameter " & + "X is a multiple of the half cycle" & + " (180.0, 360.0)"); + end; + end if; + + if Float'Machine_Overflows = True then + begin + The_Result := EF.Cot (540.0, 360.0); + Report.Failed("Constraint_Error not raised by Function Cot " & + "with specified cycle, when value of parameter " & + "X is a multiple of the half cycle (540.0, 360.0)"); + Dont_Optimize_Float(The_Result, 8); + exception + when Constraint_Error => null; -- OK, expected exception. + when others => + Report.Failed("Unexpected exception raised by Function Cot " & + "with specified cycle, when value of parameter " & + "X is a multiple of the half cycle (540.0, 360.0)"); + end; + end if; + +--pwb-math -- Check that no exception occurs on computing the Cot with very +--pwb-math -- large (positive and negative) input values. +--pwb-math +--pwb-math begin +--pwb-math New_Float_Result := GEF.Cot (New_Float(FXA5A00.Large), 2.0*Pi); +--pwb-math Dont_Optimize_New_Float(New_Float_Result, 9); +--pwb-math exception +--pwb-math when others => +--pwb-math Report.Failed("Unexpected exception on GEF.Cot with large " & +--pwb-math "positive value"); +--pwb-math end; +--pwb-math +--pwb-math begin +--pwb-math The_Result := EF.Cot (FXA5A00.Minus_Large, Cycle => 2.0*Pi); +--pwb-math Dont_Optimize_Float(The_Result, 10); +--pwb-math exception +--pwb-math when others => +--pwb-math Report.Failed("Unexpected exception on EF.Cot with large " & +--pwb-math "negative value"); +--pwb-math end; +--pwb-math +--pwb-math +--pwb-math -- Check prescribed result from Cot function with Cycle parameter. +--pwb-math +--pwb-math if not FXA5A00.Result_Within_Range +--pwb-math (GEF.Cot(New_Float(FXA5A00.Half_Pi), 2.0*Pi), 0.0, 0.001) or +--pwb-math not FXA5A00.Result_Within_Range +--pwb-math (EF.Cot(3.0*Pi/2.0, Cycle => 2.0*Pi), 0.0, 0.001) +--pwb-math then +--pwb-math Report.Failed("Incorrect result from Cot function with cycle " & +--pwb-math "parameter, using a multiple of Pi/2 as the " & +--pwb-math "input parameter"); +--pwb-math end if; + + + -- Testing of Coth Function, both instantiated and pre-instantiated + -- version. + + -- Check that no exception occurs on computing the Coth with very + -- large (positive and negative) input values. + + begin + The_Result := EF.Coth (FXA5A00.Large); + if The_Result > 1.0 then + Report.Failed("Result of Coth function with large positive " & + "value greater than 1.0"); + end if; + exception + when others => + Report.Failed("Unexpected exception on EF.Coth with large " & + "positive value"); + end; + + begin + The_Result := EF.Coth (FXA5A00.Minus_Large); + if The_Result < -1.0 then + Report.Failed("Result of Coth function with large negative " & + "value less than -1.0"); + end if; + exception + when others => + Report.Failed("Unexpected exception on EF.Coth with large " & + "negative value"); + end; + + + -- Check that Constraint_Error is raised by the Coth function, when + -- the value of the parameter X is 0.0. + + if New_Float'Machine_Overflows = True then + begin + New_Float_Result := GEF.Coth (X => 0.0); + Report.Failed("Constraint_Error not raised by the Coth function " & + "when the value of parameter X is 0.0"); + Dont_Optimize_New_Float(New_Float_Result, 11); + exception + when Constraint_Error => null; -- OK, expected exception. + when others => + Report.Failed("Unexpected exception raised by the Coth " & + "function when the value of parameter X is 0.0"); + end; + end if; + + + -- Testing of Arccoth Function, both instantiated and pre-instantiated + -- version. + + -- Check that Constraint_Error is raised by the Arccoth function + -- when the absolute value of the parameter X is 1.0. + + if New_Float'Machine_Overflows = True then + begin + New_Float_Result := GEF.Arccoth (X => 1.0); + Report.Failed("Constraint_Error not raised by the Arccoth " & + "function when the value of parameter X is 1.0"); + Dont_Optimize_New_Float(New_Float_Result, 12); + exception + when Constraint_Error => null; -- OK, expected exception. + when others => + Report.Failed("Unexpected exception raised by the Arccoth " & + "function when the value of parameter X is 1.0"); + end; + end if; + + if Float'Machine_Overflows = True then + begin + The_Result := EF.Arccoth (-1.0); + Report.Failed("Constraint_Error not raised by the Arccoth " & + "function when the value of parameter X is -1.0"); + Dont_Optimize_Float(The_Result, 13); + exception + when Constraint_Error => null; -- OK, expected exception. + when others => + Report.Failed("Unexpected exception raised by the Arccoth " & + "function when the value of parameter X is -1.0"); + end; + end if; + + -- Check that Argument_Error is raised by the Arccoth function when + -- the absolute value of the parameter X is less than 1.0. + + begin + New_Float_Result := GEF.Arccoth (X => New_Float(One_Minus_Delta)); + Report.Failed("Argument_Error not raised by the Arccoth " & + "function with parameter value less than 1.0"); + Dont_Optimize_New_Float(New_Float_Result, 14); + exception + when Argument_Error => null; -- OK, expected exception. + when others => + Report.Failed("Unexpected exception raised by the Arccoth " & + "function with parameter value less than 1.0"); + end; + + begin + The_Result := EF.Arccoth (X => FXA5A00.Minus_One_Plus_Delta); + Report.Failed("Argument_Error not raised by the Arccoth function " & + "with parameter value between 0.0 and -1.0"); + Dont_Optimize_Float(The_Result, 15); + exception + when Argument_Error => null; -- OK, expected exception. + when others => + Report.Failed("Unexpected exception raised by the Arccoth " & + "function with parameter value between 0.0 " & + "and -1.0"); + end; + + + -- Check the results of the Arccoth function with various input + -- parameters. + + if not (Result_Within_Range(GEF.Arccoth(1.01), 2.652, 0.01) and + Result_Within_Range( EF.Arccoth(1.25), 1.099, 0.01) and + Result_Within_Range(GEF.Arccoth(1.56), 0.760, 0.001) and + Result_Within_Range( EF.Arccoth(1.97), 0.560, 0.001) and + Result_Within_Range(GEF.Arccoth(2.40), 0.444, 0.001) and + Result_Within_Range( EF.Arccoth(4.30), 0.237, 0.001) and + Result_Within_Range(GEF.Arccoth(5.80), 0.174, 0.001) and + Result_Within_Range( EF.Arccoth(7.00), 0.144, 0.001)) + then + Report.Failed("Incorrect result from Arccoth function with various " & + "input parameters"); + end if; + + + exception + when The_Error : others => + Report.Failed ("The following exception was raised in the " & + "Test_Block: " & Exception_Name(The_Error)); + end Test_Block; + + Report.Result; + +end CXA5A04; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxa5a05.a b/gcc/testsuite/ada/acats/tests/cxa/cxa5a05.a new file mode 100644 index 000000000..b50da3a6a --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxa5a05.a @@ -0,0 +1,338 @@ +-- CXA5A05.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 functions Arcsin and Arcsinh provide correct +-- results. +-- +-- TEST DESCRIPTION: +-- This test examines both the version of Arcsin and Arcsinh +-- the instantiation of the Ada.Numerics.Generic_Elementary_Functions +-- with a type derived from type Float, as well as the preinstantiated +-- version of this package for type Float. +-- Prescribed results, including instances prescribed to raise +-- exceptions, are examined in the test cases. In addition, +-- certain evaluations are performed where the actual function result +-- is compared with the expected result (within an epsilon range of +-- accuracy). +-- +-- TEST FILES: +-- The following files comprise this test: +-- +-- FXA5A00.A (foundation code) +-- CXA5A05.A +-- +-- +-- CHANGE HISTORY: +-- 20 Mar 95 SAIC Initial prerelease version. +-- 06 Apr 95 SAIC Corrected errors in context clause reference and +-- use of Cycle parameter. +-- 13 Jun 95 SAIC Incorporated use of Dont_Optimize procedure, and +-- use of Result_Within_Range function overloaded for +-- FXA5A00.New_Float_Type. +-- 28 Feb 97 PWB.CTA Removed checks with explict Cycle => 2.0*Pi +-- +-- CHANGE NOTE: +-- According to Ken Dritz, author of the Numerics Annex of the RM, +-- one should never specify the cycle 2.0*Pi for the trigonometric +-- functions. In particular, if the machine number for the first +-- argument is not an exact multiple of the machine number for the +-- explicit cycle, then the specified exact results cannot be +-- reasonably expected. The affected checks in this test have been +-- marked as comments, with the additional notation "pwb-math". +-- Phil Brashear +--! + +with Ada.Numerics.Elementary_Functions; +with Ada.Numerics.Generic_Elementary_Functions; +with FXA5A00; +with Report; + +procedure CXA5A05 is +begin + + Report.Test ("CXA5A05", "Check that the functions Arcsin and Arcsinh " & + "provide correct results"); + + Test_Block: + declare + + use Ada.Numerics; + use FXA5A00; + + package GEF is new Ada.Numerics.Generic_Elementary_Functions(New_Float); + package EF renames Ada.Numerics.Elementary_Functions; + + The_Result : Float; + New_Float_Result : New_Float; + + procedure Dont_Optimize_Float is new Dont_Optimize(Float); + procedure Dont_Optimize_New_Float is new Dont_Optimize(New_Float); + + begin + + -- Testing of Function Arcsin, both instantiated and pre-instantiated + -- versions. + + -- Check that Argument_Error is raised by the Arcsin function when + -- the absolute value of the parameter X is greater than 1.0. + + begin + New_Float_Result := GEF.Arcsin(New_Float(FXA5A00.One_Plus_Delta)); + Report.Failed("Argument_Error not raised by Arcsin function " & + "when provided a parameter value larger than 1.0"); + Dont_Optimize_New_Float(New_Float_Result, 1); + exception + when Argument_Error => null; -- OK, expected exception. + when others => + Report.Failed("Unexpected exception raised by Arcsin function " & + "when provided a parameter value larger than 1.0"); + end; + + begin + The_Result := EF.Arcsin(FXA5A00.Minus_Large); + Report.Failed("Argument_Error not raised by Arcsin function " & + "when provided a large negative parameter value"); + Dont_Optimize_Float(The_Result, 2); + exception + when Argument_Error => null; -- OK, expected exception. + when others => + Report.Failed("Unexpected exception raised by Arcsin function " & + "when provided a large negative parameter value"); + end; + + + -- Check the prescribed result of function Arcsin with parameter 0.0. + + if GEF.Arcsin(X => 0.0) /= 0.0 or + EF.Arcsin(0.0) /= 0.0 + then + Report.Failed("Incorrect result from Function Arcsin when the " & + "value of the parameter X is 0.0"); + end if; + + + -- Check the results of the Arcsin function with various input + -- parameters. + + if not Result_Within_Range(GEF.Arcsin(1.0), 1.571, 0.001) or + not Result_Within_Range( EF.Arcsin(0.62), 0.669, 0.001) or + not Result_Within_Range(GEF.Arcsin(0.01), 0.010, 0.001) or + not Result_Within_Range( EF.Arcsin(-0.29), -0.294, 0.001) or + not Result_Within_Range(GEF.Arcsin(-0.50), -0.524, 0.001) or + not Result_Within_Range( EF.Arcsin(-1.0), -1.571, 0.001) + then + Report.Failed("Incorrect result from Function Arcsin with " & + "various input parameters"); + end if; + + + -- Testing of Function Arcsin with specified Cycle parameter. + +--pwb-math -- Check that Argument_Error is raised by the Arcsin function with +--pwb-math -- specified cycle, whenever the absolute value of the parameter X +--pwb-math -- is greater than 1.0. +--pwb-math +--pwb-math begin +--pwb-math New_Float_Result := GEF.Arcsin(New_Float(FXA5A00.Large), 2.0*Pi); +--pwb-math Report.Failed("Argument_Error not raised by Function Arcsin " & +--pwb-math "with specified cycle, when provided a large " & +--pwb-math "positive input parameter"); +--pwb-math Dont_Optimize_New_Float(New_Float_Result, 3); +--pwb-math exception +--pwb-math when Argument_Error => null; -- OK, expected exception. +--pwb-math when others => +--pwb-math Report.Failed("Unexpected exception raised by Function Arcsin " & +--pwb-math "with specified cycle, when provided a large " & +--pwb-math "positive input parameter"); +--pwb-math end; +--pwb-math +--pwb-math begin +--pwb-math The_Result := EF.Arcsin(FXA5A00.Minus_One_Minus_Delta, 2.0*Pi); +--pwb-math Report.Failed("Argument_Error not raised by Function Arcsin " & +--pwb-math "with specified cycle, when provided an input " & +--pwb-math "parameter less than -1.0"); +--pwb-math Dont_Optimize_Float(The_Result, 4); +--pwb-math exception +--pwb-math when Argument_Error => null; -- OK, expected exception. +--pwb-math when others => +--pwb-math Report.Failed("Unexpected exception raised by Function Arcsin " & +--pwb-math "with specified cycle, when provided an input " & +--pwb-math "parameter less than -1.0"); +--pwb-math end; +--pwb-math + -- Check that Argument_Error is raised by the Arcsin function with + -- specified cycle, whenever the Cycle parameter is zero or negative. + + begin + New_Float_Result := GEF.Arcsin(2.0, 0.0); + Report.Failed("Argument_Error not raised by Function Arcsin " & + "with specified cycle of 0.0"); + Dont_Optimize_New_Float(New_Float_Result, 5); + exception + when Argument_Error => null; -- OK, expected exception. + when others => + Report.Failed("Unexpected exception raised by Function Arcsin " & + "with specified cycle of 0.0"); + end; + + begin + The_Result := EF.Arcsin(2.0, -2.0*Pi); + Report.Failed("Argument_Error not raised by Function Arcsin " & + "with specified negative cycle parameter"); + Dont_Optimize_Float(The_Result, 6); + exception + when Argument_Error => null; -- OK, expected exception. + when others => + Report.Failed("Unexpected exception raised by Function Arcsin " & + "with specified negative cycle parameter"); + end; + + +--pwb-math -- Check the prescribed result of function Arcsin with specified Cycle +--pwb-math -- parameter, when the value of parameter X is 0.0. +--pwb-math +--pwb-math if GEF.Arcsin(X => 0.0, Cycle => 2.0*Pi) /= 0.0 or +--pwb-math EF.Arcsin(0.0, 2.0*Pi) /= 0.0 +--pwb-math then +--pwb-math Report.Failed("Incorrect result from Function Arcsin with " & +--pwb-math "specified Cycle parameter, when the value " & +--pwb-math "of parameter X is 0.0"); +--pwb-math end if; +--pwb-math +--pwb-math +--pwb-math -- Test of the Arcsin function with specified Cycle parameter with +--pwb-math -- various input parameters. +--pwb-math +--pwb-math if not FXA5A00.Result_Within_Range(GEF.Arcsin( 0.01, 2.0*Pi), +--pwb-math 0.010, +--pwb-math 0.001) or +--pwb-math not FXA5A00.Result_Within_Range( EF.Arcsin( 0.14, 2.0*Pi), +--pwb-math 0.141, +--pwb-math 0.001) or +--pwb-math not FXA5A00.Result_Within_Range(GEF.Arcsin( 0.37, 2.0*Pi), +--pwb-math 0.379, +--pwb-math 0.001) or +--pwb-math not FXA5A00.Result_Within_Range( EF.Arcsin( 0.55, 2.0*Pi), +--pwb-math 0.582, +--pwb-math 0.001) or +--pwb-math not FXA5A00.Result_Within_Range(GEF.Arcsin(-0.22, 2.0*Pi), +--pwb-math -0.222, +--pwb-math 0.001) or +--pwb-math not FXA5A00.Result_Within_Range( EF.Arcsin(-0.99, 2.0*Pi), +--pwb-math -1.43, +--pwb-math 0.01) or +--pwb-math not FXA5A00.Result_Within_Range( EF.Arcsin(1.0, 360.0), +--pwb-math 90.0, +--pwb-math 0.1) or +--pwb-math not FXA5A00.Result_Within_Range( EF.Arcsin(1.0, 100.0), +--pwb-math 25.0, +--pwb-math 0.1) +--pwb-math then +--pwb-math Report.Failed("Incorrect result from Arcsin with specified " & +--pwb-math "cycle parameter with various input parameters"); +--pwb-math end if; + + -- Testing of Arcsinh Function, both instantiated and pre-instantiated + -- version. + + -- Check that no exception occurs on computing the Arcsinh with very + -- large (positive and negative) input values. + + begin + New_Float_Result := GEF.Arcsinh(New_Float(FXA5A00.Large)); + Dont_Optimize_New_Float(New_Float_Result, 7); + exception + when others => + Report.Failed("Unexpected exception on Arcsinh with large " & + "positive value"); + end; + + begin + The_Result := EF.Arcsinh(FXA5A00.Minus_Large); + Dont_Optimize_Float(The_Result, 8); + exception + when others => + Report.Failed("Unexpected exception on Arcsinh with large " & + "negative value"); + end; + + + -- Check that no exception occurs on computing the Arcsinh with very + -- small (positive and negative) input values. + + begin + New_Float_Result := GEF.Arcsinh(New_Float(FXA5A00.Small)); + Dont_Optimize_New_Float(New_Float_Result, 9); + exception + when others => + Report.Failed("Unexpected exception on Arcsinh with small " & + "positive value"); + end; + + begin + The_Result := EF.Arcsinh(-FXA5A00.Small); + Dont_Optimize_Float(The_Result, 10); + exception + when others => + Report.Failed("Unexpected exception on Arcsinh with small " & + "negative value"); + end; + + + -- Check function Arcsinh for prescribed result with parameter 0.0. + + if GEF.Arcsinh(X => 0.0) /= 0.0 or + EF.Arcsinh(X => 0.0) /= 0.0 + then + Report.Failed("Incorrect result from Function Arcsinh when " & + "provided a 0.0 input parameter"); + end if; + + + -- Check the results of the Arcsinh function with various input + -- parameters. + + if not Result_Within_Range(GEF.Arcsinh(0.15), 0.149, 0.001) or + not Result_Within_Range( EF.Arcsinh(0.82), 0.748, 0.001) or + not Result_Within_Range(GEF.Arcsinh(1.44), 1.161, 0.001) or + not Result_Within_Range(GEF.Arcsinh(6.70), 2.601, 0.001) or + not Result_Within_Range( EF.Arcsinh(Pi), 1.862, 0.001) or + not Result_Within_Range( EF.Arcsinh(-Pi), -1.862, 0.001) or + not Result_Within_Range(GEF.Arcsinh(-1.0), -0.881, 0.001) or + not Result_Within_Range( EF.Arcsinh(-5.5), -2.406, 0.001) + then + Report.Failed("Incorrect result from Function Arcsin with " & + "various input parameters"); + end if; + + + exception + when others => Report.Failed ("Exception raised in Test_Block"); + end Test_Block; + + Report.Result; + +end CXA5A05; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxa5a06.a b/gcc/testsuite/ada/acats/tests/cxa/cxa5a06.a new file mode 100644 index 000000000..191a96d75 --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxa5a06.a @@ -0,0 +1,334 @@ +-- CXA5A06.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 functions Arccos and Arccosh provide correct +-- results. +-- +-- TEST DESCRIPTION: +-- This test examines both the version of Arccos and Arccosh +-- the instantiation of the Ada.Numerics.Generic_Elementary_Functions +-- with a type derived from type Float, as well as the preinstantiated +-- version of this package for type Float. +-- Prescribed results, including instances prescribed to raise +-- exceptions, are examined in the test cases. In addition, +-- certain evaluations are performed where the actual function result +-- is compared with the expected result (within an epsilon range of +-- accuracy). +-- +-- TEST FILES: +-- The following files comprise this test: +-- +-- FXA5A00.A (foundation code) +-- CXA5A06.A +-- +-- +-- CHANGE HISTORY: +-- 27 Mar 95 SAIC Initial prerelease version. +-- 13 Jun 95 SAIC Incorporated use of Dont_Optimize procedure, and +-- use of Result_Within_Range function overloaded for +-- FXA5A00.New_Float_Type. +-- 28 Feb 97 PWB.CTA Removed checks with explicit Cycle => 2.0*Pi +-- +-- CHANGE NOTE: +-- According to Ken Dritz, author of the Numerics Annex of the RM, +-- one should never specify the cycle 2.0*Pi for the trigonometric +-- functions. In particular, if the machine number for the first +-- argument is not an exact multiple of the machine number for the +-- explicit cycle, then the specified exact results cannot be +-- reasonably expected. The affected checks in this test have been +-- marked as comments, with the additional notation "pwb-math". +-- Phil Brashear +--! + +with Ada.Numerics.Elementary_Functions; +with Ada.Numerics.Generic_Elementary_Functions; +with FXA5A00; +with Report; + +procedure CXA5A06 is +begin + + Report.Test ("CXA5A06", "Check that the functions Arccos and Arccosh " & + "provide correct results"); + + Test_Block: + declare + + use Ada.Numerics; + use FXA5A00; + + package GEF is new Ada.Numerics.Generic_Elementary_Functions(New_Float); + package EF renames Ada.Numerics.Elementary_Functions; + + The_Result : Float; + New_Float_Result : New_Float; + + procedure Dont_Optimize_Float is new Dont_Optimize(Float); + procedure Dont_Optimize_New_Float is new Dont_Optimize(New_Float); + + begin + + -- Testing of Arccos Function, both instantiated and pre-instantiated + -- version. + + -- Check that Argument_Error is raised by the Arccos function when the + -- absolute value of the input parameter is greater than 1.0. + + begin + New_Float_Result := GEF.Arccos(New_Float(FXA5A00.One_Plus_Delta)); + Report.Failed("Argument_Error not raised by the Arccos function " & + "when the input parameter is greater than 1.0"); + Dont_Optimize_New_Float(New_Float_Result, 1); + exception + when Argument_Error => null; -- OK, expected exception. + when others => + Report.Failed("Unexpected exception raised by the Arccos " & + "function when the input parameter is greater " & + "than 1.0"); + end; + + begin + The_Result := EF.Arccos(-FXA5A00.Large); + Report.Failed("Argument_Error not raised by the Arccos function " & + "when the input parameter is a large negative value"); + Dont_Optimize_Float(The_Result, 2); + exception + when Argument_Error => null; -- OK, expected exception. + when others => + Report.Failed("Unexpected exception raised by the Arccos " & + "function when the input parameter is a " & + "large negative value"); + end; + + + -- Check the prescribed results of the Arccos function. + + if GEF.Arccos(X => 1.0) /= 0.0 or + EF.Arccos(1.0) /= 0.0 + then + Report.Failed("Incorrect result returned by the Arccos function " & + "when provided a parameter value of 0.0"); + end if; + + + -- Check the results of the Arccos function with various input + -- parameters. + + if not Result_Within_Range(GEF.Arccos(0.77), 0.692, 0.001) or + not Result_Within_Range( EF.Arccos(0.37), 1.19, 0.01) or + not Result_Within_Range(GEF.Arccos(0.0), Pi/2.0, 0.01) or + not Result_Within_Range( EF.Arccos(-0.11), 1.68, 0.01) or + not Result_Within_Range(GEF.Arccos(-0.67), 2.31, 0.01) or + not Result_Within_Range( EF.Arccos(-0.94), 2.79, 0.01) or + not Result_Within_Range(GEF.Arccos(-1.0), Pi, 0.01) + then + Report.Failed("Incorrect result returned from the Arccos " & + "function when provided a variety of input " & + "parameters"); + end if; + + + -- Testing of the Arccos function with specified Cycle parameter. + + -- Check that Argument_Error is raised by the Arccos function, with + -- specified Cycle parameter, when the absolute value of the input + -- parameter is greater than 1.0. + + begin +--pwb-math: Next line: Changed 2.0*Pi to 360.0 + New_Float_Result := GEF.Arccos(New_Float(Large), Cycle => 360.0); + Report.Failed("Argument_Error not raised by the Arccos function " & + "with specified Cycle parameter, when the input " & + "parameter is a large positive value"); + Dont_Optimize_New_Float(New_Float_Result, 3); + exception + when Argument_Error => null; -- OK, expected exception. + when others => + Report.Failed("Unexpected exception raised by the Arccos " & + "function with specified Cycle parameter, when " & + "the input parameter is a large positive value"); + end; + + begin +--pwb-math: Next line: Changed 2.0*Pi to 360.0 + The_Result := EF.Arccos(FXA5A00.Minus_One_Minus_Delta, 360.0); + Report.Failed("Argument_Error not raised by the Arccos function " & + "with specified Cycle parameter, when the input " & + "parameter is less than -1.0"); + Dont_Optimize_Float(The_Result, 4); + exception + when Argument_Error => null; -- OK, expected exception. + when others => + Report.Failed("Unexpected exception raised by the Arccos " & + "function with specified Cycle parameter, " & + "when the input parameter is less than -1.0"); + end; + + + -- Check that Argument_Error is raised by the Arccos function with + -- specified cycle when the value of the Cycle parameter is zero or + -- negative. + + begin + New_Float_Result := GEF.Arccos(X => 1.0, Cycle => 0.0 ); + Report.Failed("Argument_Error not raised by the Arccos function " & + "with specified Cycle parameter, when the Cycle " & + "parameter is 0.0"); + Dont_Optimize_New_Float(New_Float_Result, 5); + exception + when Argument_Error => null; -- OK, expected exception. + when others => + Report.Failed("Unexpected exception raised by the Arccos " & + "function with specified Cycle parameter, when " & + "the Cycle parameter is 0.0"); + end; + + begin + The_Result := EF.Arccos(1.0, Cycle => -2.0*Pi); + Report.Failed("Argument_Error not raised by the Arccos function " & + "with specified Cycle parameter, when the Cycle " & + "parameter is negative"); + Dont_Optimize_Float(The_Result, 6); + exception + when Argument_Error => null; -- OK, expected exception. + when others => + Report.Failed("Unexpected exception raised by the Arccos " & + "function with specified Cycle parameter, when " & + "the Cycle parameter is negative"); + end; + + + -- Check the prescribed result of the Arccos function with specified + -- Cycle parameter. + +--pwb-math: Next two lines: Changed 2.0*Pi to 360.0 + if GEF.Arccos(X => 1.0, Cycle => 360.0) /= 0.0 or + EF.Arccos(1.0, 360.0) /= 0.0 + then + Report.Failed("Incorrect result from the Arccos function with " & + "specified Cycle parameter, when the input " & + "parameter value is 1.0"); + end if; + + + -- Check the results of the Arccos function, with specified Cycle + -- parameter, with various input parameters. + + if --pwb-math not Result_Within_Range(GEF.Arccos( 0.04, 2.0*Pi), 1.53, 0.01) or +--pwb-math not Result_Within_Range( EF.Arccos( 0.14, 2.0*Pi), 1.43, 0.01) or +--pwb-math not Result_Within_Range(GEF.Arccos( 0.57, 2.0*Pi), 0.96, 0.01) or +--pwb-math not Result_Within_Range( EF.Arccos( 0.99, 2.0*Pi), 0.14, 0.01) or + not Result_Within_Range(GEF.Arccos(-1.0, 360.0), 180.0, 0.1) or + not Result_Within_Range(GEF.Arccos(-1.0, 100.0), 50.0, 0.1) or + not Result_Within_Range(GEF.Arccos( 0.0, 360.0), 90.0, 0.1) or + not Result_Within_Range(GEF.Arccos( 0.0, 100.0), 25.0, 0.1) + then + Report.Failed("Incorrect result returned from the Arccos " & + "function with specified Cycle parameter, " & + "when provided a variety of input parameters"); + end if; + + + + -- Testing of Arccosh Function, both instantiated and pre-instantiated + -- version. + + -- Check that Argument_Error is raised by the Arccosh function when + -- the value of the parameter X is less than 1.0. + + begin + New_Float_Result := GEF.Arccosh(New_Float(FXA5A00.One_Minus_Delta)); + Report.Failed("Argument_Error not raised by the Arccosh function " & + "when the parameter value is less than 1.0"); + Dont_Optimize_New_Float(New_Float_Result, 7); + exception + when Argument_Error => null; -- OK, expected exception. + when others => + Report.Failed("Unexpected exception raised by the Arccosh " & + "function when given a parameter value less " & + "than 1.0"); + end; + + begin + The_Result := EF.Arccosh(0.0); + Report.Failed("Argument_Error not raised by the Arccosh function " & + "when the parameter value is 0.0"); + Dont_Optimize_Float(The_Result, 8); + exception + when Argument_Error => null; -- OK, expected exception. + when others => + Report.Failed("Unexpected exception raised by the Arccosh " & + "function when given a parameter value of 0.0"); + end; + + begin + New_Float_Result := GEF.Arccosh(New_Float(-FXA5A00.Large)); + Report.Failed("Argument_Error not raised by the Arccosh function " & + "when the large negative parameter value"); + Dont_Optimize_New_Float(New_Float_Result, 9); + exception + when Argument_Error => null; -- OK, expected exception. + when others => + Report.Failed("Unexpected exception raised by the Arccosh " & + "function when given a large negative parameter " & + "value"); + end; + + + -- Check the prescribed results of the Arccosh function. + + if GEF.Arccosh(X => 1.0) /= 0.0 or + EF.Arccosh(1.0) /= 0.0 + then + Report.Failed("Incorrect result returned by the Arccosh " & + "function when provided a parameter value of 0.0"); + end if; + + + -- Check the results of the Arccosh function with various input + -- parameters. + + if not Result_Within_Range(GEF.Arccosh(1.03), 0.244, 0.001) or + not Result_Within_Range( EF.Arccosh(1.28), 0.732, 0.001) or + not Result_Within_Range(GEF.Arccosh(1.50), 0.962, 0.001) or + not Result_Within_Range( EF.Arccosh(1.77), 1.17, 0.01) or + not Result_Within_Range(GEF.Arccosh(2.00), 1.32, 0.01) or + not Result_Within_Range( EF.Arccosh(4.30), 2.14, 0.01) or + not Result_Within_Range(GEF.Arccosh(6.90), 2.62, 0.01) + then + Report.Failed("Incorrect result returned from the Arccosh " & + "function when provided a variety of input " & + "parameters"); + end if; + + + exception + when others => Report.Failed ("Exception raised in Test_Block"); + end Test_Block; + + Report.Result; + +end CXA5A06; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxa5a07.a b/gcc/testsuite/ada/acats/tests/cxa/cxa5a07.a new file mode 100644 index 000000000..179d54c44 --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxa5a07.a @@ -0,0 +1,413 @@ +-- CXA5A07.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 function Arctan provides correct results. +-- +-- TEST DESCRIPTION: +-- This test examines both the version of Arctan resulting from the +-- instantiation of the Ada.Numerics.Generic_Elementary_Functions with +-- a type derived from type Float, as well as the preinstantiated +-- version of this package for type Float. +-- Prescribed results, including instances prescribed to raise +-- exceptions, are examined in the test cases. In addition, +-- certain evaluations are performed where the actual function result +-- is compared with the expected result (within an epsilon range of +-- accuracy). +-- +-- TEST FILES: +-- The following files comprise this test: +-- +-- FXA5A00.A (foundation code) +-- CXA5A07.A +-- +-- +-- CHANGE HISTORY: +-- 04 Apr 95 SAIC Initial prerelease version. +-- 13 Jun 95 SAIC Incorporated use of Dont_Optimize procedure, and +-- use of Result_Within_Range function overloaded for +-- FXA5A00.New_Float_Type. +-- 28 Feb 97 PWB.CTA Removed checks with explicit Cycle => 2.0*Pi +-- +-- CHANGE NOTE: +-- According to Ken Dritz, author of the Numerics Annex of the RM, +-- one should never specify the cycle 2.0*Pi for the trigonometric +-- functions. In particular, if the machine number for the first +-- argument is not an exact multiple of the machine number for the +-- explicit cycle, then the specified exact results cannot be +-- reasonably expected. The affected checks in this test have been +-- marked as comments, with the additional notation "pwb-math". +-- Phil Brashear +--! + +with Ada.Numerics.Elementary_Functions; +with Ada.Numerics.Generic_Elementary_Functions; +with FXA5A00; +with Report; + +procedure CXA5A07 is +begin + + Report.Test ("CXA5A07", "Check that the Arctan function provides " & + "correct results"); + + Test_Block: + declare + + use Ada.Numerics; + use FXA5A00; + + package GEF is new Ada.Numerics.Generic_Elementary_Functions(New_Float); + package EF renames Ada.Numerics.Elementary_Functions; + + Float_Result : Float; + New_Float_Result : New_Float; + + procedure Dont_Optimize_Float is new Dont_Optimize(Float); + procedure Dont_Optimize_New_Float is new Dont_Optimize(New_Float); + + begin + + -- Testing of Arctan Function, both instantiated and pre-instantiated + -- version. + + -- Check that Argument_Error is raised by the Arctan function when + -- provided parameter values of 0.0, 0.0. + + begin + New_Float_Result := GEF.Arctan(Y => 0.0, X => 0.0); + Report.Failed("Argument_Error not raised when the Arctan " & + "function is provided input of 0.0, 0.0"); + Dont_Optimize_New_Float(New_Float_Result, 1); + exception + when Argument_Error => null; -- OK, expected exception. + when others => + Report.Failed("Incorrect exception raised by the Arctan " & + "function when provided 0.0, 0.0 input parameters"); + end; + + + -- Check that no exception is raised by the Arctan function when + -- provided a large positive or negative Y parameter value, when + -- using the default value for parameter X. + + begin + Float_Result := EF.Arctan(Y => FXA5A00.Large); + Dont_Optimize_Float(Float_Result, 2); + exception + when others => + Report.Failed("Exception raised when the Arctan function is " & + "provided a large positive Y parameter value"); + end; + + begin + New_Float_Result := GEF.Arctan(Y => New_Float(-FXA5A00.Large)); + Dont_Optimize_New_Float(New_Float_Result, 3); + exception + when others => + Report.Failed("Exception raised when the Arctan function is " & + "provided a large negative Y parameter value"); + end; + + + -- Check that no exception is raised by the Arctan function when + -- provided a small positive or negative Y parameter value, when + -- using the default value for parameter X. + + begin + Float_Result := EF.Arctan(Y => FXA5A00.Small); + Dont_Optimize_Float(Float_Result, 4); + exception + when others => + Report.Failed("Exception raised when the Arctan function is " & + "provided a small positive Y parameter value"); + end; + + begin + New_Float_Result := GEF.Arctan(Y => New_Float(-FXA5A00.Small)); + Dont_Optimize_New_Float(New_Float_Result, 5); + exception + when others => + Report.Failed("Exception raised when the Arctan function is " & + "provided a small negative Y parameter value"); + end; + + + -- Check that no exception is raised by the Arctan function when + -- provided combinations of large and small positive or negative + -- parameter values for both Y and X input parameters. + + begin + Float_Result := EF.Arctan(Y => FXA5A00.Large, X => FXA5A00.Large); + Dont_Optimize_Float(Float_Result, 6); + exception + when others => + Report.Failed("Exception raised when the Arctan function is " & + "provided large positive X and Y parameter values"); + end; + + begin + New_Float_Result := GEF.Arctan(New_Float(-FXA5A00.Large), + X => New_Float(FXA5A00.Small)); + Dont_Optimize_New_Float(New_Float_Result, 7); + exception + when others => + Report.Failed("Exception raised when the Arctan function is " & + "provided a large negative Y parameter value " & + "and a small positive X parameter value"); + end; + + + begin + Float_Result := EF.Arctan(Y => FXA5A00.Small, X => FXA5A00.Large); + Dont_Optimize_Float(Float_Result, 8); + exception + when others => + Report.Failed("Exception raised when the Arctan function is " & + "provided a small positive Y parameter value " & + "and a large positive X parameter value"); + end; + + begin + New_Float_Result := GEF.Arctan(New_Float(-FXA5A00.Small), + New_Float(-FXA5A00.Large)); + Dont_Optimize_New_Float(New_Float_Result, 9); + exception + when others => + Report.Failed("Exception raised when the Arctan function is " & + "provided a small negative Y parameter value " & + "and a large negative parameter value"); + end; + + + -- Check that when the Arctan function is provided a Y parameter value + -- of 0.0 and a positive X parameter input value, the prescribed result + -- of zero is returned. + + if GEF.Arctan(Y => 0.0) /= 0.0 or -- Default X value + EF.Arctan(Y => 0.0, X => FXA5A00.Large) /= 0.0 or +--pwb-math: Next line: changed 2.0*Pi to 360.0 + GEF.Arctan(0.0, 360.0) /= 0.0 or + EF.Arctan(0.0, FXA5A00.Small) /= 0.0 + then + Report.Failed("Incorrect results from the Arctan function when " & + "provided a Y parameter value of 0.0 and various " & + "positive X parameter values"); + end if; + + + -- Check that the Arctan function provides correct results when provided + -- a variety of Y parameter values. + + if not FXA5A00.Result_Within_Range(EF.Arctan(Pi), 1.26, 0.01) or + not FXA5A00.Result_Within_Range(EF.Arctan(-Pi), -1.26, 0.01) or + not FXA5A00.Result_Within_Range(GEF.Arctan(1.0), 0.785, 0.001) or + not FXA5A00.Result_Within_Range(EF.Arctan(-1.0), -0.785, 0.001) or + not FXA5A00.Result_Within_Range(GEF.Arctan(0.25), 0.245, 0.001) or + not FXA5A00.Result_Within_Range(EF.Arctan(0.92), 0.744, 0.001) + then + Report.Failed("Incorrect results from the Arctan function when " & + "provided a variety of Y parameter values"); + end if; + + + + -- Check the results of the Arctan function with specified cycle + -- parameter. + + -- Check that the Arctan function with specified Cycle parameter + -- raises Argument_Error when the value of the Cycle parameter is zero + -- or negative. + + begin + Float_Result := EF.Arctan(Y => Pi, Cycle => 0.0); -- Default X value + Report.Failed("Argument_Error not raised by the Arctan function " & + "with default X parameter value, when the Cycle " & + "parameter is 0.0"); + Dont_Optimize_Float(Float_Result, 10); + exception + when Argument_Error => null; -- OK, expected exception. + when others => + Report.Failed("Incorrect exception raised by the Arctan " & + "function with default X parameter value, when " & + "provided a 0.0 cycle parameter value"); + end; + + begin + New_Float_Result := GEF.Arctan(Y => Pi, X => 1.0, Cycle => 0.0); + Report.Failed("Argument_Error not raised by the Arctan function " & + "when the Cycle parameter is 0.0"); + Dont_Optimize_New_Float(New_Float_Result, 11); + exception + when Argument_Error => null; -- OK, expected exception. + when others => + Report.Failed("Incorrect exception raised by the Arctan " & + "function when provided a 0.0 cycle parameter " & + "value"); + end; + + begin + Float_Result := EF.Arctan(Y => Pi, Cycle => -360.0); + Report.Failed("Argument_Error not raised by the Arctan function " & + "with a default X parameter value, when the Cycle " & + "parameter is -360.0"); + Dont_Optimize_Float(Float_Result, 12); + exception + when Argument_Error => null; -- OK, expected exception. + when others => + Report.Failed("Incorrect exception raised by the Arctan " & + "function with a default X parameter value, when " & + "provided a -360.0 cycle parameter value"); + end; + + begin + New_Float_Result := GEF.Arctan(Y => Pi, X => 1.0, Cycle => -Pi); + Report.Failed("Argument_Error not raised by the Arctan function " & + "when the Cycle parameter is -Pi"); + Dont_Optimize_New_Float(New_Float_Result, 13); + exception + when Argument_Error => null; -- OK, expected exception. + when others => + Report.Failed("Incorrect exception raised by the Arctan " & + "function when provided a -Pi cycle parameter " & + "value"); + end; + + + -- Check that no exception is raised by the Arctan function with + -- specified Cycle parameter, when provided large and small positive + -- or negative parameter values for both Y and X input parameters. + + begin + Float_Result := EF.Arctan(Y => -FXA5A00.Large, + X => -FXA5A00.Large, +--pwb-math: Next line: changed 2.0*Pi to 360.0 + Cycle => 360.0); + Dont_Optimize_Float(Float_Result, 14); + exception + when others => + Report.Failed("Exception raised when the Arctan function with " & + "specified Cycle parameter, when provided large " & + "negative X and Y parameter values"); + end; + + + begin + New_Float_Result := GEF.Arctan(New_Float(FXA5A00.Large), + X => New_Float(-FXA5A00.Small), +--pwb-math: Next line: changed 2.0*Pi to 360.0 + Cycle => 360.0); + Dont_Optimize_New_Float(New_Float_Result, 15); + exception + when others => + Report.Failed("Exception raised when the Arctan function with " & + "specified Cycle parameter, when provided large " & + "positive Y parameter value and a small negative " & + "X parameter value"); + end; + + + begin + Float_Result := EF.Arctan(Y => -FXA5A00.Small, + X => -FXA5A00.Large, +--pwb-math: Next line: changed 2.0*Pi to 360.0 + Cycle => 360.0); + Dont_Optimize_Float(Float_Result, 16); + exception + when others => + Report.Failed("Exception raised when the Arctan function with " & + "specified Cycle parameter, when provided large " & + "negative Y parameter value and a large negative " & + "X parameter value"); + end; + + begin + New_Float_Result := GEF.Arctan(New_Float(FXA5A00.Small), + New_Float(FXA5A00.Large), +--pwb-math: Next line: changed 2.0*Pi to 360.0 + 360.0); + Dont_Optimize_New_Float(New_Float_Result, 17); + exception + when others => + Report.Failed("Exception raised when the Arctan function with " & + "specified Cycle parameter, when provided a " & + "small negative Y parameter value and a large " & + "positive X parameter value"); + end; + + + -- Check that the Arctan function with specified Cycle parameter + -- provides correct results when provided a variety of Y parameter + -- input values. + +--pwb-math if not FXA5A00.Result_Within_Range(EF.Arctan(Pi, Cycle => 2.0*Pi), +--pwb-math 1.26, +--pwb-math 0.01) or +--pwb-math not FXA5A00.Result_Within_Range(EF.Arctan(-Pi, Cycle => 2.0*Pi), +--pwb-math -1.26, +--pwb-math 0.01) or +--pwb-math not FXA5A00.Result_Within_Range(GEF.Arctan(1.0, Cycle => 2.0*Pi), +--pwb-math 0.785, +--pwb-math 0.001) or +--pwb-math not FXA5A00.Result_Within_Range(EF.Arctan(-1.0, Cycle => 2.0*Pi), +--pwb-math -0.785, +--pwb-math 0.001) or +--pwb-math not FXA5A00.Result_Within_Range(GEF.Arctan(0.16, Cycle => 2.0*Pi), +--pwb-math 0.159, +--pwb-math 0.001) or +--pwb-math not FXA5A00.Result_Within_Range(EF.Arctan(1.0, Cycle => 360.0), +--pwb-math 45.0, +--pwb-math 0.1) or +--pwb-math not FXA5A00.Result_Within_Range(GEF.Arctan(1.0, Cycle => 100.0), +--pwb-math 12.5, +--pwb-math 0.1) + +--pwb-math Next 12 lines are replacements for 21 commented lines above + if not FXA5A00.Result_Within_Range(GEF.Arctan(1.0, Cycle => 2.0*180.0), + 45.0, + 0.001) or + not FXA5A00.Result_Within_Range(EF.Arctan(-1.0, Cycle => 2.0*180.0), + -45.0, + 0.001) or + not FXA5A00.Result_Within_Range(EF.Arctan(1.0, Cycle => 360.0), + 45.0, + 0.1) or + not FXA5A00.Result_Within_Range(GEF.Arctan(1.0, Cycle => 100.0), + 12.5, + 0.1) + then + Report.Failed("Incorrect results from the Arctan function with " & + "specified Cycle parameter when provided a variety " & + "of Y parameter values"); + end if; + + + exception + when others => Report.Failed ("Exception raised in Test_Block"); + end Test_Block; + + Report.Result; + +end CXA5A07; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxa5a08.a b/gcc/testsuite/ada/acats/tests/cxa/cxa5a08.a new file mode 100644 index 000000000..ae2b85a6d --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxa5a08.a @@ -0,0 +1,474 @@ +-- CXA5A08.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 function Arccot provides correct results. +-- +-- TEST DESCRIPTION: +-- This test examines both the version of Arccot resulting from the +-- instantiation of the Ada.Numerics.Generic_Elementary_Functions +-- with a type derived from type Float, as well as the preinstantiated +-- version of this package for type Float. +-- Prescribed results, including instances prescribed to raise +-- exceptions, are examined in the test cases. In addition, +-- certain evaluations are performed where the actual function result +-- is compared with the expected result (within an epsilon range of +-- accuracy). +-- +-- TEST FILES: +-- The following files comprise this test: +-- +-- FXA5A00.A (foundation code) +-- CXA5A08.A +-- +-- +-- CHANGE HISTORY: +-- 06 Apr 95 SAIC Initial prerelease version. +-- 13 Jun 95 SAIC Incorporated use of Dont_Optimize procedure, and +-- use of Result_Within_Range function overloaded for +-- FXA5A00.New_Float_Type. +-- 18 Apr 96 SAIC Incorporated reviewer comments for ACVC 2.1. +-- 28 Feb 97 CTA.PWB Removed checks with explicit Cycle => 2.0*Pi +-- +-- CHANGE NOTE: +-- According to Ken Dritz, author of the Numerics Annex of the RM, +-- one should never specify the cycle 2.0*Pi for the trigonometric +-- functions. In particular, if the machine number for the first +-- argument is not an exact multiple of the machine number for the +-- explicit cycle, then the specified exact results cannot be +-- reasonably expected. The affected checks in this test have been +-- marked as comments, with the additional notation "pwb-math". +-- Phil Brashear +--! + +with Ada.Exceptions; +with Ada.Numerics.Elementary_Functions; +with Ada.Numerics.Generic_Elementary_Functions; +with FXA5A00; +with Report; + +procedure CXA5A08 is +begin + + Report.Test ("CXA5A08", "Check that the Arccot function provides " & + "correct results"); + + Test_Block: + declare + + use Ada.Exceptions; + use Ada.Numerics; + use FXA5A00; + + package GEF is new Ada.Numerics.Generic_Elementary_Functions(New_Float); + package EF renames Ada.Numerics.Elementary_Functions; + + Float_Result : Float; + Angle : Float; + New_Float_Result : New_Float; + New_Float_Angle : New_Float; + Incorrect_Inverse : Boolean := False; + + procedure Dont_Optimize_Float is new Dont_Optimize(Float); + procedure Dont_Optimize_New_Float is new Dont_Optimize(New_Float); + + begin + + -- Testing of Arccot Function, both instantiated and pre-instantiated + -- version. + + -- Check that Argument_Error is raised by the Arccot function when + -- provided parameter values of 0.0, 0.0. + + begin + New_Float_Result := GEF.Arccot(X => 0.0, Y => 0.0); + Report.Failed("Argument_Error not raised when the Arccot " & + "function is provided input of 0.0, 0.0"); + Dont_Optimize_New_Float(New_Float_Result, 1); + exception + when Argument_Error => null; -- OK, expected exception. + when others => + Report.Failed("Incorrect exception raised by the Arccot " & + "function when provided 0.0, 0.0 input parameters"); + end; + + + -- Check that no exception is raised by the Arccot function when + -- provided a large positive or negative X parameter value, when + -- using the default value for parameter Y. + + begin + Float_Result := EF.Arccot(X => FXA5A00.Large); + Dont_Optimize_Float(Float_Result, 2); + exception + when others => + Report.Failed("Exception raised when the Arccot function is " & + "provided a large positive X parameter value"); + end; + + begin + New_Float_Result := GEF.Arccot(X => New_Float(-FXA5A00.Large)); + Dont_Optimize_New_Float(New_Float_Result, 3); + exception + when others => + Report.Failed("Exception raised when the Arccot function is " & + "provided a large negative X parameter value"); + end; + + + -- Check that no exception is raised by the Arccot function when + -- provided a small positive or negative X parameter value, when + -- using the default value for parameter Y. + + begin + Float_Result := EF.Arccot(X => FXA5A00.Small); + Dont_Optimize_Float(Float_Result, 4); + exception + when others => + Report.Failed("Exception raised when the Arccot function is " & + "provided a small positive X parameter value"); + end; + + begin + New_Float_Result := GEF.Arccot(X => New_Float(-FXA5A00.Small)); + Dont_Optimize_New_Float(New_Float_Result, 5); + exception + when others => + Report.Failed("Exception raised when the Arccot function is " & + "provided a small negative X parameter value"); + end; + + + -- Check that no exception is raised by the Arccot function when + -- provided combinations of large and small positive or negative + -- parameter values for both X and Y input parameters. + + begin + Float_Result := EF.Arccot(X => FXA5A00.Large, Y => FXA5A00.Large); + Dont_Optimize_Float(Float_Result, 6); + exception + when others => + Report.Failed("Exception raised when the Arccot function is " & + "provided large positive X and Y parameter values"); + end; + + begin + New_Float_Result := GEF.Arccot(New_Float(-FXA5A00.Large), + Y => New_Float(FXA5A00.Small)); + Dont_Optimize_New_Float(New_Float_Result, 7); + exception + when others => + Report.Failed("Exception raised when the Arccot function is " & + "provided a large negative X parameter value " & + "and a small positive Y parameter value"); + end; + + + begin + Float_Result := EF.Arccot(X => FXA5A00.Small, Y => FXA5A00.Large); + Dont_Optimize_Float(Float_Result, 8); + exception + when others => + Report.Failed("Exception raised when the Arccot function is " & + "provided a small positive X parameter value " & + "and a large positive Y parameter value"); + end; + + begin + New_Float_Result := GEF.Arccot(New_Float(-FXA5A00.Small), + New_Float(-FXA5A00.Large)); + Dont_Optimize_New_Float(New_Float_Result, 9); + exception + when others => + Report.Failed("Exception raised when the Arccot function is " & + "provided a small negative X parameter value " & + "and a large negative Y parameter value"); + end; + + + -- Check that when the Arccot function is provided a Y parameter value + -- of 0.0 and a positive X parameter input value, the prescribed result + -- of zero is returned. + + if EF.Arccot(X => FXA5A00.Large, Y => 0.0) /= 0.0 or + GEF.Arccot(2.0*Pi, Y => 0.0) /= 0.0 or + EF.Arccot(FXA5A00.Small, 0.0) /= 0.0 or + EF.Arccot(X => FXA5A00.Large, Y => 0.0, Cycle => 360.0) /= 0.0 or + GEF.Arccot(2.0*Pi, Y => 0.0, Cycle => 360.0) /= 0.0 or + EF.Arccot(FXA5A00.Small, 0.0, Cycle => 360.0) /= 0.0 + then + Report.Failed("Incorrect results from the Arccot function when " & + "provided a Y parameter value of 0.0 and various " & + "positive X parameter values"); + end if; + + + -- Check that the Arccot function provides correct results when + -- provided a variety of X parameter values. + + if not Result_Within_Range( EF.Arccot( 1.0), Pi/4.0, 0.001) or + not Result_Within_Range(GEF.Arccot( 0.0), Pi/2.0, 0.001) or + not Result_Within_Range( EF.Arccot(-1.0), 3.0*Pi/4.0, 0.001) + then + Report.Failed("Incorrect results from the Arccot function when " & + "provided a variety of Y parameter values"); + end if; + + + -- Check the results of the Arccot function with specified cycle + -- parameter. + + -- Check that the Arccot function with specified Cycle parameter + -- raises Argument_Error when the value of the Cycle parameter is zero + -- or negative. + + begin + Float_Result := EF.Arccot(X => Pi, Cycle => 0.0); -- Default Y value + Report.Failed("Argument_Error not raised by the Arccot function " & + "with default Y parameter value, when the Cycle " & + "parameter is 0.0"); + Dont_Optimize_Float(Float_Result, 10); + exception + when Argument_Error => null; -- OK, expected exception. + when others => + Report.Failed("Incorrect exception raised by the Arccot " & + "function with default Y parameter value, when " & + "provided a 0.0 cycle parameter value"); + end; + + begin + New_Float_Result := GEF.Arccot(X => Pi, Y => 1.0, Cycle => 0.0); + Report.Failed("Argument_Error not raised by the Arccot function " & + "when the Cycle parameter is 0.0"); + Dont_Optimize_New_Float(New_Float_Result, 11); + exception + when Argument_Error => null; -- OK, expected exception. + when others => + Report.Failed("Incorrect exception raised by the Arccot " & + "function when provided a 0.0 cycle parameter " & + "value"); + end; + + begin + Float_Result := EF.Arccot(X => Pi, Cycle => -360.0); + Report.Failed("Argument_Error not raised by the Arccot function " & + "with a default Y parameter value, when the Cycle " & + "parameter is -360.0"); + Dont_Optimize_Float(Float_Result, 12); + exception + when Argument_Error => null; -- OK, expected exception. + when others => + Report.Failed("Incorrect exception raised by the Arccot " & + "function with a default Y parameter value, when " & + "provided a -360.0 cycle parameter value"); + end; + + begin + New_Float_Result := GEF.Arccot(X => Pi, Y => 1.0, Cycle => -Pi); + Report.Failed("Argument_Error not raised by the Arccot function " & + "when the Cycle parameter is -Pi"); + Dont_Optimize_New_Float(New_Float_Result, 13); + exception + when Argument_Error => null; -- OK, expected exception. + when others => + Report.Failed("Incorrect exception raised by the Arccot " & + "function when provided a -Pi cycle parameter " & + "value"); + end; + + + -- Check that no exception is raised by the Arccot function with + -- specified Cycle parameter, when provided large and small positive + -- or negative parameter values for both X and Y input parameters. + + begin + Float_Result := EF.Arccot(X => -FXA5A00.Large, + Y => -FXA5A00.Large, +--pwb-math Next line: changed 2.0*Pi to 360.0 + Cycle => 360.0); + Dont_Optimize_Float(Float_Result, 14); + exception + when others => + Report.Failed("Exception raised when the Arccot function with " & + "specified Cycle parameter, when provided large " & + "negative X and Y parameter values"); + end; + + + begin + New_Float_Result := GEF.Arccot(New_Float(FXA5A00.Large), + Y => New_Float(-FXA5A00.Small), +--pwb-math Next line: changed 2.0*Pi to 360.0 + Cycle => 360.0); + Dont_Optimize_New_Float(New_Float_Result, 15); + exception + when others => + Report.Failed("Exception raised when the Arccot function with " & + "specified Cycle parameter, when provided large " & + "positive X parameter value and a small negative " & + "Y parameter value"); + end; + + + begin + Float_Result := EF.Arccot(X => -FXA5A00.Small, + Y => -FXA5A00.Large, +--pwb-math Next line: changed 2.0*Pi to 360.0 + Cycle => 360.0); + Dont_Optimize_Float(Float_Result, 16); + exception + when others => + Report.Failed("Exception raised when the Arccot function with " & + "specified Cycle parameter, when provided small " & + "negative X parameter value and a large negative " & + "Y parameter value"); + end; + + begin + New_Float_Result := GEF.Arccot(New_Float(FXA5A00.Small), + New_Float(FXA5A00.Large), +--pwb-math Next line: changed 2.0*Pi to 360.0 + 360.0); + Dont_Optimize_New_Float(New_Float_Result, 17); + exception + when others => + Report.Failed("Exception raised when the Arccot function with " & + "specified Cycle parameter, when provided a " & + "small positive X parameter value and a large " & + "positive Y parameter value"); + end; + + + -- Check that the Arccot function with specified Cycle parameter + -- provides correct results when provided a variety of X parameter + -- input values. + + if not FXA5A00.Result_Within_Range(GEF.Arccot( 0.0, Cycle => 360.0), + 90.0, + 0.001) or + not FXA5A00.Result_Within_Range(EF.Arccot( 0.0, Cycle => 100.0), + 25.0, + 0.001) or + not FXA5A00.Result_Within_Range(GEF.Arccot( 1.0, Cycle => 360.0), + 45.0, + 0.001) or + not FXA5A00.Result_Within_Range(EF.Arccot( 1.0, Cycle => 100.0), + 12.5, + 0.001) or + not FXA5A00.Result_Within_Range(GEF.Arccot(-1.0, Cycle => 360.0), + 135.0, + 0.001) or + not FXA5A00.Result_Within_Range(EF.Arccot(-1.0, Cycle => 100.0), + 37.5, + 0.001) + then + Report.Failed("Incorrect results from the Arccot function with " & + "specified Cycle parameter when provided a variety " & + "of X parameter values"); + end if; + + + if not FXA5A00.Result_Within_Range(EF.Arccot(0.2425355, 0.9701420), + EF.Arccot(0.25), + 0.01) or + not FXA5A00.Result_Within_Range(EF.Arccot(0.3162277, 0.9486831), + Ef.Arccot(0.33), + 0.01) + then + Report.Failed("Incorrect results from the Arccot function with " & + "comparison to other Arccot function results"); + end if; + + + if not FXA5A00.Result_Within_Range(EF.Cot(EF.Arccot(0.4472135, + 0.8944270)), + 0.5, + 0.01) or + not FXA5A00.Result_Within_Range(EF.Cot(EF.Arccot(0.9987380, + 0.0499369)), + 20.0, + 0.1) + then + Report.Failed("Incorrect results from the Arccot function when " & + "used as argument to Cot function"); + end if; + + + -- Check that inverse function results are correct. + -- Default Cycle test. + + Angle := 0.001; + while Angle < Pi and not Incorrect_Inverse loop + if not Result_Within_Range(EF.Arccot(EF.Cot(Angle)), Angle, 0.001) + then + Incorrect_Inverse := True; + end if; + Angle := Angle + 0.001; + end loop; + + if Incorrect_Inverse then + Report.Failed("Incorrect results returned from the Inverse " & + "comparison of Cot and Arccot using the default " & + "cycle value"); + Incorrect_Inverse := False; + end if; + + -- Non-Default Cycle test. + + New_Float_Angle := 0.01; + while New_Float_Angle < 180.0 and not Incorrect_Inverse loop + if not Result_Within_Range(EF.Arccot(EF.Cot(Float(New_Float_Angle), + Cycle => 360.0), + Cycle => 360.0), + Float(New_Float_Angle), + 0.01) or + not Result_Within_Range(GEF.Arccot( + New_Float(GEF.Cot(New_Float_Angle, + Cycle => 360.0)), + Cycle => 360.0), + Float(New_Float_Angle), + 0.01) + then + Incorrect_Inverse := True; + end if; + New_Float_Angle := New_Float_Angle + 0.01; + end loop; + + if Incorrect_Inverse then + Report.Failed("Incorrect results returned from the Inverse " & + "comparison of Cot and Arccot using non-default " & + "cycle value"); + end if; + + + exception + when The_Error : others => + Report.Failed ("The following exception was raised in the " & + "Test_Block: " & Exception_Name(The_Error)); + end Test_Block; + + Report.Result; + +end CXA5A08; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxa5a09.a b/gcc/testsuite/ada/acats/tests/cxa/cxa5a09.a new file mode 100644 index 000000000..22bd2f890 --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxa5a09.a @@ -0,0 +1,400 @@ +-- CXA5A09.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 function Log provides correct results. +-- +-- TEST DESCRIPTION: +-- This test examines both the version of Log resulting from the +-- instantiation of the Ada.Numerics.Generic_Elementary_Functions with +-- with a type derived from type Float,as well as the preinstantiated +-- version of this package for type Float. +-- Prescribed results, including instances prescribed to raise +-- exceptions, are examined in the test cases. In addition, +-- certain evaluations are performed where the actual function result +-- is compared with the expected result (within an epsilon range of +-- accuracy). +-- +-- TEST FILES: +-- The following files comprise this test: +-- +-- FXA5A00.A (foundation code) +-- CXA5A09.A +-- +-- +-- CHANGE HISTORY: +-- 11 Apr 95 SAIC Initial prerelease version. +-- 13 Jun 95 SAIC Incorporated use of Dont_Optimize procedure, and +-- use of Result_Within_Range function overloaded for +-- FXA5A00.New_Float_Type. +-- 29 Jun 98 EDS Protected exception tests by first testing +-- for 'Machine_Overflows +-- +--! + +with Ada.Numerics.Elementary_Functions; +with Ada.Numerics.Generic_Elementary_Functions; +with FXA5A00; +with Report; + +procedure CXA5A09 is +begin + + Report.Test ("CXA5A09", "Check that the Log function provides " & + "correct results"); + + Test_Block: + declare + + use Ada.Numerics; + use FXA5A00; + + package GEF is new Ada.Numerics.Generic_Elementary_Functions(New_Float); + package EF renames Ada.Numerics.Elementary_Functions; + + Arg, + Float_Result : Float := 0.0; + New_Float_Result : New_Float := 0.0; + + Incorrect_Inverse, + Incorrect_Inverse_Base_2, + Incorrect_Inverse_Base_8, + Incorrect_Inverse_Base_10, + Incorrect_Inverse_Base_16 : Boolean := False; + + procedure Dont_Optimize_Float is new Dont_Optimize(Float); + procedure Dont_Optimize_New_Float is new Dont_Optimize(New_Float); + + begin + + -- Testing of Log Function, both instantiated and pre-instantiated + -- version. + + -- Check that Argument_Error is raised when the parameter X is negative. + + begin + New_Float_Result := GEF.Log(X => -1.0); + Report.Failed("Argument_Error not raised by the Log function " & + "when the input parameter is negative"); + Dont_Optimize_New_Float(New_Float_Result, 1); + exception + when Argument_Error => null; -- OK, expected exception. + when others => + Report.Failed("Unexpected exception raised by the Log function " & + "when the input parameter is negative"); + end; + + begin + Float_Result := EF.Log(X => -FXA5A00.Large); + Report.Failed("Argument_Error not raised by the Log function " & + "when the input parameter is negative"); + Dont_Optimize_Float(Float_Result, 2); + exception + when Argument_Error => null; -- OK, expected exception. + when others => + Report.Failed("Unexpected exception raised by the Log function " & + "when the input parameter is negative"); + end; + + + -- Check that Constraint_Error is raised when the Log function is + -- provided an input parameter of zero. + + if New_Float'Machine_Overflows = True then + begin + New_Float_Result := GEF.Log(X => 0.0); + Report.Failed("Constraint_Error not raised by the Log function " & + "when the input parameter is zero"); + Dont_Optimize_New_Float(New_Float_Result, 3); + exception + when Constraint_Error => null; -- OK, expected exception. + when others => + Report.Failed("Unexpected exception raised by the Log function " + & "when the input parameter is zero"); + end; + end if; + + + -- Check for the reference manual prescribed results of the Log function. + + if GEF.Log(X => 1.0) /= 0.0 or + EF.Log(X => 1.0) /= 0.0 + then + Report.Failed("Incorrect result from Function Log when provided " & + "an input parameter value of 1.0"); + end if; + + + -- Check that the Log function provides correct results when provided + -- a variety of input parameters. + + if not FXA5A00.Result_Within_Range(GEF.Log(0.015), -4.20, 0.01) or + not FXA5A00.Result_Within_Range(GEF.Log(0.592), -0.524, 0.001) or + not FXA5A00.Result_Within_Range(GEF.Log(0.997), -0.003, 0.001) or + not FXA5A00.Result_Within_Range(GEF.Log(1.341), 0.293, 0.001) or + not FXA5A00.Result_Within_Range( EF.Log(2.826), 1.04, 0.01) or + not FXA5A00.Result_Within_Range( EF.Log(10.052), 2.31, 0.01) or + not FXA5A00.Result_Within_Range( EF.Log(2569.143), 7.85, 0.01) + then + Report.Failed("Incorrect results from Function Log when provided " & + "a variety of input parameter values"); + end if; + + Arg := 0.001; + while Arg < 1.0 and not Incorrect_Inverse loop + if not Result_Within_Range(EF."**"(e,EF.Log(Arg)), Arg, 0.001) then + Incorrect_Inverse := True; + end if; + Arg := Arg + 0.001; + end loop; + + if Incorrect_Inverse then + Report.Failed("Incorrect inverse result comparing ""**"" and " & + "Log function over argument range 0.001..1.0"); + Incorrect_Inverse := False; + end if; + + Arg := 1.0; + while Arg < 10.0 and not Incorrect_Inverse loop + if not Result_Within_Range(EF."**"(e,EF.Log(Arg)), Arg, 0.01) then + Incorrect_Inverse := True; + end if; + Arg := Arg + 0.01; + end loop; + + if Incorrect_Inverse then + Report.Failed("Incorrect inverse result comparing ""**"" and " & + "Log function over argument range 1.0..10.0"); + Incorrect_Inverse := False; + end if; + + Arg := 1.0; + while Arg < 1000.0 and not Incorrect_Inverse loop + if not Result_Within_Range(EF."**"(e,EF.Log(Arg)), Arg, 0.1) then + Incorrect_Inverse := True; + end if; + Arg := Arg + 1.0; + end loop; + + if Incorrect_Inverse then + Report.Failed("Incorrect inverse result comparing ""**"" and " & + "Log function over argument range 1.0..1000.0"); + end if; + + + -- Testing of Log Function, with specified Base parameter, both + -- instantiated and pre-instantiated versions. + + -- Check that Argument_Error is raised by the Log function with + -- specified Base parameter, when the X parameter value is negative. + + begin + New_Float_Result := GEF.Log(X => -1.0, Base => 16.0); + Report.Failed("Argument_Error not raised by the Log function " & + "with Base parameter, when the input parameter " & + "value is -1.0"); + Dont_Optimize_New_Float(New_Float_Result, 4); + exception + when Argument_Error => null; -- OK, expected exception. + when others => + Report.Failed("Unexpected exception raised by the Log function " & + "with Base parameter, when the X parameter value " & + "is -1.0"); + end; + + begin + Float_Result := EF.Log(X => -FXA5A00.Large, Base => 8.0); + Report.Failed("Argument_Error not raised by the Log function " & + "with Base parameter, when the X parameter " & + "value is a large negative value"); + Dont_Optimize_Float(Float_Result, 5); + exception + when Argument_Error => null; -- OK, expected exception. + when others => + Report.Failed("Unexpected exception raised by the Log function " & + "with Base parameter, when the X parameter " & + "value is a large negative value"); + end; + + + -- Check that Argument_Error is raised by the Log function when + -- the specified Base parameter is zero. + + begin + New_Float_Result := GEF.Log(X => 10.0, Base => 0.0); + Report.Failed("Argument_Error not raised by the Log function " & + "with Base parameter of 0.0"); + Dont_Optimize_New_Float(New_Float_Result, 6); + exception + when Argument_Error => null; -- OK, expected exception. + when others => + Report.Failed("Unexpected exception raised by the Log function " & + "with Base parameter of 0.0"); + end; + + + -- Check that Argument_Error is raised by the Log function when + -- the specified Base parameter is one. + + begin + Float_Result := EF.Log(X => 12.3, Base => 1.0); + Report.Failed("Argument_Error not raised by the Log function " & + "with Base parameter of 1.0"); + Dont_Optimize_Float(Float_Result, 7); + exception + when Argument_Error => null; -- OK, expected exception. + when others => + Report.Failed("Unexpected exception raised by the Log function " & + "with Base parameter of 1.0"); + end; + + + -- Check that Argument_Error is raised by the Log function when + -- the specified Base parameter is negative. + + begin + New_Float_Result := GEF.Log(X => 12.3, Base => -10.0); + Report.Failed("Argument_Error not raised by the Log function " & + "with negative Base parameter"); + Dont_Optimize_New_Float(New_Float_Result, 8); + exception + when Argument_Error => null; -- OK, expected exception. + when others => + Report.Failed("Unexpected exception raised by the Log function " & + "with negative Base parameter"); + end; + + + -- Check that Constraint_Error is raised by the Log function when the + -- input X parameter value is 0.0. + + if New_Float'Machine_Overflows = True then + begin + New_Float_Result := GEF.Log(X => 0.0, Base => 16.0); + Report.Failed("Constraint_Error not raised by the Log function " & + "with specified Base parameter, when the value of " & + "the parameter X is 0.0"); + Dont_Optimize_New_Float(New_Float_Result, 9); + exception + when Constraint_Error => null; -- OK, expected exception. + when others => + Report.Failed("Unexpected exception raised by Function Log" & + "with specified Base parameter, when the value " & + "of the parameter X is 0.0"); + end; + end if; + + -- Check for the prescribed results of the Log function with specified + -- Base parameter. + + if GEF.Log(X => 1.0, Base => 16.0) /= 0.0 or + EF.Log(X => 1.0, Base => 10.0) /= 0.0 or + GEF.Log(1.0, Base => 8.0) /= 0.0 or + EF.Log(1.0, 2.0) /= 0.0 + then + Report.Failed("Incorrect result from Function Log with specified " & + "Base parameter when provided an parameter X input " & + "value of 1.0"); + end if; + + + -- Check that the Log function with specified Base parameter provides + -- correct results when provided a variety of input parameters. + + if not Result_Within_Range(GEF.Log( 10.0, e), 2.30, 0.01) or + not Result_Within_Range( EF.Log( 8.0, 2.0), 3.0, 0.01) or + not Result_Within_Range(GEF.Log(256.0, 2.0), 8.0, 0.01) or + not Result_Within_Range( EF.Log(512.0, 8.0), 3.0, 0.01) or + not Result_Within_Range(GEF.Log(0.5649, e), -0.57, 0.01) or + not Result_Within_Range( EF.Log(1.7714, e), 0.57, 0.01) or + not Result_Within_Range(GEF.Log(0.5718, 10.0), -0.243, 0.001) or + not Result_Within_Range( EF.Log(466.25, 10.0), 2.67, 0.01) + then + Report.Failed("Incorrect results from Function Log with specified " & + "Base parameter, when provided a variety of input " & + "parameter values"); + end if; + + + Arg := 1.0; + while Arg < 1000.0 and + not (Incorrect_Inverse_Base_2 and Incorrect_Inverse_Base_8 and + Incorrect_Inverse_Base_10 and Incorrect_Inverse_Base_16) + loop + if not FXA5A00.Result_Within_Range(EF."**"(2.0,EF.Log(Arg,2.0)), + Arg, + 0.001) + then + Incorrect_Inverse_Base_2 := True; + end if; + if not FXA5A00.Result_Within_Range(EF."**"(8.0,EF.Log(Arg,8.0)), + Arg, + 0.001) + then + Incorrect_Inverse_Base_8 := True; + end if; + if not FXA5A00.Result_Within_Range(EF."**"(10.0,EF.Log(Arg,10.0)), + Arg, + 0.001) + then + Incorrect_Inverse_Base_10 := True; + end if; + if not FXA5A00.Result_Within_Range(EF."**"(16.0,EF.Log(Arg,16.0)), + Arg, + 0.001) + then + Incorrect_Inverse_Base_16 := True; + end if; + Arg := Arg + 1.0; + end loop; + + if Incorrect_Inverse_Base_2 then + Report.Failed("Incorrect inverse result comparing ""**"" and " & + "Log function for Base 2"); + end if; + + if Incorrect_Inverse_Base_8 then + Report.Failed("Incorrect inverse result comparing ""**"" and " & + "Log function for Base 8"); + end if; + + if Incorrect_Inverse_Base_10 then + Report.Failed("Incorrect inverse result comparing ""**"" and " & + "Log function for Base 10"); + end if; + + if Incorrect_Inverse_Base_16 then + Report.Failed("Incorrect inverse result comparing ""**"" and " & + "Log function for Base 16"); + end if; + + + exception + when others => Report.Failed ("Exception raised in Test_Block"); + end Test_Block; + + Report.Result; + +end CXA5A09; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxa5a10.a b/gcc/testsuite/ada/acats/tests/cxa/cxa5a10.a new file mode 100644 index 000000000..4804d6729 --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxa5a10.a @@ -0,0 +1,551 @@ +-- CXA5A10.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 functions Exp and Sqrt, and the exponentiation +-- operator "**" provide correct results. +-- +-- TEST DESCRIPTION: +-- This test examines both the versions of Exp, Sqrt, and "**" +-- resulting from the instantiation of the +-- Ada.Numerics.Generic_Elementary_Functions with a type derived from +-- type Float, as well as the preinstantiated version of this package +-- for type Float. +-- Prescribed results (stated as such in the reference manual), +-- including instances prescribed to raise exceptions, are examined +-- in the test cases. In addition, certain evaluations are performed +-- for the preinstantiated package where the actual function result is +-- compared with the expected result (within an epsilon range of +-- accuracy). +-- +-- TEST FILES: +-- The following files comprise this test: +-- +-- FXA5A00.A (foundation code) +-- CXA5A10.A +-- +-- +-- CHANGE HISTORY: +-- 17 Apr 95 SAIC Initial prerelease version. +-- 13 Jun 95 SAIC Incorporated use of Dont_Optimize procedure, and +-- use of Result_Within_Range function overloaded for +-- FXA5A00.New_Float_Type. +-- 18 Apr 96 SAIC Incorporated reviewer comments for ACVC 2.1. +-- 01 Oct 01 RLB Protected Constraint_Error exception tests by +-- first testing for 'Machine_Overflows. +-- +--! + +with Ada.Exceptions; +with Ada.Numerics.Elementary_Functions; +with Ada.Numerics.Generic_Elementary_Functions; +with FXA5A00; +with Report; + +procedure CXA5A10 is +begin + + Report.Test ("CXA5A10", "Check that Exp, Sqrt, and the ""**"" operator " & + "provide correct results"); + + Test_Block: + declare + + use FXA5A00, Ada.Numerics; + use Ada.Exceptions; + + package GEF is new Ada.Numerics.Generic_Elementary_Functions(New_Float); + package EF renames Ada.Numerics.Elementary_Functions; + + use GEF, EF; + + Arg, + Float_Result : Float; + New_Float_Result : New_Float; + + Flag_1, Flag_2, Flag_3, Flag_4, + Incorrect_Inverse_Base_e, + Incorrect_Inverse_Base_2, + Incorrect_Inverse_Base_8, + Incorrect_Inverse_Base_10, + Incorrect_Inverse_Base_16 : Boolean := False; + + procedure Dont_Optimize_Float is new Dont_Optimize(Float); + procedure Dont_Optimize_New_Float is new Dont_Optimize(New_Float); + + begin + + -- Testing of the "**" operator, both instantiated and pre-instantiated + -- version. + + -- Check that Argument_Error is raised by the exponentiation operator + -- when the value of the Left parameter (operand) is negative. + + begin + New_Float_Result := GEF."**"(Left => -10.0, + Right => 2.0); + Report.Failed("Argument_Error not raised by the instantiated " & + "version of the exponentiation operator when the " & + "value of the Left parameter is negative"); + Dont_Optimize_New_Float(New_Float_Result, 1); + exception + when Argument_Error => null; -- OK, expected exception. + when others => + Report.Failed("Unexpected exception raised by the " & + "instantiated version of the exponentiation " & + "operator when the value of the Left parameter " & + "is negative"); + end; + + begin + Float_Result := (-FXA5A00.Small) ** 4.0; + Report.Failed("Argument_Error not raised by the preinstantiated " & + "version of the exponentiation operator when the " & + "value of the Left parameter is negative"); + Dont_Optimize_Float(Float_Result, 2); + exception + when Argument_Error => null; -- OK, expected exception. + when others => + Report.Failed("Unexpected exception raised by the " & + "preinstantiated version of the exponentiation " & + "operator when the value of the Left parameter " & + "is negative"); + end; + + + -- Check that Argument_Error is raised by the exponentiation operator + -- when both parameters (operands) have the value 0.0. + + begin + New_Float_Result := GEF."**"(0.0, Right => 0.0); + Report.Failed("Argument_Error not raised by the instantiated " & + "version of the exponentiation operator when " & + "both operands are zero"); + Dont_Optimize_New_Float(New_Float_Result, 3); + exception + when Argument_Error => null; -- OK, expected exception. + when others => + Report.Failed("Unexpected exception raised by the " & + "instantiated version of the exponentiation " & + "operator when both operands are zero"); + end; + + begin + Float_Result := 0.0**0.0; + Report.Failed("Argument_Error not raised by the preinstantiated " & + "version of the exponentiation operator when both " & + "operands are zero"); + Dont_Optimize_Float(Float_Result, 4); + exception + when Argument_Error => null; -- OK, expected exception. + when others => + Report.Failed("Unexpected exception raised by the " & + "preinstantiated version of the exponentiation " & + "operator when both operands are zero"); + end; + + + -- Check that Constraint_Error is raised by the exponentiation + -- operator when the value of the left parameter (operand) is zero, + -- and the value of the right parameter (exponent) is negative. + -- This check applies only if Machine_Overflows is true [A.5.1(28, 30)]. + + if New_Float'Machine_Overflows = True then + begin + New_Float_Result := GEF."**"(0.0, Right => -2.0); + Report.Failed("Constraint_Error not raised by the instantiated " & + "version of the exponentiation operator when " & + "the left parameter is 0.0, and the right " & + "parameter is negative"); + Dont_Optimize_New_Float(New_Float_Result, 5); + exception + when Constraint_Error => null; -- OK, expected exception. + when others => + Report.Failed("Unexpected exception raised by the " & + "instantiated version of the exponentiation " & + "operator when the left parameter is 0.0, " & + "and the right parameter is negative"); + end; + end if; + + if Float'Machine_Overflows = True then + begin + Float_Result := 0.0 ** (-FXA5A00.Small); + Report.Failed("Constraint_Error not raised by the " & + "preinstantiated version of the exponentiation " & + "operator when the left parameter is 0.0, and the " & + "right parameter is negative"); + Dont_Optimize_Float(Float_Result, 6); + exception + when Constraint_Error => null; -- OK, expected exception. + when others => + Report.Failed("Unexpected exception raised by the " & + "preinstantiated version of the exponentiation " & + "operator when the left parameter is 0.0, and " & + "the right parameter is negative"); + end; + end if; + + -- Prescribed results. + -- Check that exponentiation by a 0.0 exponent yields the value one. + + if GEF."**"(Left => 10.0, Right => 0.0) /= 1.0 or + EF."**"(FXA5A00.Large, Right => 0.0) /= 1.0 or + GEF."**"(3.0, 0.0) /= 1.0 or + FXA5A00.Small ** 0.0 /= 1.0 + then + Report.Failed("Incorrect results returned from the ""**"" " & + "operator when the value of the exponent is 0.0"); + end if; + + + -- Check that exponentiation by a unit exponent yields the value + -- of the left operand. + + if GEF."**"(Left => 50.0, Right => 1.0) /= 50.0 or + EF."**"(FXA5A00.Large, Right => 1.0) /= FXA5A00.Large or + GEF."**"(6.0, 1.0) /= 6.0 or + FXA5A00.Small ** 1.0 /= FXA5A00.Small + then + Report.Failed("Incorrect results returned from the ""**"" " & + "operator when the value of the exponent is 1.0"); + end if; + + + -- Check that exponentiation of the value 1.0 yields the value 1.0. + + if GEF."**"(Left => 1.0, Right => 16.0) /= 1.0 or + EF."**"(1.0, Right => FXA5A00.Large) /= 1.0 or + GEF."**"(1.0, 3.0) /= 1.0 or + 1.0 ** FXA5A00.Small /= 1.0 + then + Report.Failed("Incorrect results returned from the ""**"" " & + "operator when the value of the operand is 1.0"); + end if; + + + -- Check that exponentiation of the value 0.0 yields the value 0.0. + + if GEF."**"(Left => 0.0, Right => 10.0) /= 0.0 or + EF."**"(0.0, Right => FXA5A00.Large) /= 0.0 or + GEF."**"(0.0, 4.0) /= 0.0 or + 0.0 ** FXA5A00.Small /= 0.0 + then + Report.Failed("Incorrect results returned from the ""**"" " & + "operator when the value of the operand is 0.0"); + end if; + + + -- Check that exponentiation of various operands with a variety of + -- of exponent values yield correct results. + + if not Result_Within_Range(GEF."**"(5.0, 2.0), 25.0, 0.01) or + not Result_Within_Range(GEF."**"(1.225, 1.5), 1.36, 0.01) or + not Result_Within_Range(GEF."**"(0.26, 2.0), 0.068, 0.001) or + not Result_Within_Range( EF."**"(e, 5.0), 148.4, 0.1) or + not Result_Within_Range( EF."**"(10.0, e), 522.7, 0.1) or + not Result_Within_Range( EF."**"(e, (-3.0)), 0.050, 0.001) or + not Result_Within_Range(GEF."**"(10.0,(-2.0)), 0.010, 0.001) + then + Report.Failed("Incorrect results returned from the ""**"" " & + "operator with a variety of operand and exponent " & + "values"); + end if; + + + -- Use the following loops to check for internal consistency between + -- inverse functions. + + declare + -- Use the relative error value to account for non-exact + -- computations. + TC_Relative_Error: Float := 0.005; + begin + for i in 1..5 loop + for j in 0..5 loop + if not Incorrect_Inverse_Base_e and + not FXA5A00.Result_Within_Range + (Float(i)**Float(j), + e**(Float(j)*EF.Log(Float(i))), + TC_Relative_Error) + then + Incorrect_Inverse_Base_e := True; + Report.Failed("Incorrect Log-** Inverse calc for Base e " & + "with i= " & Integer'Image(i) & " and j= " & + Integer'Image(j)); + end if; + if not Incorrect_Inverse_Base_2 and + not FXA5A00.Result_Within_Range + (Float(i)**Float(j), + 2.0**(Float(j)*EF.Log(Float(i),2.0)), + TC_Relative_Error) + then + Incorrect_Inverse_Base_2 := True; + Report.Failed("Incorrect Log-** Inverse calc for Base 2 " & + "with i= " & Integer'Image(i) & " and j= " & + Integer'Image(j)); + end if; + if not Incorrect_Inverse_Base_8 and + not FXA5A00.Result_Within_Range + (Float(i)**Float(j), + 8.0**(Float(j)*EF.Log(Float(i),8.0)), + TC_Relative_Error) + then + Incorrect_Inverse_Base_8 := True; + Report.Failed("Incorrect Log-** Inverse calc for Base 8 " & + "with i= " & Integer'Image(i) & " and j= " & + Integer'Image(j)); + end if; + if not Incorrect_Inverse_Base_10 and + not FXA5A00.Result_Within_Range + (Float(i)**Float(j), + 10.0**(Float(j)*EF.Log(Float(i),10.0)), + TC_Relative_Error) + then + Incorrect_Inverse_Base_10 := True; + Report.Failed("Incorrect Log-** Inverse calc for Base 10 " & + "with i= " & Integer'Image(i) & " and j= " & + Integer'Image(j)); + end if; + if not Incorrect_Inverse_Base_16 and + not FXA5A00.Result_Within_Range + (Float(i)**Float(j), + 16.0**(Float(j)*EF.Log(Float(i),16.0)), + TC_Relative_Error) + then + Incorrect_Inverse_Base_16 := True; + Report.Failed("Incorrect Log-** Inverse calc for Base 16 " & + "with i= " & Integer'Image(i) & " and j= " & + Integer'Image(j)); + end if; + end loop; + end loop; + end; + + -- Reset Flags. + Incorrect_Inverse_Base_e := False; + Incorrect_Inverse_Base_2 := False; + Incorrect_Inverse_Base_8 := False; + Incorrect_Inverse_Base_10 := False; + Incorrect_Inverse_Base_16 := False; + + + -- Testing of Exp Function, both instantiated and pre-instantiated + -- version. + + -- Check that the result of the Exp Function, when provided an X + -- parameter value of 0.0, is 1.0. + + if GEF.Exp(X => 0.0) /= 1.0 or + EF.Exp(0.0) /= 1.0 + then + Report.Failed("Incorrect result returned by Function Exp when " & + "given a parameter value of 0.0"); + end if; + + + -- Check that the Exp Function provides correct results when provided + -- a variety of input parameter values. + + if not Result_Within_Range(GEF.Exp(0.001), 1.01, 0.01) or + not Result_Within_Range( EF.Exp(0.1), 1.11, 0.01) or + not Result_Within_Range(GEF.Exp(1.2697), 3.56, 0.01) or + not Result_Within_Range( EF.Exp(3.2525), 25.9, 0.1) or + not Result_Within_Range(GEF.Exp(-0.2198), 0.803, 0.001) or + not Result_Within_Range( EF.Exp(-1.6621), 0.190, 0.001) or + not Result_Within_Range(GEF.Exp(-2.3888), 0.092, 0.001) or + not Result_Within_Range( EF.Exp(-5.4415), 0.004, 0.001) + then + Report.Failed("Incorrect result from Function Exp when provided " & + "a variety of input parameter values"); + end if; + + -- Use the following loops to check for internal consistency between + -- inverse functions. + + Arg := 0.01; + while Arg < 10.0 loop + if not Incorrect_Inverse_Base_e and + FXA5A00.Result_Within_Range(EF.Exp(Arg), + e**(Arg*EF.Log(Arg)), + 0.001) + then + Incorrect_Inverse_Base_e := True; + Report.Failed("Incorrect Exp-** Inverse calc for Base e"); + end if; + if not Incorrect_Inverse_Base_2 and + FXA5A00.Result_Within_Range(EF.Exp(Arg), + 2.0**(Arg*EF.Log(Arg,2.0)), + 0.001) + then + Incorrect_Inverse_Base_2 := True; + Report.Failed("Incorrect Exp-** Inverse calc for Base 2"); + end if; + if not Incorrect_Inverse_Base_8 and + FXA5A00.Result_Within_Range(EF.Exp(Arg), + 8.0**(Arg*EF.Log(Arg,8.0)), + 0.001) + then + Incorrect_Inverse_Base_8 := True; + Report.Failed("Incorrect Exp-** Inverse calc for Base 8"); + end if; + if not Incorrect_Inverse_Base_10 and + FXA5A00.Result_Within_Range(EF.Exp(Arg), + 10.0**(Arg*EF.Log(Arg,10.0)), + 0.001) + then + Incorrect_Inverse_Base_10 := True; + Report.Failed("Incorrect Exp-** Inverse calc for Base 10"); + end if; + if not Incorrect_Inverse_Base_16 and + FXA5A00.Result_Within_Range(EF.Exp(Arg), + 16.0**(Arg*EF.Log(Arg,16.0)), + 0.001) + then + Incorrect_Inverse_Base_16 := True; + Report.Failed("Incorrect Exp-** Inverse calc for Base 16"); + end if; + Arg := Arg + 0.01; + end loop; + + + -- Testing of Sqrt Function, both instantiated and pre-instantiated + -- version. + + -- Check that Argument_Error is raised by the Sqrt Function when + -- the value of the input parameter X is negative. + + begin + Float_Result := EF.Sqrt(X => -FXA5A00.Small); + Report.Failed("Argument_Error not raised by Function Sqrt " & + "when provided a small negative input parameter " & + "value"); + Dont_Optimize_Float(Float_Result, 7); + exception + when Argument_Error => null; -- OK, expected exception. + when others => + Report.Failed("Unexpected exception raised by Function Sqrt " & + "when provided a small negative input parameter " & + "value"); + end; + + begin + New_Float_Result := GEF.Sqrt(X => -64.0); + Report.Failed("Argument_Error not raised by Function Sqrt " & + "when provided a large negative input parameter " & + "value"); + Dont_Optimize_New_Float(New_Float_Result, 8); + exception + when Argument_Error => null; -- OK, expected exception. + when others => + Report.Failed("Unexpected exception raised by Function Sqrt " & + "when provided a large negative input parameter " & + "value"); + end; + + + -- Check that the Sqrt Function, when given an X parameter value of 0.0, + -- returns a result of 0.0. + + if GEF.Sqrt(X => 0.0) /= 0.0 or + EF.Sqrt(0.0) /= 0.0 + then + Report.Failed("Incorrect result from Function Sqrt when provided " & + "an input parameter value of 0.0"); + end if; + + + -- Check that the Sqrt Function, when given an X parameter input value + -- of 1.0, returns a result of 1.0. + + if GEF.Sqrt(X => 1.0) /= 1.0 or + EF.Sqrt(1.0) /= 1.0 + then + Report.Failed("Incorrect result from Function Sqrt when provided " & + "an input parameter value of 1.0"); + end if; + + + -- Check that the Sqrt Function provides correct results when provided + -- a variety of input parameter values. + + if not FXA5A00.Result_Within_Range(GEF.Sqrt(0.0327), 0.181, 0.001) or + not FXA5A00.Result_Within_Range( EF.Sqrt(0.1808), 0.425, 0.001) or + not FXA5A00.Result_Within_Range(GEF.Sqrt(1.0556), 1.03, 0.01) or + not FXA5A00.Result_Within_Range( EF.Sqrt(32.8208), 5.73, 0.01) or + not FXA5A00.Result_Within_Range( EF.Sqrt(27851.0), 166.9, 0.1) or + not FXA5A00.Result_Within_Range( EF.Sqrt(61203.4), 247.4, 0.1) or + not FXA5A00.Result_Within_Range( EF.Sqrt(655891.0), 809.9, 0.1) + then + Report.Failed("Incorrect result from Function Sqrt when provided " & + "a variety of input parameter values"); + end if; + + -- Check internal consistency between functions. + + Arg := 0.01; + while Arg < 10.0 loop + if not Flag_1 and + not FXA5A00.Result_Within_Range(Arg, + EF.Sqrt(Arg)*EF.Sqrt(Arg), + 0.01) + then + Report.Failed("Inconsistency found in Case 1"); + Flag_1 := True; + end if; + if not Flag_2 and + not FXA5A00.Result_Within_Range(Arg, EF.Sqrt(Arg)**2.0, 0.01) + then + Report.Failed("Inconsistency found in Case 2"); + Flag_2 := True; + end if; + if not Flag_3 and + not FXA5A00.Result_Within_Range(EF.Log(Arg), + EF.Log(Sqrt(Arg)**2.0), 0.01) + then + Report.Failed("Inconsistency found in Case 3"); + Flag_3 := True; + end if; + if not Flag_4 and + not FXA5A00.Result_Within_Range(EF.Log(Arg), + 2.00*EF.Log(EF.Sqrt(Arg)), + 0.01) + then + Report.Failed("Inconsistency found in Case 4"); + Flag_4 := True; + end if; + Arg := Arg + 1.0; + end loop; + + + exception + when The_Error : others => + Report.Failed ("The following exception was raised in the " & + "Test_Block: " & Exception_Name(The_Error)); + end Test_Block; + + Report.Result; + +end CXA5A10; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxa8001.a b/gcc/testsuite/ada/acats/tests/cxa/cxa8001.a new file mode 100644 index 000000000..16f30752d --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxa8001.a @@ -0,0 +1,243 @@ +-- CXA8001.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 all elements to be transferred to a sequential file of +-- mode Append_File will be placed following the last element currently +-- in the file. +-- Check that it is possible to append data to a file that has been +-- previously appended to. +-- Check that the predefined procedure Write will place an element after +-- the last element in the file in mode Append_File. +-- +-- TEST DESCRIPTION: +-- This test implements a sequential file system that has the capability +-- to store data records at the end of a file. Initially, the file is +-- opened with mode Out_File, and data is written to the file. The file +-- is closed, then reopened with mode Append_File. An additional record +-- is written, and again the file is closed. The file is then reopened, +-- again with mode Append_File, and another record is written to the +-- file. +-- The file is closed again, the reopened with mode In_File, and the data +-- in the file is read and checked for proper ordering within the file. +-- +-- An expected common usage of Append_File mode would be in the opening +-- of a file that currently contains data. Likewise, the reopening of +-- files in Append_Mode that have been previously appended to for the +-- addition of more data would be frequently encountered. This test +-- attempts to simulate both situations. (Of course, in an actual user +-- environment, the open/write/close processing would be performed using +-- looping structures, rather than the straight-line processing displayed +-- here.) +-- +-- APPLICABILITY CRITERIA: +-- Applicable to all systems capable of supporting IO operations on +-- external Sequential_IO files. +-- +-- +-- CHANGE HISTORY: +-- 06 Dec 94 SAIC ACVC 2.0 +-- 27 Feb 97 PWB.CTA Allowed for non-support of some IO operations +--! + +with Sequential_IO; +with Report; + +procedure CXA8001 is + + -- Declare data types and objects to be stored in the file. + subtype Name_Type is String (1 .. 10); + type Tickets is range 0 .. 1000; + + type Order_Type is record + Name : Name_Type; + No_of_Tickets : Tickets; + end record; + + package Order_IO is new Sequential_IO (Order_Type); -- Declare Seq_IO + -- package, + Order_File : Order_IO.File_Type; -- and file object. + Order_Filename : constant String := + Report.Legal_File_Name ( Nam => "CXA8001" ); + Incomplete : exception; + +begin + + Report.Test ("CXA8001", "Check that all elements to be transferred to a " & + "sequential file of mode Append_File will be " & + "placed following the last element currently " & + "in the file"); + + Test_for_Sequential_IO_Support: + begin + + -- An implementation that does not support Sequential_IO in a particular + -- environment will raise Use_Error or Name_Error on calls to various + -- Sequential_IO operations. This block statement encloses a call to + -- Create, which should produce an exception in a non-supportive + -- environment. These exceptions will be handled to produce a + -- Not_Applicable result. + + Order_IO.Create (File => Order_File, -- Create Sequential_IO file + Mode => Order_IO.Out_File, -- with mode Out_File. + Name => Order_Filename); + + exception + + when Order_IO.Use_Error | Order_IO.Name_Error => + Report.Not_Applicable + ( "Files not supported - Create as Out_File for Sequential_IO" ); + raise Incomplete; + + end Test_for_Sequential_IO_Support; + + Operational_Test_Block: + declare + -- Assign values into the component fields of the data objects. + Buyer_1 : constant Order_Type := ("John Smith", 3); + Buyer_2 : constant Order_Type := + (Name => "Jane Jones", No_of_Tickets => 2); + Buyer_3 : Order_Type := ("Mike Brown", 5); + + begin + Order_IO.Write (File => Order_File, -- Write initial data item + Item => Buyer_1); -- to file. + + Order_IO.Close (File => Order_File); -- Close file. + + -- + -- Enter additional data records into the file. (Append to a file of + -- previous mode Out_File). + -- + Order_IO.Open (Order_File, -- Open Sequential_IO file + Order_IO.Append_File, -- with mode Append_File. + Order_Filename); + + Order_IO.Write (Order_File, Buyer_2); -- Write second data item + -- to file. + Order_IO.Close (File => Order_File); -- Close file. + + -- Check to determine whether file is actually closed. + begin + Order_IO.Write (Order_File, Buyer_2); + Report.Failed("Exception not raised on Write to Closed file"); + exception + when Order_IO.Status_Error => null; -- Expected exception. + when others => + Report.Failed("Incorrect exception on Write to Closed file"); + end; + + -- + -- The following code segment demonstrates appending data to a file + -- that has been previously appended to. + -- + + Order_IO.Open (Order_File, -- Open Sequential_IO file + Order_IO.Append_File, -- with mode Append_File. + Order_Filename ); + + Order_IO.Write (Order_File, Buyer_3); -- Write third data item + -- to file. + Order_IO.Close (File => Order_File); -- Close file. + + + Test_Verification_Block: + declare + TC_Order1, TC_Order2, TC_Order3 : Order_Type; + begin + + Order_IO.Open (Order_File, -- Open Sequential_IO file + Order_IO.In_File, -- with mode In_File. + Order_Filename ); + + Order_IO.Read (File => Order_File, -- Read records from file. + Item => TC_Order1); + Order_IO.Read (Order_File, TC_Order2); + Order_IO.Read (Order_File, TC_Order3); + + -- Compare the contents of each with the individual data items. + -- If items read from file do not match the items placed into + -- the file, in the appropriate order, then fail. + + if ((TC_Order1 /= Buyer_1) or + (TC_Order2.Name /= Buyer_2.Name) or + (TC_Order2.No_of_Tickets /= Buyer_2.No_of_Tickets) or + not ((TC_Order3.Name = "Mike Brown") and + (TC_Order3.No_of_Tickets = 5))) then + Report.Failed ("Incorrect appending of record data in file"); + end if; + + -- Check to determine that no more than three data records were + -- actually written to the file. + if not Order_IO.End_Of_File (Order_File) then + Report.Failed("File not empty after three reads"); + end if; + + exception + + when Order_IO.End_Error => -- If three items not in + -- file (data overwritten), + -- then fail. + Report.Failed ("Incorrect number of record elements in file"); + + when others => + Report.Failed ("Error raised during data verification"); + + end Test_Verification_Block; + + exception + + when others => + Report.Failed("Exception raised during Sequential_IO processing"); + + end Operational_Test_Block; + + Deletion: + begin + -- Check that file is open prior to deleting it. + if Order_IO.Is_Open(Order_File) then + Order_IO.Delete (Order_File); + else + Order_IO.Open(Order_File, Order_IO.In_File, Order_Filename); + Order_IO.Delete (Order_File); + end if; + + exception + when others => + Report.Failed + ( "Delete not properly implemented for Sequential_IO" ); + + end Deletion; + + Report.Result; + +exception + when Incomplete => + Report.Result; + when others => + Report.Failed ( "Unexpected exception" ); + Report.Result; + +end CXA8001; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxa8002.a b/gcc/testsuite/ada/acats/tests/cxa/cxa8002.a new file mode 100644 index 000000000..8670e98ba --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxa8002.a @@ -0,0 +1,285 @@ +-- CXA8002.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 resetting a file using mode Append_File allows for the +-- writing of elements to the file starting after the last element in +-- the file. +-- Check that the result of function Name can be used on a subsequent +-- reopen of the file. +-- Check that a mode change occurs on reset of a file to/from mode +-- Append_File. +-- +-- TEST DESCRIPTION: +-- This test simulates the read/write of data from/to an individual +-- sequential file. New data can be appended to the end of the existing +-- file, and the same file can be reset to allow reading of data from +-- the file. This process can occur multiple times. +-- When the mode of the file is changed with a Reset, the current mode +-- value assigned to the file is checked using the result of function +-- Mode. This, in conjunction with the read/write operations, verifies +-- that a mode change has taken place on Reset. +-- +-- An expected common usage of the scenarios found in this test would +-- be a case where a single data file is kept open continuously, being +-- reset for read/append of data. For systems that do not support a +-- direct form of I/O, this would allow for efficient use of a sequential +-- I/O file. +-- +-- APPLICABILITY CRITERIA: +-- Applicable to all systems capable of supporting IO operations on +-- external Sequential_IO files. +-- +-- +-- CHANGE HISTORY: +-- 06 Dec 94 SAIC ACVC 2.0 +-- 19 Feb 97 PWB.CTA Fixed handling for file non-support and Reset +-- non-support. +--! + +with Sequential_IO; +with Report; + +procedure CXA8002 is + subtype Employee_Data is String (1 .. 11); + package Data_IO is new Sequential_IO (Employee_Data); + + Employee_Data_File : Data_IO.File_Type; + Employee_Filename : constant String := + Report.Legal_File_Name (Nam => "CXA8002"); + + Incomplete : exception; + +begin + + Report.Test ("CXA8002", "Check that resetting a file using mode " & + "Append_File allows for the writing of " & + "elements to the file starting after the " & + "last element in the file"); + + Test_for_Sequential_IO_Support: + begin + + -- An implementation that does not support Sequential_IO in a particular + -- environment will raise Use_Error or Name_Error on calls to various + -- Sequential_IO operations. This block statement encloses a call to + -- Create, which should produce an exception in a non-supportive + -- environment. These exceptions will be handled to produce a + -- Not_Applicable result. + + Data_IO.Create (File => Employee_Data_File, -- Create file in + Mode => Data_IO.Append_File, -- mode Append_File. + Name => Employee_Filename); + + -- + -- The following portion of code demonstrates the fact that a sequential + -- file can be created in Append_File mode, and that data can be written + -- to the file. + -- + + exception + when Data_IO.Use_Error | Data_IO.Name_Error => + Report.Not_Applicable + ( "Sequential files not supported - Create as Append_File"); + raise Incomplete; + end Test_for_Sequential_IO_Support; + Operational_Test_Block: + declare + Blank_Data : constant Employee_Data := " "; + Employee_1 : constant Employee_Data := "123-45-6789"; + Employee_2 : Employee_Data := "987-65-4321"; + + -- Note: Artificial numerical data chosen above to prevent any + -- unintended similarity with persons alive or dead. + + TC_Employee_Data : Employee_Data := Blank_Data; + + + function TC_Mode_Selection (Selector : Integer) + return Data_IO.File_Mode is + begin + case Report.Ident_Int(Selector) is + when 1 => return Data_IO.In_File; + when 2 => return Data_IO.Out_File; + when others => return Data_IO.Append_File; + end case; + end TC_Mode_Selection; + + Employee_Filename : constant String := -- Use function Name to + Data_IO.Name (File => Employee_Data_File); -- store filename in + -- string variable. + begin + + Data_IO.Write (File => Employee_Data_File, -- Write initial data + Item => Employee_1); -- entry to file. + + -- + -- The following portion of code demonstrates that a sequential file + -- can be reset to various file modes, including Append_File mode, + -- allowing data to be added to the end of the file. + -- + begin + Data_IO.Reset (File => Employee_Data_File, -- Reset file with + Mode => Data_IO.In_File); -- mode In_File. + exception + when Data_IO.Use_Error => + Report.Not_Applicable + ("Reset to In_File not supported for Sequential_IO"); + raise Incomplete; + when others => + Report.Failed + ("Unexpected exception on Reset to In_File (Sequential_IO)"); + raise Incomplete; + end; + if Data_IO."="(Data_IO.Mode (Employee_Data_File), + TC_Mode_Selection (1)) then -- Compare In_File mode + -- Reset successful, + Data_IO.Read (File => Employee_Data_File, -- now verify file data. + Item => TC_Employee_Data); + + if ((TC_Employee_Data (1 .. 7) /= "123-45-") or + (TC_Employee_Data (5 .. 11) /= "45-6789")) then + Report.Failed ("Data read error"); + end if; + + else + Report.Failed ("File mode not changed by Reset"); + end if; + + -- + -- Simulate appending data to a file that has previously been written + -- to and read from. + -- + begin + Data_IO.Reset (File => Employee_Data_File, -- Reset file with + Mode => Data_IO.Append_File); -- mode Append_File. + exception + when Data_IO.Use_Error => + Report.Not_Applicable + ("Reset to Append_File not supported for Sequential_IO"); + raise Incomplete; + when others => + Report.Failed + ("Unexpected exception on Reset to Append_File (Sequential_IO)"); + raise Incomplete; + end; + + if Data_IO.Is_Open (Employee_Data_File) then -- File remains open + -- following Reset to + -- Append_File mode? + + if Data_IO."=" (Data_IO.Mode (Employee_Data_File), + TC_Mode_Selection (3)) then -- Compare to + -- Append_File mode. + Data_IO.Write (File => Employee_Data_File, -- Write additional + Item => Employee_2); -- data to file. + else + Report.Failed ("File mode not changed by Reset"); + end if; + + else + Report.Failed + ("File status not Open following Reset to Append mode"); + end if; + + Data_IO.Close (Employee_Data_File); + + + Test_Verification_Block: + begin + + Data_IO.Open (File => Employee_Data_File, -- Reopen file, using + Mode => Data_IO.In_File, -- previous result of + Name => Employee_Filename); -- function Name. + + TC_Employee_Data := Blank_Data; -- Clear record field. + Data_IO.Read (Employee_Data_File, -- Read first record, + TC_Employee_Data); -- check ordering of + -- records. + + if not ((TC_Employee_Data (1 .. 3) = "123") and then + (TC_Employee_Data (4 .. 11) = "-45-6789")) then + Report.Failed ("Data read error - first record"); + end if; + + TC_Employee_Data := Blank_Data; -- Clear record field. + Data_IO.Read (Employee_Data_File, -- Read second record, + TC_Employee_Data); -- check for ordering of + -- records. + + if ((TC_Employee_Data (1 .. 6) /= "987-65") or else + not (TC_Employee_Data (3 .. 11) = "7-65-4321")) then + Report.Failed ("Data read error - second record"); + end if; + + -- Check that only two items were written to the file. + if not Data_IO.End_Of_File(Employee_Data_File) then + Report.Failed("Incorrect number of records in file"); + end if; + + exception + + when Data_IO.End_Error => -- If two items not in + -- file (data overwritten), + -- then fail. + Report.Failed ("Incorrect number of record elements in file"); + + when others => + Report.Failed ("Error raised during data verification"); + + end Test_Verification_Block; + + exception + + when others => + Report.Failed("Exception raised during Sequential_IO processing"); + + end Operational_Test_Block; + + Final_Block: + begin + -- Check that file is open prior to deleting it. + if Data_IO.Is_Open(Employee_Data_File) then + Data_IO.Delete (Employee_Data_File); + else + Data_IO.Open(Employee_Data_File, + Data_IO.In_File, + Employee_Filename); + Data_IO.Delete (Employee_Data_File); + end if; + exception + when others => + Report.Failed ("Sequential_IO Delete not properly supported"); + end Final_Block; + + Report.Result; + +exception + when Incomplete => + Report.Result; + when others => + Report.Failed ("Unexpected exception"); + Report.Result; +end CXA8002; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxa8003.a b/gcc/testsuite/ada/acats/tests/cxa/cxa8003.a new file mode 100644 index 000000000..cf9b5e075 --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxa8003.a @@ -0,0 +1,214 @@ +-- CXA8003.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 Append_File mode has not been added to package Direct_IO. +-- +-- TEST DESCRIPTION: +-- This test uses a procedure to change the mode of an existing Direct_IO +-- file. The file descriptor is passed as a parameter, along with a +-- numeric indicator for the new mode. Based on the numeric parameter, +-- a Direct_IO.Reset is performed using a File_Mode'Value transformation +-- of a string constant into a File_Mode value. An attempt to reset a +-- Direct_IO file to mode Append_File should cause an Constraint_Error +-- to be raised, as Append_File mode has not been added to Direct_IO in +-- Ada 9X. +-- +-- APPLICABILITY CRITERIA: +-- This test is applicable to all implementations supporting Direct_IO +-- files. +-- +-- +-- CHANGE HISTORY: +-- 06 Dec 94 SAIC ACVC 2.0 +-- 19 Feb 97 PWB.CTA Allowed for non-support of Reset for certain +-- modes. +--! + +with Direct_IO; +with Report; + +procedure CXA8003 is + Incomplete : exception; + begin + + Report.Test ("CXA8003", "Check that Append_File mode has not " & + "been added to package Direct_IO"); + + Test_for_Direct_IO_Support: + declare + + subtype String_Data_Type is String (1 .. 20); + type Numeric_Data_Type is range 1 .. 512; + type Composite_Data_Type is array (1 .. 3) of String_Data_Type; + + type File_Data_Type is record + Data_Field_1 : String_Data_Type; + Data_Field_2 : Numeric_Data_Type; + Data_Field_3 : Composite_Data_Type; + end record; + + package Dir_IO is new Direct_IO (File_Data_Type); + + Data_File : Dir_IO.File_Type; + Dir_Filename : constant String := Report.Legal_File_Name; + + begin + + -- An application creates a text file with mode Out_File. + -- Use_Error will be raised if Direct_IO operations or external + -- files are not supported. + + Dir_IO.Create (Data_File, + Dir_IO.Out_File, + Dir_Filename); + + Change_File_Mode: + declare + + TC_Append_Test_Executed : Boolean := False; + + type Mode_Selection_Type is ( A, I, IO, O ); + + + procedure Change_Mode (File : in out Dir_IO.File_Type; + To : in Mode_Selection_Type) is + begin + case To is + when A => + TC_Append_Test_Executed := True; + Dir_IO.Reset + (File, Dir_IO.File_Mode'Value("Append_File")); + when I => + begin + Dir_IO.Reset + (File, Dir_IO.File_Mode'Value("In_File")); + exception + when Dir_IO.Use_Error => + Report.Not_Applicable + ("Reset to In_File not supported: Direct_IO"); + raise Incomplete; + end; + when IO => + begin + Dir_IO.Reset + (File, Dir_IO.File_Mode'Value("Inout_File")); + exception + when Dir_IO.Use_Error => + Report.Not_Applicable + ("Reset to InOut_File not supported: Direct_IO"); + raise Incomplete; + end; + when O => + begin + Dir_IO.Reset + (File, Dir_IO.File_Mode'Value("Out_File")); + exception + when Dir_IO.Use_Error => + Report.Not_Applicable + ("Reset to Out_File not supported: Direct_IO"); + raise Incomplete; + end; + end case; + end Change_Mode; + + + begin + + -- At some point in the processing, the application may call a + -- procedure to change the mode of the file (perhaps for + -- additional data entry, data verification, etc.). It is at + -- this point that a use of Append_File mode for a Direct_IO + -- file would cause an exception. + + for I in reverse Mode_Selection_Type loop + Change_Mode (Data_File, I); + Report.Comment + ("Mode changed to " & + Dir_IO.File_Mode'Image (Dir_IO.Mode (Data_File))); + end loop; + + Report.Failed("No error raised on change to Append_File mode"); + + exception + + -- A handler has been provided in the application, which + -- handles the constraint error, allowing processing to + -- continue. + + when Constraint_Error => + + if TC_Append_Test_Executed then + Report.Comment ("Constraint_Error correctly raised on " & + "attempted Append_File mode selection " & + "for a Direct_IO file"); + else + Report.Failed ("Append test was not executed"); + end if; + + when Incomplete => raise; + + when others => Report.Failed ("Unexpected exception raised"); + + end Change_File_Mode; + + Final_Block: + begin + if Dir_IO.Is_Open (Data_File) then + Dir_IO.Delete (Data_File); + else + Dir_IO.Open (Data_File, Dir_IO.In_File, Dir_Filename); + Dir_IO.Delete (Data_File); + end if; + exception + when others => + Report.Failed ("Delete not properly supported: Direct_IO"); + end Final_Block; + + exception + + -- Since Use_Error or Name_Error can be raised if, for the + -- specified mode, the environment does not support Direct_IO + -- operations, the following handlers are included: + + when Dir_IO.Name_Error => + Report.Not_Applicable("Name_Error raised on Direct IO Create"); + + when Dir_IO.Use_Error => + Report.Not_Applicable("Use_Error raised on Direct IO Create"); + + when others => + Report.Failed + ("Unexpected exception raised on Direct IO Create"); + + end Test_for_Direct_IO_Support; + + Report.Result; + +exception + when Incomplete => + Report.Result; + +end CXA8003; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxa9001.a b/gcc/testsuite/ada/acats/tests/cxa/cxa9001.a new file mode 100644 index 000000000..4fe9c3576 --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxa9001.a @@ -0,0 +1,287 @@ +-- CXA9001.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 operations defined in the generic package +-- Ada.Storage_IO provide the ability to store and retrieve objects +-- which may include implicit levels of indirection in their +-- implementation, from an in-memory buffer. +-- +-- TEST DESCRIPTION: +-- The following scenario demonstrates how an object of a type with +-- (potential) levels of indirection (based on the implementation) +-- can be "flattened" and written/read to/from a Direct_IO file. +-- In this small example, we have attempted to simulate the situation +-- where two independent programs are using a particular Direct_IO file, +-- one writing data to the file, and the second program reading that file. +-- The Storage_IO Read and Write procedures are used to "flatten" +-- and reconstruct objects of the record type. +-- +-- APPLICABILITY CRITERIA: +-- Applicable to implementations capable of supporting external +-- Direct_IO files. +-- +-- +-- CHANGE HISTORY: +-- 06 Dec 94 SAIC ACVC 2.0 +-- 07 Jun 95 SAIC Modified to constrain type used with Storage_IO. +-- 20 Nov 95 SAIC Corrected and enhanced for ACVC 2.0.1. +-- 25 Feb 97 PWB.CTA Allowed for non-support of some IO operations +--! + +with Report; +with Ada.Storage_IO; +with Ada.Direct_IO; + +procedure CXA9001 is + package Dir_IO is new Ada.Direct_IO (Integer); + Test_File : Dir_IO.File_Type; + Incomplete : exception; +begin + + Report.Test ("CXA9001", "Check that the operations defined in the " & + "generic package Ada.Storage_IO provide the " & + "ability to store and retrieve objects which " & + "may include implicit levels of indirection in " & + "their implementation, from an in-memory buffer"); + + + Test_For_Direct_IO_Support: + begin + + -- The following Create does not have any bearing on the test scenario, + -- but is included to check that the implementation supports Direct_IO + -- files. An exception on this Create statement will raise a Name_Error + -- or Use_Error, which will be handled to produce a Not_Applicable + -- result. If created, the file is immediately deleted, as it is not + -- needed for the program scenario. + + Dir_IO.Create (Test_File, Dir_IO.Out_File, Report.Legal_File_Name(1)); + + exception + + when Dir_IO.Use_Error | Dir_IO.Name_Error => + Report.Not_Applicable + ( "Files not supported - Create as Out_File for Direct_IO" ); + raise Incomplete; + + end Test_for_Direct_IO_Support; + + Deletion1: + begin + Dir_IO.Delete (Test_File); + exception + when others => + Report.Failed + ( "Delete not properly implemented for Direct_IO - 1" ); + end Deletion1; + + + Test_Block: + declare + + The_Filename : constant String := Report.Legal_File_Name(2); + + -- The following type is the basic unit used in this test. It is + -- incorporated into the definition of the Unit_Array_Type. + + type Unit_Type is + record + Position : Natural := 19; + String_Value : String (1..9) := (others => 'X'); + end record; + + TC_Size : Natural := Natural'First; + + procedure Data_Storage (Number_Of_Units : in Natural; + Result : out Natural) is + + -- Type based on input parameter. Uses type Unit_Type + -- as the array element. + type Unit_Array_Type is array (1..Number_Of_Units) + of Unit_Type; + + -- This type definition is the ultimate storage type used + -- in this test; uses type Unit_Array_Type as a record + -- component field. + -- This record type contains a component that is an array of + -- records, with each of these records containing a Natural + -- and a String value (i.e., a record containing an array of + -- records). + + type Data_Storage_Type is + record + Data_Value : Natural := Number_Of_Units; + Unit_Array : Unit_Array_Type; + end record; + + -- The instantiation of the following generic package is a + -- central point in this test. Storage_IO is instantiated for + -- a specific data type, and will be used to "flatten" objects + -- of that type into buffers. Direct_IO is instantiated for + -- these Storage_IO buffers. + + package Flat_Storage_IO is + new Ada.Storage_IO (Data_Storage_Type); + package Buffer_IO is + new Ada.Direct_IO (Flat_Storage_IO.Buffer_Type); + + Buffer_File : Buffer_IO.File_Type; + Outbound_Buffer : Flat_Storage_IO.Buffer_Type; + Storage_Item : Data_Storage_Type; + + begin -- procedure Data_Storage + + Buffer_IO.Create (Buffer_File, + Buffer_IO.Out_File, + The_Filename); + + Flat_Storage_IO.Write (Buffer => Outbound_Buffer, + Item => Storage_Item); + + -- At this point, any levels of indirection have been removed + -- by the Storage_IO procedure, and the buffered data can be + -- written to a file. + + Buffer_IO.Write (Buffer_File, Outbound_Buffer); + Buffer_IO.Close (Buffer_File); + Result := Storage_Item.Unit_Array'Last + -- 5 + + Storage_Item.Unit_Array -- 9 + (Storage_Item.Unit_Array'First).String_Value'Length; + + exception + when others => + Report.Failed ("Data storage error"); + if Buffer_IO.Is_Open (Buffer_File) then + Buffer_IO.Close (Buffer_File); + end if; + end Data_Storage; + + procedure Data_Retrieval (Number_Of_Units : in Natural; + Result : out Natural) is + type Unit_Array_Type is array (1..Number_Of_Units) + of Unit_Type; + + type Data_Storage_Type is + record + Data_Value : Natural := Number_Of_Units; + Unit_Array : Unit_Array_Type; + end record; + + package Flat_Storage_IO is + new Ada.Storage_IO (Data_Storage_Type); + package Reader_IO is + new Ada.Direct_IO (Flat_Storage_IO.Buffer_Type); + + Reader_File : Reader_IO.File_Type; + Inbound_Buffer : Flat_Storage_IO.Buffer_Type; + Storage_Item : Data_Storage_Type; + TC_Item : Data_Storage_Type; + + begin -- procedure Data_Retrieval + + Reader_IO.Open (Reader_File, Reader_IO.In_File, The_Filename); + Reader_IO.Read (Reader_File, Inbound_Buffer); + + Flat_Storage_IO.Read (Inbound_Buffer, Storage_Item); + + -- Validate the reconstructed value against an "unflattened" + -- value. + + if Storage_Item.Data_Value /= TC_Item.Data_Value + then + Report.Failed ("Data_Retrieval Error - 1"); + end if; + + for i in 1..Number_Of_Units loop + if Storage_Item.Unit_Array(i).String_Value'Length /= + TC_Item.Unit_Array(i).String_Value'Length or + Storage_Item.Unit_Array(i).Position /= + TC_Item.Unit_Array(i).Position or + Storage_Item.Unit_Array(i).String_Value /= + TC_Item.Unit_Array(i).String_Value + then + Report.Failed ("Data_Retrieval Error - 2"); + end if; + end loop; + + Result := Storage_Item.Unit_Array'Last + -- 5 + + Storage_Item.Unit_Array -- 9 + (Storage_Item.Unit_Array'First).String_Value'Length; + + if Reader_IO.Is_Open (Reader_File) then + Reader_IO.Delete (Reader_File); + else + Reader_IO.Open (Reader_File, + Reader_IO.In_File, + The_Filename); + Reader_IO.Delete (Reader_File); + end if; + + exception + when others => + Report.Failed ("Exception raised in Data_Retrieval"); + if Reader_IO.Is_Open (Reader_File) then + Reader_IO.Delete (Reader_File); + else + Reader_IO.Open (Reader_File, + Reader_IO.In_File, + The_Filename); + Reader_IO.Delete (Reader_File); + end if; + end Data_Retrieval; + + + begin -- Test_Block + + -- The number of Units is provided in this call to Data_Storage. + Data_Storage (Number_Of_Units => Natural(Report.Ident_Int(5)), + Result => TC_Size); + + if TC_Size /= 14 then + Report.Failed ("Data_Storage error in Data_Storage"); + end if; + + Data_Retrieval (Number_Of_Units => Natural(Report.Ident_Int(5)), + Result => TC_Size); + + if TC_Size /= 14 then + Report.Failed ("Data retrieval error in Data_Retrieval"); + end if; + + exception + when others => Report.Failed ("Exception raised in Test_Block"); + end Test_Block; + + Report.Result; + +exception + when Incomplete => + Report.Result; + when others => + Report.Failed ( "Unexpected exception" ); + Report.Result; + +end CXA9001; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxa9002.a b/gcc/testsuite/ada/acats/tests/cxa/cxa9002.a new file mode 100644 index 000000000..415a56630 --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxa9002.a @@ -0,0 +1,482 @@ +-- CXA9002.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 operations defined in the generic package +-- Ada.Storage_IO provide the ability to store and retrieve objects +-- of tagged types from in-memory buffers. +-- +-- TEST DESCRIPTION: +-- The following scenario demonstrates how objects of a tagged type, +-- extended types, and twice extended types can be written/read +-- to/from Direct_IO files. The Storage_IO subprograms, Read and Write, +-- demonstrated in this scenario, perform tag "fixing" prior to/following +-- transfer to the Direct_IO files. +-- This method is especially important for those implementations that +-- represent tags as pointers, or for cases where the tagged objects +-- are read in by a program other than the one that wrote them. +-- +-- In this small example, we have attempted to simulate the situation +-- where two independent programs are using a series of Direct_IO files, +-- one writing data to the files, and the second program reading the +-- data from those files. Two procedures are defined, the first +-- simulating the program responsible for writing, the second simulating +-- a separate program opening and reading the data from the files. +-- +-- The hierarchy of types used in this test can be displayed as follows: +-- +-- Account_Type +-- / \ +-- / \ +-- / \ +-- Cash_Account_Type Investment_Account_Type +-- / \ +-- / \ +-- / \ +-- Checking_Account_Type Savings_Account_Type +-- +-- APPLICABILITY CRITERIA: +-- Applicable to implementations capable of supporting external +-- Direct_IO files. +-- +-- +-- CHANGE HISTORY: +-- 06 Dec 94 SAIC ACVC 2.0 +-- 08 Nov 95 SAIC Corrected incorrect prefix of 'Tag for ACVC 2.0.1, +-- and mode of files in Procedure Read_Data. +-- Added verification of objects reconstructed from +-- files. +-- 27 Feb 97 PWB.CTA Allowed for non-support of some IO operations +--! + +package CXA9002_0 is + + type Investment_Type is (Stocks, Bonds, Mutual_Funds); + type Savings_Type is (Standard, Business, Impound); + + type Account_Type is tagged + record + Num : String (1..3); + end record; + + type Cash_Account_Type is new Account_Type with + record + Years_As_Customer : Natural := 1; + end record; + + type Investment_Account_Type is new Account_Type with + record + Investment_Vehicle : Investment_Type := Stocks; + end record; + + type Checking_Account_Type is new Cash_Account_Type with + record + Checks_Per_Year : Positive := 200; + Interest_Bearing : Boolean := False; + end record; + + type Savings_Account_Type is new Cash_Account_Type with + record + Kind : Savings_Type := Standard; + end record; + +end CXA9002_0; + +--- + +with Report; +with Ada.Storage_IO; +with Ada.Direct_IO; +with Ada.Tags; +with CXA9002_0; + +procedure CXA9002 is + package Dir_IO is new Ada.Direct_IO (Integer); + Test_File : Dir_IO.File_Type; + Incomplete : exception; +begin + + Report.Test ("CXA9002", "Check that the operations defined in the " & + "generic package Ada.Storage_IO provide the " & + "ability to store and retrieve objects of " & + "tagged types from in-memory buffers"); + + + Test_For_Direct_IO_Support: + begin + + -- The following Create does not have any bearing on the test scenario, + -- but is included to check that the implementation supports Direct_IO + -- files. An exception on this Create statement will raise a Name_Error + -- or Use_Error, which will be handled to produce a Not_Applicable + -- result. If created, the file is immediately deleted, as it is not + -- needed for the program scenario. + + Dir_IO.Create (Test_File, + Dir_IO.Out_File, + Report.Legal_File_Name(1)); + exception + + when Dir_IO.Use_Error | Dir_IO.Name_Error => + Report.Not_Applicable + ( "Files not supported - Create as Out_File for Direct_IO" ); + raise Incomplete; + + end Test_for_Direct_IO_Support; + + Deletion: + begin + Dir_IO.Delete (Test_File); + exception + when others => + Report.Failed + ( "Delete not properly implemented for Direct_IO" ); + end Deletion; + + Test_Block: + declare + + use CXA9002_0; + + Acct_Filename : constant String := Report.Legal_File_Name(1); + Cash_Filename : constant String := Report.Legal_File_Name(2); + Inv_Filename : constant String := Report.Legal_File_Name(3); + Chk_Filename : constant String := Report.Legal_File_Name(4); + Sav_Filename : constant String := Report.Legal_File_Name(5); + + type Tag_Pointer_Type is access String; + + TC_Account_Type_Tag, + TC_Cash_Account_Type_Tag, + TC_Investment_Account_Type_Tag, + TC_Checking_Account_Type_Tag, + TC_Savings_Account_Type_Tag : Tag_Pointer_Type; + + TC_Account : Account_Type := + (Num => "123"); + + TC_Cash_Account : Cash_Account_Type := + (Num => "234", + Years_As_Customer => 3); + + TC_Investment_Account : Investment_Account_Type := + (Num => "456", + Investment_Vehicle => Bonds); + + TC_Checking_Account : Checking_Account_Type := + (Num => "567", + Years_As_Customer => 2, + Checks_Per_Year => 300, + Interest_Bearing => True); + + TC_Savings_Account : Savings_Account_Type := + (Num => "789", + Years_As_Customer => 14, + Kind => Business); + + procedure Buffer_Data is + + Account : Account_Type := + TC_Account; + Cash_Account : Cash_Account_Type := + TC_Cash_Account; + Investment_Account : Investment_Account_Type := + TC_Investment_Account; + Checking_Account : Checking_Account_Type := + TC_Checking_Account; + Savings_Account : Savings_Account_Type := + TC_Savings_Account; + + -- The instantiations below are a central point in this test. + -- Storage_IO is instantiated for each of the specific tagged + -- type. These instantiated packages will be used to compress + -- tagged objects of these various types into buffers that will + -- be written to the Direct_IO files declared below. + + package Acct_SIO is new Ada.Storage_IO (Account_Type); + package Cash_SIO is new Ada.Storage_IO (Cash_Account_Type); + package Inv_SIO is new Ada.Storage_IO (Investment_Account_Type); + package Chk_SIO is new Ada.Storage_IO (Checking_Account_Type); + package Sav_SIO is new Ada.Storage_IO (Savings_Account_Type); + + -- Direct_IO is instantiated for the buffer types defined in the + -- instantiated Storage_IO packages. + + package Acct_DIO is new Ada.Direct_IO (Acct_SIO.Buffer_Type); + package Cash_DIO is new Ada.Direct_IO (Cash_SIO.Buffer_Type); + package Inv_DIO is new Ada.Direct_IO (Inv_SIO.Buffer_Type); + package Chk_DIO is new Ada.Direct_IO (Chk_SIO.Buffer_Type); + package Sav_DIO is new Ada.Direct_IO (Sav_SIO.Buffer_Type); + + Acct_Buffer : Acct_SIO.Buffer_Type; + Cash_Buffer : Cash_SIO.Buffer_Type; + Inv_Buffer : Inv_SIO.Buffer_Type; + Chk_Buffer : Chk_SIO.Buffer_Type; + Sav_Buffer : Sav_SIO.Buffer_Type; + + Acct_File : Acct_DIO.File_Type; + Cash_File : Cash_DIO.File_Type; + Inv_File : Inv_DIO.File_Type; + Chk_File : Chk_DIO.File_Type; + Sav_File : Sav_DIO.File_Type; + + begin + + Acct_DIO.Create (Acct_File, Acct_DIO.Out_File, Acct_Filename); + Cash_DIO.Create (Cash_File, Cash_DIO.Out_File, Cash_Filename); + Inv_DIO.Create (Inv_File, Inv_DIO.Out_File, Inv_Filename); + Chk_DIO.Create (Chk_File, Chk_DIO.Out_File, Chk_Filename); + Sav_DIO.Create (Sav_File, Sav_DIO.Out_File, Sav_Filename); + + -- Store the tag values of the objects declared above for + -- comparison with tag values of objects following processing. + + TC_Account_Type_Tag := + new String'(Ada.Tags.External_Tag(Account_Type'Tag)); + + TC_Cash_Account_Type_Tag := + new String'(Ada.Tags.External_Tag(Cash_Account_Type'Tag)); + + TC_Investment_Account_Type_Tag := + new String'(Ada.Tags.External_Tag(Investment_Account_Type'Tag)); + + TC_Checking_Account_Type_Tag := + new String'(Ada.Tags.External_Tag(Checking_Account_Type'Tag)); + + TC_Savings_Account_Type_Tag := + new String'(Ada.Tags.External_Tag(Savings_Account_Type'Tag)); + + -- Prepare tagged data for writing to the Direct_IO files using + -- Storage_IO procedure to place data in buffers. + + Acct_SIO.Write (Buffer => Acct_Buffer, Item => Account); + Cash_SIO.Write (Cash_Buffer, Cash_Account); + Inv_SIO.Write (Inv_Buffer, Item => Investment_Account); + Chk_SIO.Write (Buffer => Chk_Buffer, Item => Checking_Account); + Sav_SIO.Write (Sav_Buffer, Savings_Account); + + -- At this point, the data and associated tag values have been + -- buffered by the Storage_IO procedure, and the buffered data + -- can be written to the appropriate Direct_IO file. + + Acct_DIO.Write (File => Acct_File, Item => Acct_Buffer); + Cash_DIO.Write (Cash_File, Cash_Buffer); + Inv_DIO.Write (Inv_File, Item => Inv_Buffer); + Chk_DIO.Write (File => Chk_File, Item =>Chk_Buffer); + Sav_DIO.Write (Sav_File, Sav_Buffer); + + -- Close all Direct_IO files. + + Acct_DIO.Close (Acct_File); + Cash_DIO.Close (Cash_File); + Inv_DIO.Close (Inv_File); + Chk_DIO.Close (Chk_File); + Sav_DIO.Close (Sav_File); + + exception + when others => Report.Failed("Exception raised in Buffer_Data"); + end Buffer_Data; + + procedure Read_Data is + + Account : Account_Type; + Cash_Account : Cash_Account_Type; + Investment_Account : Investment_Account_Type; + Checking_Account : Checking_Account_Type; + Savings_Account : Savings_Account_Type; + + -- Storage_IO is instantiated for each of the specific tagged + -- type. + + package Acct_SIO is new Ada.Storage_IO (Account_Type); + package Cash_SIO is new Ada.Storage_IO (Cash_Account_Type); + package Inv_SIO is new Ada.Storage_IO (Investment_Account_Type); + package Chk_SIO is new Ada.Storage_IO (Checking_Account_Type); + package Sav_SIO is new Ada.Storage_IO (Savings_Account_Type); + + -- Direct_IO is instantiated for the buffer types defined in the + -- instantiated Storage_IO packages. + + package Acct_DIO is new Ada.Direct_IO (Acct_SIO.Buffer_Type); + package Cash_DIO is new Ada.Direct_IO (Cash_SIO.Buffer_Type); + package Inv_DIO is new Ada.Direct_IO (Inv_SIO.Buffer_Type); + package Chk_DIO is new Ada.Direct_IO (Chk_SIO.Buffer_Type); + package Sav_DIO is new Ada.Direct_IO (Sav_SIO.Buffer_Type); + + Acct_Buffer : Acct_SIO.Buffer_Type; + Cash_Buffer : Cash_SIO.Buffer_Type; + Inv_Buffer : Inv_SIO.Buffer_Type; + Chk_Buffer : Chk_SIO.Buffer_Type; + Sav_Buffer : Sav_SIO.Buffer_Type; + + Acct_File : Acct_DIO.File_Type; + Cash_File : Cash_DIO.File_Type; + Inv_File : Inv_DIO.File_Type; + Chk_File : Chk_DIO.File_Type; + Sav_File : Sav_DIO.File_Type; + + begin + + -- Open the Direct_IO files. + + Acct_DIO.Open (Acct_File, Acct_DIO.In_File, Acct_Filename); + Cash_DIO.Open (Cash_File, Cash_DIO.In_File, Cash_Filename); + Inv_DIO.Open (Inv_File, Inv_DIO.In_File, Inv_Filename); + Chk_DIO.Open (Chk_File, Chk_DIO.In_File, Chk_Filename); + Sav_DIO.Open (Sav_File, Sav_DIO.In_File, Sav_Filename); + + -- Read the buffer data from the files using Direct_IO. + + Acct_DIO.Read (File => Acct_File, Item => Acct_Buffer); + Cash_DIO.Read (Cash_File, Cash_Buffer); + Inv_DIO.Read (Inv_File, Item => Inv_Buffer); + Chk_DIO.Read (File => Chk_File, Item =>Chk_Buffer); + Sav_DIO.Read (Sav_File, Sav_Buffer); + + -- At this point, the data and associated tag values are stored + -- in buffers. Use the Storage_IO procedure Read to recreate the + -- tagged objects from the buffers. + + Acct_SIO.Read (Buffer => Acct_Buffer, Item => Account); + Cash_SIO.Read (Cash_Buffer, Cash_Account); + Inv_SIO.Read (Inv_Buffer, Item => Investment_Account); + Chk_SIO.Read (Buffer => Chk_Buffer, Item => Checking_Account); + Sav_SIO.Read (Sav_Buffer, Savings_Account); + + -- Delete all Direct_IO files. + + Acct_DIO.Delete (Acct_File); + Cash_DIO.Delete (Cash_File); + Inv_DIO.Delete (Inv_File); + Chk_DIO.Delete (Chk_File); + Sav_DIO.Delete (Sav_File); + + Data_Verification_Block: + begin + + if Account /= TC_Account then + Report.Failed("Incorrect Account object reconstructed"); + end if; + + if Cash_Account /= TC_Cash_Account then + Report.Failed + ("Incorrect Cash_Account object reconstructed"); + end if; + + if Investment_Account /= TC_Investment_Account then + Report.Failed + ("Incorrect Investment_Account object reconstructed"); + end if; + + if Checking_Account /= TC_Checking_Account then + Report.Failed + ("Incorrect Checking_Account object reconstructed"); + end if; + + if Savings_Account /= TC_Savings_Account then + Report.Failed + ("Incorrect Savings_Account object reconstructed"); + end if; + + exception + when others => + Report.Failed + ("Exception raised during Data_Verification Block"); + end Data_Verification_Block; + + + -- To ensure that the tags of the values reconstructed by + -- Storage_IO were properly preserved, object tag values following + -- object reconstruction are compared with tag values of objects + -- stored prior to processing. + + Tag_Verification_Block: + begin + + if TC_Account_Type_Tag.all /= + Ada.Tags.External_Tag(Account_Type'Class(Account)'Tag) + then + Report.Failed("Incorrect Account tag"); + end if; + + if TC_Cash_Account_Type_Tag.all /= + Ada.Tags.External_Tag( + Cash_Account_Type'Class(Cash_Account)'Tag) + then + Report.Failed("Incorrect Cash_Account tag"); + end if; + + if TC_Investment_Account_Type_Tag.all /= + Ada.Tags.External_Tag( + Investment_Account_Type'Class(Investment_Account)'Tag) + then + Report.Failed("Incorrect Investment_Account tag"); + end if; + + if TC_Checking_Account_Type_Tag.all /= + Ada.Tags.External_Tag( + Checking_Account_Type'Class(Checking_Account)'Tag) + then + Report.Failed("Incorrect Checking_Account tag"); + end if; + + if TC_Savings_Account_Type_Tag.all /= + Ada.Tags.External_Tag( + Savings_Account_Type'Class(Savings_Account)'Tag) + then + Report.Failed("Incorrect Savings_Account tag"); + end if; + + exception + when others => + Report.Failed ("Exception raised during tag evaluation"); + end Tag_Verification_Block; + + exception + when others => Report.Failed ("Exception in Read_Data"); + end Read_Data; + + begin -- Test_Block + + -- Enter the data into the appropriate files. + Buffer_Data; + + -- Reconstruct the data from files, and verify the results. + Read_Data; + + exception + when others => Report.Failed ("Exception raised in Test_Block"); + end Test_Block; + + Report.Result; + +exception + when Incomplete => + Report.Result; + when others => + Report.Failed ( "Unexpected exception" ); + Report.Result; + +end CXA9002; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxaa001.a b/gcc/testsuite/ada/acats/tests/cxa/cxaa001.a new file mode 100644 index 000000000..6c2af9870 --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxaa001.a @@ -0,0 +1,279 @@ +-- CXAA001.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 Line_Length and Page_Length maximums for a Text_IO +-- file of mode Append_File are initially zero (unbounded) after a +-- Create, Open, or Reset, and that these values can be modified using +-- the procedures Set_Line_Length and Set_Page_Length. +-- Check that setting the Line_Length and Page_Length attributes to zero +-- results in an unbounded Text_IO file. +-- Check that setting the line length when in Append_Mode doesn't +-- change the length of lines previously written to the Text_IO file. +-- +-- TEST DESCRIPTION: +-- This test attempts to simulate a possible text processing environment. +-- String values, from a number of different string types, are written to +-- a Text_IO file. Prior to the writing of each, the line length is set +-- to the particular length of the data being written. In addition, the +-- default line and page lengths are checked, to determine whether they +-- are unbounded (length = 0) following a create, reset, or open of a +-- Text_IO file with mode Append_File. +-- +-- APPLICABILITY CRITERIA: +-- This test is applicable only to implementations that support text +-- files. +-- +-- +-- CHANGE HISTORY: +-- 06 Dec 94 SAIC ACVC 2.0 +-- 27 Feb 97 PWB.CTA Allowed for non-support of some IO operations +--! + +with Ada.Text_IO; +with Report; + +procedure CXAA001 is + use Ada; + Data_File : Text_IO.File_Type; + Data_Filename : constant String := + Report.Legal_File_Name ( Nam => "CXAA001" ); + Incomplete : exception; +begin + + Report.Test ("CXAA001","Check that the Line_Length and Page_Length " & + "maximums for a Text_IO file of mode Append_File " & + "are initially zero (unbounded) after a Create, " & + "Open, or Reset, and that these values can be " & + "modified using the procedures Set_Line_Length " & + "and Set_Page_Length"); + + Test_for_Text_IO_Support: + begin + + -- An implementation that does not support Text_IO in a particular + -- environment will raise Use_Error on calls to various + -- Text_IO operations. This block statement encloses a call to + -- Create, which should raise an exception in a non-supportive + -- environment. This exception will be handled to produce a + -- Not_Applicable result. + + Text_IO.Create (File => Data_File, + Mode => Text_IO.Append_File, + Name => Data_Filename); + + exception + + when Text_IO.Use_Error | Text_IO.Name_Error => + Report.Not_Applicable + ( "Files not supported - Create as Append_File for Text_IO" ); + raise Incomplete; + + end Test_for_Text_IO_Support; + + Operational_Test_Block: + declare + + subtype Confidential_Data_Type is string (1 .. 10); + subtype Secret_Data_Type is string (1 .. 20); + subtype Top_Secret_Data_Type is string (1 .. 30); + + Zero : constant Text_IO.Count := 0; + Confidential_Data_Size : constant Text_IO.Count := 10; + Secret_Data_Size : constant Text_IO.Count := 20; + Top_Secret_Data_Size : constant Text_IO.Count := 30; + + -- The following generic procedure is designed to simulate a text + -- processing environment where line and page sizes are set and + -- verified prior to the writing of data to a file. + + generic + Data_Size : Text_IO.Count; + procedure Write_Data_To_File (Data_Item : in String); + + procedure Write_Data_To_File (Data_Item : in String) is + use Text_IO; -- Used to provide visibility to the "/=" operator. + begin + if (Text_IO.Line_Length (Data_File) /= Zero) then -- Check default + Report.Failed("Line not of unbounded length"); -- line length, + elsif (Text_IO.Page_Length (Data_File) /= Zero) then -- default + Report.Failed ("Page not of unbounded length"); -- page length. + end if; + + Text_IO.Set_Line_Length (File => Data_File, -- Set the line + To => Data_Size); -- length. + Text_IO.Set_Page_Length (File => Data_File, -- Set the page + To => Data_Size); -- length. + -- Verify the lengths set. + if (Integer(Text_IO.Line_Length (Data_File)) /= + Report.Ident_Int(Integer(Data_Size))) then + Report.Failed ("Line length not set to appropriate length"); + elsif (Integer(Text_IO.Page_Length (Data_File)) /= + Report.Ident_Int(Integer(Data_Size))) then + Report.Failed ("Page length not set to appropriate length"); + end if; + + Text_IO.Put_Line (File => Data_File, -- Write data to + Item => Data_Item); -- file. + + end Write_Data_To_File; + + -- Instantiation for the three data types/sizes. + + procedure Write_Confidential_Data is + new Write_Data_To_File (Data_Size => Confidential_Data_Size); + + procedure Write_Secret_Data is + new Write_Data_To_File (Data_Size => Secret_Data_Size); + + procedure Write_Top_Secret_Data is + new Write_Data_To_File (Data_Size => Top_Secret_Data_Size); + + Confidential_Item : Confidential_Data_Type := "Confidenti"; + Secret_Item : Secret_Data_Type := "Secret Data Values "; + Top_Secret_Item : Top_Secret_Data_Type := + "Extremely Top Secret Data "; + + begin + + -- The following call simulates processing occurring after the create + -- of a Text_IO file with mode Append_File. + + Write_Confidential_Data (Confidential_Item); + + -- The following call simulates processing occurring after the reset + -- of a Text_IO file with mode Append_File. + + Reset1: + begin + Text_IO.Reset (Data_File, Text_IO.Append_File); -- Reset to + -- Append_File mode. + exception + when Text_IO.Use_Error => + Report.Not_Applicable + ( "Reset to Append_File not supported for Text_IO" ); + raise Incomplete; + end Reset1; + + Write_Secret_Data (Data_Item => Secret_Item); + + Text_IO.Close (Data_File); -- Close file. + + -- The following processing simulates processing occurring after the + -- opening of an existing file with mode Append_File. + + Text_IO.Open (Data_File, -- Open file in + Text_IO.Append_File, -- Append_File mode. + Data_Filename); + + Write_Top_Secret_Data (Top_Secret_Item); + + Test_Verification_Block: + declare + TC_String1, + TC_String2, + TC_String3 : String (1..80) := (others => ' '); + TC_Length1, + TC_Length2, + TC_Length3 : Natural := 0; + begin + + Reset2: + begin + Text_IO.Reset (Data_File, Text_IO.In_File); -- Reset for reading. + exception + when Text_IO.Use_Error => + Report.Not_Applicable + ( "Reset to In_File not supported for Text_IO" ); + raise Incomplete; + end Reset2; + + Text_IO.Get_Line (Data_File, TC_String1, TC_Length1); + Text_IO.Get_Line (Data_File, TC_String2, TC_Length2); + Text_IO.Get_Line (Data_File, TC_String3, TC_Length3); + + -- Verify that the line lengths of each line were accurate. + -- Note: Each data line was written to the file after the + -- particular line length had been set (to the data length). + + if not ((TC_Length1 = Natural(Confidential_Data_Size)) and + (TC_Length2 = Natural(Secret_Data_Size)) and + (TC_Length3 = Natural(Top_Secret_Data_Size))) then + Report.Failed ("Inaccurate line lengths read from file"); + end if; + + -- Verify that the data read from the file are accurate. + + if (TC_String1(1..TC_Length1) /= Confidential_Item) or else + (TC_String2(1..TC_Length2) /= Secret_Item) or else + (TC_String3(1..TC_Length3) /= Top_Secret_Item) then + Report.Failed ("Corrupted data items read from file"); + end if; + + exception + + when Incomplete => + raise; + + when others => + Report.Failed ("Error raised during data verification"); + + end Test_Verification_Block; + + exception + + when Incomplete => + raise; + + when others => + Report.Failed ("Exception raised during Text_IO processing"); + + end Operational_Test_Block; + + Deletion: + begin + -- Check that the file is open prior to deleting it. + if Text_IO.Is_Open(Data_File) then + Text_IO.Delete(Data_File); + else + Text_IO.Open(Data_File, Text_IO.In_File, Data_Filename); + Text_IO.Delete(Data_File); + end if; + exception + when others => + Report.Failed + ( "Delete not properly implemented for Text_IO" ); + end Deletion; + + Report.Result; + +exception + when Incomplete => + Report.Result; + when others => + Report.Failed ( "Unexpected exception" ); + Report.Result; + +end CXAA001; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxaa002.a b/gcc/testsuite/ada/acats/tests/cxa/cxaa002.a new file mode 100644 index 000000000..953d33f1d --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxaa002.a @@ -0,0 +1,257 @@ +-- CXAA002.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 procedures New_Page, Set_Line, Set_Col, and New_Line +-- subprograms perform properly on a text file created with mode +-- Append_File. +-- Check that the attributes Page, Line, and Column are all set to 1 +-- following the creation of a text file with mode Append_File. +-- Check that the functions Page, Line, and Col perform properly on a +-- text file created with mode Append_File. +-- Check that the procedures Put and Put_Line perform properly on text +-- files created with mode Append_File. +-- Check that the procedure Set_Line sets the current line number to +-- the value specified by the parameter "To" for text files created with +-- mode Append_File. +-- Check that the procedure Set_Col sets the current column number to +-- the value specified by the parameter "To" for text files created with +-- mode Append_File. +-- +-- TEST DESCRIPTION: +-- This test is designed to simulate the text processing that could +-- occur with files that have been created in Append_File mode. Various +-- calls to Text_IO formatting subprograms are called to properly +-- position text appended to a document. The text content and position +-- are subsequently verified for accuracy. +-- +-- APPLICABILITY CRITERIA: +-- This test is applicable only to implementations that support text +-- files. +-- +-- +-- CHANGE HISTORY: +-- 06 Dec 94 SAIC ACVC 2.0 +-- 27 Feb 97 PWB.CTA Allowed for non-support of some IO operations + +--! + +with Ada.Text_IO; +with Report; + +procedure CXAA002 is + use Ada; + Data_File : Text_IO.File_Type; + Data_Filename : constant String := + Report.Legal_File_Name ( Nam => "CXAA002" ); + Incomplete : exception; +begin + + Report.Test ("CXAA002", "Check that page, line, and column formatting " & + "subprograms perform properly on text files " & + "created with mode Append_File"); + + Test_for_Text_IO_Support: + begin + + -- An implementation that does not support Text_IO in a particular + -- environment will raise Use_Error on calls to various + -- Text_IO operations. This block statement encloses a call to + -- Create, which should raise the exception in a non-supportive + -- environment. This exception will be handled to produce a + -- Not_Applicable result. + + Text_IO.Create (File => Data_File, + Mode => Text_IO.Append_File, + Name => Data_Filename); + + exception + + when Text_IO.Use_Error | Text_IO.Name_Error => + Report.Not_Applicable + ( "Files not supported - Create as Append_File for Text_IO" ); + raise Incomplete; + + end Test_for_Text_IO_Support; + + Operational_Test_Block: + declare + Default_Position : constant Text_IO.Positive_Count := 1; + Section_Header : constant String := "VII. "; + Appendix_Title : constant String := "Appendix A"; + Appendix_Content : constant String := "TBD"; + + -- The following procedure simulates the addition of an Appendix page + -- to an existing text file. + procedure Position_Appendix_Text is + use Text_IO; -- To provide visibility to the "/=" operator. + begin + + -- Test control code. + -- Verify initial page, line, column number. + if "/="(Text_IO.Page (Data_File), Default_Position) then + Report.Failed ("Incorrect default page number"); + end if; + if Text_IO.Line (Data_File) /= Default_Position then + Report.Failed ("Incorrect default line number"); + end if; + if "/="(Text_IO.Col (Data_File), Default_Position) then + Report.Failed ("Incorrect default column number"); + end if; + + -- Simulated usage code. + -- Set new page/line positions. + Text_IO.Put_Line + (Data_File, "Add some optional data to the file here"); + Text_IO.New_Page (Data_File); + Text_IO.New_Line (File => Data_File, Spacing => 2); + + -- Test control code. + if Integer(Text_IO.Page (Data_File)) /= Report.Ident_Int(2) or else + Integer(Text_IO.Line (Data_File)) /= Report.Ident_Int(3) then + Report.Failed ("Incorrect results from page/line positioning"); + end if; + + -- Simulated usage code. + Text_IO.Put (Data_File, Section_Header); -- Position title + Text_IO.Put_Line (Data_File, Appendix_Title); -- of Appendix. + + Text_IO.Set_Line (File => Data_File, To => 5); -- Set new + Text_IO.Set_Col (File => Data_File, To => 8); -- position. + + -- Test control code. + if (Integer(Text_IO.Line (Data_File)) /= Report.Ident_Int(5)) or + (Integer(Text_IO.Col (Data_File)) /= Report.Ident_Int(8)) then + Report.Failed ("Incorrect results from line/column positioning"); + end if; + + -- Simulated usage code. -- Position + Text_IO.Put_Line (Data_File, Appendix_Content); -- content of + -- Appendix. + end Position_Appendix_Text; + + begin + + -- This code section simulates a scenario that could occur in a + -- text processing environment: + -- A document is created/modified/edited Then... + -- Text is to be appended to the document. + -- A procedure is called to perform that operation. + -- The position on the appended page is set, verified, and text is + -- appended to the existing file. + -- + -- Note: The text file has been originally created in Append_File + -- mode, and has not been closed prior to this processing. + + Position_Appendix_Text; + + Test_Verification_Block: + declare + TC_Page, + TC_Line, + TC_Column : Text_IO.Positive_Count; + TC_Position : Natural := 0; + Blanks : constant String := " "; + TC_String : String (1 .. 17) := Blanks; + begin + + Reset1: + begin + Text_IO.Reset (Data_File, Text_IO.In_File); + exception + when Text_IO.Use_Error => + Report.Not_Applicable + ( "Reset to In_File not supported for Text_IO" ); + raise Incomplete; + end Reset1; + + Text_IO.Skip_Page (Data_File); + -- Loop to the third line + for I in 1 .. 3 loop -- and read the contents. + Text_IO.Get_Line (Data_File, TC_String, TC_Position); + end loop; + + if (TC_Position /= 16) or else -- Verify the title line. + (TC_String (1..4) /= "VII.") or else + (TC_String (3..16) /= ("I. " & Appendix_Title)) then + Report.Failed ("Incorrect positioning of title line"); + end if; + + TC_String := Blanks; -- Clear string. + -- Loop to the fifth line + for I in 4 .. 5 loop -- and read the contents. + Text_IO.Get_Line (Data_File, TC_String, TC_Position); + end loop; + + if (TC_Position /= 10) or -- Verify the contents. + (TC_String (8..10) /= Appendix_Content) then + Report.Failed ("Incorrect positioning of contents line"); + end if; + + exception + + when Incomplete => + raise; + + when others => + Report.Failed ("Error raised during data verification"); + + end Test_Verification_Block; + + exception + + when Incomplete => + raise; + + when others => + Report.Failed ("Exception raised during Text_IO processing"); + + end Operational_Test_Block; + + Deletion: + begin + -- Delete the external file. + if Text_IO.Is_Open(Data_File) then + Text_IO.Delete(Data_File); + else + Text_IO.Open(Data_File, Text_IO.In_File, Data_Filename); + Text_IO.Delete(Data_File); + end if; + exception + when others => + Report.Failed + ( "Delete not properly implemented for Text_IO" ); + end Deletion; + + Report.Result; + +exception + when Incomplete => + Report.Result; + when others => + Report.Failed ( "Unexpected exception" ); + Report.Result; + +end CXAA002; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxaa003.a b/gcc/testsuite/ada/acats/tests/cxa/cxaa003.a new file mode 100644 index 000000000..c9580dfb3 --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxaa003.a @@ -0,0 +1,293 @@ +-- CXAA003.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 procedures New_Page, Set_Line, Set_Col, and New_Line +-- subprograms perform properly on a text file reset (from Out_File) +-- with mode Append_File. +-- Check that the attributes Page, Line, and Column are all set to 1 +-- following the reset of a text file with mode Append_File. +-- Check that the functions Page, Line, and Col perform properly on a +-- text file reset with mode Append_File. +-- Check that the procedures Put and Put_Line perform properly on text +-- files reset with mode Append_File. +-- Check that the procedure Set_Line sets the current line number to +-- the value specified by the parameter "To" for text files reset with +-- mode Append_File. Check that Set_Line has no effect if the specified +-- line equals the current line. +-- Check that the procedure Set_Col sets the current column number to +-- the value specified by the parameter "To" for text files reset with +-- mode Append_File. +-- +-- TEST DESCRIPTION: +-- This test is designed to simulate the text processing that could +-- occur with files that have been created in Out_File mode, +-- and then reset to Append_File mode. +-- Various calls to Text_IO formatting subprograms are called to properly +-- position text appended to a document. The text content and position +-- are subsequently verified for accuracy. +-- +-- APPLICABILITY CRITERIA: +-- This test is applicable only to implementations that support text +-- files. +-- +-- +-- CHANGE HISTORY: +-- 06 Dec 94 SAIC ACVC 2.0 +-- 24 Feb 97 PWB.CTA Allowed for non-support of some IO operations. +--! + +with Ada.Text_IO; +with Report; + +procedure CXAA003 is + use Ada; + Data_File : Text_IO.File_Type; + Data_Filename : constant String := + Report.Legal_File_Name ( Nam => "CXAA003" ); + Incomplete : exception; + +begin + + Report.Test ("CXAA003", "Check that page, line, and column formatting " & + "subprograms perform properly on text files " & + "reset with mode Append_File"); + + Test_for_Text_IO_Support: + begin + + -- An implementation that does not support Text_IO in a particular + -- environment will raise Use_Error on calls to various + -- Text_IO operations. This block statement encloses a call to + -- Create, which should raise the exception in a non-supportive + -- environment. This exception will be handled to produce a + -- Not_Applicable result. + + Text_IO.Create (File => Data_File, + Mode => Text_IO.Out_File, + Name => Data_Filename); + exception + when Text_IO.Use_Error | Text_IO.Name_Error => + Report.Not_Applicable + ( "Text files not supported - Create as Out_File" ); + raise Incomplete; + end Test_for_Text_IO_Support; + + Operational_Test_Block: + declare + + Default_Position : constant Text_IO.Positive_Count := 1; + + Section_Header : constant String := "IX. "; + Glossary_Title : constant String := "GLOSSARY"; + Glossary_Content : constant String := "TBD"; + + -- The following procedure simulates the addition of a Glossary page + -- to an existing text file that has been reset with mode + -- Append_File. + + procedure Position_Glossary_Text + (The_File : in out Text_IO.File_Type) is + use Text_IO; -- To provide visibility to the "/=" operator. + begin + + -- Test control code. + -- Verify initial page value. + if (Text_IO.Page (The_File) /= Default_Position) then + Report.Failed ("Incorrect default page number"); + end if; + -- Verify initial line number. + if (Text_IO.Line (The_File) /= Default_Position) then + Report.Failed ("Incorrect default line number"); + end if; + -- Verify initial column number. + if (Text_IO.Col (The_File) /= Default_Position) then + Report.Failed ("Incorrect default column number"); + end if; + -- Simulated usage code. Set new page/line positions. + Text_IO.New_Page (The_File); + Text_IO.New_Page (The_File); + Text_IO.New_Line (File => The_File, Spacing => 1); + + -- Test control code. + if (Integer(Text_IO.Page(The_File)) /= + Report.Ident_Int(3)) or else + (Integer(Text_IO.Line (The_File)) /= + Report.Ident_Int(2)) then + Report.Failed ("Incorrect results from page/line positioning"); + end if; + + -- Simulated usage code. Position title of Glossary. + Text_IO.Put (The_File, Section_Header); + Text_IO.Put_Line (The_File, Glossary_Title); + -- Set line to the current line. + Text_IO.Set_Line (File => The_File, To => 3); + + -- Test control code. + if (Integer(Text_IO.Page (The_File)) /= Report.Ident_Int(3)) or + (Integer(Text_IO.Line (The_File)) /= Report.Ident_Int(3)) or + (Integer(Text_IO.Col (The_File)) /= Report.Ident_Int(1)) then + Report.Failed ("Set_Line failed for current line"); + end if; + + -- Simulated usage code. + Text_IO.Set_Line (File => The_File, To => 4); -- Set new + Text_IO.Set_Col (File => The_File, To => 10); -- position. + + -- Test control code. + if (Integer(Text_IO.Line (The_File)) /= Report.Ident_Int(4)) or + (Integer(Text_IO.Col (The_File)) /= Report.Ident_Int(10)) then + Report.Failed + ("Incorrect results from line/column positioning"); + end if; + + -- Simulated usage code. -- Position + Text_IO.Put_Line (The_File, Glossary_Content); -- content of + -- Glossary. + end Position_Glossary_Text; + + + begin + + -- In the scenario, data is added to the file here. + Text_IO.Put_Line (File => Data_File, Item => "Some optional data"); + + -- This code section simulates a scenario that could occur in a + -- text processing environment. Text is to be appended to an + -- existing document: + -- The file is reset to append mode. + -- A procedure is called to perform the positioning and placement + -- of text. + -- The position on the appended page is set, verified, and text is + -- placed in the file. + -- + -- Note: The text file has been originally created in Out_File + -- mode, and has subsequently been reset to Append_File mode. + + Reset1: + begin + -- Reset has effect of calling New_Page. + Text_IO.Reset (Data_File, Text_IO.Append_File); + exception + when Text_IO.Use_Error => + Report.Not_Applicable + ( "Reset to Append_File not supported for Text_IO" ); + raise Incomplete; + end Reset1; + + Position_Glossary_Text (The_File => Data_File); + + Test_Verification_Block: + declare + TC_Page, TC_Line, TC_Column : Text_IO.Positive_Count; + TC_Position : Natural := 0; + Blanks : constant String := + " "; + TC_String : String (1 .. 15) := Blanks; + begin + Reset2: + begin + Text_IO.Reset (Data_File, Text_IO.In_File); + exception + when Text_IO.Use_Error => + Report.Not_Applicable + ( "Reset to In_File not supported for Text_IO" ); + raise Incomplete; + end Reset2; + + Text_IO.Skip_Page (Data_File); + Text_IO.Skip_Page (Data_File); + + -- If the Reset to Append_File mode actually put a page terminator + -- on the file, as allowed (but not required) by RM A.10.2(4), then + -- we are now on page 3, an empty page. We'll need to skip one more. + + if Text_IO.End_Of_Page (Data_File) then + Text_IO.Skip_Page (Data_File); + end if; + + -- Now we're on the Glossary page. + + -- Loop to the second line + for I in 1 .. 2 loop -- and read the contents. + Text_IO.Get_Line (Data_File, TC_String, TC_Position); + end loop; + if (TC_Position /= 13) or else -- Verify the title line. + (TC_String (1..2) /= "IX") or else + (TC_String (3..13) /= (". " & Glossary_Title)) then + Report.Failed ("Incorrect positioning of title line"); + end if; + + TC_String := Blanks; -- Clear string. + -- Loop to the fourth line + for I in 3 .. 4 loop -- and read the contents. + Text_IO.Get_Line (Data_File, TC_String, TC_Position); + end loop; + + if (TC_Position /= 12) or -- Verify the contents. + (TC_String (8..12) /= " " & Glossary_Content) then + Report.Failed ("Incorrect positioning of contents line"); + end if; + + exception + when Incomplete => + raise; + when others => + Report.Failed ("Error raised during data verification"); + + end Test_Verification_Block; + + exception + when Incomplete => + raise; + when others => + Report.Failed ("Exception raised during Text_IO processing"); + + end Operational_Test_Block; + + Final_Block: + begin + -- Delete the external file. + if Text_IO.Is_Open (Data_File) then + Text_IO.Delete (Data_File); + else + Text_IO.Open (Data_File, Text_IO.In_File, Data_Filename); + Text_IO.Delete (Data_File); + end if; + exception + when others => + Report.Failed ( "Delete not properly implemented for Text_IO" ); + end Final_Block; + + Report.Result; + + exception + when Incomplete => + Report.Result; + when others => + Report.Failed ( "Unexpected exception" ); + Report.Result; + +end CXAA003; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxaa004.a b/gcc/testsuite/ada/acats/tests/cxa/cxaa004.a new file mode 100644 index 000000000..f3ea17eba --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxaa004.a @@ -0,0 +1,260 @@ +-- CXAA004.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 procedures New_Page, Set_Line, Set_Col, and New_Line +-- perform properly on a text file opened with mode Append_File. +-- Check that the attributes Page, Line, and Column are all set to 1 +-- following the opening of a text file with mode Append_File. +-- Check that the functions Page, Line, and Col perform properly on a +-- text file opened with mode Append_File. +-- Check that the procedures Put and Put_Line perform properly on text +-- files opened with mode Append_File. +-- Check that the procedure Set_Line sets the current line number to +-- the value specified by the parameter "To" for text files opened with +-- mode Append_File. +-- Check that the procedure Set_Col sets the current column number to +-- the value specified by the parameter "To" for text files reset with +-- mode Append_File. +-- +-- TEST DESCRIPTION: +-- This test is designed to simulate the text processing that could +-- occur with files that have been created in Out_File mode, +-- and then reset to Append_File mode. +-- Various calls to Text_IO formatting subprograms are called to properly +-- position text appended to a document. The text content and position +-- are subsequently verified for accuracy. +-- +-- APPLICABILITY CRITERIA: +-- This test is applicable only to implementations that support text +-- files. +-- +-- +-- CHANGE HISTORY: +-- 06 Dec 94 SAIC ACVC 2.0 +-- 24 Feb 97 PWB.CTA Allowed for non-support of some IO operations. +--! + +with Ada.Text_IO; +with Report; + +procedure CXAA004 is + use Ada; + Data_File : Text_IO.File_Type; + Data_Filename : constant String := + Report.Legal_File_Name ( Nam => "CXAA004" ); + Incomplete : exception; + +begin + + Report.Test ("CXAA004", "Check that page, line, and column formatting " & + "subprograms perform properly on text files " & + "opened with mode Append_File"); + + Test_for_Text_IO_Support: + begin + + -- An implementation that does not support Text_IO in a particular + -- environment will raise Use_Error on calls to various + -- Text_IO operations. This block statement encloses a call to + -- Create, which should raise the exception in a non-supportive + -- environment. This exception will be handled to produce a + -- Not_Applicable result. + + Text_IO.Create (File => Data_File, + Mode => Text_IO.Out_File, + Name => Data_Filename); + + exception + when Text_IO.Use_Error | Text_IO.Name_Error => + Report.Not_Applicable + ( "Files not supported - Create for Text_IO" ); + raise Incomplete; + end Test_for_Text_IO_Support; + + Operational_Test_Block: + declare + use Text_IO; -- To provide visibility to the "/=" operator. + + Default_Position : constant Text_IO.Positive_Count := 1; + + Section_Header : constant String := "X. "; + Reference_Title : constant String := "REFERENCES"; + Reference_Content : constant String := "Available Upon Request"; + + begin + + -- Some amount of text processing would occur here in the scenario + -- following file creation, prior to file closure. + Text_IO.Put_Line (File => Data_File, Item => "Some optional data"); + + -- Close has the effect of a call to New_Page (adding a page + -- terminator). + Text_IO.Close (Data_File); + + -- This code section simulates a scenario that could occur in a + -- text processing environment: + -- Certain text is to be appended to a document. + -- The file is opened in Append_File mode. + -- The position on the appended page is set, verified, and text + -- is placed in the file. + -- + -- Note: The text file has been originally created in Out_File + -- mode, has been subsequently closed and is now being reopened in + -- Append_File mode for further processing. + + Text_IO.Open (Data_File, Text_IO.Append_File, Data_Filename); + + -- Test control code. + if (Text_IO.Page(Data_File) /= Default_Position) then -- Verify init. + Report.Failed ("Incorrect default page number"); -- page value. + end if; + if (Text_IO.Line(Data_File) /= Default_Position) then -- Verify init. + Report.Failed ("Incorrect default line number"); -- line number. + end if; + if (Text_IO.Col (Data_File) /= Default_Position) then -- Verify init. + Report.Failed ("Incorrect default column number"); -- column no. + end if; + + -- Simulated usage code. + Text_IO.New_Page (Data_File); -- Set new page/ + Text_IO.New_Line (File => Data_File, Spacing => 2); -- line pos. + Text_IO.Put (Data_File, Section_Header); -- Position + Text_IO.Put_Line (Data_File, Reference_Title); -- title. + + -- Test control code. -- Verify new + if (Integer(Text_IO.Page (Data_File)) /= -- page and + Report.Ident_Int(2)) or else -- line. + (Integer(Text_IO.Line (Data_File)) /= + Report.Ident_Int(4)) then + Report.Failed ("Incorrect results from page/line positioning"); + end if; + + -- Simulated usage code. + Text_IO.Set_Line (File => Data_File, To => 8); -- Set new + Text_IO.Set_Col (File => Data_File, To => 30); -- position. + Text_IO.Put_Line (Data_File, Reference_Content); + + -- Test control code. + if (Integer(Text_IO.Line (Data_File)) /= + Report.Ident_Int(9)) or -- Verify new + (Integer(Text_IO.Col (Data_File)) /= -- position. + Report.Ident_Int(1)) then + Report.Failed ("Incorrect results from line/column positioning"); + end if; + + Test_Verification_Block: + declare + TC_Page, TC_Line, TC_Column : Text_IO.Positive_Count; + TC_Position : Natural := 0; + TC_String : String (1 .. 55) := (others => ' '); + begin + + Reset1: + begin + Text_IO.Reset (Data_File, Text_IO.In_File); + exception + when Text_IO.Use_Error => + Report.Not_Applicable + ( "Reset to In_File not supported for Text_IO" ); + raise Incomplete; + end Reset1; + + Text_IO.Skip_Page (Data_File); + + -- If the Reset to Append_File mode actually put a page terminator + -- in the file, as allowed (but not required) by RM A.10.2(4), then + -- we are now on page 2, an empty page. Therefore, we need to skip + -- one more page. + + if Text_IO.End_Of_Page (Data_File) then + Text_IO.Skip_Page (Data_File); + end if; + + -- Now we're on the reference page. + + -- Loop to the third line + for I in 1 .. 3 loop -- and read the contents. + Text_IO.Get_Line (Data_File, TC_String, TC_Position); + end loop; + + if (TC_Position /= 14) or else -- Verify the title line. + (TC_String (1..6) /= "X. RE") or else + (TC_String (2..14) /= (". " & Reference_Title)) then + Report.Failed ("Incorrect positioning of title line"); + end if; + -- Loop to the eighth line + for I in 4 .. 8 loop -- and read the contents. + Text_IO.Get_Line (Data_File, TC_String, TC_Position); + end loop; + + if (TC_Position /= 51) or -- Verify the contents. + (TC_String (30..51) /= "Available Upon Request") then + Report.Failed ("Incorrect positioning of contents line"); + end if; + + exception + + when Incomplete => + raise; + when others => + Report.Failed ("Error raised during data verification"); + + end Test_Verification_Block; + + exception + + when Incomplete => + raise; + when others => + Report.Failed ("Exception raised during Text_IO processing"); + + end Operational_Test_Block; + + Final_Block: + begin + -- Delete the external file. + if Text_IO.Is_Open (Data_File) then + Text_IO.Delete (Data_File); + else + Text_IO.Open (Data_File, Text_IO.In_File, Data_Filename); + Text_IO.Delete (Data_File); + end if; + exception + when others => + Report.Failed ( "Delete not properly implemented - Text_IO" ); + end Final_Block; + + Report.Result; + +exception + + when Incomplete => + Report.Result; + when others => + Report.Failed ("Unexpected exception"); + Report.Result; + +end CXAA004; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxaa005.a b/gcc/testsuite/ada/acats/tests/cxa/cxaa005.a new file mode 100644 index 000000000..7b2a0bc39 --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxaa005.a @@ -0,0 +1,292 @@ +-- CXAA005.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 procedure Put, when called with string parameters, does +-- not update the line number of a text file of mode Append_File, when +-- the line length is unbounded (i.e., only the column number is +-- updated). +-- Check that a call to the procedure Put with a null string argument +-- has no measurable effect on a text file of mode Append_File. +-- +-- TEST DESCRIPTION: +-- This test is designed to ensure that when a string is appended to an +-- unbounded text file, it is placed following the last element currently +-- in the file. For an unbounded text file written with Put procedures +-- only (not Put_Line), the line number should not be incremented by +-- subsequent calls to Put in Append_File mode. Only the column number +-- should be incremented based on the length of the string parameter +-- placed in the file. If a call to Put with a null string argument is +-- made, no change to the line or column number should occur, and no +-- element(s) should be added to the file, so that there would be no +-- measurable change to the file. +-- +-- APPLICABILITY CRITERIA: +-- This test is applicable to all implementations that support Text_IO +-- processing and external files. +-- +-- +-- CHANGE HISTORY: +-- 06 Dec 94 SAIC ACVC 2.0 +-- 24 Feb 97 CTA.PWB Allowed for non-support of some IO operations. +--! + +with Ada.Text_IO; +with Report; + +procedure CXAA005 is + An_Unbounded_File : Ada.Text_IO.File_Type; + Unbounded_File_Name : constant String := + Report.Legal_File_Name ( Nam => "CXAA005" ); + Incomplete : exception; + +begin + + Report.Test ("CXAA005", "Check that the procedure Put does not " & + "increment line numbers when used with " & + "unbounded text files of mode Append_File"); + + Test_for_Text_IO_Support: + begin + + -- An application creates a text file in mode Out_File, with the intention + -- of entering string data packets into the file as appropriate. In the + -- event that the particular environment where the application is running + -- does not support Text_IO, Use_Error will be raised on calls to Text_IO + -- operations. + -- This exception will be handled to produce a Not_Applicable result. + + Ada.Text_IO.Create (File => An_Unbounded_File, + Mode => Ada.Text_IO.Out_File, + Name => Unbounded_File_Name); + exception + when Ada.Text_IO.Use_Error | Ada.Text_IO.Name_Error => + Report.Not_Applicable + ( "Files not supported - Create for Text_IO" ); + raise Incomplete; + end Test_For_Text_IO_Support; + + Operational_Test_Block: + declare + subtype String_Sequence_Type is string (1 .. 20); + type String_Pointer_Type is access String_Sequence_Type; + +-- During the course of processing, the application creates a variety of data +-- pointers that refer to particular data items. The possibility of having +-- null data values in this environment exists. + + Data_Packet_1 : String_Pointer_Type := + new String_Sequence_Type'("One Data Sequence 01"); + + Data_Packet_2 : String_Pointer_Type := + new String_Sequence_Type'("New Data Sequence 02"); + + Blank_Data_Packet : String_Pointer_Type := + new String_Sequence_Type'(" "); + + Null_Data_Packet : constant String := ""; + + TC_Line, TC_Col : Natural := 0; + + function TC_Mode_Selection (Selector : Integer) + return Ada.Text_IO.File_Mode is + begin + case Selector is + when 1 => return Ada.Text_IO.In_File; + when 2 => return Ada.Text_IO.Out_File; + when others => return Ada.Text_IO.Append_File; + end case; + end TC_Mode_Selection; + + begin + +-- The application places some data into the file, using the Put subroutine. +-- This operation can occur one-to-many times. + + Ada.Text_IO.Put (An_Unbounded_File, Data_Packet_1.all); + + -- Test control code. + if (Integer(Ada.Text_IO.Col (An_Unbounded_File)) /= + Report.Ident_Int(21)) or + (Integer(Ada.Text_IO.Line (An_Unbounded_File)) /= + Report.Ident_Int(1)) then + Report.Failed ("Incorrect Col position after 1st Put"); + end if; + +-- The application may close the file at some point following its initial +-- entry of data. + + Ada.Text_IO.Close (An_Unbounded_File); + +-- At some later point in the processing, more data needs to be added to the +-- file, so the application opens the file in Append_File mode. + + Ada.Text_IO.Open (File => An_Unbounded_File, + Mode => Ada.Text_IO.Append_File, + Name => Unbounded_File_Name); + + -- Test control code. + -- Store line/column number for later comparison. + TC_Line := Natural(Ada.Text_IO.Line(An_Unbounded_File)); + TC_Col := Natural(Ada.Text_IO.Col(An_Unbounded_File)); + +-- Additional data items can then be appended to the file. + + Ada.Text_IO.Put (An_Unbounded_File, Blank_Data_Packet.all); + + -- Test control code. + if (Natural(Ada.Text_IO.Col (An_Unbounded_File)) /= + (TC_Col + 20)) or + (Natural(Ada.Text_IO.Line (An_Unbounded_File)) /= + TC_Line) then + Report.Failed ("Incorrect Col position after 2nd Put"); + end if; + +-- In order to accommodate various scenarios, the application may have changed +-- the mode of the data file to In_File in order to retrieve/verify some of +-- the data contained there. However, with the need to place more data into +-- the file, the file can be reset to Append_File mode. + + Reset1: + begin + Ada.Text_IO.Reset (An_Unbounded_File, + TC_Mode_Selection (Report.Ident_Int(3))); + exception + when Ada.Text_IO.Use_Error => + Report.Not_Applicable + ( "Reset to Append_File not supported for Text_IO" ); + raise Incomplete; + end Reset1; + + -- Test control code. + -- Store line/column number for later comparison. + TC_Line := Natural(Ada.Text_IO.Line(An_Unbounded_File)); + TC_Col := Natural(Ada.Text_IO.Col(An_Unbounded_File)); + +-- Additional data can then be appended to the file. On some occasions, an +-- attempt to enter a null string value into the file may occur. This should +-- have no effect on the file, leaving it unchanged. + + -- No measurable effect from Put with null string. + Ada.Text_IO.Put (An_Unbounded_File, Null_Data_Packet); + + -- Test control code. + -- There should be no change following the Put above. + if (Natural(Ada.Text_IO.Col (An_Unbounded_File)) /= + TC_Col) or + (Natural(Ada.Text_IO.Line (An_Unbounded_File)) /= + TC_Line) then + Report.Failed ("Incorrect Col position after 3rd Put"); + end if; + +-- Additional data can be appended to the file. + + Ada.Text_IO.Put (An_Unbounded_File, Data_Packet_2.all); + + -- Test control code. + if (Natural(Ada.Text_IO.Col (An_Unbounded_File)) /= + (TC_Col + 20)) or + (Integer(Ada.Text_IO.Line (An_Unbounded_File)) /= + TC_Line) then + Report.Failed ("Incorrect Col position after 4th Put"); + end if; + + Test_Verification_Block: + declare + File_Data : String (1 .. 80); + TC_Width : Natural; + begin + +-- The application has the capability to reset the file to In_File mode to +-- verify some of the data that is contained there. + + Reset2: + begin + Ada.Text_IO.Reset (An_Unbounded_File, Ada.Text_IO.In_File); + exception + when Ada.Text_IO.Use_Error => + Report.Not_Applicable + ( "Reset to In_File not supported - Text_IO" ); + raise Incomplete; + end Reset2; + + Ada.Text_IO.Get_Line (An_Unbounded_File, + File_Data, + TC_Width); + + -- Test control code. + -- Since it is implementation defined whether a page + -- terminator separates preexisting text from new text + -- following an open in append mode (as occurred above), + -- verify only that the first data item written to the + -- file was not overwritten by any subsequent call to Put. + + if (File_Data (File_Data'First) /= 'O') or + (File_Data (20) /= '1') then + Report.Failed ("Data placed incorrectly in file"); + end if; + + exception + when Incomplete => + raise; + when others => + Report.Failed ("Error raised during data verification"); + end Test_Verification_Block; + + exception + when Incomplete => + raise; + when others => + Report.Failed ("Exception in Text_IO processing"); + end Operational_Test_Block; + + Final_Block: + begin + -- Delete the external file. + if Ada.Text_IO.Is_Open(An_Unbounded_File) then + Ada.Text_IO.Delete (An_Unbounded_File); + else + Ada.Text_IO.Open(An_Unbounded_File, + Ada.Text_IO.In_File, + Unbounded_File_Name); + Ada.Text_IO.Delete (An_Unbounded_File); + end if; + exception + when others => + Report.Failed + ( "Delete not properly implemented -- Text_IO" ); + end Final_Block; + + Report.Result; + +exception + + when Incomplete => + Report.Result; + when others => + Report.Failed ( "Unexpected exception" ); + Report.Result; + +end CXAA005; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxaa006.a b/gcc/testsuite/ada/acats/tests/cxa/cxaa006.a new file mode 100644 index 000000000..518d43b89 --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxaa006.a @@ -0,0 +1,285 @@ +-- CXAA006.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 for a bounded line length text file of mode Append_File, +-- when the number of characters to be output exceeds the number of +-- columns remaining on the current line, a call to Put will output +-- characters of the string sufficient to fill the remaining columns of +-- the line (up to line length), then output a line terminator, reset the +-- column number, increment the line number, then output the balance of +-- the item. +-- +-- Check that the procedure Put does not raise Layout_Error when the +-- number of characters to be output exceeds the line length of a bounded +-- text file of mode Append_File. +-- +-- TEST DESCRIPTION: +-- This test demonstrates the situation where an application intends to +-- output variable length string elements to a text file in the most +-- efficient manner possible. This is the case in a typesetting +-- environment where text is compressed and split between lines of a +-- bounded length. +-- +-- The procedure Put will break string parameters placed in the file at +-- the point of the line length. Two examples are demonstrated in this +-- test, one being the case where only one column remains on a line, and +-- the other being the case where a larger portion of the line remains +-- unfilled, but still not sufficient to contain the entire output +-- string. +-- +-- During the course of the test, the file is reset to Append_File mode, +-- and the bounded line length is modified for different lines of the +-- file. +-- +-- APPLICABILITY CRITERIA: +-- This test is applicable to all implementations that support Text_IO +-- processing and external files. +-- +-- +-- CHANGE HISTORY: +-- 06 Dec 94 SAIC ACVC 2.0 +-- 25 Feb 97 PWB.CTA Allowed for non-support of some IO operations +--! + +with Ada.Text_IO; +with Report; + +procedure CXAA006 is + + A_Bounded_File : Ada.Text_IO.File_Type; + Bounded_File_Name : constant String := + Report.Legal_File_Name ( Nam => "CXAA006" ); + Incomplete : exception; + +begin + + Report.Test ("CXAA006", "Check that procedure Put will correctly " & + "output string items to a bounded line " & + "length text file of mode Append_File"); + + Test_for_Text_IO_Support: + begin + +-- An application creates a text file in mode Append_File, with the intention +-- of using the procedure Put to compress variable length string data into the +-- file in the most efficient manner possible. + + Ada.Text_IO.Create (File => A_Bounded_File, + Mode => Ada.Text_IO.Append_File, + Name => Bounded_File_Name); + exception + when Ada.Text_IO.Use_Error | Ada.Text_IO.Name_Error => + Report.Not_Applicable + ( "Files not supported - Create with Append_File for Text_IO" ); + raise Incomplete; + end Test_For_Text_IO_Support; + + Operational_Test_Block: + declare + Twelve_Characters : constant String := "12Characters"; + Nineteen_Characters : constant String := "Nineteen_Characters"; + TC_Line : Natural := 0; + + function TC_Mode_Selection (Selector : Integer) + return Ada.Text_IO.File_Mode is + begin + case Selector is + when 1 => return Ada.Text_IO.In_File; + when 2 => return Ada.Text_IO.Out_File; + when others => return Ada.Text_IO.Append_File; + end case; + end TC_Mode_Selection; + + begin + +-- The application sets the line length of the file to be bound at 20. All +-- lines in this file will be limited to that length. + + Ada.Text_IO.Set_Line_Length (A_Bounded_File, 20); + + Ada.Text_IO.Put (A_Bounded_File, Nineteen_Characters); + + -- Test control code. + if (Integer(Ada.Text_IO.Line (A_Bounded_File)) /= + Report.Ident_Int(1)) or + (Integer(Ada.Text_IO.Col (A_Bounded_File)) /= + Report.Ident_Int(20)) then + Report.Failed ("Incorrect position after 1st Put"); + end if; + +-- The application finds that there is only one column available on the +-- current line, so the next string item to be output must be broken at +-- the appropriate place (following the first character). + + Ada.Text_IO.Put (File => A_Bounded_File, + Item => Twelve_Characters); + + -- Test control code. + if (Integer(Ada.Text_IO.Line (A_Bounded_File)) /= + Report.Ident_Int(2)) or + (Integer(Ada.Text_IO.Col (A_Bounded_File)) /= + Report.Ident_Int(12)) then + Report.Failed ("Incorrect position after 2nd Put"); + end if; + +-- The application subsequently modifies the processing, resetting the file +-- at this point to In_File mode in order to verify data that has been written +-- to the file. Following this, the application resets the file to Append_File +-- mode in order to continue the placement of data into the file, but modifies +-- the original bounded line length for subsequent lines to be appended. + + -- Reset to Append mode; call outputs page terminator and + -- resets line length to Unbounded. + Reset1: + begin + Ada.Text_IO.Reset (A_Bounded_File, + TC_Mode_Selection (Report.Ident_Int(3))); + exception + when Ada.Text_IO.Use_Error => + Report.Not_Applicable + ( "Reset to Append_File not supported for Text_IO" ); + raise Incomplete; + end Reset1; + + Ada.Text_IO.Set_Line_Length (A_Bounded_File, 15); + + -- Store line number for later comparison. + TC_Line := Natural(Ada.Text_IO.Line(A_Bounded_File)); + +-- The application finds that fifteen columns are available on the current +-- line but that the string item to be output exceeds this available space. +-- It must be split at the end of the line, and the balance placed on the +-- next file line. + + Ada.Text_IO.Put (File => A_Bounded_File, + Item => Nineteen_Characters); + + -- Test control code. + -- Positioned on new line at col 5. + if (Natural(Ada.Text_IO.Line (A_Bounded_File)) /= + (TC_Line + 1)) or + (Integer(Ada.Text_IO.Col (A_Bounded_File)) /= + Report.Ident_Int(5)) then + Report.Failed ("Incorrect position after 3rd Put"); + end if; + + + Test_Verification_Block: + declare + First_String : String (1 .. 80); + Second_String : String (1 .. 80); + Third_String : String (1 .. 80); + Fourth_String : String (1 .. 80); + TC_Width1 : Natural; + TC_Width2 : Natural; + TC_Width3 : Natural; + TC_Width4 : Natural; + begin + +-- The application has the capability to reset the file to In_File mode to +-- verify some or all of the data that is contained there. + + Reset2: + begin + Ada.Text_IO.Reset (A_Bounded_File, Ada.Text_IO.In_File); + exception + when others => + Report.Not_Applicable + ( "Reset to In_File not supported for Text_IO" ); + raise Incomplete; + end Reset2; + + Ada.Text_IO.Get_Line + (A_Bounded_File, First_String, TC_Width1); + Ada.Text_IO.Get_Line + (A_Bounded_File, Second_String, TC_Width2); + Ada.Text_IO.Get_Line + (A_Bounded_File, Third_String, TC_Width3); + Ada.Text_IO.Get_Line + (A_Bounded_File, Fourth_String, TC_Width4); + + -- Test control code. + if (First_String (1..TC_Width1) /= Nineteen_Characters & "1") or + (Second_String (1..TC_Width2) /= "2Characters") or + (Third_String (1..TC_Width3) /= + Nineteen_Characters(1..15)) or + (Fourth_String (1..TC_Width4) /= "ters") + then + Report.Failed ("Data placed incorrectly in file"); + end if; + + exception + + when Incomplete => + raise; + + when Ada.Text_IO.End_Error => + Report.Failed ("Incorrect number of lines in file"); + + when others => + Report.Failed ("Error raised during data verification"); + + end Test_Verification_Block; + + exception + + when Ada.Text_IO.Layout_Error => + Report.Failed ("Layout Error raised when positioning text"); + + when others => + Report.Failed ("Exception in Text_IO processing"); + + end Operational_Test_Block; + + Final_Block: + begin + -- Delete the external file. + if Ada.Text_IO.Is_Open(A_Bounded_File) then + Ada.Text_IO.Delete (A_Bounded_File); + else + Ada.Text_IO.Open (A_Bounded_File, + Ada.Text_IO.In_File, + Bounded_File_Name); + Ada.Text_IO.Delete (A_Bounded_File); + end if; + + exception + when others => + Report.Failed + ( "Delete not properly implemented for Text_IO" ); + end Final_Block; + + Report.Result; + +exception + + when Incomplete => + Report.Result; + when others => + Report.Failed ( "Unexpected exception" ); + Report.Result; + +end CXAA006; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxaa007.a b/gcc/testsuite/ada/acats/tests/cxa/cxaa007.a new file mode 100644 index 000000000..fe79c2d7a --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxaa007.a @@ -0,0 +1,263 @@ +-- CXAA007.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 capabilities of Text_IO.Integer_IO perform correctly +-- on files of Append_File mode, for instantiations with integer and +-- user-defined subtypes. +-- Check that the formatting parameters available in the package can +-- be used and modified successfully in the storage and retrieval of +-- data. +-- +-- TEST DESCRIPTION: +-- This test simulates a receiving department inventory system. Data on +-- items received is entered into an inventory database. This information +-- consists of integer entry number, item number, and bar code. +-- One item is placed into the inventory file immediately following file +-- creation, subsequent items are entered following file opening in +-- Append_File mode. Data items are validated by reading all data from +-- the file and comparing against known values (those used to enter the +-- data originally). +-- +-- This test verifies issues of create in Append_File mode, appending to +-- a file previously appended to, opening in Append_File mode, resetting +-- from Append_File mode to In_File mode, as well as a variety of Text_IO +-- and Integer_IO predefined subprograms. +-- +-- APPLICABILITY CRITERIA: +-- This test is applicable only to implementations that support text +-- files. +-- +-- +-- CHANGE HISTORY: +-- 06 Dec 94 SAIC ACVC 2.0 +-- 25 Feb 97 PWB.CTA Allowed for non-support of some IO operations +--! + +with Ada.Text_IO; +with Report; + +procedure CXAA007 is + use Ada; + + Inventory_File : Text_IO.File_Type; + Inventory_Filename : constant String := + Report.Legal_File_Name ( Nam => "CXAA007" ); + Incomplete : exception; + +begin + + Report.Test ("CXAA007", "Check that the capabilities of " & + "Text_IO.Integer_IO operate correctly for files " & + "with mode Append_File"); + + Test_for_Text_IO_Support: + begin + + -- An implementation that does not support Text_IO in a particular + -- environment will raise Use_Error on calls to various + -- Text_IO operations. This block statement encloses a call to + -- Create, which should raise the exception in a non-supportive + -- environment. This exception will be handled to produce a + -- Not_Applicable result. + + Text_IO.Create (File => Inventory_File, + Mode => Text_IO.Append_File, + Name => Inventory_Filename); + exception + when Text_IO.Use_Error | Text_IO.Name_Error => + Report.Not_Applicable + ( "Files not supported - Create with Append_File for Text_IO" ); + raise Incomplete; + end Test_for_Text_IO_Support; + + Operational_Test_Block: + declare + + Max_Entries_Per_Order : constant Natural := 4; + + type Bar_Code_Type is range 0 .. 127; -- Values to be stored as base + -- two numbers in file. + type Item_Type is record + Entry_Number : Natural := 0; + Item_Number : Integer := 0; + Bar_Code : Bar_Code_Type := 0; + end record; + + type Inventory_Type is + array (1 .. Max_Entries_Per_Order) of Item_Type; + + Inventory_List : Inventory_Type := ((1, 119, 87), -- Items received + (2, 206, 44), -- this order. + (3, -25, 126), + (4, -18, 31)); + + Daily_Order : constant := 1; + Entry_Field_Width : constant Natural := 1; + Item_Base : constant Natural := 16; + Items_Inventoried : Natural := 1; + Items_To_Inventory : Natural := 4; + + package Entry_IO is new Text_IO.Integer_IO (Natural); + package Item_IO is new Text_IO.Integer_IO (Integer); + package Bar_Code_IO is new Text_IO.Integer_IO (Bar_Code_Type); + + + -- The following procedure simulates the addition of inventory item + -- information into a data file. + + procedure Update_Inventory (The_Item : in Item_Type) is + Spacer : constant String := " "; + begin + -- Enter all the incoming data into the inventory file. + Entry_IO.Put (Inventory_File, The_Item.Entry_Number); + Text_IO.Put (Inventory_File, Spacer); + Item_IO.Put (Inventory_File, The_Item.Item_Number); + Text_IO.Put (Inventory_File, Spacer); + Bar_Code_IO.Put(File => Inventory_File, + Item => The_Item.Bar_Code, + Width => 13, + Base => 2); + Text_IO.New_Line(Inventory_File); + end Update_Inventory; + + + begin + + -- This code section simulates a receiving department maintaining a + -- data file containing information on items that have been ordered + -- and received. + -- + -- As new orders are received, the file is opened in Append_File + -- mode. + -- Data is taken from the inventory list and entered into the file, + -- in specific format. + -- Enter the order into the inventory file. This is item 1 in + -- the inventory list. + -- The data entry process can be repeated numerous times as required. + + Entry_IO.Put (Inventory_File, + Inventory_List(Daily_Order).Entry_Number); + Item_IO.Put (Inventory_File, + Inventory_List(Daily_Order).Item_Number); + Bar_Code_IO.Put (File => Inventory_File, + Item => Inventory_List(Daily_Order).Bar_Code); + Text_IO.New_Line (Inventory_File); + + Text_IO.Close (Inventory_File); + + + Entry_IO.Default_Width := Entry_Field_Width; -- Modify the default + -- width of Entry_IO. + Item_IO.Default_Base := Item_Base; -- Modify the default + -- number base of + -- Item_IO + Text_IO.Open (Inventory_File, + Text_IO.Append_File, -- Open in Append mode. + Inventory_Filename); + -- Enter items + while (Items_Inventoried < Items_To_Inventory) loop -- 2-4 into the + Items_Inventoried := Items_Inventoried + 1; -- inventory file. + Update_Inventory (The_Item => Inventory_List (Items_Inventoried)); + end loop; + + Test_Verification_Block: -- Read and check + declare -- all the data + TC_Entry : Natural; -- values that + TC_Item : Integer; -- have been + TC_Bar_Code : Bar_Code_Type; -- entered in the + TC_Item_Count : Natural := 0; -- data file. + begin + + Reset1: + begin + Text_IO.Reset (Inventory_File, Text_IO.In_File); -- Reset for + -- reading. + exception + when Text_IO.Use_Error => + Report.Not_Applicable + ( "Reset to mode In_File not supported for Text_IO" ); + raise Incomplete; + end Reset1; + + while not Text_IO.End_Of_File (Inventory_File) loop + Entry_IO.Get (Inventory_File, TC_Entry); + Item_IO.Get (Inventory_File, TC_Item); + Bar_Code_IO.Get (Inventory_File, TC_Bar_Code); + Text_IO.Skip_Line (Inventory_File); + TC_Item_Count := TC_Item_Count + 1; + + if (TC_Item /= Inventory_List(TC_Entry).Item_Number) or + (TC_Bar_Code /= Inventory_List(TC_Entry).Bar_Code) then + Report.Failed ("Error in integer data read from file"); + end if; + end loop; + + if (TC_Item_Count /= Max_Entries_Per_Order) then + Report.Failed ("Incorrect number of records read from file"); + end if; + + exception + when Incomplete => + raise; + when others => + Report.Failed ("Error raised during data verification"); + end Test_Verification_Block; + + exception + when Incomplete => + raise; + when others => + Report.Failed ("Exception in Text_IO.Integer_IO processing"); + end Operational_Test_Block; + + Final_Block: + begin + -- Delete the external file. + if Text_IO.Is_Open(Inventory_File) then + Text_IO.Delete (Inventory_File); + else + Text_IO.Open (Inventory_File, Text_IO.In_File, Inventory_Filename); + Text_IO.Delete (Inventory_File); + end if; + + exception + + when others => + Report.Failed ( "Delete not properly implemented for Text_IO" ); + + end Final_Block; + + Report.Result; + +exception + + when Incomplete => + Report.Result; + when others => + Report.Failed ( "Unexpected exception" ); + Report.Result; + +end CXAA007; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxaa008.a b/gcc/testsuite/ada/acats/tests/cxa/cxaa008.a new file mode 100644 index 000000000..c21d07ea9 --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxaa008.a @@ -0,0 +1,271 @@ +-- CXAA008.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 capabilities provided in instantiations of the +-- Ada.Text_IO.Fixed_IO package operate correctly when the mode of +-- the file is Append_File. Check that Fixed_IO procedures Put and Get +-- properly transfer fixed point data to/from data files that are in +-- Append_File mode. Check that the formatting parameters available in +-- the package can be used and modified successfully in the appending and +-- retrieval of data. +-- +-- TEST DESCRIPTION: +-- This test simulates order processing, with data values being written +-- to a file, in a specific format, using Fixed_IO. Validation is done +-- on this process by reading the data values from the file, and +-- comparing them for equality with the values originally written to +-- the file. +-- +-- This test verifies issues of create in Append_File mode, appending to +-- a file previously appended to, resetting to Append_File mode, +-- resetting from Append_File mode to In_File mode, as well as a +-- variety of Text_IO and Fixed_IO predefined subprograms. +-- +-- APPLICABILITY CRITERIA: +-- This test is applicable only to implementations that support text +-- files. +-- +-- +-- CHANGE HISTORY: +-- 06 Dec 94 SAIC ACVC 2.0 +-- 25 Feb 97 PWB.CTA Allowed for non-support of some IO operations +--! + +with Ada.Text_IO; +with Report; + +procedure CXAA008 is + use Ada; + + Inventory_File : Text_IO.File_Type; + Inventory_Filename : constant String := + Report.Legal_File_Name ( Nam => "CXAA008" ); + Incomplete : exception; + +begin + + Report.Test ("CXAA008", "Check that the capabilities of " & + "Text_IO.Fixed_IO operate correctly for files " & + "with mode Append_File"); + + Test_for_Text_IO_Support: + begin + + -- An implementation that does not support Text_IO in a particular + -- environment will raise Use_Error on calls to various + -- Text_IO operations. This block statement encloses a call to + -- Create, which should raise the exception in a non-supportive + -- environment. This exception will be handled to produce a + -- Not_Applicable result. + + Text_IO.Create (File => Inventory_File, + Mode => Text_IO.Append_File, + Name => Inventory_Filename); + + exception + when Text_IO.Use_Error | Text_IO.Name_Error => + Report.Not_Applicable + ( "Files not supported - Create with Append_File for Text_IO" ); + raise Incomplete; + end Test_For_Text_IO_Support; + + Operational_Test_Block: + declare + + Daily_Orders_Received : constant Natural := 4; + + type Item_Type is delta 0.1 range 0.0 .. 5000.0; + type Cost_Type is delta 0.01 range 0.0 .. 10_000.0; + type Profit_Type is delta 0.01 range -100.0 .. 1000.0; + + type Product_Type is record + Item_Number : Item_Type := 0.0; + Unit_Cost : Cost_Type := 0.00; + Percent_Markup : Profit_Type := 0.00; + end record; + + type Inventory_Type is + array (1 .. Daily_Orders_Received) of Product_Type; + + Daily_Inventory : Inventory_Type := (( 1.0, 1.75, 50.00), + ( 155.0, 20.00, -5.50), + (3343.5, 2.50, 126.50), + (4986.0, 180.00, 31.75)); + + package Item_IO is new Text_IO.Fixed_IO (Item_Type); + package Cost_IO is new Text_IO.Fixed_IO (Cost_Type); + package Markup_IO is new Text_IO.Fixed_IO (Profit_Type); + + + function TC_Mode_Selection (Selector : Integer) + return Text_IO.File_Mode is + begin + case Selector is + when 1 => return Text_IO.In_File; + when 2 => return Text_IO.Out_File; + when others => return Text_IO.Append_File; + end case; + end TC_Mode_Selection; + + + -- The following function simulates the addition of inventory item + -- information into a data file. Boolean status of True is returned + -- if all of the data entry was successful, False otherwise. + + function Update_Inventory (The_List : Inventory_Type) + return Boolean is + begin + for I in 1 .. Daily_Orders_Received loop + Item_IO.Put (Inventory_File, The_List(I).Item_Number); + Cost_IO.Put (Inventory_File, The_List(I).Unit_Cost, 10, 4, 0); + Markup_IO.Put(File => Inventory_File, + Item => The_List(I).Percent_Markup, + Fore => 6, + Aft => 3, + Exp => 2); + Text_IO.New_Line (Inventory_File); + end loop; + return (True); -- Return a Status value. + exception + when others => return False; + end Update_Inventory; + + + begin + + -- This code section simulates a receiving department maintaining a + -- data file containing information on items that have been ordered + -- and received. + + -- Whenever items are received, the file is reset to Append_File + -- mode. Data is taken from an inventory list and entered into the + -- file, in specific format. + + Reset1: + begin -- Reset to + Text_IO.Reset (Inventory_File, -- Append mode. + TC_Mode_Selection (Report.Ident_Int(3))); + exception + when Text_IO.Use_Error => + Report.Not_Applicable + ( "Reset to Append_File not supported for Text_IO" ); + end Reset1; + + -- Enter data. + if not Update_Inventory (The_List => Daily_Inventory) then + Report.Failed ("Exception occurred during inventory update"); + raise Incomplete; + end if; + + Test_Verification_Block: + declare + TC_Item : Item_Type; + TC_Cost : Cost_Type; + TC_Markup : Profit_Type; + TC_Item_Count : Natural := 0; + begin + + Reset2: + begin + Text_IO.Reset (Inventory_File, Text_IO.In_File); -- Reset for + -- reading. + exception + when Text_IO.Use_Error => + Report.Not_Applicable + ( "Reset to In_File not supported for Text_IO" ); + raise Incomplete; + end Reset2; + + while not Text_IO.End_Of_File (Inventory_File) loop + Item_IO.Get (Inventory_File, TC_Item); + Cost_IO.Get (Inventory_File, TC_Cost); + Markup_IO.Get (File => Inventory_File, + Item => TC_Markup, + Width => 0); + Text_IO.Skip_Line (Inventory_File); + TC_Item_Count := TC_Item_Count + 1; + + -- Verify all of the data fields read from the file. Compare + -- with the values that were originally entered into the file. + + if (TC_Item /= Daily_Inventory(TC_Item_Count).Item_Number) then + Report.Failed ("Error in Item_Number read from file"); + end if; + if (TC_Cost /= Daily_Inventory(TC_Item_Count).Unit_Cost) then + Report.Failed ("Error in Unit_Cost read from file"); + end if; + if not (TC_Markup = + Daily_Inventory(TC_Item_Count).Percent_Markup) then + Report.Failed ("Error in Percent_Markup read from file"); + end if; + + end loop; + + if (TC_Item_Count /= Daily_Orders_Received) then + Report.Failed ("Incorrect number of records read from file"); + end if; + + exception + when Incomplete => + raise; + when others => + Report.Failed ("Error raised during data verification"); + end Test_Verification_Block; + + exception + when Incomplete => + raise; + when others => + Report.Failed ("Exception in Text_IO.Fixed_IO processing"); + end Operational_Test_Block; + + Final_Block: + begin + -- Delete the external file. + if Text_IO.Is_Open (Inventory_File) then + Text_IO.Delete (Inventory_File); + else + Text_IO.Open (Inventory_File, Text_IO.In_File, Inventory_Filename); + Text_IO.Delete (Inventory_File); + end if; + + exception + + when others => + Report.Failed ( "Delete not properly implemented for Text_IO" ); + + end Final_Block; + + Report.Result; + +exception + when Incomplete => + Report.Result; + when others => + Report.Failed ( "Unexpected exception" ); + Report.Result; + +end CXAA008; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxaa009.a b/gcc/testsuite/ada/acats/tests/cxa/cxaa009.a new file mode 100644 index 000000000..d47806080 --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxaa009.a @@ -0,0 +1,290 @@ +-- CXAA009.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 capabilities provided in instantiations of the +-- Ada.Text_IO.Float_IO package operate correctly when the mode of +-- the file is Append_File. Check that Float_IO procedures Put and Get +-- properly transfer floating point data to/from data files that are in +-- Append_File mode. Check that the formatting parameters available in +-- the package can be used and modified successfully in the appending and +-- retrieval of data. +-- +-- TEST DESCRIPTION: +-- This test is designed to simulate an environment where a data file +-- that holds floating point information is created, written to, and +-- closed. In the future, the file can be reopened in Append_File mode, +-- additional data can be appended to it, and then closed. This process +-- of Open/Append/Close can be repeated as necessary. All data written +-- to the file is verified for accuracy when retrieved from the file. +-- +-- This test verifies issues of create in Append_File mode, appending to +-- a file previously appended to, opening in Append_File mode, resetting +-- from Append_File mode to In_File mode, as well as a variety of Text_IO +-- and Float_IO predefined subprograms. +-- +-- APPLICABILITY CRITERIA: +-- This test is applicable only to implementations that support text +-- files. +-- +-- +-- CHANGE HISTORY: +-- 06 Dec 94 SAIC ACVC 2.0 +-- 25 Feb 97 PWB.CTA Allowed for non-support of some IO operations +--! + +with Ada.Text_IO; +with Report; + +procedure CXAA009 is + + use Ada; + Loan_File : Text_IO.File_Type; + Loan_Filename : constant String := + Report.Legal_File_Name ( Nam => "CXAA009" ); + Incomplete : exception; + +begin + + Report.Test ("CXAA009", "Check that the capabilities of " & + "Text_IO.Float_IO operate correctly for files " & + "with mode Append_File"); + + Test_for_Text_IO_Support: + begin + + -- An implementation that does not support Text_IO in a particular + -- environment will raise Use_Error on calls to various + -- Text_IO operations. This block statement encloses a call to + -- Create, which should raise the exception in a non-supportive + -- environment. This exception will be handled to produce a + -- Not_Applicable result. + + Text_IO.Create (File => Loan_File, -- Create in + Mode => Text_IO.Out_File, -- Out_File mode. + Name => Loan_Filename); + + exception + + when Text_IO.Use_Error | Text_IO.Name_Error => + Report.Not_Applicable + ( "Files not supported - Create as Out_File for Text_IO" ); + raise Incomplete; + + end Test_for_Text_IO_Support; + + Operational_Test_Block: + declare + Total_Loans_Outstanding : constant Natural := 3; + Transaction_Status : Boolean := False; + + type Account_Balance_Type is digits 6 range 0.0 .. 1.0E6; + type Loan_Balance_Type is digits 6; + type Interest_Rate_Type is digits 4 range 0.0 .. 30.00; + + type Loan_Info_Type is record + Account_Balance : Account_Balance_Type := 0.00; + Loan_Balance : Loan_Balance_Type := 0.00; + Loan_Interest_Rate : Interest_Rate_Type := 0.00; + end record; + + Home_Refinance_Loan : Loan_Info_Type := + (14_500.00, 135_000.00, 6.875); + Line_Of_Credit_Loan : Loan_Info_Type := + ( 5490.00, -3000.00, 13.75); + Small_Business_Loan : Loan_Info_Type := + (Account_Balance => 45_000.00, + Loan_Balance => 10_500.00, + Loan_Interest_Rate => 5.875); + + package Acct_IO is new Text_IO.Float_IO (Account_Balance_Type); + package Loan_IO is new Text_IO.Float_IO (Loan_Balance_Type); + package Rate_IO is new Text_IO.Float_IO (Interest_Rate_Type); + + + -- The following procedure performs the addition of loan information + -- into a data file. Boolean status of True is returned if all of + -- the data entry was successful, False otherwise. + -- This demonstrates use of Float_IO using a variety of data formats. + + procedure Update_Loan_Info (The_File : in out Text_IO.File_Type; + The_Loan : in Loan_Info_Type; + Status : out Boolean ) is + begin + Acct_IO.Put (The_File, The_Loan.Account_Balance); + Loan_IO.Put (The_File, The_Loan.Loan_Balance, 15, 2, 0); + Rate_IO.Put (File => The_File, + Item => The_Loan.Loan_Interest_Rate, + Fore => 6, + Aft => 3, + Exp => 0); + Text_IO.New_Line (The_File); + Status := True; + exception + when others => Status := False; + end Update_Loan_Info; + + + begin + + -- This code section simulates a bank maintaining a data file + -- containing information on loans that have been made. + -- The scenario: + -- The loan file was created in Out_File mode. + -- Some number of data records are added. + -- The file is closed. + -- The file is subsequently reopened in Append_File mode. + -- Data is appended to the file. + -- The file is closed. + -- Repeat the Open/Append/Close process as required. + -- Verify data in the file. + -- etc. + + Update_Loan_Info(Loan_File, Home_Refinance_Loan, Transaction_Status); + + if not Transaction_Status then + Report.Failed ("Failure in update of first loan data"); + end if; + + Text_IO.Close (Loan_File); + + -- When subsequent data items are to be added to the file, the file + -- is opened in Append_File mode. + + Text_IO.Open (Loan_File, -- Open with + Text_IO.Append_File, -- Append mode. + Loan_Filename); + + Update_Loan_Info(Loan_File, Line_Of_Credit_Loan, Transaction_Status); + + if not Transaction_Status then + Report.Failed("Failure in update of first loan data"); + end if; + + Text_IO.Close(Loan_File); + + -- To add additional data to the file, the file + -- is again opened in Append_File mode (appending to a file + -- previously appended to). + + Text_IO.Open (Loan_File, -- Open with + Text_IO.Append_File, -- Append mode. + Loan_Filename); + + Update_Loan_Info(Loan_File, Small_Business_Loan, Transaction_Status); + + if not Transaction_Status then + Report.Failed("Failure in update of first loan data"); + end if; + + Test_Verification_Block: + declare + type Ledger_Type is + array (1 .. Total_Loans_Outstanding) of Loan_Info_Type; + TC_Bank_Ledger : Ledger_Type; + TC_Item_Count : Natural := 0; + begin + + Reset1: + begin + Text_IO.Reset (Loan_File, Text_IO.In_File); -- Reset for + -- reading. + exception + when Text_IO.Use_Error => + Report.Not_Applicable + ( "Reset to In_File not supported for Text_IO" ); + raise Incomplete; + end Reset1; + + while not Text_IO.End_Of_File (Loan_File) loop + TC_Item_Count := TC_Item_Count + 1; + Acct_IO.Get (Loan_File, + TC_Bank_Ledger(TC_Item_Count).Account_Balance); + Loan_IO.Get (Loan_File, + TC_Bank_Ledger(TC_Item_Count).Loan_Balance, + 0); + Rate_IO.Get(File => Loan_File, + Item => + TC_Bank_Ledger(TC_Item_Count).Loan_Interest_Rate, + Width => 0); + Text_IO.Skip_Line(Loan_File); + + end loop; + + -- Verify all of the data fields read from the file. Compare + -- with the values that were originally entered into the file. + + if (TC_Bank_Ledger(1) /= Home_Refinance_Loan) or + (TC_Bank_Ledger(2) /= Line_Of_Credit_Loan) or + (TC_Bank_Ledger(3) /= Small_Business_Loan) then + Report.Failed("Error in data read from file"); + end if; + + if (TC_Item_Count /= Total_Loans_Outstanding) then + Report.Failed ("Incorrect number of records read from file"); + end if; + + exception + when Incomplete => + raise; + when others => + Report.Failed ("Error raised during data verification"); + end Test_Verification_Block; + + exception + when Incomplete => + raise; + when others => + Report.Failed ("Exception in Text_IO.Float_IO processing"); + end Operational_Test_Block; + + Final_Block: + begin + -- Delete the external file. + if Text_IO.Is_Open(Loan_File) then + Text_IO.Delete(Loan_File); + else + Text_IO.Open(Loan_File, Text_IO.In_File, Loan_Filename); + Text_IO.Delete(Loan_File); + end if; + + exception + + when Text_IO.Use_Error => + Report.Failed + ( "Delete not properly implemented for Text_IO" ); + + end Final_Block; + + Report.Result; + +exception + when Incomplete => + Report.Result; + when others => + Report.Failed ( "Unexpected exception" ); + Report.Result; + +end CXAA009; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxaa010.a b/gcc/testsuite/ada/acats/tests/cxa/cxaa010.a new file mode 100644 index 000000000..5678aee6b --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxaa010.a @@ -0,0 +1,335 @@ +-- CXAA010.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 operations defined in package Ada.Text_IO.Decimal_IO +-- are available, and that they function correctly when used for the +-- input/output of Decimal types. +-- +-- TEST DESCRIPTION: +-- This test demonstrates the Put and Get procedures found in the +-- generic package Ada.Text_IO.Decimal_IO. Both Put and Get are +-- overloaded to allow placement or extraction of decimal values +-- to/from a text file or a string. This test demonstrates both forms +-- of each subprogram. +-- The test defines an array of records containing decimal value +-- and string component fields. All component values are placed in a +-- Text_IO file, with the decimal values being placed there using the +-- version of Put defined for files, and using user-specified formatting +-- parameters. The data is later extracted from the file, with the +-- decimal values being removed using the version of Get defined for +-- files. Decimal values are then written to strings, using the +-- appropriate Put procedure. Finally, extraction of the decimal data +-- from the strings completes the evaluation of the Decimal_IO package +-- subprograms. +-- The reconstructed data is verified at the end of the test against the +-- data originally written to the file. +-- +-- APPLICABILITY CRITERIA: +-- Applicable to all implementations capable of supporting external +-- Text_IO files and Decimal Fixed Point Types +-- +-- All implementations must attempt to compile this test. +-- +-- For implementations validating against Information Systems Annex (F): +-- this test must execute and report PASSED. +-- +-- For implementations not validating against Annex F: +-- this test may report compile time errors at one or more points +-- indicated by "-- ANX-F RQMT", in which case it may be graded as inapplicable. +-- Otherwise, the test must execute and report PASSED. +-- +-- +-- CHANGE HISTORY: +-- 06 Dec 94 SAIC ACVC 2.0 +-- 20 Feb 95 SAIC Modified test to allow for Use_Error/Name_Error +-- generation by an implementation not supporting +-- Text_IO operations. +-- 14 Nov 95 SAIC Corrected string indexing for ACVC 2.0.1. +-- 27 Feb 97 PWB.CTA Allowed for non-support of some IO operations +-- 16 FEB 98 EDS Modified documentation. +--! + +with Ada.Text_IO; +with Report; + +procedure CXAA010 is + use Ada.Text_IO; + Tax_Roll : Ada.Text_IO.File_Type; + Tax_Roll_Name : constant String := + Report.Legal_File_Name ( Nam => "CXAA010" ); + Incomplete : exception; +begin + + Report.Test ("CXAA010", "Check that the operations defined in package " & + "Ada.Text_IO.Decimal_IO are available, and " & + "that they function correctly when used for " & + "the input/output of Decimal types"); + + Test_for_Decimal_IO_Support: + begin + + -- An implementation that does not support Text_IO creation or naming + -- of external files in a particular environment will raise Use_Error + -- or Name_Error on a call to Text_IO Create. This block statement + -- encloses a call to Create, which should produce an exception in a + -- non-supportive environment. Either of these exceptions will be + -- handled to produce a Not_Applicable result. + + Ada.Text_IO.Create (Tax_Roll, Ada.Text_IO.Out_File, Tax_Roll_Name); + + exception + + when Ada.Text_IO.Use_Error | Ada.Text_IO.Name_Error => + Report.Not_Applicable + ( "Files not supported - Create as Out_File for Text_IO" ); + raise Incomplete; + + end Test_for_Decimal_IO_Support; + + Taxation: + declare + + ID_Length : constant := 5; + Price_String_Length : constant := 5; + Value_String_Length : constant := 6; + Total_String_Length : constant := 20; + Spacer : constant String := " "; -- Two blanks. + + type Price_Type is delta 0.1 digits 4; -- ANX-F RQMT + type Value_Type is delta 0.01 digits 5; -- ANX-F RQMT + + type Property_Type is + record + Parcel_ID : String (1..ID_Length); + Purchase_Price : Price_Type; + Assessed_Value : Value_Type; + end record; + + type City_Block_Type is array (1..4) of Property_Type; + + subtype Tax_Bill_Type is string (1..Total_String_Length); + type Tax_Bill_Array_Type is array (1..4) of Tax_Bill_Type; + + Neighborhood : City_Block_Type := + (("X9254", 123.0, 135.00), ("X3569", 345.0, 140.50), + ("X3434", 234.0, 179.50), ("X8838", 456.0, 158.00)); + + Neighborhood_Taxes : Tax_Bill_Array_Type; + + package Price_IO is new Ada.Text_IO.Decimal_IO (Price_Type); + package Value_IO is new Ada.Text_IO.Decimal_IO (Value_Type); + + begin -- Taxation + + Assessors_Office: + begin + + for Parcel in City_Block_Type'Range loop + -- Note: All data in the file will be separated with a + -- two-character blank spacer. + Ada.Text_IO.Put(Tax_Roll, Neighborhood(Parcel).Parcel_ID); + Ada.Text_IO.Put(Tax_Roll, Spacer); + + -- Use Decimal_IO.Put with non-default format parameters to + -- place decimal data into file. + Price_IO.Put (Tax_Roll, Neighborhood(Parcel).Purchase_Price, + Fore => 3, Aft =>1, Exp => 0); + Ada.Text_IO.Put(Tax_Roll, Spacer); + + Value_IO.Put (Tax_Roll, Neighborhood(Parcel).Assessed_Value, + Fore => 3, Aft =>2, Exp => 0); + Ada.Text_IO.New_Line(Tax_Roll); + end loop; + + Ada.Text_IO.Close (Tax_Roll); + + exception + when others => + Report.Failed ("Exception raised in Assessor's Office"); + end Assessors_Office; + + + Twice_A_Year: + declare + + procedure Collect_Tax(Index : in Integer; + Tax_Array : in out Tax_Bill_Array_Type) is + ID : String (1..ID_Length); + Price : Price_Type := 0.0; + Value : Value_Type := 0.00; + Price_String : String (1..Price_String_Length); + Value_String : String (1..Value_String_Length); + begin + + -- Extract information from the Text_IO file; one string, two + -- decimal values. + -- Note that the Spacers that were put in the file above are + -- not individually read here, due to the fact that each call + -- to Decimal_IO.Get below uses a zero in the Width field, + -- which allows each Get procedure to skip these leading blanks + -- prior to extracting the numeric value. + + Ada.Text_IO.Get (Tax_Roll, ID); + + -- A zero value of Width is provided, so the following + -- two calls to Decimal_IO.Get will skip the leading blanks, + -- (from the Spacer variable above), then read the numeric + -- literals. + + Price_IO.Get (Tax_Roll, Price, 0); + Value_IO.Get (Tax_Roll, Value, 0); + Ada.Text_IO.Skip_Line (Tax_Roll); + + -- Convert the values read from the file into string format, + -- using user-specified format parameters. + -- Format of the Price_String should be "nnn.n" + -- Format of the Value_String should be "nnn.nn" + + Price_IO.Put (To => Price_String, + Item => Price, + Aft => 1); + Value_IO.Put (Value_String, Value, 2); + + -- Construct a string of length 20 that contains the Parcel_ID, + -- the Purchase_Price, and the Assessed_Value, separated by + -- two-character blank data spacers. Store this string + -- into the string array out parameter. + -- Format of each Tax_Array element should be + -- "Xnnnn nnn.n nnn.nn" (with an 'n' signifying a digit). + + Tax_Array(Index) := ID & Spacer & + Price_String & Spacer & + Value_String; + exception + when Data_Error => + Report.Failed("Data Error raised during the extraction " & + "of decimal data from the file"); + when others => + Report.Failed("Exception in Collect_Tax procedure"); + end Collect_Tax; + + + begin -- Twice_A_Year + + Ada.Text_IO.Open (Tax_Roll, Ada.Text_IO.In_File, Tax_Roll_Name); + + -- Determine property tax bills for the entire neighborhood from + -- the information that is stored in the file. Store information + -- in the Neighborhood_Taxes string array. + + for Parcel in City_Block_Type'Range loop + Collect_Tax (Parcel, Neighborhood_Taxes); + end loop; + + exception + when others => + Report.Failed ("Exception in Twice_A_Year Block"); + end Twice_A_Year; + + -- Use Decimal_IO Get procedure to extract information from a string. + -- Verify data against original values. + Validation_Block: + declare + TC_ID : String (1..ID_Length); -- 1..5 + TC_Price : Price_Type; + TC_Value : Value_Type; + Length : Positive; + Front, + Rear : Integer := 0; + begin + + for Parcel in City_Block_Type'Range loop + -- Extract values from the strings of the string array. + -- Each element of the string array is 20 characters long; the + -- first five characters are the Parcel_ID, two blank characters + -- separate data, the next five characters contain the Price + -- decimal value, two blank characters separate data, the last + -- six characters contain the Value decimal value. + -- Extract each of these components in turn. + + Front := 1; -- 1 + Rear := ID_Length; -- 5 + TC_ID := Neighborhood_Taxes(Parcel)(Front..Rear); + + -- Extract the decimal value from the next slice of the string. + Front := Rear + 3; -- 8 + Rear := Front + Price_String_Length - 1; -- 12 + Price_IO.Get (Neighborhood_Taxes(Parcel)(Front..Rear), + Item => TC_Price, + Last => Length); + + -- Extract next decimal value from slice of string, based on + -- length of preceding strings read from string array element. + Front := Rear + 3; -- 15 + Rear := Total_String_Length; -- 20 + Value_IO.Get (Neighborhood_Taxes(Parcel)(Front..Rear), + Item => TC_Value, + Last => Length); + + if TC_ID /= Neighborhood(Parcel).Parcel_ID or + TC_Price /= Neighborhood(Parcel).Purchase_Price or + TC_Value /= Neighborhood(Parcel).Assessed_Value + then + Report.Failed ("Incorrect data validation"); + end if; + + end loop; + + exception + when others => Report.Failed ("Exception in Validation Block"); + end Validation_Block; + + -- Check that the Text_IO file is open, then delete. + + if not Ada.Text_IO.Is_Open (Tax_Roll) then + Report.Failed ("File not left open after processing"); + Ada.Text_IO.Open (Tax_Roll, Ada.Text_IO.Out_File, Tax_Roll_Name); + end if; + + Ada.Text_IO.Delete (Tax_Roll); + + exception + when others => + Report.Failed ("Exception in Taxation block"); + -- Check that the Text_IO file is open, then delete. + if not Ada.Text_IO.Is_Open (Tax_Roll) then + Ada.Text_IO.Open (Tax_Roll, + Ada.Text_IO.Out_File, + Tax_Roll_Name); + end if; + Ada.Text_IO.Delete (Tax_Roll); + end Taxation; + + Report.Result; + +exception + when Incomplete => + Report.Result; + when others => + Report.Failed ( "Unexpected exception" ); + Report.Result; + +end CXAA010; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxaa011.a b/gcc/testsuite/ada/acats/tests/cxa/cxaa011.a new file mode 100644 index 000000000..8cc136d35 --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxaa011.a @@ -0,0 +1,266 @@ +-- CXAA011.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 operations of Text_IO.Enumeration_IO perform correctly +-- on files of Append_File mode, for instantiations using +-- enumeration types. Check that Enumeration_IO procedures Put and Get +-- properly transfer enumeration data to/from data files. +-- Check that the formatting parameters available in the package can +-- be used and modified successfully in the storage and retrieval of data. +-- +-- TEST DESCRIPTION: +-- This test is designed to simulate an environment where a data file +-- that holds enumeration type information is reset from it current mode +-- to allow the appending of data to the end of the This process +-- of Reset/Write can be repeated as necessary. All data written +-- to the file is verified for accuracy when retrieved from the file. +-- +-- This test verifies issues of resetting a file created in Out_File mode +-- to Append_File mode, resetting from Append_File mode to In_File mode, +-- as well as a variety of Text_IO and Enumeration_IO predefined +-- subprograms. +-- +-- APPLICABILITY CRITERIA: +-- This test is applicable only to implementations that support text +-- files. +-- +-- +-- CHANGE HISTORY: +-- 06 Dec 94 SAIC ACVC 2.0 +-- 25 Feb 97 PWB.CTA Allowed for non-support of some IO operations +--! + +with Ada.Text_IO; +with Report; + +procedure CXAA011 is + use Ada; + + Status_Log : Text_IO.File_Type; + Status_Log_Filename : constant String := + Report.Legal_File_Name ( Nam => "CXAA011" ); + Incomplete : exception; + +begin + + Report.Test ("CXAA011", "Check that the operations of " & + "Text_IO.Enumeration_IO operate correctly for " & + "files with mode Append_File"); + + Test_for_Text_IO_Support: + begin + + -- An implementation that does not support Text_IO in a particular + -- environment will raise Use_Error on calls to various + -- Text_IO operations. This block statement encloses a call to + -- Create, which should raise the exception in a non-supportive + -- environment. This exception will be handled to produce a + -- Not_Applicable result. + + Text_IO.Create (File => Status_Log, + Mode => Text_IO.Out_File, + Name => Status_Log_Filename); + exception + + when Text_IO.Use_Error | Text_IO.Name_Error => + Report.Not_Applicable + ( "Files not supported - Create as Out_File for Text_IO" ); + raise Incomplete; + + end Test_for_Text_IO_Support; + + + Operational_Test_Block: + declare + + type Days_In_Week is (Monday, Tuesday, Wednesday, Thursday, Friday, + Saturday, Sunday); + type Hours_In_Day is (A0000, A0600, P1200, P0600); -- Six hour + -- blocks. + type Status_Type is (Operational, Off_Line); + + type Status_Record_Type is record + Day : Days_In_Week; + Hour : Hours_In_Day; + Status : Status_Type; + end record; + + Morning_Reading : Status_Record_Type := + (Wednesday, A0600, Operational); + Evening_Reading : Status_Record_Type := + (Saturday, P0600, Off_Line); + + package Day_IO is new Text_IO.Enumeration_IO (Days_In_Week); + package Hours_IO is new Text_IO.Enumeration_IO (Hours_In_Day); + package Status_IO is new Text_IO.Enumeration_IO (Status_Type); + + + -- The following function simulates the hourly recording of equipment + -- status. + + function Record_Status (Reading : Status_Record_Type) + return Boolean is + use Text_IO; -- To provide visibility to type Type_Set and + -- enumeration literal Upper_Case. + begin + Day_IO.Put (File => Status_Log, + Item => Reading.Day, + Set => Type_Set'(Upper_Case)); + Hours_IO.Put (Status_Log, Reading.Hour, 7); + Status_IO.Put (Status_Log, Reading.Status, + Width => 8, Set => Lower_Case); + Text_IO.New_Line (Status_Log); + return (True); + exception + when others => return False; + end Record_Status; + + begin + + -- The usage scenario intended is as follows: + -- File is created. + -- Unrelated/unknown file processing occurs. + -- On six hour intervals, file is reset to Append_File mode. + -- Data is appended to file. + -- Unrelated/unknown file processing resumes. + -- Reset/Append process is repeated. + + Reset1: + begin + Text_IO.Reset (Status_Log, -- Reset to + Text_IO.Append_File); -- Append mode. + exception + when Text_IO.Use_Error => + Report.Not_Applicable + ( "Reset to Append_File not supported for Text_IO" ); + raise Incomplete; + end Reset1; + + Day_IO.Default_Width := Days_In_Week'Width + 5; -- Default values + -- are modifiable. + + if not Record_Status (Morning_Reading) then -- Enter data. + Report.Failed ("Exception occurred during data file update"); + end if; + + Reset2: + begin + Text_IO.Reset (Status_Log, -- Reset to + Text_IO.Append_File); -- Append mode. + exception + when Text_IO.Use_Error => + Report.Not_Applicable + ( "Reset to Append_File not supported for Text_IO" ); + raise Incomplete; + end Reset2; + + if not Record_Status (Evening_Reading) then -- Enter data. + Report.Failed ("Exception occurred during data file update"); + end if; + + Test_Verification_Block: + declare + TC_Reading1 : Status_Record_Type; + TC_Reading2 : Status_Record_Type; + begin + + Reset3: + begin + Text_IO.Reset (Status_Log, Text_IO.In_File); -- Reset for + -- reading. + exception + when Text_IO.Use_Error => + Report.Not_Applicable + ( "Reset to In_File not supported for Text_IO" ); + raise Incomplete; + end Reset3; + + Day_IO.Get (Status_Log, TC_Reading1.Day); -- Read data from + Hours_IO.Get (Status_Log, TC_Reading1.Hour); -- first record. + Status_IO.Get (Status_Log, TC_Reading1.Status); + Text_IO.Skip_Line (Status_Log); + + -- Verify the data read from the file. Compare with the + -- record that was originally entered into the file. + + if (TC_Reading1 /= Morning_Reading) then + Report.Failed ("Data error on reading first record"); + end if; + + Day_IO.Get (Status_Log, TC_Reading2.Day); -- Read data from + Hours_IO.Get (Status_Log, TC_Reading2.Hour); -- second record. + Status_IO.Get (Status_Log, TC_Reading2.Status); + Text_IO.Skip_Line (Status_Log); + + -- Verify all of the data fields read from the file. Compare + -- with the values that were originally entered into the file. + + if (TC_Reading2.Day /= Evening_Reading.Day) or + (TC_Reading2.Hour /= Evening_Reading.Hour) or + (TC_Reading2.Status /= Evening_Reading.Status) then + Report.Failed ("Data error on reading second record"); + end if; + + exception + when Incomplete => + raise; + when others => + Report.Failed ("Error raised during data verification"); + end Test_Verification_Block; + + exception + when Incomplete => + raise; + when others => + Report.Failed ("Exception in Text_IO.Enumeration_IO processing"); + end Operational_Test_Block; + + Final_Block: + begin + -- Delete the external file. + if Text_IO.Is_Open (Status_Log) then + Text_IO.Delete (Status_Log); + else + Text_IO.Open (Status_Log, Text_IO.Out_File, Status_Log_Filename); + Text_IO.Delete (Status_Log); + end if; + exception + when Text_IO.Use_Error => + Report.Failed + ( "Delete not properly implemented for Text_IO" ); + + end Final_Block; + + Report.Result; + +exception + when Incomplete => + Report.Result; + when others => + Report.Failed ( "Unexpected exception" ); + Report.Result; + +end CXAA011; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxaa012.a b/gcc/testsuite/ada/acats/tests/cxa/cxaa012.a new file mode 100644 index 000000000..07523b441 --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxaa012.a @@ -0,0 +1,167 @@ +-- CXAA012.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 exception Mode_Error is raised when an attempt is made +-- to read from (perform a Get_Line) or use the predefined End_Of_File +-- function on a text file with mode Append_File. +-- +-- TEST DESCRIPTION: +-- A scenario is created that demonstrates the potential for the +-- incorrect usage of predefined text processing subprograms, resulting +-- from their use with files of the wrong Mode. This results in the +-- raising of Mode_Error exceptions, which is handled within blocks +-- embedded in the test. +-- A count is kept to ensure that each anticipated exception is in fact +-- raised and handled properly. +-- +-- APPLICABILITY CRITERIA: +-- This test is applicable only to implementations that support text +-- files. +-- +-- +-- CHANGE HISTORY: +-- 06 Dec 94 SAIC ACVC 2.0 +-- 27 Feb 97 PWB.CTA Allowed for non-support of some IO operations +--! + +with Ada.Text_IO; +with Report; + +procedure CXAA012 is + use Ada; + Text_File : Text_IO.File_Type; + Text_Filename : constant String := + Report.Legal_File_Name ( Nam => "CXAA012" ); + Incomplete : exception; +begin + + Report.Test ("CXAA012", "Check that the exception Mode_Error is " & + "raised when an attempt is made to read " & + "from (perform a Get_Line) or use the " & + "predefined End_Of_File function on a " & + "text file with mode Append_File"); + + Test_for_Text_IO_Support: + begin + + -- Use_Error or Name_Error will be raised if Text_IO operations + -- or external files are not supported. + + Text_IO.Create (Text_File, Text_IO.Out_File, Text_Filename); + + exception + when Text_IO.Use_Error | Text_IO.Name_Error => + Report.Not_Applicable + ( "Files not supported - Create as Out_File for Text_IO" ); + raise Incomplete; + end Test_for_Text_IO_Support; + + -- The application writes some amount of data to the file. + + Text_IO.Put_Line (Text_File, "Data entered into the file"); + + Text_IO.Close (Text_File); + + Operational_Test_Block: + declare + TC_Number_Of_Forced_Mode_Errors : constant Natural := 2; + TC_Mode_Errors : Natural := 0; + begin + + Text_IO.Open (Text_File, Text_IO.Append_File, Text_Filename); + + Test_for_Reading: + declare + TC_Data : String (1..80); + TC_Length : Natural := 0; + begin + +-- During the course of its processing, the application may become confused +-- and erroneously attempt to read data from the file that is currently in +-- Append_File mode (instead of the anticipated In_File mode). +-- This would result in the raising of Mode_Error. + + Text_IO.Get_Line (Text_File, TC_Data, TC_Length); + Report.Failed ("Exception not raised by Get_Line"); + +-- An exception handler present within the application handles the exception +-- and processing can continue. + + exception + when Text_IO.Mode_Error => + TC_Mode_Errors := TC_Mode_Errors + 1; + when others => + Report.Failed ("Exception in Get_Line processing"); + end Test_for_Reading; + + + Test_for_End_Of_File: + declare + TC_End_Of_File : Boolean; + begin + +-- Again, during the course of its processing, the application attempts to +-- call the End_Of_File function for the file that is currently in +-- Append_File mode (instead of the anticipated In_File mode). + + TC_End_Of_File := Text_IO.End_Of_File (Text_File); + Report.Failed ("Exception not raised by End_Of_File"); + +-- Once again, an exception handler present within the application handles +-- the exception and processing continues. + + exception + when Text_IO.Mode_Error => + TC_Mode_Errors := TC_Mode_Errors + 1; + when others => + Report.Failed("Exception in End_Of_File processing"); + end Test_for_End_Of_File; + + + if (TC_Mode_Errors /= TC_Number_Of_Forced_Mode_Errors) then + Report.Failed ("Incorrect number of exceptions handled"); + end if; + + end Operational_Test_Block; + + -- Delete the external file. + if Text_IO.Is_Open (Text_File) then + Text_IO.Delete (Text_File); + else + Text_IO.Open (Text_File, Text_IO.In_File, Text_Filename); + Text_IO.Delete (Text_File); + end if; + + Report.Result; + +exception + when Incomplete => + Report.Result; + when others => + Report.Failed ( "Unexpected exception" ); + Report.Result; + +end CXAA012; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxaa013.a b/gcc/testsuite/ada/acats/tests/cxa/cxaa013.a new file mode 100644 index 000000000..be658ca13 --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxaa013.a @@ -0,0 +1,167 @@ +-- CXAA013.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 exception Mode_Error is raised when an attempt is made +-- to skip a line or page using the predefined Skip_Line and Skip_Page +-- procedures on a text file with mode Append_File. +-- +-- TEST DESCRIPTION: +-- A scenario is created that demonstrates the potential for the +-- incorrect usage of predefined text processing subprograms, which +-- results in the raising of a Mode_Error exception. +-- A count is kept to ensure that each anticipated exception is in fact +-- raised and handled properly. +-- +-- APPLICABILITY CRITERIA: +-- This test is applicable only to implementations that support text +-- files. +-- +-- +-- CHANGE HISTORY: +-- 06 Dec 94 SAIC ACVC 2.0 +-- 28 Feb 97 PWB.CTA Allowed for non-support of some IO operations +--! + +with Ada.Text_IO; +with Report; + +procedure CXAA013 is + use Ada; + Text_File : Text_IO.File_Type; + Text_Filename : constant String := + Report.Legal_File_Name ( Nam => "CXAA013" ); + Incomplete : exception; + +begin + + Report.Test ("CXAA013", "Check that the exception Mode_Error is " & + "raised when an attempt is made to skip " & + "a line or page using the predefined " & + "Skip_Line and Skip_Page procedures on " & + "a text file with mode Append_File"); + + Test_for_Text_IO_Support: + begin + +-- An application creates a text file with mode Append_File. +-- Use_Error will be raised if Text_IO operations or external files are not +-- supported. + + Text_IO.Create (Text_File, Text_IO.Append_File, Text_Filename); + + exception + + when Text_IO.Use_Error | Text_IO.Name_Error => + Report.Not_Applicable + ( "Files not supported - Create as Append_File for Text_IO" ); + raise Incomplete; + + end Test_for_Text_IO_Support; + +-- The application writes some amount of data to the file. + + Text_IO.Put_Line (Text_File, "Data entered into the file"); + + Operational_Test_Block: + declare + TC_Number_Of_Forced_Mode_Errors : constant Natural := 2; + TC_Mode_Errors : Natural := 0; + begin + + Test_for_Skip_Line: + declare + TC_Spacing : constant Text_IO.Count := 3; + begin + +-- During the course of its processing, the application may attempt to +-- invoke the Skip_Line procedure on a file that is currently in Append_File +-- mode (instead of the anticipated In_File mode). This results in the +-- raising of Mode_Error. + + Text_IO.Skip_Line (Text_File, TC_Spacing); + Report.Failed ("Exception not raised by Skip_Line"); + +-- An exception handler present within the application handles the exception +-- and processing can continue. + + exception + when Text_IO.Mode_Error => + TC_Mode_Errors := TC_Mode_Errors + 1; + when others => + Report.Failed("Exception in Skip_Line processing"); + end Test_for_Skip_Line; + + Test_for_Skip_Page: + begin + +-- Again, during the course of its processing, the application incorrectly +-- assumes that the file mode is In_File, this time attempting to call the +-- Skip_Page procedure for the file (that is currently in Append_File mode). + + Text_IO.Skip_Page (Text_File); + Report.Failed ("Exception not raised by Skip_Page"); + +-- Once again, an exception handler present within the application handles +-- the exception and processing continues. + + exception + when Text_IO.Mode_Error => + TC_Mode_Errors := TC_Mode_Errors + 1; + when others => + Report.Failed("Exception in Skip_Page processing"); + end Test_for_Skip_Page; + + if (TC_Mode_Errors /= TC_Number_Of_Forced_Mode_Errors) then + Report.Failed ("Incorrect number of exceptions handled"); + end if; + + end Operational_Test_Block; + + Deletion: + begin + -- Delete the external file. + if Text_IO.Is_Open (Text_File) then + Text_IO.Delete (Text_File); + else + Text_IO.Open (Text_File, Text_IO.In_File, Text_Filename); + Text_IO.Delete (Text_File); + end if; + exception + when others => + Report.Failed + ( "Delete not properly implemented for Text_IO" ); + end Deletion; + + Report.Result; + +exception + when Incomplete => + Report.Result; + when others => + Report.Failed ( "Unexpected exception" ); + Report.Result; + +end CXAA013; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxaa014.a b/gcc/testsuite/ada/acats/tests/cxa/cxaa014.a new file mode 100644 index 000000000..0b74c6169 --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxaa014.a @@ -0,0 +1,178 @@ +-- CXAA014.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 exception Mode_Error is raised when an attempt is made +-- to check for the end of a line or page using the predefined functions +-- End_Of_Line or End_Of_Page on a text file with mode Append_File. +-- +-- TEST DESCRIPTION: +-- A scenario is created that demonstrates the potential for the +-- incorrect usage of predefined text processing subprograms, which +-- results in the raising of a Mode_Error exception. +-- A count is kept to ensure that each anticipated exception is in fact +-- raised and handled properly. +-- +-- APPLICABILITY CRITERIA: +-- This test is applicable only to implementations that support text +-- files. +-- +-- +-- CHANGE HISTORY: +-- 06 Dec 94 SAIC ACVC 2.0 +-- 28 Feb 97 PWB.CTA Allowed for non-support of some IO operations +--! + +with Ada.Text_IO; +with Report; + +procedure CXAA014 is + use Ada; + Text_File : Text_IO.File_Type; + Text_Filename : constant String := + Report.Legal_File_Name ( Nam => "CXAA014" ); + Incomplete : exception; + +begin + + Report.Test ("CXAA014", "Check that the exception Mode_Error is " & + "raised when an attempt is made to check " & + "for the end of a line or page using the " & + "predefined functions End_Of_Line or " & + "End_Of_Page on a text file with mode " & + "Append_File"); + + Test_for_Text_IO_Support: + begin + +-- Use_Error will be raised if Text_IO operations or external files are not +-- supported. + + Text_IO.Create (Text_File, Text_IO.Out_File, Text_Filename); + + exception + + when Text_IO.Use_Error | Text_IO.Name_Error => + Report.Not_Applicable + ( "Files not supported - Create as Out_File for Text_IO" ); + raise Incomplete; + + end Test_for_Text_IO_Support; + + +-- The application writes some amount of data to the file. + + for I in 1 .. 10 loop + Text_IO.Put_Line (Text_File, "Data entered into the file"); + end loop; + + Text_IO.Close (Text_File); + + Operational_Test_Block: + declare + TC_Number_Of_Forced_Mode_Errors : constant Natural := 2; + TC_Mode_Errors : Natural := 0; + begin + + Text_IO.Open (Text_File, Text_IO.Append_File, Text_Filename); + + Test_for_End_Of_Line: + declare + TC_End_Of_Line : Boolean; + begin + +-- During the course of its processing, the application may attempt to +-- invoke the End_Of_Line function on a file that is currently in Append_File +-- mode (instead of the anticipated In_File mode). This results in the +-- raising of Mode_Error. + + TC_End_Of_Line := Text_IO.End_Of_Line (Text_File); + Report.Failed ("Exception not raised by End_Of_Line"); + +-- An exception handler present within the application handles the exception +-- and processing can continue. + + exception + when Text_IO.Mode_Error => + TC_Mode_Errors := TC_Mode_Errors + 1; + when others => + Report.Failed("Exception in End_Of_Line processing"); + end Test_for_End_Of_Line; + + + Test_for_End_Of_Page: + declare + TC_End_Of_Page : Boolean; + begin + +-- Again, during the course of its processing, the application incorrectly +-- assumes that the file mode is In_File, this time attempting to call the +-- End_Of_Page function for the file (that is currently in Append_File mode). + + TC_End_Of_Page := Text_IO.End_Of_Page (Text_File); + Report.Failed ("Exception not raised by End_Of_Page"); + +-- Once again, an exception handler present within the application handles +-- the exception and processing continues. + + exception + when Text_IO.Mode_Error => + TC_Mode_Errors := TC_Mode_Errors + 1; + when others => + Report.Failed("Exception in End_Of_Page processing"); + end Test_for_End_Of_Page; + + + if (TC_Mode_Errors /= TC_Number_Of_Forced_Mode_Errors) then + Report.Failed ("Incorrect number of exceptions handled"); + end if; + + end Operational_Test_Block; + + Deletion: + begin + -- Delete the external file. + if Text_IO.Is_Open (Text_File) then + Text_IO.Delete (Text_File); + else + Text_IO.Open (Text_File, Text_IO.In_File, Text_Filename); + Text_IO.Delete (Text_File); + end if; + exception + when others => + Report.Failed + ( "Delete not properly implemented for Text_IO" ); + end Deletion; + + Report.Result; + +exception + when Incomplete => + Report.Result; + when others => + Report.Failed ( "Unexpected exception" ); + Report.Result; + +end CXAA014; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxaa015.a b/gcc/testsuite/ada/acats/tests/cxa/cxaa015.a new file mode 100644 index 000000000..919ef05ca --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxaa015.a @@ -0,0 +1,227 @@ +-- CXAA015.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 exception Status_Error is raised when an attempt is +-- made to create or open a file in Append_File mode when the file is +-- already open. +-- Check that the exception Name_Error is raised by procedure Open when +-- attempting to open a file in Append_File mode when the name supplied +-- as the filename does not correspond to an existing external file. +-- +-- TEST DESCRIPTION: +-- A scenario is created that demonstrates the potential for the +-- inappropriate usage of text processing subprograms Create and Open, +-- resulting in the raising of Status_Error and Name_Error exceptions. +-- A count is kept to ensure that each anticipated exception is in fact +-- raised and handled properly. +-- +-- APPLICABILITY CRITERIA: +-- This test is applicable only to implementations that support text +-- files. +-- +-- +-- CHANGE HISTORY: +-- 06 Dec 94 SAIC ACVC 2.0 +-- 28 Feb 97 PWB.CTA Allowed for non-support of some IO operations +--! + +with Ada.Text_IO; +with Report; + +procedure CXAA015 is + use Ada; + Text_File : Text_IO.File_Type; + Text_Filename : constant String := + Report.Legal_File_Name ( Nam => "CXAA015" ); + Incomplete : exception; + +begin + + Report.Test ("CXAA015", "Check that the appropriate exceptions " & + "are raised when procedures Create and " & + "Open are used to inappropriately operate " & + "on files of mode Append_File"); + + Test_for_Text_IO_Support: + begin + +-- An application creates a text file with mode Append_File. +-- Use_Error will be raised if Text_IO operations or external files are not +-- supported. + + Text_IO.Create (Text_File, Text_IO.Append_File, Text_Filename); + exception + + when Text_IO.Use_Error | Text_IO.Name_Error => + Report.Not_Applicable + ( "Files not supported - Create as Append_File for Text_IO" ); + raise Incomplete; + + end Test_for_Text_IO_Support; + + +-- The application writes some amount of data to the file. + + for I in 1 .. 5 loop + Text_IO.Put_Line (Text_File, "Data entered into the file"); + end loop; + + Operational_Test_Block: + declare + TC_Number_Of_Forced_Errors : constant Natural := 3; + TC_Errors : Natural := 0; + begin + + + Test_for_Create: + begin + +-- During the course of its processing, the application may (erroneously) +-- attempt to create the same file already in existence in Append_File mode. +-- This results in the raising of Status_Error. + + Text_IO.Create (Text_File, + Text_IO.Append_File, + Text_Filename); + Report.Failed ("Exception not raised by Create"); + +-- An exception handler present within the application handles the exception +-- and processing can continue. + + exception + when Text_IO.Status_Error => + TC_Errors := TC_Errors + 1; + when others => + Report.Failed("Exception in Create processing"); + end Test_for_Create; + + + First_Test_For_Open: + begin + +-- Again, during the course of its processing, the application incorrectly +-- attempts to Open a file (in Append_File mode) that is already open. + + Text_IO.Open (Text_File, Text_IO.Append_File, Text_Filename); + Report.Failed ("Exception not raised by improper Open - 1"); + +-- Once again, an exception handler present within the application handles +-- the exception and processing continues. + + exception + when Text_IO.Status_Error => + TC_Errors := TC_Errors + 1; + +-- At some point in its processing, the application closes the file that is +-- currently open. + + Text_IO.Close (Text_File); + when others => + Report.Failed("Exception in Open processing - 1"); + end First_Test_For_Open; + + + Open_With_Wrong_Filename: + declare + TC_Wrong_Filename : constant String := + Report.Legal_File_Name(2); + begin + +-- At this point, the application attempts to Open (in Append_File mode) the +-- file used in previous processing, but it attempts this Open using a name +-- string that does not correspond to any existing external file. +-- First make sure the file doesn't exist. (If it did, then the check +-- for open in append mode wouldn't work.) + + Verify_No_File: + begin + Text_IO.Open (Text_File, + Text_IO.In_File, + TC_Wrong_Filename); + exception + when Text_IO.Name_Error => + null; + when others => + Report.Failed ( "Unexpected exception on Open check" ); + end Verify_No_File; + + Delete_No_File: + begin + if Text_IO.Is_Open (Text_File) then + Text_IO.Delete (Text_File); + end if; + exception + when others => + Report.Failed ( "Unexpected exception - Delete check" ); + end Delete_No_File; + + Text_IO.Open (Text_File, + Text_IO.Append_File, + TC_Wrong_Filename); + Report.Failed ("Exception not raised by improper Open - 2"); + +-- An exception handler for the Name_Error, present within the application, +-- catches the exception and processing continues. + + exception + when Text_IO.Name_Error => + TC_Errors := TC_Errors + 1; + when others => + Report.Failed("Exception in Open processing - 2"); + end Open_With_Wrong_Filename; + + + if (TC_Errors /= TC_Number_Of_Forced_Errors) then + Report.Failed ("Incorrect number of exceptions handled"); + end if; + + end Operational_Test_Block; + + Deletion: + begin + -- Delete the external file. + if Text_IO.Is_Open (Text_File) then + Text_IO.Delete (Text_File); + else + Text_IO.Open (Text_File, Text_IO.In_File, Text_Filename); + Text_IO.Delete (Text_File); + end if; + exception + when others => + Report.Failed + ( "Delete not properly implemented for Text_IO" ); + end Deletion; + + Report.Result; + +exception + when Incomplete => + Report.Result; + when others => + Report.Failed ( "Unexpected exception" ); + Report.Result; + +end CXAA015; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxaa016.a b/gcc/testsuite/ada/acats/tests/cxa/cxaa016.a new file mode 100644 index 000000000..8ae69a126 --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxaa016.a @@ -0,0 +1,462 @@ +-- CXAA016.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 type File_Access is available in Ada.Text_IO, and that +-- objects of this type designate File_Type objects. +-- Check that function Set_Error will set the current default error file. +-- Check that versions of Ada.Text_IO functions Standard_Input, +-- Standard_Output, Standard_Error return File_Access values designating +-- the standard system input, output, and error files. +-- Check that versions of Ada.Text_IO functions Current_Input, +-- Current_Output, Current_Error return File_Access values designating +-- the current system input, output, and error files. +-- +-- TEST DESCRIPTION: +-- This test tests the use of File_Access objects in referring +-- to File_Type objects, as well as several new functions that return +-- File_Access objects as results. +-- Four user-defined files are created. These files will be set to +-- function as current system input, output, and error files. +-- Data will be read from and written to these files during the +-- time at which they function as the current system files. +-- An array of File_Access objects will be defined. It will be +-- initialized using functions that return File_Access objects +-- referencing the Standard and Current Input, Output, and Error files. +-- This "saves" the initial system environment, which will be modified +-- to use the user-defined files as the current default Input, Output, +-- and Error files. At the end of the test, the data in this array +-- will be used to restore the initial system environment. +-- +-- APPLICABILITY CRITERIA: +-- This test is applicable to implementations capable of supporting +-- external Text_IO files. +-- +-- +-- CHANGE HISTORY: +-- 25 May 95 SAIC Initial prerelease version. +-- 22 Apr 96 SAIC Incorporated reviewer comments for ACVC 2.1. +-- 26 Feb 97 PWB.CTA Allowed for non-support of some IO operations. +-- 18 Jan 99 RLB Repaired to allow Not_Applicable systems to +-- fail delete. +--! + +with Ada.Text_IO; +package CXAA016_0 is + New_Input_File, + New_Output_File, + New_Error_File_1, + New_Error_File_2 : aliased Ada.Text_IO.File_Type; +end CXAA016_0; + + +with Report; +with Ada.Exceptions; +with Ada.Text_IO; use Ada.Text_IO; +with CXAA016_0; use CXAA016_0; + +procedure CXAA016 is + + Non_Applicable_System : exception; + No_Reset : exception; + Not_Applicable_System : Boolean := False; + + procedure Delete_File ( A_File : in out Ada.Text_IO.File_Type; + ID_Num : in Integer ) is + begin + if not Ada.Text_IO.Is_Open ( A_File ) then + Ada.Text_IO.Open ( A_File, + Ada.Text_IO.In_File, + Report.Legal_File_Name ( ID_Num ) ); + end if; + Ada.Text_IO.Delete ( A_File ); + exception + when Ada.Text_IO.Name_Error => + if Not_Applicable_System then + null; -- File probably wasn't created. + else + Report.Failed ( "Can't open file for Text_IO" ); + end if; + when Ada.Text_IO.Use_Error => + if Not_Applicable_System then + null; -- File probably wasn't created. + else + Report.Failed ( "Delete not properly implemented for Text_IO" ); + end if; + when others => + Report.Failed ( "Unexpected exception in Delete_File" ); + end Delete_File; + +begin + + Report.Test ("CXAA016", "Check that the type File_Access is available " & + "in Ada.Text_IO, and that objects of this " & + "type designate File_Type objects"); + Test_Block: + declare + + use Ada.Exceptions; + + type System_File_Array_Type is + array (Integer range <>) of File_Access; + + -- Fill the following array with the File_Access results of six + -- functions. + + Initial_Environment : System_File_Array_Type(1..6) := + ( Standard_Input, + Standard_Output, + Standard_Error, + Current_Input, + Current_Output, + Current_Error ); + + New_Input_Ptr : File_Access := New_Input_File'Access; + New_Output_Ptr : File_Access := New_Output_File'Access; + New_Error_Ptr : File_Access := New_Error_File_1'Access; + + Line : String(1..80); + Length : Natural := 0; + + Line_1 : constant String := "This is the first line in the Output file"; + Line_2 : constant String := "This is the next line in the Output file"; + Line_3 : constant String := "This is the first line in Error file 1"; + Line_4 : constant String := "This is the next line in Error file 1"; + Line_5 : constant String := "This is the first line in Error file 2"; + Line_6 : constant String := "This is the next line in Error file 2"; + + + + procedure New_File (The_File : in out File_Type; + Mode : in File_Mode; + Next : in Integer) is + begin + Create (The_File, Mode, Report.Legal_File_Name(Next)); + exception + -- The following two exceptions may be raised if a system is not + -- capable of supporting external Text_IO files. The handler will + -- raise a user-defined exception which will result in a + -- Not_Applicable result for the test. + when Use_Error | Name_Error => raise Non_Applicable_System; + end New_File; + + + + procedure Check_Initial_Environment (Env : System_File_Array_Type) is + begin + -- Check that the system has defined the following sources/ + -- destinations for input/output/error, and that the six functions + -- returning File_Access values are available. + if not (Env(1) = Standard_Input and + Env(2) = Standard_Output and + Env(3) = Standard_Error and + Env(4) = Current_Input and + Env(5) = Current_Output and + Env(6) = Current_Error) + then + Report.Failed("At the start of the test, the Standard and " & + "Current File_Access values associated with " & + "system Input, Output, and Error files do " & + "not correspond"); + end if; + end Check_Initial_Environment; + + + + procedure Load_Input_File (Input_Ptr : in File_Access) is + begin + -- Load data into the file that will function as the user-defined + -- system input file. + Put_Line(Input_Ptr.all, Line_1); + Put_Line(Input_Ptr.all, Line_2); + Put_Line(Input_Ptr.all, Line_3); + Put_Line(Input_Ptr.all, Line_4); + Put_Line(Input_Ptr.all, Line_5); + Put_Line(Input_Ptr.all, Line_6); + end Load_Input_File; + + + + procedure Restore_Initial_Environment + (Initial_Env : System_File_Array_Type) is + begin + -- Restore the Current Input, Output, and Error files to their + -- original states. + + Set_Input (Initial_Env(4).all); + Set_Output(Initial_Env(5).all); + Set_Error (Initial_Env(6).all); + + -- At this point, the user-defined files that were functioning as + -- the Current Input, Output, and Error files have been replaced in + -- that capacity by the state of the original environment. + + declare + + -- Capture the state of the current environment. + + Current_Env : System_File_Array_Type (1..6) := + (Standard_Input, Standard_Output, Standard_Error, + Current_Input, Current_Output, Current_Error); + begin + + -- Compare the current environment with that of the saved + -- initial environment. + + if Current_Env /= Initial_Env then + Report.Failed("Restored file environment was not the same " & + "as the initial file environment"); + end if; + end; + end Restore_Initial_Environment; + + + + procedure Verify_Files (O_File, E_File_1, E_File_2 : in File_Type) is + Str_1, Str_2, Str_3, Str_4, Str_5, Str_6 : String (1..80); + Len_1, Len_2, Len_3, Len_4, Len_5, Len_6 : Natural; + begin + + -- Get the lines that are contained in all the files, and verify + -- them against the expected results. + + Get_Line(O_File, Str_1, Len_1); -- The user defined output file + Get_Line(O_File, Str_2, Len_2); -- should contain two lines of data. + + if Str_1(1..Len_1) /= Line_1 or + Str_2(1..Len_2) /= Line_2 + then + Report.Failed("Incorrect results from Current_Output file"); + end if; + + Get_Line(E_File_1, Str_3, Len_3); -- The first error file received + Get_Line(E_File_1, Str_4, Len_4); -- two lines of data originally, + Get_Line(E_File_1, Str_5, Len_5); -- then had two additional lines + Get_Line(E_File_1, Str_6, Len_6); -- appended from the second error + -- file. + if Str_3(1..Len_3) /= Line_3 or + Str_4(1..Len_4) /= Line_4 or + Str_5(1..Len_5) /= Line_5 or + Str_6(1..Len_6) /= Line_6 + then + Report.Failed("Incorrect results from first Error file"); + end if; + + Get_Line(E_File_2, Str_5, Len_5); -- The second error file + Get_Line(E_File_2, Str_6, Len_6); -- received two lines of data. + + if Str_5(1..Len_5) /= Line_5 or + Str_6(1..Len_6) /= Line_6 + then + Report.Failed("Incorrect results from second Error file"); + end if; + + end Verify_Files; + + + + begin + + Check_Initial_Environment (Initial_Environment); + + -- Create user-defined text files that will be set to serve as current + -- system input, output, and error files. + + New_File (New_Input_File, Out_File, 1); -- Will be reset prior to use. + New_File (New_Output_File, Out_File, 2); + New_File (New_Error_File_1, Out_File, 3); + New_File (New_Error_File_2, Out_File, 4); + + -- Enter several lines of text into the new input file. This file will + -- be reset to mode In_File to function as the current system input file. + -- Note: File_Access value used as parameter to this procedure. + + Load_Input_File (New_Input_Ptr); + + -- Reset the New_Input_File to mode In_File, to allow it to act as the + -- current system input file. + + Reset1: + begin + Reset (New_Input_File, In_File); + exception + when Ada.Text_IO.Use_Error => + Report.Not_Applicable + ( "Reset to In_File not supported for Text_IO - 1" ); + raise No_Reset; + end Reset1; + + -- Establish new files that will function as the current system Input, + -- Output, and Error files. + + Set_Input (New_Input_File); + Set_Output(New_Output_Ptr.all); + Set_Error (New_Error_Ptr.all); + + -- Perform various file processing tasks, exercising specific new + -- Text_IO functionality. + -- + -- Read two lines from Current_Input and write them to Current_Output. + + for i in 1..2 loop + Get_Line(Current_Input, Line, Length); + Put_Line(Current_Output, Line(1..Length)); + end loop; + + -- Read two lines from Current_Input and write them to Current_Error. + + for i in 1..2 loop + Get_Line(Current_Input, Line, Length); + Put_Line(Current_Error, Line(1..Length)); + end loop; + + -- Reset the Current system error file. + + Set_Error (New_Error_File_2); + + -- Read two lines from Current_Input and write them to Current_Error. + + for i in 1..2 loop + Get_Line(Current_Input, Line, Length); + Put_Line(Current_Error, Line(1..Length)); + end loop; + + -- At this point in the processing, the new Output file, and each of + -- the two Error files, contain two lines of data. + -- Note that New_Error_File_1 has been replaced by New_Error_File_2 + -- as the current system error file, allowing New_Error_File_1 to be + -- reset (Mode_Error raised otherwise). + -- + -- Reset the first Error file to Append_File mode, and then set it to + -- function as the current system error file. + + Reset2: + begin + Reset (New_Error_File_1, Append_File); + exception + when Ada.Text_IO.Use_Error => + Report.Not_Applicable + ( "Reset to Append_File not supported for Text_IO - 2" ); + raise No_Reset; + end Reset2; + + Set_Error (New_Error_File_1); + + -- Reset the second Error file to In_File mode, then set it to become + -- the current system input file. + + Reset3: + begin + Reset (New_Error_File_2, In_File); + exception + when Ada.Text_IO.Use_Error => + Report.Not_Applicable + ( "Reset to In_File not supported for Text_IO - 3" ); + raise No_Reset; + end Reset3; + + New_Error_Ptr := New_Error_File_2'Access; + Set_Input (New_Error_Ptr.all); + + -- Append all of the text lines (2) in the new current system input + -- file onto the current system error file. + + while not End_Of_File(Current_Input) loop + Get_Line(Current_Input, Line, Length); + Put_Line(Current_Error, Line(1..Length)); + end loop; + + -- Restore the original system file environment, based upon the values + -- stored at the start of this test. + -- Check that the original environment has been restored. + + Restore_Initial_Environment (Initial_Environment); + + -- Reset all three files to In_File_Mode prior to verification. + -- Note: If these three files had still been the designated Current + -- Input, Output, or Error files for the system, a Reset + -- operation at this point would raise Mode_Error. + -- However, at this point, the environment has been restored to + -- its original state, and these user-defined files are no longer + -- designated as current system files, allowing a Reset. + + Reset4: + begin + Reset(New_Error_File_1, In_File); + exception + when Ada.Text_IO.Use_Error => + Report.Not_Applicable + ( "Reset to In_File not supported for Text_IO - 4" ); + raise No_Reset; + end Reset4; + + Reset5: + begin + Reset(New_Error_File_2, In_File); + exception + when Ada.Text_IO.Use_Error => + Report.Not_Applicable + ( "Reset to In_File not supported for Text_IO - 5" ); + raise No_Reset; + end Reset5; + + Reset6: + begin + Reset(New_Output_File, In_File); + exception + when Ada.Text_IO.Use_Error => + Report.Not_Applicable + ( "Reset to In_File not supported for Text_IO - 6" ); + raise No_Reset; + end Reset6; + + -- Check that all the files contain the appropriate data. + + Verify_Files (New_Output_File, New_Error_File_1, New_Error_File_2); + + exception + when No_Reset => + null; + when Non_Applicable_System => + Report.Not_Applicable("System not capable of supporting external " & + "text files -- Name_Error/Use_Error raised " & + "during text file creation"); + Not_Applicable_System := True; + when The_Error : others => + Report.Failed ("The following exception was raised in the " & + "Test_Block: " & Exception_Name(The_Error)); + end Test_Block; + + Delete_Block: + begin + Delete_File ( New_Input_File, 1 ); + Delete_File ( New_Output_File, 2 ); + Delete_File ( New_Error_File_1, 3 ); + Delete_File ( New_Error_File_2, 4 ); + end Delete_Block; + + Report.Result; + +end CXAA016; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxaa017.a b/gcc/testsuite/ada/acats/tests/cxa/cxaa017.a new file mode 100644 index 000000000..17d0922cc --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxaa017.a @@ -0,0 +1,400 @@ +-- CXAA017.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 function Look_Ahead sets parameter End_Of_Line +-- to True if at the end of a line; otherwise check that it returns the +-- next character from a file (without consuming it), while setting +-- End_Of_Line to False. +-- +-- Check that Ada.Text_IO function Get_Immediate will return the next +-- control or graphic character in parameter Item from the specified +-- file. Check that the version of Ada.Text_IO function Get_Immediate +-- with the Available parameter will, if a character is available in the +-- specified file, return the character in parameter Item, and set +-- parameter Available to True. +-- +-- TEST DESCRIPTION: +-- This test exercises specific capabilities of two Text_IO subprograms, +-- Look_Ahead and Get_Immediate. A file is prepared that contains a +-- variety of graphic and control characters on several lines. +-- In processing this file, a call to Look_Ahead is performed to ensure +-- that characters are available, then individual characters are +-- extracted from the current line using Get_Immediate. The characters +-- returned from both subprogram calls are compared with the expected +-- character result. Processing on each file line continues until +-- Look_Ahead indicates that the end of the line is next. Separate +-- verification is performed to ensure that all characters of each line +-- are processed, and that the Available and End_Of_Line parameters +-- of the subprograms are properly set in the appropriate instances. +-- +-- APPLICABILITY CRITERIA: +-- This test is applicable to implementations capable of supporting +-- external Text_IO files. +-- +-- +-- CHANGE HISTORY: +-- 30 May 95 SAIC Initial prerelease version. +-- 01 May 96 SAIC Incorporated reviewer comments for ACVC 2.1. +-- 26 Feb 97 PWB.CTA Allowed for non-support of some IO operations. +--! + +with Ada.Text_IO; +package CXAA017_0 is + + User_Defined_Input_File : aliased Ada.Text_IO.File_Type; + +end CXAA017_0; + + +with CXAA017_0; use CXAA017_0; +with Ada.Characters.Latin_1; +with Ada.Exceptions; +with Ada.Text_IO; +with Report; + +procedure CXAA017 is + + use Ada.Characters.Latin_1; + use Ada.Exceptions; + use Ada.Text_IO; + + Non_Applicable_System : exception; + No_Reset : exception; + +begin + + Report.Test ("CXAA017", "Check that Ada.Text_IO subprograms " & + "Look_Ahead and Get_Immediate are available " & + "and produce correct results"); + + Test_Block: + declare + + User_Input_Ptr : File_Access := User_Defined_Input_File'Access; + + UDLA_Char, -- Acronym UDLA => "User Defined Look Ahead" + UDGI_Char, -- Acronym UDGI => "User Defined Get Immediate" + TC_Char : Character := Ada.Characters.Latin_1.NUL; + + UDLA_End_Of_Line, + UDGI_Available : Boolean := False; + + Char_Pos : Natural; + + -- This string contains five ISO 646 Control characters and six ISO 646 + -- Graphic characters: + TC_String_1 : constant String := STX & + SI & + DC2 & + CAN & + US & + Space & + Ampersand & + Solidus & + 'A' & + LC_X & + DEL; + + -- This string contains two ISO 6429 Control and six ISO 6429 Graphic + -- characters: + TC_String_2 : constant String := IS4 & + SCI & + Yen_Sign & + Masculine_Ordinal_Indicator & + UC_I_Grave & + Multiplication_Sign & + LC_C_Cedilla & + LC_Icelandic_Thorn; + + TC_Number_Of_Strings : constant := 2; + + type String_Access_Type is access constant String; + type String_Ptr_Array_Type is + array (1..TC_Number_Of_Strings) of String_Access_Type; + + TC_String_Ptr_Array : String_Ptr_Array_Type := + (new String'(TC_String_1), + new String'(TC_String_2)); + + + + procedure Create_New_File (The_File : in out File_Type; + Mode : in File_Mode; + Next : in Integer) is + begin + Create (The_File, Mode, Report.Legal_File_Name(Next)); + exception + -- The following two exceptions can be raised if a system is not + -- capable of supporting external Text_IO files. The handler will + -- raise a user-defined exception which will result in a + -- Not_Applicable result for the test. + when Use_Error | Name_Error => raise Non_Applicable_System; + end Create_New_File; + + + + procedure Load_File (The_File : in out File_Type) is + -- This procedure will load several strings into the file denoted + -- by the input parameter. A call to New_Line will add line/page + -- termination characters, which will be available for processing + -- along with the text in the file. + begin + Put_Line (The_File, TC_String_Ptr_Array(1).all); + New_Line (The_File, Spacing => 1); + Put_Line (The_File, TC_String_Ptr_Array(2).all); + end Load_File; + + + begin + + -- Create user-defined text file that will serve as the appropriate + -- sources of input to the procedures under test. + + Create_New_File (User_Defined_Input_File, Out_File, 1); + + -- Enter several lines of text into the new input file. + -- The characters that make up these text strings will be processed + -- using the procedures being exercised in this test. + + Load_File (User_Defined_Input_File); + + -- Check that Mode_Error is raised by Look_Ahead and Get_Immedidate + -- if the mode of the file object is not In_File. + -- Currently, the file mode is Out_File. + + begin + Look_Ahead(User_Defined_Input_File, UDLA_Char, UDLA_End_Of_Line); + Report.Failed("Mode_Error not raised by Look_Ahead"); + Report.Comment("This char should never be printed: " & UDLA_Char); + exception + when Mode_Error => null; -- OK, expected exception. + when The_Error : others => + Report.Failed ("The following exception was raised during the " & + "check that Look_Ahead raised Mode_Error when " & + "provided a file object that is not in In_File " & + "mode: " & Exception_Name(The_Error)); + end; + + begin + Get_Immediate(User_Defined_Input_File, UDGI_Char); + Report.Failed("Mode_Error not raised by Get_Immediate"); + Report.Comment("This char should never be printed: " & UDGI_Char); + exception + when Mode_Error => null; -- OK, expected exception. + when The_Error : others => + Report.Failed ("The following exception was raised during the " & + "check that Get_Immediate raised Mode_Error " & + "when provided a file object that is not in " & + "In_File mode: " & Exception_Name(The_Error)); + end; + + + -- The file will then be reset to In_File mode to properly function as + -- a source of input. + + Reset1: + begin + Reset (User_Defined_Input_File, In_File); + exception + when Ada.Text_IO.Use_Error => + Report.Not_Applicable + ( "Reset to In_File not supported for Text_IO" ); + raise No_Reset; + end Reset1; + + -- Process the input file, exercising various Text_IO + -- functionality, and validating the results at each step. + -- Note: The designated File_Access object is used in processing + -- the New_Default_Input_File in the second loop below. + + -- Process characters in first line of text of each file. + + Char_Pos := 1; + + -- Check that the first line is not blank. + + Look_Ahead(User_Defined_Input_File, UDLA_Char, UDLA_End_Of_Line); + + while not UDLA_End_Of_Line loop + + -- Use the Get_Immediate procedure on the file to get the next + -- available character on the current line. + + Get_Immediate(User_Defined_Input_File, UDGI_Char); + + -- Check that the characters returned by both procedures are the + -- same, and that they match the expected character from the file. + + if UDLA_Char /= TC_String_Ptr_Array(1).all(Char_Pos) or + UDGI_Char /= TC_String_Ptr_Array(1).all(Char_Pos) + then + Report.Failed("Incorrect retrieval of character " & + Integer'Image(Char_Pos) & " of first string"); + end if; + + -- Increment the character position counter. + Char_Pos := Char_Pos + 1; + + -- Check the next character on the line. If at the end of line, + -- the processing flow will exit the While loop. + + Look_Ahead(User_Defined_Input_File, UDLA_Char, UDLA_End_Of_Line); + + end loop; + + -- Check to ensure that the "end of line" results returned from the + -- Look_Ahead procedure (used to exit the above While loop) corresponds + -- with the result of Function End_Of_Line. + + if not End_Of_Line(User_Defined_Input_File) + then + Report.Failed("Result of procedure Look_Ahead that indicated " & + "being at the end of the line does not correspond " & + "with the result of function End_Of_Line"); + end if; + + -- Check that all characters in the string were processed. + + if Char_Pos-1 /= TC_String_1'Length then + Report.Failed("Not all of the characters on the first line " & + "were processed"); + end if; + + + -- Call procedure Skip_Line to advance beyond the end of the first line. + + Skip_Line(User_Defined_Input_File); + + + -- Process the second line in the file (a blank line). + + Look_Ahead(User_Input_Ptr.all, UDLA_Char, UDLA_End_Of_Line); + + if not UDLA_End_Of_Line then + Report.Failed("Incorrect end of line determination from procedure " & + "Look_Ahead when processing a blank line"); + end if; + + -- Call procedure Skip_Line to advance beyond the end of the second line. + + Skip_Line(User_Input_Ptr.all); + + + -- Process characters in the third line of the file (second line + -- of text) + -- Note: The version of Get_Immediate used in processing this line has + -- the Boolean parameter Available. + + Char_Pos := 1; + + -- Check whether the line is blank (i.e., at end of line, page, or file). + + Look_Ahead(User_Input_Ptr.all, UDLA_Char, UDLA_End_Of_Line); + + while not UDLA_End_Of_Line loop + + -- Use the Get_Immediate procedure on the file to get access to the + -- next character on the current line. + + Get_Immediate(User_Input_Ptr.all, UDGI_Char, UDGI_Available); + + -- Check that the Available parameter of Get_Immediate was set + -- to indicate that a character was available in the file. + -- Check that the characters returned by both procedures are the + -- same, and they all match the expected character from the file. + + if not UDGI_Available or + UDLA_Char /= TC_String_Ptr_Array(2).all(Char_Pos) or + UDGI_Char /= TC_String_Ptr_Array(2).all(Char_Pos) + then + Report.Failed("Incorrect retrieval of character " & + Integer'Image(Char_Pos) & " of second string"); + end if; + + -- Increment the character position counter. + + Char_Pos := Char_Pos + 1; + + -- Check the next character on the line. If at the end of line, + -- the processing flow will exit the While loop. + + Look_Ahead(User_Input_Ptr.all, UDLA_Char, UDLA_End_Of_Line); + + end loop; + + -- Check to ensure that the "end of line" results returned from the + -- Look_Ahead procedure (used to exit the above While loop) corresponds + -- with the result of Function End_Of_Line. + + if not End_Of_Line(User_Defined_Input_File) + then + Report.Failed("Result of procedure Look_Ahead that indicated " & + "being at the end of the line does not correspond " & + "with the result of function End_Of_Line"); + end if; + + -- Check that all characters in the second string were processed. + + if Char_Pos-1 /= TC_String_2'Length then + Report.Failed("Not all of the characters on the second line " & + "were processed"); + end if; + + + Deletion: + begin + -- Delete the user defined file. + + if Is_Open(User_Defined_Input_File) then + Delete(User_Defined_Input_File); + else + Open(User_Defined_Input_File, Out_File, Report.Legal_File_Name(1)); + Delete(User_Defined_Input_File); + end if; + exception + when others => + Report.Failed + ( "Delete not properly implemented for Text_IO" ); + end Deletion; + + + exception + + when No_Reset => + null; + + when Non_Applicable_System => + Report.Not_Applicable("System not capable of supporting external " & + "text files -- Name_Error/Use_Error raised " & + "during text file creation"); + when The_Error : others => + Report.Failed ("The following exception was raised in the " & + "Test_Block: " & Exception_Name(The_Error)); + end Test_Block; + + Report.Result; + +end CXAA017; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxaa018.a b/gcc/testsuite/ada/acats/tests/cxa/cxaa018.a new file mode 100644 index 000000000..53b16fea4 --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxaa018.a @@ -0,0 +1,277 @@ +-- CXAA018.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 subprograms defined in the package Text_IO.Modular_IO +-- provide correct results. +-- +-- TEST DESCRIPTION: +-- This test checks that the subprograms defined in the +-- Ada.Text_IO.Modular_IO package provide correct results. +-- A modular type is defined and used to instantiate the generic +-- package Ada.Text_IO.Modular_IO. Values of the modular type are +-- written to a Text_IO file, and to a series of string variables, using +-- different versions of the procedure Put from the instantiated IO +-- package. These modular data items are retrieved from the file and +-- string variables using the appropriate instantiated version of +-- procedure Get. A variety of Base and Width parameter values are +-- used in the procedure calls. +-- +-- APPLICABILITY CRITERIA: +-- This test is applicable to all implementations that support Text_IO +-- processing and external files. +-- +-- +-- CHANGE HISTORY: +-- 03 Jul 95 SAIC Initial prerelease version. +-- 01 May 96 SAIC Incorporated reviewer comments for ACVC 2.1. +-- +--! + +with Ada.Text_IO; +with System; +with Report; + +procedure CXAA018 is +begin + + Report.Test ("CXAA018", "Check that the subprograms defined in " & + "the package Text_IO.Modular_IO provide " & + "correct results"); + + Test_for_Text_IO_Support: + declare + Data_File : Ada.Text_IO.File_Type; + Data_Filename : constant String := Report.Legal_File_Name; + begin + + -- An application creates a text file in mode Out_File, with the + -- intention of entering modular data into the file as appropriate. + -- In the event that the particular environment where the application + -- is running does not support Text_IO, Use_Error or Name_Error will be + -- raised on calls to Text_IO operations. Either of these exceptions + -- will be handled to produce a Not_Applicable result. + + Ada.Text_IO.Create (File => Data_File, + Mode => Ada.Text_IO.Out_File, + Name => Data_Filename); + + Test_Block: + declare + + type Mod_Type is mod System.Max_Binary_Modulus; + -- Max_Binary_Modulus must be at least 2**16, which would result + -- in a base range of 0..65535 (zero to one less than the given + -- modulus) for this modular type. + + package Mod_IO is new Ada.Text_IO.Modular_IO(Mod_Type); + use Ada.Text_IO, Mod_IO; + use type Mod_Type; + + Number_Of_Modular_Items : constant := 6; + Number_Of_Error_Items : constant := 1; + + TC_Modular : Mod_Type; + TC_Last_Character_Read : Positive; + + Modular_Array : array (1..Number_Of_Modular_Items) of Mod_Type := + ( 0, 97, 255, 1025, 12097, 65535 ); + + + procedure Load_File (The_File : in out Ada.Text_IO.File_Type) is + begin + -- This procedure does not create, open, or close the data file; + -- The_File file object must be Open at this point. + -- This procedure is designed to load Modular_Type data into a + -- data file. + -- + -- Use the Modular_IO procedure Put to enter modular data items + -- into the data file. + + for i in 1..Number_Of_Modular_Items loop + -- Use default Base parameter of 10. + Mod_IO.Put(File => Data_File, + Item => Modular_Array(i), + Width => 6, + Base => Mod_IO.Default_Base); + end loop; + + -- Enter data into the file such that on the corresponding "Get" + -- of this data, Data_Error must be raised. This value is outside + -- the base range of Modular_Type. + -- Text_IO is used to enter the value in the file. + + for i in 1..Number_Of_Error_Items loop + Ada.Text_IO.Put(The_File, "-10"); + end loop; + + end Load_File; + + + + procedure Process_File(The_File : in out Ada.Text_IO.File_Type) is + begin + -- This procedure does not create, open, or close the data file; + -- The_File file object must be Open at this point. + -- Use procedure Get (for Files) to extract the modular data from + -- the Text_IO file. + + for i in 1..Number_Of_Modular_Items loop + Mod_IO.Get(The_File, TC_Modular, Width => 6); + + if TC_Modular /= Modular_Array(i) then + Report.Failed("Incorrect modular data read from file " & + "data item #" & Integer'Image(i)); + end if; + end loop; + + -- The final item in the Data_File is a modular value that is + -- outside the base range 0..Num'Last. This value should raise + -- Data_Error on an attempt to "Get" it from the file. + + for i in 1..Number_Of_Error_Items loop + begin + Mod_IO.Get(The_File, TC_Modular, Mod_IO.Default_Width); + Report.Failed + ("Exception Data_Error not raised when Get " & + "was used to read modular data outside base " & + "range of type, item # " & + Integer'Image(i)); + exception + when Ada.Text_IO.Data_Error => + null; -- OK, expected exception. + when others => + Report.Failed("Unexpected exception raised when Get " & + "was used to read modular data outside " & + "base range of type from Data_File, " & + "data item #" & Integer'Image(i)); + end; + end loop; + + exception + when others => + Report.Failed + ("Unexpected exception raised in Process_File"); + end Process_File; + + + + begin -- Test_Block. + + -- Place modular values into data file. + + Load_File(Data_File); + Ada.Text_IO.Close(Data_File); + + -- Read modular values from data file. + + Ada.Text_IO.Open(Data_File, Ada.Text_IO.In_File, Data_Filename); + Process_File(Data_File); + + -- Verify versions of Modular_IO procedures Put and Get for Strings. + + Modular_IO_in_Strings: + declare + TC_String_Array : array (1..Number_Of_Modular_Items) + of String(1..30) := (others =>(others => ' ')); + begin + + -- Place modular values into strings using the Procedure Put, + -- Use a variety of different "Base" parameter values. + -- Note: This version of Put uses the length of the given + -- string as the value of the "Width" parameter. + + for i in 1..2 loop + Mod_IO.Put(To => TC_String_Array(i), + Item => Modular_Array(i), + Base => Mod_IO.Default_Base); + end loop; + for i in 3..4 loop + Mod_IO.Put(TC_String_Array(i), + Modular_Array(i), + Base => 2); + end loop; + for i in 5..6 loop + Mod_IO.Put(TC_String_Array(i), Modular_Array(i), 16); + end loop; + + -- Get modular values from strings using the Procedure Get. + -- Compare with expected modular values. + + for i in 1..Number_Of_Modular_Items loop + + Mod_IO.Get(From => TC_String_Array(i), + Item => TC_Modular, + Last => TC_Last_Character_Read); + + if TC_Modular /= Modular_Array(i) then + Report.Failed("Incorrect modular data value obtained " & + "from String following use of Procedures " & + "Put and Get from Strings, Modular_Array " & + "item #" & Integer'Image(i)); + end if; + end loop; + + exception + when others => + Report.Failed("Unexpected exception raised during the " & + "evaluation of Put and Get for Strings"); + end Modular_IO_in_Strings; + + exception + when others => Report.Failed ("Exception raised in Test_Block"); + end Test_Block; + + + -- Delete the external file. + if Ada.Text_IO.Is_Open(Data_File) then + Ada.Text_IO.Delete(Data_File); + else + Ada.Text_IO.Open(Data_File, + Ada.Text_IO.In_File, + Data_Filename); + Ada.Text_IO.Delete(Data_File); + end if; + + exception + + -- Since Use_Error can be raised if, for the specified mode, + -- the environment does not support Text_IO operations, the + -- following handlers are included: + + when Ada.Text_IO.Use_Error => + Report.Not_Applicable ("Use_Error raised on Text_IO Create"); + + when Ada.Text_IO.Name_Error => + Report.Not_Applicable ("Name_Error raised on Text_IO Create"); + + when others => + Report.Failed ("Unexpected exception raised on text file Create"); + + end Test_for_Text_IO_Support; + + Report.Result; + +end CXAA018; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxaa019.a b/gcc/testsuite/ada/acats/tests/cxa/cxaa019.a new file mode 100644 index 000000000..04c257e97 --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxaa019.a @@ -0,0 +1,138 @@ +-- CXAA019.A +-- +-- Grant of Unlimited Rights +-- +-- The Ada Conformity Assessment Authority (ACAA) holds unlimited +-- rights in the software and documentation contained herein. Unlimited +-- rights are the same as those granted by the U.S. Government for older +-- parts of the Ada Conformity Assessment Test Suite, and are defined +-- in DFAR 252.227-7013(a)(19). By making this public release, the ACAA +-- intends to confer upon all recipients unlimited rights equal to those +-- held by the ACAA. 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 Standard_Output can be flushed. Check that 'in' parameters of +-- types Ada.Text_IO.File_Type and Ada.Streams.Stream_IO.File_Type can be +-- flushed. (Defect Report 8652/0051). +-- +-- CHANGE HISTORY: +-- 12 FEB 2001 PHL Initial version +-- 16 MAR 2001 RLB Readied for release; fixed Not_Applicable check +-- to terminate test gracefully. +-- +--! +with Ada.Streams.Stream_Io; +use Ada.Streams; +with Ada.Text_Io; +with Ada.Wide_Text_Io; +with Report; +use Report; +procedure CXAA019 is + + procedure Check (File : in Ada.Text_Io.File_Type) is + begin + Ada.Text_Io.Put_Line + (File, " - CXAA019 About to flush a Text_IO file passed " & + "as 'in' parameter"); + Ada.Text_Io.Flush (File); + end Check; + + procedure Check (File : in Ada.Wide_Text_Io.File_Type) is + begin + Ada.Wide_Text_Io.Put_Line + (File, " - CXAA019 About to flush a Wide_Text_IO file passed " & + "as 'in' parameter"); + Ada.Wide_Text_Io.Flush (File); + end Check; + + procedure Check (File : in Stream_Io.File_Type) is + S : Stream_Element_Array (1 .. 10); + begin + for I in S'Range loop + S (I) := Stream_Element (Character'Pos ('A') + I); + end loop; + Stream_Io.Write (File, S); + Comment ("About to flush a Stream_IO file passed as 'in' parameter"); + Stream_Io.Flush (File); + end Check; + + +begin + Test ("CXAA019", + "Check that Standard_Output can be flushed; check that " & + "'in' Ada.Text_IO.File_Type and Ada.Streams.Stream_IO.File_Type" & + "parameters can be flushed"); + + Ada.Text_Io.Put_Line (Ada.Text_Io.Standard_Output, + " - CXAA019 About to flush Standard_Output"); + Ada.Text_Io.Flush (Ada.Text_Io.Standard_Output); + + Check (Ada.Text_Io.Current_Output); + + declare + TC_OK : Boolean := False; + F : Ada.Text_Io.File_Type; + begin + begin + Ada.Text_Io.Create (F, Name => Legal_File_Name (X => 1)); + TC_OK := True; + exception + when others => + Not_Applicable ("Unable to create Out mode Text_IO file"); + end; + if TC_OK then + Check (F); + Ada.Text_Io.Delete (F); + end if; + end; + + declare + TC_OK : Boolean := False; + F : Ada.Wide_Text_Io.File_Type; + begin + begin + Ada.Wide_Text_Io.Create (F, Name => Legal_File_Name (X => 2)); + TC_OK := True; + exception + when others => + Not_Applicable ("Unable to create Out mode Wide_Text_IO file"); + end; + if TC_OK then + Check (F); + Ada.Wide_Text_Io.Delete (F); + end if; + end; + + declare + TC_OK : Boolean := False; + F : Stream_Io.File_Type; + begin + begin + Stream_Io.Create (F, Name => Legal_File_Name (X => 3)); + TC_OK := True; + exception + when others => + Not_Applicable ("Unable to create Out mode Stream_IO file"); + end; + if TC_OK then + Check (F); + Stream_Io.Delete (F); + end if; + end; + + Result; +end CXAA019; + diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxab001.a b/gcc/testsuite/ada/acats/tests/cxa/cxab001.a new file mode 100644 index 000000000..483acd16c --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxab001.a @@ -0,0 +1,272 @@ +-- CXAB001.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 operations defined in package Wide_Text_IO allow for +-- the input/output of Wide_Character and Wide_String data. +-- +-- TEST DESCRIPTION: +-- This test is designed to exercise the components of the Wide_Text_IO +-- package, including the Put/Get utilities for Wide_Characters and +-- Wide_String objects. +-- The test utilizes the Put and Get procedures defined for +-- Wide_Characters, as well as the Put, Get, Put_Line, and Get_Line +-- procedures defined for Wide_Strings. In addition, many of the +-- additional subprograms found in package Wide_Text_IO are used in this +-- test. +-- +-- APPLICABILITY CRITERIA: +-- This test is applicable to all implementations capable of supporting +-- external Wide_Text_IO files. +-- +-- +-- CHANGE HISTORY: +-- 06 Dec 94 SAIC ACVC 2.0 +-- 26 Feb 97 CTA.PWB Allowed for non-support of some IO operations. +--! + +with Ada.Wide_Text_IO; +with Report; + +procedure CXAB001 is + + Filter_File : Ada.Wide_Text_IO.File_Type; + Filter_Filename : constant String := + Report.Legal_File_Name ( Nam => "CXAB001" ); + Incomplete : exception; + + +begin + + Report.Test ("CXAB001", "Check that the operations defined in package " & + "Wide_Text_IO allow for the input/output of " & + "Wide_Character and Wide_String data"); + + + Test_for_Wide_Text_IO_Support: + begin + + -- An implementation that does not support Wide_Text_IO in a particular + -- environment will raise Use_Error on calls to various + -- Wide_Text_IO operations. This block statement encloses a call to + -- Create, which should raise an exception in a non-supportive + -- environment. This exception will be handled to produce a + -- Not_Applicable result. + + Ada.Wide_Text_IO.Create (File => Filter_File, -- Create. + Mode => Ada.Wide_Text_IO.Out_File, + Name => Filter_Filename); + + exception + + when Ada.Wide_Text_IO.Use_Error | Ada.Wide_Text_IO.Name_Error => + Report.Not_Applicable + ( "Files not supported - Create as Out_File for Wide_Text_IO" ); + raise Incomplete; + + end Test_for_Wide_Text_IO_Support; + + Operational_Test_Block: + declare + + First_String : constant Wide_String := "Somewhere "; + Second_String : constant Wide_String := "Over The "; + Third_String : constant Wide_String := "Rainbow"; + Current_Char : Wide_Character := ' '; + + begin + + Enter_Data_In_File: + declare + Pos : Natural := 1; + Bad_Character_Found : Boolean := False; + begin + -- Use the Put procedure defined for Wide_Character data to + -- write all of the wide characters of the First_String into + -- the file individually, followed by a call to New_Line. + + while Pos <= First_String'Length loop + Ada.Wide_Text_IO.Put (Filter_File, First_String (Pos)); -- Put. + Pos := Pos + 1; + end loop; + Ada.Wide_Text_IO.New_Line (Filter_File); -- New_Line. + + -- Reset to In_File mode and read file contents, using the Get + -- procedure defined for Wide_Character data. + Reset1: + begin + Ada.Wide_Text_IO.Reset (Filter_File, -- Reset. + Ada.Wide_Text_IO.In_File); + exception + when Ada.Wide_Text_IO.Use_Error => + Report.Not_Applicable + ( "Reset to In_File not supported for Wide_Text_IO" ); + raise Incomplete; + end Reset1; + + Pos := 1; + while Pos <= First_String'Length loop + Ada.Wide_Text_IO.Get (Filter_File, Current_Char); -- Get. + -- Verify the wide character against the original string. + if Current_Char /= First_String(Pos) then + Bad_Character_Found := True; + end if; + Pos := Pos + 1; + end loop; + + if Bad_Character_Found then + Report.Failed ("Incorrect Wide_Character read from file - 1"); + end if; + + -- Following user file/string processing, the Wide_String data + -- of the Second_String and Third_String Wide_String objects are + -- appended to the file. + -- The Put procedure defined for Wide_String data is used to + -- transfer the Second_String, followed by a call to New_Line. + -- The Put_Line procedure defined for Wide_String data is used + -- to transfer the Third_String. + Reset2: + begin + Ada.Wide_Text_IO.Reset (Filter_File, -- Reset. + Ada.Wide_Text_IO.Append_File); + + exception + when Ada.Wide_Text_IO.Use_Error => + Report.Not_Applicable + ( "Reset to Append_File not supported for Wide_Text_IO" ); + raise Incomplete; + end Reset2; + + Ada.Wide_Text_IO.Put (Filter_File, Second_String); -- Put. + Ada.Wide_Text_IO.New_Line (Filter_File); -- New_Line. + + Ada.Wide_Text_IO.Put_Line (Filter_File, Third_String); -- Put_Line. + Ada.Wide_Text_IO.Close (Filter_File); -- Close. + + exception + + when Incomplete => + raise; + + when others => + Report.Failed ("Exception in Enter_Data_In_File block"); + raise; + + end Enter_Data_In_File; + + --- + + Filter_Block: + declare + + Pos : Positive := 1; + TC_String2 : Wide_String (1..Second_String'Length); + TC_String3 : Wide_String (1..Third_String'Length); + Last : Natural := Natural'First; + + begin + + Ada.Wide_Text_IO.Open (Filter_File, -- Open. + Ada.Wide_Text_IO.In_File, + Filter_Filename); + + + -- Read the data of the First_String from the file, using the + -- Get procedure defined for Wide_Character data. + -- Verify that the character corresponds to the data originally + -- written to the file. + + while Pos <= First_String'Length loop + Ada.Wide_Text_IO.Get (Filter_File, Current_Char); -- Get. + if Current_Char /= First_String(Pos) then + Report.Failed + ("Incorrect Wide_Character read from file - 2"); + end if; + Pos := Pos + 1; + end loop; + + -- The first line of the file has been read, move to the second. + Ada.Wide_Text_IO.Skip_Line (Filter_File); -- Skip_Line. + + -- Read the Wide_String data from the second and third lines of + -- the file. + Ada.Wide_Text_IO.Get (Filter_File, TC_String2); -- Get. + Ada.Wide_Text_IO.Skip_Line (Filter_File); -- Skip_Line. + Ada.Wide_Text_IO.Get_Line (Filter_File, -- Get_Line. + TC_String3, Last); + + -- Verify data of second and third strings. + if TC_String2 /= Second_String then + Report.Failed ("Incorrect Wide_String read from file - 1"); + end if; + if TC_String3 /= Third_String then + Report.Failed ("Incorrect Wide_String read from file - 2"); + end if; + + -- The file should now be at EOF. + if not Ada.Wide_Text_IO.End_Of_File (Filter_File) then -- EOF. + Report.Failed ("File not empty following filtering"); + end if; + + exception + when others => + Report.Failed ("Exception in Filter_Block"); + raise; + end Filter_Block; + + exception + + when Incomplete => + raise; + when others => + Report.Failed ("Exception raised in Operational Test Block"); + + end Operational_Test_Block; + + Deletion: + begin + if Ada.Wide_Text_IO.Is_Open (Filter_File) then -- Is_Open. + Ada.Wide_Text_IO.Delete (Filter_File); -- Delete. + else + Ada.Wide_Text_IO.Open (Filter_File, -- Open. + Ada.Wide_Text_IO.Out_File, + Filter_Filename); + Ada.Wide_Text_IO.Delete (Filter_File); -- Delete. + end if; + exception + when others => + Report.Failed ("Delete not properly implemented for Wide_Text_IO"); + end Deletion; + + Report.Result; + +exception + when Incomplete => + Report.Result; + when others => + Report.Failed ( "Unexpected exception" ); + Report.Result; + +end CXAB001; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxac001.a b/gcc/testsuite/ada/acats/tests/cxa/cxac001.a new file mode 100644 index 000000000..a77d561f5 --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxac001.a @@ -0,0 +1,292 @@ +-- CXAC001.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 attribute T'Write will, for any specific non-limited +-- type T, write an item of the subtype to the stream. +-- +-- Check that the attribute T'Read will, for a specific non-limited +-- type T, read a value of the subtype from the stream. +-- +-- TEST DESCRIPTION: +-- The scenario depicted in this test is that of an environment where +-- product data is stored in stream form, then reconstructed into the +-- appropriate data structures. Several records of product information +-- are stored in an array; the array is passed as a parameter to a +-- procedure for storage in the stream. A header is created based on the +-- number of data records stored in the array. The header is then written +-- to the stream, followed by each record maintained in the array. +-- In order to retrieve data from the stream, the header information is +-- read from the stream, and the data stored in the header is used to +-- perform the appropriate number of read operations of record data from +-- the stream. All data read from the stream is validated against the +--- values that were written to the stream. +-- +-- APPLICABILITY CRITERIA: +-- Applicable to all systems capable of supporting IO operations on +-- external Stream_IO files. +-- +-- +-- CHANGE HISTORY: +-- 06 Dec 94 SAIC ACVC 2.0 +-- 08 Nov 95 SAIC Corrected call to Read in Procedure Retrieve_Data +-- for ACVC 2.0.1. +-- 27 Feb 08 PWB.CTA Allowed for non-support of certain IO operations. +--! + +with Ada.Streams.Stream_IO; +with Report; + +procedure CXAC001 is + + package Strm_Pack renames Ada.Streams.Stream_IO; + The_File : Strm_Pack.File_Type; + The_Filename : constant String := + Report.Legal_File_Name ( Nam => "CXAC001" ); + Incomplete : exception; + + +begin + + Report.Test ("CXAC001", "Check that the 'Read and 'Write attributes " & + "will transfer an object of a specific, " & + "non-limited type to/from a stream"); + + Test_for_Stream_IO_Support: + begin + + -- If an implementation does not support Stream_IO in a particular + -- environment, the exception Use_Error or Name_Error will be raised on + -- calls to various Stream_IO operations. This block statement + -- encloses a call to Create, which should produce an exception in a + -- non-supportive environment. These exceptions will be handled to + -- produce a Not_Applicable result. + + Strm_Pack.Create (The_File, Strm_Pack.Out_File, The_Filename); + + exception + + when Ada.Streams.Stream_IO.Use_Error | + Ada.Streams.Stream_IO.Name_Error => + Report.Not_Applicable + ( "Files not supported - Create as Out_File for Stream_IO" ); + raise Incomplete; + + end Test_for_Stream_IO_Support; + + Operational_Test_Block: + declare + + The_Stream : Strm_Pack.Stream_Access; + Todays_Date : String (1 .. 6) := "271193"; + + type ID_Type is range 1 .. 100; + type Size_Type is (Small, Medium, Large, XLarge); + + type Header_Type is record + Number_of_Elements : Natural := 0; + Origination_Date : String (1 .. 6); + end record; + + type Data_Type is record + ID : ID_Type; + Size : Size_Type; + end record; + + type Data_Array_Type is array (Positive range <>) of Data_Type; + + Product_Information_1 : Data_Array_Type (1 .. 3) := ((20, Large), + (55, Small), + (89, XLarge)); + + Product_Information_2 : Data_Array_Type (1 .. 4) := (( 5, XLarge), + (27, Small), + (79, Medium), + (93, XLarge)); + + procedure Store_Data ( The_Stream : in Strm_Pack.Stream_Access; + The_Array : in Data_Array_Type ) is + Header : Header_Type; + begin + + -- Fill in header info. + Header.Number_of_Elements := The_Array'Length; + Header.Origination_Date := Todays_Date; + + -- Write header to stream. + Header_Type'Write (The_Stream, Header); + + -- Write each record in the array to the stream. + for I in 1 .. Header.Number_of_Elements loop + Data_Type'Write (The_Stream, The_Array (I)); + end loop; + + end Store_Data; + + procedure Retrieve_Data (The_Stream : in Strm_Pack.Stream_Access; + The_Header : out Header_Type; + The_Array : out Data_Array_Type ) is + begin + + -- Read header from the stream. + Header_Type'Read (The_Stream, The_Header); + + -- Read the records from the stream into the array. + for I in 1 .. The_Header.Number_of_Elements loop + Data_Type'Read (The_Stream, The_Array (I)); + end loop; + + end Retrieve_Data; + + begin + + -- Assign access value. + The_Stream := Strm_Pack.Stream (The_File); + + -- Product information is to be stored in the stream file. These + -- data arrays are of different sizes (actually, the records + -- are stored individually, not as a single array). Prior to the + -- record data being written, a header record is initialized with + -- information about the data to be written, then itself is written + -- to the stream. + + Store_Data (The_Stream, Product_Information_1); + Store_Data (The_Stream, Product_Information_2); + + Test_Verification_Block: + declare + Product_Header_1 : Header_Type; + Product_Header_2 : Header_Type; + Product_Array_1 : Data_Array_Type (1 .. 3); + Product_Array_2 : Data_Array_Type (1 .. 4); + begin + + Reset1: + begin + Strm_Pack.Reset (The_File, Strm_Pack.In_File); + exception + when Ada.Streams.Stream_IO.Use_Error => + Report.Not_Applicable + ( "Reset to In_File not supported for Stream_IO" ); + raise Incomplete; + end Reset1; + + -- Data is read from the stream, first the appropriate header, + -- then the associated data records, which are then reconstructed + -- into a data array of product information. + + Retrieve_Data (The_Stream, Product_Header_1, Product_Array_1); + + -- Validate a field in the header. + if (Product_Header_1.Origination_Date /= Todays_Date) or + (Product_Header_1.Number_of_Elements /= 3) + then + Report.Failed ("Incorrect Header_1 info read from stream"); + end if; + + -- Validate the data records read from the file. + for I in 1 .. Product_Header_1.Number_of_Elements loop + if (Product_Array_1(I) /= Product_Information_1(I)) then + Report.Failed ("Incorrect Product 1 info read from" & + " record: " & Integer'Image (I)); + end if; + end loop; + + -- Repeat this read and verify operation for the next parcel of + -- data. Again, header and data record information are read from + -- the same stream file. + Retrieve_Data (The_Stream, Product_Header_2, Product_Array_2); + + if (Product_Header_2.Origination_Date /= Todays_Date) or + (Product_Header_2.Number_of_Elements /= 4) + then + Report.Failed ("Incorrect Header_2 info read from stream"); + end if; + + for I in 1 .. Product_Header_2.Number_of_Elements loop + if (Product_Array_2(I) /= Product_Information_2(I)) then + Report.Failed ("Incorrect Product_2 info read from" & + " record: " & Integer'Image (I)); + end if; + end loop; + + exception + + when Incomplete => + raise; + + when Strm_Pack.End_Error => -- If correct number of + -- items not in file (data + -- overwritten), then fail. + Report.Failed ("Incorrect number of record elements in file"); + if not Strm_Pack.Is_Open (The_File) then + Strm_Pack.Open (The_File, Strm_Pack.Out_File, The_Filename); + end if; + + when others => + Report.Failed ("Exception raised in Data Verification Block"); + if not Strm_Pack.Is_Open (The_File) then + Strm_Pack.Open (The_File, Strm_Pack.Out_File, The_Filename); + end if; + + end Test_Verification_Block; + + exception + + when Incomplete => + raise; + + when others => + Report.Failed ("Exception raised in Operational Test Block"); + + end Operational_Test_Block; + + Deletion: + begin + -- Delete the file. + if Strm_Pack.Is_Open (The_File) then + Strm_Pack.Delete (The_File); + else + Strm_Pack.Open (The_File, Strm_Pack.Out_File, The_Filename); + Strm_Pack.Delete (The_File); + end if; + + exception + + when others => + Report.Failed + ( "Delete not properly implemented for Stream_IO" ); + end Deletion; + + Report.Result; + +exception + when Incomplete => + Report.Result; + when others => + Report.Failed ( "Unexpected exception" ); + Report.Result; + +end CXAC001; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxac002.a b/gcc/testsuite/ada/acats/tests/cxa/cxac002.a new file mode 100644 index 000000000..e4b303c4b --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxac002.a @@ -0,0 +1,426 @@ +-- CXAC002.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 subprograms defined in package Ada.Streams.Stream_IO +-- are accessible, and that they provide the appropriate functionality. +-- +-- TEST DESCRIPTION: +-- This test simulates a user filter designed to capitalize the +-- characters of a string. It utilizes a variety of the subprograms +-- contained in the package Ada.Streams.Stream_IO. +-- Its purpose is to demonstrate the use of a variety of the capabilities +-- found in the Ada.Streams.Stream_IO package. +-- +-- APPLICABILITY CRITERIA: +-- This test is applicable to all implementations capable of supporting +-- external Stream_IO files. +-- +-- +-- CHANGE HISTORY: +-- 06 Dec 94 SAIC ACVC 2.0 +-- 14 Nov 95 SAIC Corrected visibility problems; corrected +-- subtest validating result from function Name +-- for ACVC 2.0.1. +-- 05 Oct 96 SAIC Removed calls to Close/Open in test and replaced +-- them with a single call to Reset (per AI95-0001) +-- 26 Feb 97 PWB.CTA Allowed for non-support of some IO operations. +-- 09 Feb 01 RLB Corrected non-support check to avoid unintended +-- failures. +--! + +package CXAC002_0 is + + -- This function searches for the first instance of a specified substring + -- within a specified string, returning boolean result. (Case insensitive + -- analysis) + + function Find (Str : in String; Sub : in String) return Boolean; + +end CXAC002_0; + +package body CXAC002_0 is + + function Find (Str : in String; Sub : in String) return Boolean is + + New_Str : String(Str'First..Str'Last); + New_Sub : String(Sub'First..Sub'Last); + Pos : Integer := Str'First; -- Character index. + + function Upper_Case (Str : in String) return String is + subtype Upper is Character range 'A'..'Z'; + subtype Lower is Character range 'a'..'z'; + Ret : String(Str'First..Str'Last); + Pos : Integer; + begin + for I in Str'Range loop + if (Str(I) in Lower) then + Pos := Upper'Pos(Upper'First) + + (Lower'Pos(Str(I)) - Lower'Pos(Lower'First)); + Ret(I) := Upper'Val(Pos); + else + Ret(I) := Str (I); + end if; + end loop; + return Ret; + end Upper_Case; + + begin + + New_Str := Upper_Case(Str); -- Convert Str and Sub to upper + New_Sub := Upper_Case(Sub); -- case for comparison. + + while (Pos <= New_Str'Last-New_Sub'Length+1) -- Search until no more + and then -- sub-string-length + (New_Str(Pos..Pos+New_Sub'Length-1) /= New_Sub) -- slices remain. + loop + Pos := Pos + 1; + end loop; + + if (Pos > New_Str'Last-New_Sub'Length+1) then -- Substring not found. + return False; + else + return True; + end if; + + end Find; + +end CXAC002_0; + + +with Ada.Streams.Stream_IO, CXAC002_0, Report; +procedure CXAC002 is + Filter_File : Ada.Streams.Stream_IO.File_Type; + Filter_Stream : Ada.Streams.Stream_IO.Stream_Access; + Filter_Filename : constant String := + Report.Legal_File_Name ( Nam => "CXAC002" ); + Incomplete : Exception; + +begin + + Report.Test ("CXAC002", "Check that the subprograms defined in " & + "package Ada.Streams.Stream_IO are accessible, " & + "and that they provide the appropriate " & + "functionality"); + + Test_for_Stream_IO_Support: + + begin + + -- If an implementation does not support Stream_IO in a particular + -- environment, the exception Use_Error or Name_Error will be raised on + -- calls to various Stream_IO operations. This block statement + -- encloses a call to Create, which should produce an exception in a + -- non-supportive environment. These exceptions will be handled to + -- produce a Not_Applicable result. + + Ada.Streams.Stream_IO.Create (Filter_File, -- Create. + Ada.Streams.Stream_IO.Out_File, + Filter_Filename); + exception + + when Ada.Streams.Stream_IO.Use_Error | Ada.Streams.Stream_IO.Name_Error => + Report.Not_Applicable + ( "Files not supported - Create as Out_File for Stream_IO" ); + raise Incomplete; + + end Test_for_Stream_IO_Support; + + Operational_Test_Block: + declare + + use CXAC002_0; + use type Ada.Streams.Stream_IO.File_Mode; + use type Ada.Streams.Stream_IO.Count; + + File_Size : Ada.Streams.Stream_IO.Count := -- Count. + Ada.Streams.Stream_IO.Count'First; -- (0) + File_Index : Ada.Streams.Stream_IO.Positive_Count := -- Pos. Count. + Ada.Streams.Stream_IO.Positive_Count'First; -- (1) + + First_String : constant String := "this is going to be "; + Second_String : constant String := "the best year of your life"; + Total_Length : constant Natural := First_String'Length + + Second_String'Length; + Current_Char : Character := ' '; + + Cap_String : String (1..Total_Length) := (others => ' '); + + TC_Capital_String : constant String := + "THIS IS GOING TO BE THE BEST YEAR OF YOUR LIFE"; + + begin + + if not Ada.Streams.Stream_IO.Is_Open (Filter_File) then -- Is_Open + Report.Failed ("File not open following Create"); + end if; + + -- Call function Find to determine if the filename (Sub) is contained + -- in the result of Function Name. + + if not Find(Str => Ada.Streams.Stream_IO.Name(Filter_File), -- Name. + Sub => Filter_Filename) + then + Report.Failed ("Function Name provided incorrect filename"); + end if; + -- Stream. + Filter_Stream := Ada.Streams.Stream_IO.Stream (Filter_File); + + --- + + Enter_Data_In_Stream: + declare + Pos : Natural := 1; + Bad_Character_Found : Boolean := False; + begin + + -- Enter data from the first string into the stream. + while Pos <= Natural(First_String'Length) loop + -- Write all characters of the First_String to the stream. + Character'Write (Filter_Stream, First_String (Pos)); + Pos := Pos + 1; + -- Ensure data put in file on a regular basis. + if Pos mod 5 = 0 then + Ada.Streams.Stream_IO.Flush (Filter_File); -- Flush. + end if; + end loop; + + Ada.Streams.Stream_IO.Flush (Filter_File); -- Flush. + -- Reset to In_File mode and read stream contents. + Reset1: + begin + Ada.Streams.Stream_IO.Reset (Filter_File, -- Reset. + Ada.Streams.Stream_IO.In_File); + exception + when Ada.Streams.Stream_IO.Use_Error => + Report.Not_Applicable + ( "Reset to In_File not supported for Stream_IO" ); + raise Incomplete; + end Reset1; + + Pos := 1; + while Pos <= First_String'Length loop + -- Read one character from the stream. + Character'Read (Filter_Stream, Current_Char); -- 'Read + -- Verify character against the original string. + if Current_Char /= First_String(Pos) then + Bad_Character_Found := True; + end if; + Pos := Pos + 1; + end loop; + + if Bad_Character_Found then + Report.Failed ("Incorrect character read from stream"); + end if; + + -- Following user stream/string processing, the stream file is + -- appended to as follows: + + Reset2: + begin + Ada.Streams.Stream_IO.Reset (Filter_File, -- Reset. + Ada.Streams.Stream_IO.Append_File); + exception + when Ada.Streams.Stream_IO.Use_Error => + Report.Not_Applicable + ( "Reset to Append_File not supported for Stream_IO" ); + raise Incomplete; + end Reset2; + + if Ada.Streams.Stream_IO.Mode (Filter_File) /= -- Mode. + Ada.Streams.Stream_IO.Append_File + then + Report.Failed ("Incorrect mode following Reset to Append"); + end if; + + Pos := 1; + while Pos <= Natural(Second_String'Length) loop + -- Write all characters of the Second_String to the stream. + Character'Write (Filter_Stream, Second_String (Pos)); -- 'Write + Pos := Pos + 1; + end loop; + + Ada.Streams.Stream_IO.Flush (Filter_File); -- Flush. + + -- Record file statistics. + File_Size := Ada.Streams.Stream_IO.Size (Filter_File); -- Size. + + Index_Might_Not_Be_Supported: + begin + File_Index := Ada.Streams.Stream_IO.Index (Filter_File); -- Index. + exception + when Ada.Streams.Stream_IO.Use_Error => + Report.Not_Applicable ( "Index not supported for Stream_IO" ); + raise Incomplete; + end Index_Might_Not_Be_Supported; + + exception + when Incomplete => + raise; + when others => + Report.Failed ("Exception in Enter_Data_In_Stream block"); + raise; + end Enter_Data_In_Stream; + + --- + + Filter_Block: + declare + Pos : Positive := 1; + Full_String : constant String := First_String & Second_String; + + function Capitalize (Char : Character) return Character is + begin + if Char /= ' ' then + return Character'Val( Character'Pos(Char) - + (Character'Pos('a') - Character'Pos('A'))); + else + return Char; + end if; + end Capitalize; + + begin + + Reset3: + begin + Ada.Streams.Stream_IO.Reset (Filter_File, -- Reset. + Ada.Streams.Stream_IO.In_File); + exception + when Ada.Streams.Stream_IO.Use_Error => + Report.Not_Applicable + ( "Reset to In_File not supported for Stream_IO" ); + raise Incomplete; + end Reset3; + + if Ada.Streams.Stream_IO.Mode (Filter_File) /= -- Mode. + Ada.Streams.Stream_IO.In_File + then + Report.Failed ("Incorrect mode following Reset to In_File"); + end if; + + if not Ada.Streams.Stream_IO.Is_Open (Filter_File) then -- Is_Open + Report.Failed ( "Reset command did not leave file open" ); + end if; + + if Ada.Streams.Stream_IO.Size (Filter_File) /= -- Size. + File_Size + then + Report.Failed ("Reset file is not correct size"); + end if; + + if Ada.Streams.Stream_IO.Index (Filter_File) /= 1 then -- Index. + -- File position should have been reset to start of file. + Report.Failed ("Index of file not set to 1 following Reset"); + end if; + + while Pos <= Full_String'Length loop + -- Read one character from the stream. + Character'Read (Filter_Stream, Current_Char); -- 'Read + -- Verify character against the original string. + if Current_Char /= Full_String(Pos) then + Report.Failed ("Incorrect character read from stream"); + else + -- Capitalize the characters read from the stream, and + -- place them in a string variable. + Cap_String(Pos) := Capitalize (Current_Char); + end if; + Pos := Pos + 1; + end loop; + + -- File index should now be set to the position following the final + -- character in the file (the same as the index value stored at + -- the completion of the Enter_Data_In_Stream block). + if Ada.Streams.Stream_IO.Index (Filter_File) /= -- Index. + File_Index + then + Report.Failed ("Incorrect file index position"); + end if; + + -- The stream file should now be at EOF. -- EOF. + if not Ada.Streams.Stream_IO.End_Of_File (Filter_File) then + Report.Failed ("File not empty following filtering"); + end if; + + exception + + when Incomplete => + raise; + when others => + Report.Failed ("Exception in Filter_Block"); + raise; + end Filter_Block; + + --- + + Verification_Block: + begin + + -- Verify that the entire string was examined, and that the + -- process of capitalizing the character data was successful. + if Cap_String /= TC_Capital_String then + Report.Failed ("Incorrect Capitalization"); + end if; + + exception + when others => + Report.Failed ("Exception in Verification_Block"); + end Verification_Block; + + + exception + + when Incomplete => + raise; + when others => + Report.Failed ("Exception raised in Operational Test Block"); + + end Operational_Test_Block; + + Deletion: + begin + if Ada.Streams.Stream_IO.Is_Open (Filter_File) then -- Is_Open. + Ada.Streams.Stream_IO.Delete (Filter_File); -- Delete. + else + Ada.Streams.Stream_IO.Open (Filter_File, -- Open. + Ada.Streams.Stream_IO.Out_File, + Filter_Filename); + Ada.Streams.Stream_IO.Delete (Filter_File); -- Delete. + end if; + exception + when others => + Report.Failed + ( "Delete not properly implemented for Stream_IO" ); + end Deletion; + + Report.Result; + +exception + when Incomplete => + Report.Result; + when others => + Report.Failed ( "Unexpected exception" ); + Report.Result; + +end CXAC002; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxac003.a b/gcc/testsuite/ada/acats/tests/cxa/cxac003.a new file mode 100644 index 000000000..cc1e044d0 --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxac003.a @@ -0,0 +1,376 @@ +-- CXAC003.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 correct exceptions are raised when improperly +-- manipulating stream file objects. +-- +-- TEST DESCRIPTION: +-- This test is designed to focus on Stream_IO file manipulation +-- exceptions. Several potentially common user errors are examined in +-- the test: +-- +-- A Status_Error should be raised whenever an attempt is made to perform +-- an operation on a file that is closed. +-- +-- A Status_Error should be raised when an attempt is made to open a +-- stream file that is currently open. +-- +-- A Mode_Error should be raised when attempting to read from (use the +-- 'Read attribute) on an Out_File or Append_Mode file. +-- +-- A Mode_Error should be raised when checking for End Of File on a +-- file with mode Out_File or Append_Mode. +-- +-- A Mode_Error should be raised when attempting to write to (use the +-- 'Output attribute) on a file with mode In_File. +-- +-- A Name_Error should be raised when the string provided to the Name +-- parameter of an Open operation does not allow association of an +-- external file. +-- +-- APPLICABILITY CRITERIA: +-- This test is applicable to all implementations capable of supporting +-- external Stream_IO files. +-- +-- +-- CHANGE HISTORY: +-- 06 Dec 94 SAIC ACVC 2.0 +-- 25 Feb 97 PWB.CTA Allowed for non-support of some IO operations +-- 02 Mar 01 PHL Check that Ada.Streams.Stream_IO.Stream raises +-- Status_Error if the file is not open. (DR 8652/ +-- 0056). +-- 15 Mar 01 RLB Readied for release. +--! + +with Ada.Streams.Stream_IO; +with Report; + +procedure CXAC003 is + + Stream_File_Object : Ada.Streams.Stream_IO.File_Type; + Stream_Access_Value : Ada.Streams.Stream_IO.Stream_Access; + Stream_Filename : constant String := + Report.Legal_File_Name ( Nam => "CXAC003" ); + Incomplete : exception; + +begin + + Report.Test ("CXAC003", "Check that the correct exceptions are " & + "raised when improperly manipulating stream " & + "file objects"); + + Test_for_Stream_IO_Support: + begin + -- If an implementation does not support Stream_IO in a particular + -- environment, the exception Use_Error or Name_Error will be raised on + -- calls to various Stream_IO operations. This block statement + -- encloses a call to Create, which should produce an exception in a + -- non-supportive environment. These exceptions will be handled to + -- produce a Not_Applicable result. + + Ada.Streams.Stream_IO.Create (Stream_File_Object, + Ada.Streams.Stream_IO.Out_File, + Stream_Filename); + + exception + + when Ada.Streams.Stream_IO.Use_Error | Ada.Streams.Stream_IO.Name_Error => + Report.Not_Applicable + ( "Files not supported - Create as Out_File for Stream_IO" ); + raise Incomplete; + + end Test_for_Stream_IO_Support; + + Operational_Test_Block: + begin + -- A potentially common error in a file processing environment + -- is to attempt to perform an operation on a stream file that is + -- not currently open. Status_Error should be raised in this case. + Check_Status_Error: + begin + Ada.Streams.Stream_IO.Close (Stream_File_Object); + -- Attempt to reset a file that is closed. + Ada.Streams.Stream_IO.Reset (Stream_File_Object, + Ada.Streams.Stream_IO.Out_File); + Report.Failed ("Exception not raised on Reset of closed file"); + exception + when Ada.Streams.Stream_IO.Status_Error => + null; + when others => + Report.Failed ("Incorrect exception raised - 1"); + end Check_Status_Error; + + -- A similar error is to use Ada.Streams.Stream_IO.Stream + -- to attempt to perform an operation on a stream file that is + -- not currently open. Status_Error should be raised in this case. + -- (Defect Report 8652/0046, as reflected in Technical Corrigendum 1.) + Check_Status_Error2: + begin + -- Ensure that the file is not open. + if Ada.Streams.Stream_Io.Is_Open (Stream_File_Object) then + Ada.Streams.Stream_Io.Close (Stream_File_Object); + end if; + Stream_Access_Value := + Ada.Streams.Stream_Io.Stream (Stream_File_Object); + Report.Failed ("Exception not raised on Stream of closed file"); + exception + when Ada.Streams.Stream_Io.Status_Error => + null; + when others => + Report.Failed ("Incorrect exception raised - 2"); + end Check_Status_Error2; + + -- Another potentially common error in a file processing environment + -- is to attempt to Open a stream file that is currently open. + -- Status_Error should be raised in this case. + Check_Status_Error3: + begin + -- Ensure that the file is open. + if not Ada.Streams.Stream_IO.Is_Open (Stream_File_Object) then + Ada.Streams.Stream_IO.Open (Stream_File_Object, + Ada.Streams.Stream_IO.In_File, + Stream_Filename); + end if; + Ada.Streams.Stream_IO.Open (Stream_File_Object, + Ada.Streams.Stream_IO.In_File, + Stream_Filename); + Report.Failed ("Exception not raised on Open of open file"); + exception + when Ada.Streams.Stream_IO.Status_Error => + null; + when others => + Report.Failed ("Incorrect exception raised - 3"); + end Check_Status_Error3; + + -- Another example of a potential error occurring in a file + -- processing environment is to attempt to use the 'Read attribute + -- on a stream file that is currently in Out_File or Append_File + -- mode. Mode_Error should be raised in both of these cases. + Check_Mode_Error: + declare + Int_Var : Integer := -10; + begin + + Reset1: + begin + Ada.Streams.Stream_IO.Reset (Stream_File_Object, + Ada.Streams.Stream_IO.Out_File); + exception + when Ada.Streams.Stream_IO.Use_Error => + Report.Not_Applicable + ( "Reset to Out_File not supported for Stream_IO - 1" ); + raise Incomplete; + end Reset1; + + Stream_Access_Value := + Ada.Streams.Stream_IO.Stream (Stream_File_Object); + Integer'Write (Stream_Access_Value, Int_Var); + + -- File contains an integer value, but is of mode Out_File. + Integer'Read (Stream_Access_Value, Int_Var); + Report.Failed ("Exception not raised by 'Read of Out_File"); + exception + when Incomplete => + raise; + when Ada.Streams.Stream_IO.Mode_Error => + null; + Try_Read: + begin + Reset2: + begin + Ada.Streams.Stream_IO.Reset + (Stream_File_Object, Ada.Streams.Stream_IO.Append_File); + exception + when Ada.Streams.Stream_IO.Use_Error => + Report.Not_Applicable + ( "Reset to Append_File not supported " & + "for Stream_IO - 2" ); + raise Incomplete; + end Reset2; + + Integer'Write (Stream_Access_Value, Int_Var); + -- Attempt read from Append_File mode file. + Integer'Read (Stream_Access_Value, Int_Var); + Report.Failed + ("Exception not raised by 'Read of Append file"); + exception + when Incomplete => + null; + when Ada.Streams.Stream_IO.Mode_Error => + null; + when others => + Report.Failed ("Incorrect exception raised - 4b"); + end Try_Read; + + when others => Report.Failed ("Incorrect exception raised - 4a"); + end Check_Mode_Error; + + -- Another example of a this type of potential error is to attempt + -- to check for End Of File on a stream file that is currently in + -- Out_File or Append_File mode. Mode_Error should also be raised + -- in both of these cases. + Check_End_File: + declare + Test_Boolean : Boolean := False; + begin + Reset3: + begin + Ada.Streams.Stream_IO.Reset (Stream_File_Object, + Ada.Streams.Stream_IO.Out_File); + exception + when Ada.Streams.Stream_IO.Use_Error => + Report.Not_Applicable + ( "Reset to Out_File not supported for Stream_IO - 3" ); + raise Incomplete; + end Reset3; + + Test_Boolean := + Ada.Streams.Stream_IO.End_Of_File (Stream_File_Object); + Report.Failed ("Exception not raised by EOF on Out_File"); + exception + when Incomplete => + null; + when Ada.Streams.Stream_IO.Mode_Error => + null; + EOF_For_Append_File: + begin + Reset4: + begin + Ada.Streams.Stream_IO.Reset + (Stream_File_Object, Ada.Streams.Stream_IO.Append_File); + exception + when Ada.Streams.Stream_IO.Use_Error => + Report.Not_Applicable + ( "Reset to Append_File not supported " & + "for Stream_IO - 4" ); + raise Incomplete; + end Reset4; + + Test_Boolean := + Ada.Streams.Stream_IO.End_Of_File (Stream_File_Object); + Report.Failed + ("Exception not raised by EOF of Append file"); + exception + when Incomplete => + raise; + when Ada.Streams.Stream_IO.Mode_Error => + null; + when others => + Report.Failed ("Incorrect exception raised - 5b"); + end EOF_For_Append_File; + + when others => Report.Failed ("Incorrect exception raised - 5a"); + end Check_End_File; + + + + -- In a similar situation to the above cases for attribute 'Read, + -- an attempt to use the 'Output attribute on a stream file that + -- is currently in In_File mode should result in Mode_Error being + -- raised. + Check_Output_Mode_Error: + begin + Reset5: + begin + Ada.Streams.Stream_IO.Reset (Stream_File_Object, + Ada.Streams.Stream_IO.In_File); + exception + when Ada.Streams.Stream_IO.Use_Error => + Report.Not_Applicable + ( "Reset to In_File not supported for Stream_IO - 6" ); + raise Incomplete; + end Reset5; + + Stream_Access_Value := + Ada.Streams.Stream_IO.Stream (Stream_File_Object); + String'Output (Stream_Access_Value, "User-Oriented String"); + Report.Failed ("Exception not raised by 'Output to In_File"); + exception + when Incomplete => + null; + when Ada.Streams.Stream_IO.Mode_Error => + null; + when others => + Report.Failed ("Incorrect exception raised - 6"); + end Check_Output_Mode_Error; + + -- Any case of attempting to Open a stream file with a string for + -- the parameter Name that does not allow the identification of an + -- external file will result in the exception Name_Error being + -- raised. + Check_Illegal_File_Name: + begin + if Ada.Streams.Stream_IO.Is_Open (Stream_File_Object) then + Ada.Streams.Stream_IO.Close (Stream_File_Object); + end if; + -- No external file exists with this filename, allowing no + -- association with an internal file object, resulting in the + -- raising of the exception Name_Error. + Ada.Streams.Stream_IO.Open(File => Stream_File_Object, + Mode => Ada.Streams.Stream_IO.Out_File, + Name => Report.Legal_File_Name(2)); + Report.Failed ("Exception not raised by bad filename on Open"); + exception + when Ada.Streams.Stream_IO.Name_Error => + null; + when others => + Report.Failed ("Incorrect exception raised - 7"); + end Check_Illegal_File_Name; + + exception + when Incomplete => + null; + when others => + Report.Failed ("Unexpected exception in Operational Test Block"); + + end Operational_Test_Block; + + Deletion: + begin + if Ada.Streams.Stream_IO.Is_Open (Stream_File_Object) then + Ada.Streams.Stream_IO.Delete (Stream_File_Object); + else + Ada.Streams.Stream_IO.Open (Stream_File_Object, + Ada.Streams.Stream_IO.Out_File, + Stream_Filename); + Ada.Streams.Stream_IO.Delete (Stream_File_Object); + end if; + exception + when others => + Report.Failed + ( "Delete not properly implemented for Stream_IO" ); + end Deletion; + + Report.Result; + +exception + when Incomplete => + Report.Result; + when others => + Report.Failed ( "Unexpected exception" ); + Report.Result; + +end CXAC003; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxac004.a b/gcc/testsuite/ada/acats/tests/cxa/cxac004.a new file mode 100644 index 000000000..9cc88b93c --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxac004.a @@ -0,0 +1,310 @@ +-- CXAC004.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 Stream_Access type and Stream function found in package +-- Ada.Text_IO.Text_Streams allows a text file to be processed with the +-- functionality of streams. +-- +-- TEST DESCRIPTION: +-- This test verifies that the package Ada.Text_IO.Text_Streams is +-- available and that the functionality it contains allows a text file to +-- be manipulated as a stream. +-- The test defines data objects of a variety of types that can be stored +-- in a text file. A text file and associated text stream are then +-- defined, and the 'Write attribute is used to enter the individual data +-- items into the text stream. Once all the individual data items have +-- been written to the stream, the 'Output attribute is used to write +-- arrays of these same data objects to the stream. +-- The text file is reset to serve as an input file, and the 'Read +-- attribute is used to extract the individual data items from the +-- stream. These items are then verified against the data originally +-- written to the stream. Finally, the 'Input attribute is used to +-- extract the data arrays from the stream. These arrays are then +-- verified against the original data written to the stream. +-- +-- APPLICABILITY CRITERIA: +-- Applicable to implementations that support external text files. +-- +-- CHANGE HISTORY: +-- 06 Jul 95 SAIC Initial prerelease version. +-- 26 Feb 97 PWB.CTA Allowed for non-support of some IO operations; +-- removed requirement for support of decimal types. +--! + +with Report; +with Ada.Text_IO; +with Ada.Text_IO.Text_Streams; +with Ada.Characters.Latin_1; +with Ada.Strings.Unbounded; + +procedure CXAC004 is + + Data_File : Ada.Text_IO.File_Type; + Data_Filename : constant String := + Report.Legal_File_Name ( Nam => "CXAC004" ); + Incomplete : exception; + +begin + + Report.Test ("CXAC004", "Check that the Stream_Access type and Stream " & + "function found in package " & + "Ada.Text_IO.Text_Streams allows a text file to " & + "be processed with the functionality of streams"); + + Test_for_IO_Support: + begin + + -- Check for Text_IO support in creating the data file. If the + -- implementation does not support external files, Name_Error or + -- Use_Error will be raised at the point of the following call to + -- Create, resulting in a Not_Applicable test result. + + Ada.Text_IO.Create(Data_File, Ada.Text_IO.Out_File, Data_Filename); + + exception + + when Ada.Text_IO.Use_Error | Ada.Text_IO.Name_Error => + Report.Not_Applicable + ( "Files not supported - Create as Out_File for Text_IO" ); + raise Incomplete; + + end Test_for_IO_Support; + + Test_Block: + declare + use Ada.Characters.Latin_1, Ada.Strings.Unbounded; + TC_Items : constant := 3; + + -- Declare types and objects that will be used as data values to be + -- written to and read from the text file/stream. + + type Enum_Type is (Red, Yellow, Green, Blue, Indigo); + type Fixed_Type is delta 0.125 range 0.0..255.0; + type Float_Type is digits 7 range 0.0..1.0E5; + type Modular_Type is mod 256; + subtype Str_Type is String(1..4); + + type Char_Array_Type is array (1..TC_Items) of Character; + type Enum_Array_Type is array (1..TC_Items) of Enum_Type; + type Fixed_Array_Type is array (1..TC_Items) of Fixed_Type; + type Float_Array_Type is array (1..TC_Items) of Float_Type; + type Int_Array_Type is array (1..TC_Items) of Integer; + type Mod_Array_Type is array (1..TC_Items) of Modular_Type; + type Str_Array_Type is array (1..TC_Items) of Str_Type; + type Unb_Str_Array_Type is array (1..TC_Items) of Unbounded_String; + + Char_Array : Char_Array_Type := ('A', 'z', Yen_Sign); + TC_Char_Array_1, + TC_Char_Array_2 : Char_Array_Type := (others => Space); + + Enum_Array : Enum_Array_Type := (Blue, Yellow, Indigo); + TC_Enum_Array_1, + TC_Enum_Array_2 : Enum_Array_Type := (others => Red); + + Fix_Array : Fixed_Array_Type := (0.125, 123.5, 250.750); + TC_Fix_Array_1, + TC_Fix_Array_2 : Fixed_Array_Type := (others => 0.0); + + Flt_Array : Float_Array_Type := (1.0, 150.0, 1500.0); + TC_Flt_Array_1, + TC_Flt_Array_2 : Float_Array_Type := (others => 0.0); + + Int_Array : Int_Array_Type := (124, 2349, -24_001); + TC_Int_Array_1, + TC_Int_Array_2 : Int_Array_Type := (others => -99); + + Mod_Array : Mod_Array_Type := (10, 127, 255); + TC_Mod_Array_1, + TC_Mod_Array_2 : Mod_Array_Type := (others => 0); + + Str_Array : Str_Array_Type := ("abcd", "klmn", "wxyz"); + TC_Str_Array_1, + TC_Str_Array_2 : Str_Array_Type := (others => " "); + + UStr_Array : Unb_Str_Array_Type := + (To_Unbounded_String("cat"), + To_Unbounded_String("testing"), + To_Unbounded_String("ACVC")); + TC_UStr_Array_1, + TC_UStr_Array_2 : Unb_Str_Array_Type := + (others => Null_Unbounded_String); + + -- Create a stream access object pointing to the data file. + + Data_Stream : Ada.Text_IO.Text_Streams.Stream_Access := + Ada.Text_IO.Text_Streams.Stream(File => Data_File); + + begin + + -- Use the 'Write attribute to enter the three sets of data items + -- into the data stream. + -- Note that the data will be mixed within the text file. + + for i in 1..TC_Items loop + Character'Write (Data_Stream, Char_Array(i)); + Enum_Type'Write (Data_Stream, Enum_Array(i)); + Fixed_Type'Write (Data_Stream, Fix_Array(i)); + Float_Type'Write (Data_Stream, Flt_Array(i)); + Integer'Write (Data_Stream, Int_Array(i)); + Modular_Type'Write (Data_Stream, Mod_Array(i)); + Str_Type'Write (Data_Stream, Str_Array(i)); + Unbounded_String'Write(Data_Stream, UStr_Array(i)); + end loop; + + -- Use the 'Output attribute to enter the entire arrays of each + -- type of data items into the data stream. + -- Note that the array bounds will be written to the stream as part + -- of the action of the 'Output attribute. + + Char_Array_Type'Output (Data_Stream, Char_Array); + Enum_Array_Type'Output (Data_Stream, Enum_Array); + Fixed_Array_Type'Output (Data_Stream, Fix_Array); + Float_Array_Type'Output (Data_Stream, Flt_Array); + Int_Array_Type'Output (Data_Stream, Int_Array); + Mod_Array_Type'Output (Data_Stream, Mod_Array); + Str_Array_Type'Output (Data_Stream, Str_Array); + Unb_Str_Array_Type'Output (Data_Stream, UStr_Array); + + -- Reset the data file to mode In_File. The data file will now serve + -- as the source of data which will be compared to the original data + -- written to the file above. + Reset1: + begin + Ada.Text_IO.Reset (File => Data_File, Mode => Ada.Text_IO.In_File); + exception + when Ada.Text_IO.Use_Error => + Report.Not_Applicable + ( "Reset to In_File not supported for Text_IO" ); + raise Incomplete; + end Reset1; + + -- Extract and validate all the single data items from the stream. + + for i in 1..TC_Items loop + Character'Read (Data_Stream, TC_Char_Array_1(i)); + Enum_Type'Read (Data_Stream, TC_Enum_Array_1(i)); + Fixed_Type'Read (Data_Stream, TC_Fix_Array_1(i)); + Float_Type'Read (Data_Stream, TC_Flt_Array_1(i)); + Integer'Read (Data_Stream, TC_Int_Array_1(i)); + Modular_Type'Read (Data_Stream, TC_Mod_Array_1(i)); + Str_Type'Read (Data_Stream, TC_Str_Array_1(i)); + Unbounded_String'Read (Data_Stream, TC_UStr_Array_1(i)); + end loop; + + if TC_Char_Array_1 /= Char_Array then + Report.Failed("Character values do not match"); + end if; + if TC_Enum_Array_1 /= Enum_Array then + Report.Failed("Enumeration values do not match"); + end if; + if TC_Fix_Array_1 /= Fix_Array then + Report.Failed("Fixed point values do not match"); + end if; + if TC_Flt_Array_1 /= Flt_Array then + Report.Failed("Floating point values do not match"); + end if; + if TC_Int_Array_1 /= Int_Array then + Report.Failed("Integer values do not match"); + end if; + if TC_Mod_Array_1 /= Mod_Array then + Report.Failed("Modular values do not match"); + end if; + if TC_Str_Array_1 /= Str_Array then + Report.Failed("String values do not match"); + end if; + if TC_UStr_Array_1 /= UStr_Array then + Report.Failed("Unbounded_String values do not match"); + end if; + + -- Extract and validate all data arrays from the data stream. + -- Note that the 'Input attribute denotes a function, whereas the + -- other stream oriented attributes in this test denote procedures. + + TC_Char_Array_2 := Char_Array_Type'Input(Data_Stream); + TC_Enum_Array_2 := Enum_Array_Type'Input(Data_Stream); + TC_Fix_Array_2 := Fixed_Array_Type'Input(Data_Stream); + TC_Flt_Array_2 := Float_Array_Type'Input(Data_Stream); + TC_Int_Array_2 := Int_Array_Type'Input(Data_Stream); + TC_Mod_Array_2 := Mod_Array_Type'Input(Data_Stream); + TC_Str_Array_2 := Str_Array_Type'Input(Data_Stream); + TC_UStr_Array_2 := Unb_Str_Array_Type'Input(Data_Stream); + + if TC_Char_Array_2 /= Char_Array then + Report.Failed("Character array values do not match"); + end if; + if TC_Enum_Array_2 /= Enum_Array then + Report.Failed("Enumeration array values do not match"); + end if; + if TC_Fix_Array_2 /= Fix_Array then + Report.Failed("Fixed point array values do not match"); + end if; + if TC_Flt_Array_2 /= Flt_Array then + Report.Failed("Floating point array values do not match"); + end if; + if TC_Int_Array_2 /= Int_Array then + Report.Failed("Integer array values do not match"); + end if; + if TC_Mod_Array_2 /= Mod_Array then + Report.Failed("Modular array values do not match"); + end if; + if TC_Str_Array_2 /= Str_Array then + Report.Failed("String array values do not match"); + end if; + if TC_UStr_Array_2 /= UStr_Array then + Report.Failed("Unbounded_String array values do not match"); + end if; + + exception + when Incomplete => + raise; + when others => Report.Failed ("Exception raised in Test_Block"); + end Test_Block; + + Deletion: + begin + -- Delete the data file. + if not Ada.Text_IO.Is_Open(Data_File) then + Ada.Text_IO.Open(Data_File, Ada.Text_IO.In_File, Data_Filename); + end if; + Ada.Text_IO.Delete(Data_File); + + exception + when others => + Report.Failed + ( "Delete not properly implemented for Text_IO" ); + + end Deletion; + + Report.Result; + +exception + when Incomplete => + Report.Result; + when others => + Report.Failed ( "Unexpected exception" ); + Report.Result; + +end CXAC004; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxac005.a b/gcc/testsuite/ada/acats/tests/cxa/cxac005.a new file mode 100644 index 000000000..34a971f7a --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxac005.a @@ -0,0 +1,343 @@ +-- CXAC005.A +-- +-- Grant of Unlimited Rights +-- +-- The Ada Conformity Assessment Authority (ACAA) holds unlimited +-- rights in the software and documentation contained herein. Unlimited +-- rights are the same as those granted by the U.S. Government for older +-- parts of the Ada Conformity Assessment Test Suite, and are defined +-- in DFAR 252.227-7013(a)(19). By making this public release, the ACAA +-- intends to confer upon all recipients unlimited rights equal to those +-- held by the ACAA. 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 stream file positioning work as specified. (Defect Report +-- 8652/0055). +-- +-- CHANGE HISTORY: +-- 12 FEB 2001 PHL Initial version. +-- 14 MAR 2001 RLB Readied for release; fixed Not_Applicable check +-- to terminate test gracefully. +-- +--! +with Ada.Streams.Stream_Io; +use Ada.Streams; +with Ada.Exceptions; +use Ada.Exceptions; +with Report; +use Report; +procedure CXAC005 is + + Incomplete : exception; + + procedure TC_Assert (Condition : Boolean; Message : String) is + begin + if not Condition then + Failed (Message); + end if; + end TC_Assert; + + package Checked_Stream_Io is + + type File_Type (Max_Size : Stream_Element_Count) is limited private; + function Stream_Io_File (File : File_Type) return Stream_Io.File_Type; + + procedure Create (File : in out File_Type; + Mode : in Stream_Io.File_Mode := Stream_Io.Out_File; + Name : in String := ""; + Form : in String := ""); + + procedure Open (File : in out File_Type; + Mode : in Stream_Io.File_Mode; + Name : in String; + Form : in String := ""); + + procedure Close (File : in out File_Type); + procedure Delete (File : in out File_Type); + + procedure Reset (File : in out File_Type; + Mode : in Stream_Io.File_Mode); + procedure Reset (File : in out File_Type); + + procedure Read (File : in out File_Type; + Item : out Stream_Element_Array; + Last : out Stream_Element_Offset; + From : in Stream_Io.Positive_Count); + + procedure Read (File : in out File_Type; + Item : out Stream_Element_Array; + Last : out Stream_Element_Offset); + + procedure Write (File : in out File_Type; + Item : in Stream_Element_Array; + To : in Stream_Io.Positive_Count); + + procedure Write (File : in out File_Type; + Item : in Stream_Element_Array); + + procedure Set_Index (File : in out File_Type; + To : in Stream_Io.Positive_Count); + + function Index (File : in File_Type) return Stream_Io.Positive_Count; + + procedure Set_Mode (File : in out File_Type; + Mode : in Stream_Io.File_Mode); + + private + type File_Type (Max_Size : Stream_Element_Count) is + record + File : Stream_Io.File_Type; + Index : Stream_Io.Positive_Count; + Contents : + Stream_Element_Array + (Stream_Element_Offset (Ident_Int (1)) .. Max_Size); + end record; + end Checked_Stream_Io; + + package body Checked_Stream_Io is + + use Stream_Io; + + function Stream_Io_File (File : File_Type) return Stream_Io.File_Type is + begin + return File.File; + end Stream_Io_File; + + procedure Create (File : in out File_Type; + Mode : in Stream_Io.File_Mode := Stream_Io.Out_File; + Name : in String := ""; + Form : in String := "") is + begin + Stream_Io.Create (File.File, Mode, Name, Form); + File.Index := Stream_Io.Index (File.File); + if Mode = Append_File then + TC_Assert (File.Index = Stream_Io.Size (File.File) + 1, + "Index /= Size + 1 -- Create - Append_File"); + else + TC_Assert (File.Index = 1, "Index /= 1 -- Create - " & + File_Mode'Image (Mode)); + end if; + end Create; + + procedure Open (File : in out File_Type; + Mode : in Stream_Io.File_Mode; + Name : in String; + Form : in String := "") is + begin + Stream_Io.Open (File.File, Mode, Name, Form); + File.Index := Stream_Io.Index (File.File); + if Mode = Append_File then + TC_Assert (File.Index = Stream_Io.Size (File.File) + 1, + "Index /= Size + 1 -- Open - Append_File"); + else + TC_Assert (File.Index = 1, "Index /= 1 -- Open - " & + File_Mode'Image (Mode)); + end if; + end Open; + + procedure Close (File : in out File_Type) is + begin + Stream_Io.Close (File.File); + end Close; + + procedure Delete (File : in out File_Type) is + begin + Stream_Io.Delete (File.File); + end Delete; + + procedure Reset (File : in out File_Type; + Mode : in Stream_Io.File_Mode) is + begin + Stream_Io.Reset (File.File, Mode); + File.Index := Stream_Io.Index (File.File); + if Mode = Append_File then + TC_Assert (File.Index = Stream_Io.Size (File.File) + 1, + "Index /= Size + 1 -- Reset - Append_File"); + else + TC_Assert (File.Index = 1, "Index /= 1 -- Reset - " & + File_Mode'Image (Mode)); + end if; + end Reset; + + procedure Reset (File : in out File_Type) is + begin + Reset (File, Stream_Io.Mode (File.File)); + end Reset; + + + procedure Read (File : in out File_Type; + Item : out Stream_Element_Array; + Last : out Stream_Element_Offset; + From : in Stream_Io.Positive_Count) is + begin + Set_Index (File, From); + Read (File, Item, Last); + end Read; + + procedure Read (File : in out File_Type; + Item : out Stream_Element_Array; + Last : out Stream_Element_Offset) is + Index : constant Stream_Element_Offset := + Stream_Element_Offset (File.Index); + begin + Stream_Io.Read (File.File, Item, Last); + if Last < Item'Last then + TC_Assert (Item (Item'First .. Last) = + File.Contents (Index .. Index + Last - Item'First), + "Incorrect data read from file - 1"); + TC_Assert (Count (Index + Last - Item'First) = + Stream_Io.Size (File.File), + "Read stopped before end of file"); + File.Index := Count (Index + Last - Item'First) + 1; + else + TC_Assert (Item = File.Contents (Index .. Index + Item'Length - 1), + "Incorrect data read from file - 2"); + File.Index := File.Index + Item'Length; + end if; + end Read; + + procedure Write (File : in out File_Type; + Item : in Stream_Element_Array; + To : in Stream_Io.Positive_Count) is + begin + Set_Index (File, To); + Write (File, Item); + end Write; + + procedure Write (File : in out File_Type; + Item : in Stream_Element_Array) is + Index : constant Stream_Element_Offset := + Stream_Element_Offset (File.Index); + begin + Stream_Io.Write (File.File, Item); + File.Contents (Index .. Index + Item'Length - 1) := Item; + File.Index := File.Index + Item'Length; + TC_Assert (File.Index = Stream_Io.Index (File.File), + "Write failed to move the index"); + end Write; + + procedure Set_Index (File : in out File_Type; + To : in Stream_Io.Positive_Count) is + begin + Stream_Io.Set_Index (File.File, To); + File.Index := Stream_Io.Index (File.File); + TC_Assert (File.Index = To, "Set_Index failed"); + end Set_Index; + + function Index (File : in File_Type) return Stream_Io.Positive_Count is + New_Index : constant Count := Stream_Io.Index (File.File); + begin + TC_Assert (New_Index = File.Index, "Index changed unexpectedly"); + return New_Index; + end Index; + + procedure Set_Mode (File : in out File_Type; + Mode : in Stream_Io.File_Mode) is + Old_Index : constant Count := File.Index; + begin + Stream_Io.Set_Mode (File.File, Mode); + File.Index := Stream_Io.Index (File.File); + if Mode = Append_File then + TC_Assert (File.Index = Stream_Io.Size (File.File) + 1, + "Index /= Size + 1 -- Set_Mode - Append_File"); + else + TC_Assert (File.Index = Old_Index, "Set_Mode changed the index"); + end if; + end Set_Mode; + + end Checked_Stream_Io; + + package Csio renames Checked_Stream_Io; + + F : Csio.File_Type (100); + S : Stream_Element_Array (1 .. 10); + Last : Stream_Element_Offset; + +begin + + Test ("CXAC005", "Check that stream file positioning work as specified"); + + declare + Name : constant String := Legal_File_Name; + begin + begin + Csio.Create (F, Name => Name); + exception + when others => + Not_Applicable ("Files not supported - Creation with Out_File for Stream_IO"); + raise Incomplete; + end; + + for I in Stream_Element range 1 .. 10 loop + Csio.Write (F, ((1 => I + 2))); + end loop; + Csio.Write (F, (1 .. 15 => 11)); + Csio.Write (F, (1 .. 15 => 12), To => 15); + + Csio.Reset (F); + + for I in Stream_Element range 1 .. 10 loop + Csio.Write (F, (1 => I)); + end loop; + Csio.Write (F, (1 .. 15 => 13)); + Csio.Write (F, (1 .. 15 => 14), To => 15); + Csio.Write (F, (1 => 90)); + + Csio.Set_Mode (F, Stream_Io.In_File); + + Csio.Read (F, S, Last); + Csio.Read (F, S, Last, From => 3); + Csio.Read (F, S, Last, From => 28); + + Csio.Set_Mode (F, Stream_Io.Append_File); + Csio.Write (F, (1 .. 5 => 88)); + + Csio.Close (F); + + Csio.Open (F, Name => Name, Mode => Stream_Io.Append_File); + Csio.Write (F, (1 .. 3 => 33)); + + Csio.Set_Mode (F, Stream_Io.In_File); + Csio.Read (F, S, Last, From => 20); + Csio.Read (F, S, Last); + Csio.Reset (F, Stream_Io.Out_File); + + Csio.Write (F, (1 .. 9 => 99)); + + -- Check the contents of the entire file. + declare + S : Stream_Element_Array + (1 .. Stream_Element_Offset + (Stream_Io.Size (Csio.Stream_Io_File (F)))); + begin + Csio.Reset (F, Stream_Io.In_File); + Csio.Read (F, S, Last); + end; + + Csio.Delete (F); + end; + + Result; +exception + when Incomplete => + Report.Result; + when E:others => + Report.Failed ("Unexpected exception raised - " & Exception_Name (E) & + " - " & Exception_Message (E)); + Report.Result; + +end CXAC005; + diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxaca01.a b/gcc/testsuite/ada/acats/tests/cxa/cxaca01.a new file mode 100644 index 000000000..cda8776a5 --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxaca01.a @@ -0,0 +1,291 @@ +-- CXACA01.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 default attributes 'Write and 'Read work properly when +-- used with objects of a variety of types, including records with +-- default discriminants, records without default discriminants, but +-- which have the discriminant described in a representation clause for +-- the type, and arrays. +-- +-- TEST DESCRIPTION: +-- This test simulates a basic sales record system, using Stream_IO to +-- allow the storage of heterogeneous data in a single stream file. +-- +-- Four types of data are written to the stream file for each product. +-- First, the "header" information on the product is written. +-- This is an object of a discriminated (with default) record +-- type. This is followed by an integer object containing a count of +-- the number of sales data records to follow. The corresponding number +-- of sales records follow in the stream. These are of a record type +-- with a discriminant without a default, but where the discriminant is +-- included in the representation clause for the type. Finally, an +-- array object with statistical sales information for the product is +-- written to the stream. +-- +-- Objects of both record types specified below (discriminated records +-- with defaults, and discriminated records w/o defaults that have the +-- discriminant included in a representation clause for the type) should +-- have their discriminants included in the stream when using 'Write. +-- Likewise, discriminants should be extracted from the stream when +-- using 'Read. +-- +-- APPLICABILITY CRITERIA: +-- Applicable to all implementations that support external +-- Stream_IO files. +-- +-- +-- CHANGE HISTORY: +-- 06 Dec 94 SAIC ACVC 2.0 +-- +--! + +with FXACA00; +with Ada.Streams.Stream_IO; +with Report; + +procedure CXACA01 is + +begin + + Report.Test ("CXACA01", "Check that 'Write and 'Read work properly " & + "when used with complex data types"); + + Test_for_Stream_IO_Support: + declare + + Info_File : Ada.Streams.Stream_IO.File_Type; + Info_Stream : Ada.Streams.Stream_IO.Stream_Access; + The_Filename : constant String := Report.Legal_File_Name; + + begin + + -- If an implementation does not support Stream_IO in a particular + -- environment, the exception Use_Error or Name_Error will be raised on + -- calls to various Stream_IO operations. This block statement + -- encloses a call to Create, which should produce an exception in a + -- non-supportive environment. These exceptions will be handled to + -- produce a Not_Applicable result. + + Ada.Streams.Stream_IO.Create (Info_File, + Ada.Streams.Stream_IO.Out_File, + The_Filename); + + Operational_Test_Block: + declare + + begin + + Info_Stream := Ada.Streams.Stream_IO.Stream (Info_File); + + -- Write all of the product information (record, integer, and array + -- objects) defined in package FXACA00 into the stream. + + Store_Data_Block: + begin + + -- Write information about first product to the stream. + FXACA00.Product_Type'Write (Info_Stream, FXACA00.Product_01); + Integer'Write (Info_Stream, FXACA00.Sale_Count_01); + FXACA00.Sales_Record_Type'Write(Info_Stream, FXACA00.Sale_Rec_01); + FXACA00.Sales_Record_Type'Write(Info_Stream, FXACA00.Sale_Rec_02); + FXACA00.Sales_Statistics_Type'Write + (Info_Stream, FXACA00.Product_01_Stats); + + -- Write information about second product to the stream. + -- Note: No Sales_Record_Type objects. + FXACA00.Product_Type'Write (Info_Stream, FXACA00.Product_02); + Integer'Write (Info_Stream, FXACA00.Sale_Count_02); + FXACA00.Sales_Statistics_Type'Write + (Info_Stream, FXACA00.Product_02_Stats); + + -- Write information about third product to the stream. + FXACA00.Product_Type'Write (Info_Stream, FXACA00.Product_03); + Integer'Write (Info_Stream, FXACA00.Sale_Count_03); + FXACA00.Sales_Record_Type'Write(Info_Stream, FXACA00.Sale_Rec_03); + FXACA00.Sales_Record_Type'Write(Info_Stream, FXACA00.Sale_Rec_04); + FXACA00.Sales_Record_Type'Write(Info_Stream, FXACA00.Sale_Rec_05); + FXACA00.Sales_Statistics_Type'Write + (Info_Stream, FXACA00.Product_03_Stats); + + end Store_Data_Block; + + + Verify_Data_Block: + declare + + use FXACA00; -- Used within this block only. + + type Domestic_Rec_Array_Type is + array (Positive range <>) of Sales_Record_Type (Domestic); + + type Foreign_Rec_Array_Type is + array (Positive range <>) of Sales_Record_Type (Foreign); + + TC_Rec1 : Domestic_Rec_Array_Type (1..2); + TC_Rec3 : Foreign_Rec_Array_Type (1..3); + + TC_Product1 : Product_Type; + TC_Product2, + TC_Product3 : Product_Type (Foreign); + + TC_Count1, + TC_Count2, + TC_Count3 : Integer := -10; -- Initialized to dummy value. + + TC_Stat1, + TC_Stat2, + TC_Stat3 : Sales_Statistics_Type := (others => 500); + + begin + + Ada.Streams.Stream_IO.Reset (Info_File, + Ada.Streams.Stream_IO.In_File); + + -- Read all of the data that is contained in the stream. + -- Compare all data with the original data in package FXACA00 + -- that was written to the stream. + -- The calls to the read attribute are in anticipated order, based + -- on the order of data written to the stream. Possible errors, + -- such as data placement, overwriting, etc., will be manifest as + -- exceptions raised by the attribute during an unsuccessful read + -- attempt. + + -- Extract data on first product. + Product_Type'Read (Info_Stream, TC_Product1); + Integer'Read (Info_Stream, TC_Count1); + + -- Two "domestic" variant sales records will be read from the + -- stream. + for i in 1 .. TC_Count1 loop + Sales_Record_Type'Read (Info_Stream, TC_Rec1(i) ); + end loop; + + Sales_Statistics_Type'Read (Info_Stream, TC_Stat1); + + + -- Extract data on second product. + Product_Type'Read (Info_Stream, TC_Product2); + Integer'Read (Info_Stream, TC_Count2); + Sales_Statistics_Type'Read (Info_Stream, TC_Stat2); + + + -- Extract data on third product. + Product_Type'Read (Info_Stream, TC_Product3); + Integer'Read (Info_Stream, TC_Count3); + + -- Three "foreign" variant sales records will be read from the + -- stream. + for i in 1 .. TC_Count3 loop + Sales_Record_Type'Read (Info_Stream, TC_Rec3(i) ); + end loop; + + Sales_Statistics_Type'Read (Info_Stream, TC_Stat3); + + + -- After all the data has been correctly extracted, the file + -- should be empty. + + if not Ada.Streams.Stream_IO.End_Of_File (Info_File) then + Report.Failed ("Stream file not empty"); + end if; + + -- Verify that the data values read from the stream are the same + -- as those written to the stream. + + -- Verify the information of the first product. + if ((Product_01 /= TC_Product1) or else + (Product_01.Manufacture /= TC_Product1.Manufacture) or else + (Sale_Count_01 /= TC_Count1) or else + (Sale_Rec_01 /= TC_Rec1(1)) or else + (Sale_Rec_01.Buyer /= TC_Rec1(1).Buyer) or else + (Sale_Rec_02 /= TC_Rec1(2)) or else + (Sale_Rec_02.Buyer /= TC_Rec1(2).Buyer) or else + (Product_01_Stats /= TC_Stat1)) + then + Report.Failed ("Product 1 information incorrect"); + end if; + + -- Verify the information of the second product. + if not ((Product_02 = TC_Product2) and then + (Sale_Count_02 = TC_Count2) and then + (Product_02_Stats = TC_Stat2)) + then + Report.Failed ("Product 2 information incorrect"); + end if; + + -- Verify the information of the third product. + if ((Product_03 /= TC_Product3) or else + (Product_03.Manufacture /= TC_Product3.Manufacture) or else + (Sale_Count_03 /= TC_Count3) or else + (Sale_Rec_03 /= TC_Rec3(1)) or else + (Sale_Rec_03.Buyer /= TC_Rec3(1).Buyer) or else + (Sale_Rec_04 /= TC_Rec3(2)) or else + (Sale_Rec_04.Buyer /= TC_Rec3(2).Buyer) or else + (Sale_Rec_05 /= TC_Rec3(3)) or else + (Sale_Rec_05.Buyer /= TC_Rec3(3).Buyer) or else + (Product_03_Stats /= TC_Stat3)) + then + Report.Failed ("Product 3 information incorrect"); + end if; + + end Verify_Data_Block; + + exception + + when others => + Report.Failed ("Exception raised in Operational Test Block"); + + end Operational_Test_Block; + + if Ada.Streams.Stream_IO.Is_Open (Info_File) then + Ada.Streams.Stream_IO.Delete (Info_File); + else + Ada.Streams.Stream_IO.Open (Info_File, + Ada.Streams.Stream_IO.In_File, + The_Filename); + Ada.Streams.Stream_IO.Delete (Info_File); + end if; + + exception + + -- Since Use_Error or Name_Error can be raised if, for the specified + -- mode, the environment does not support Stream_IO operations, + -- the following handlers are included: + + when Ada.Streams.Stream_IO.Name_Error => + Report.Not_Applicable ("Name_Error raised on Stream IO Create"); + + when Ada.Streams.Stream_IO.Use_Error => + Report.Not_Applicable ("Use_Error raised on Stream IO Create"); + + when others => + Report.Failed ("Unexpected exception raised on Stream IO Create"); + + end Test_for_Stream_IO_Support; + + Report.Result; + +end CXACA01; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxaca02.a b/gcc/testsuite/ada/acats/tests/cxa/cxaca02.a new file mode 100644 index 000000000..5106dd399 --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxaca02.a @@ -0,0 +1,360 @@ +-- CXACA02.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 user defined subprograms can override the default +-- attributes 'Read and 'Write using attribute definition clauses. +-- Use objects of record types. +-- +-- TEST DESCRIPTION: +-- This test demonstrates that the default implementations of the +-- 'Read and 'Write attributes can be overridden by user specified +-- subprograms in conjunction with attribute definition clauses. +-- These attributes have been overridden below, and in the user defined +-- substitutes, values are added or subtracted to global variables. +-- The global variables are evaluated to ensure that the user defined +-- subprograms were used in overriding the type-related default +-- attributes. +-- +-- APPLICABILITY CRITERIA: +-- Applicable to all implementations that support external +-- Stream_IO files. +-- +-- +-- CHANGE HISTORY: +-- 06 Dec 94 SAIC ACVC 2.0 +-- 21 Nov 95 SAIC Corrected recursive attribute definitions +-- for ACVC 2.0.1. +-- 24 Aug 96 SAIC Corrected typo in test verification criteria. +-- +--! + +with Report; +with Ada.Streams.Stream_IO; + +procedure CXACA02 is +begin + + Report.Test ("CXACA02", "Check that user defined subprograms can " & + "override the default attributes 'Read and " & + "'Write using attribute definition clauses"); + + Test_for_Stream_IO_Support: + declare + + Data_File : Ada.Streams.Stream_IO.File_Type; + Data_Stream : Ada.Streams.Stream_IO.Stream_Access; + The_Filename : constant String := Report.Legal_File_Name; + + begin + + -- If an implementation does not support Stream_IO in a particular + -- environment, the exception Use_Error or Name_Error will be raised on + -- calls to various Stream_IO operations. This block statement + -- encloses a call to Create, which should produce an exception in a + -- non-supportive environment. These exceptions will be handled to + -- produce a Not_Applicable result. + + Ada.Streams.Stream_IO.Create (Data_File, + Ada.Streams.Stream_IO.Out_File, + The_Filename); + + Operational_Test_Block: + declare + + type Origin_Type is (Foreign, Domestic); + subtype String_Data_Type is String(1..8); + + type Product_Type is + record + Item : String_Data_Type; + ID : Natural range 1..100; + Manufacture : Origin_Type := Domestic; + Distributor : String_Data_Type; + Importer : String_Data_Type; + end record; + + type Sales_Record_Type is + record + Name : String_Data_Type; + Sale_Item : Boolean := False; + Buyer : Origin_Type; + Quantity_Discount : Boolean; + Cash_Discount : Boolean; + end record; + + + -- Mode conformant, user defined subprograms that will override + -- the type-related attributes. + -- In this test, the user defines these subprograms to add/subtract + -- specific values from global variables. + + procedure Product_Read + ( Stream : access Ada.Streams.Root_Stream_Type'Class; + The_Item : out Product_Type ); + + procedure Product_Write + ( Stream : access Ada.Streams.Root_Stream_Type'Class; + The_Item : Product_Type ); + + procedure Sales_Read + ( Stream : access Ada.Streams.Root_Stream_Type'Class; + The_Item : out Sales_Record_Type ); + + procedure Sales_Write + ( Stream : access Ada.Streams.Root_Stream_Type'Class; + The_Item : Sales_Record_Type ); + + -- Attribute definition clauses. + + for Product_Type'Read use Product_Read; + for Product_Type'Write use Product_Write; + + for Sales_Record_Type'Read use Sales_Read; + for Sales_Record_Type'Write use Sales_Write; + + + -- Object Declarations + + Product_01 : Product_Type := + ("Product1", 1, Domestic, "Distrib1", "Import 1"); + Product_02 : Product_Type := + ("Product2", 2, Foreign, "Distrib2", "Import 2"); + + Sale_Rec_01 : Sales_Record_Type := + ("Buyer 01", False, Domestic, True, True); + Sale_Rec_02 : Sales_Record_Type := + ("Buyer 02", True, Domestic, True, False); + Sale_Rec_03 : Sales_Record_Type := (Name => "Buyer 03", + Sale_Item => True, + Buyer => Foreign, + Quantity_Discount => False, + Cash_Discount => True); + Sale_Rec_04 : Sales_Record_Type := + ("Buyer 04", True, Foreign, False, False); + Sale_Rec_05 : Sales_Record_Type := + ("Buyer 05", False, Foreign, False, False); + + TC_Read_Total : Integer := 100; + TC_Write_Total : Integer := 0; + + + -- Subprogram bodies. + -- These subprograms are designed to override the default attributes + -- 'Read and 'Write for the specified types. Each adds/subtracts + -- a quantity to/from a program control variable, indicating its + -- activity. In addition, each component of the record is + -- individually read from or written to the stream, using the + -- appropriate 'Read or 'Write attribute for the component type. + -- The string components are moved to/from the stream using the + -- 'Input and 'Output attributes for the string subtype, so that + -- the bounds of the strings are also written/read. + + procedure Product_Read + ( Stream : access Ada.Streams.Root_Stream_Type'Class; + The_Item : out Product_Type ) is + begin + TC_Read_Total := TC_Read_Total - 10; + + The_Item.Item := String_Data_Type'Input(Data_Stream); -- Field 1. + Natural'Read(Data_Stream, The_Item.ID); -- Field 2. + Origin_Type'Read(Data_Stream, -- Field 3. + The_Item.Manufacture); + The_Item.Distributor := -- Field 4. + String_Data_Type'Input(Data_Stream); + The_Item.Importer := -- Field 5. + String_Data_Type'Input(Data_Stream); + end Product_Read; + + + procedure Product_Write + ( Stream : access Ada.Streams.Root_Stream_Type'Class; + The_Item : Product_Type ) is + begin + TC_Write_Total := TC_Write_Total + 5; + + String_Data_Type'Output(Data_Stream, The_Item.Item); -- Field 1. + Natural'Write(Data_Stream, The_Item.ID); -- Field 2. + Origin_Type'Write(Data_Stream, -- Field 3. + The_Item.Manufacture); + String_Data_Type'Output(Data_Stream, -- Field 4. + The_Item.Distributor); + String_Data_Type'Output(Data_Stream, -- Field 5. + The_Item.Importer); + end Product_Write; + + + procedure Sales_Read + ( Stream : access Ada.Streams.Root_Stream_Type'Class; + The_Item : out Sales_Record_Type ) is + begin + TC_Read_Total := TC_Read_Total - 20; + + The_Item.Name := String_Data_Type'Input(Data_Stream); -- Field 1. + Boolean'Read(Data_Stream, The_Item.Sale_Item); -- Field 2. + Origin_Type'Read(Data_Stream, The_Item.Buyer); -- Field 3. + Boolean'Read(Data_Stream, The_Item.Quantity_Discount); -- Field 4. + Boolean'Read(Data_Stream, The_Item.Cash_Discount); -- Field 5. + end Sales_Read; + + + procedure Sales_Write + ( Stream : access Ada.Streams.Root_Stream_Type'Class; + The_Item : Sales_Record_Type ) is + begin + TC_Write_Total := TC_Write_Total + 10; + + String_Data_Type'Output(Data_Stream, The_Item.Name); -- Field 1. + Boolean'Write(Data_Stream, The_Item.Sale_Item); -- Field 2. + Origin_Type'Write(Data_Stream, The_Item.Buyer); -- Field 3. + Boolean'Write(Data_Stream, The_Item.Quantity_Discount); -- Field 4. + Boolean'Write(Data_Stream, The_Item.Cash_Discount); -- Field 5. + end Sales_Write; + + + + begin + + Data_Stream := Ada.Streams.Stream_IO.Stream (Data_File); + + -- Write product and sales data to the stream. + + Product_Type'Write (Data_Stream, Product_01); + Sales_Record_Type'Write (Data_Stream, Sale_Rec_01); + Sales_Record_Type'Write (Data_Stream, Sale_Rec_02); + + Product_Type'Write (Data_Stream, Product_02); + Sales_Record_Type'Write (Data_Stream, Sale_Rec_03); + Sales_Record_Type'Write (Data_Stream, Sale_Rec_04); + Sales_Record_Type'Write (Data_Stream, Sale_Rec_05); + + -- Read data from the stream, and verify the use of the user specified + -- attributes. + + Verify_Data_Block: + declare + + TC_Product1, + TC_Product2 : Product_Type; + + TC_Sale1, + TC_Sale2, + TC_Sale3, + TC_Sale4, + TC_Sale5 : Sales_Record_Type; + + begin + + -- Reset the mode of the stream file so that Read/Input + -- operations may be performed. + + Ada.Streams.Stream_IO.Reset (Data_File, + Ada.Streams.Stream_IO.In_File); + + -- Data is read/reconstructed from the stream, in the order that + -- the data was placed into the stream. + + Product_Type'Read (Data_Stream, TC_Product1); + Sales_Record_Type'Read (Data_Stream, TC_Sale1); + Sales_Record_Type'Read (Data_Stream, TC_Sale2); + + Product_Type'Read (Data_Stream, TC_Product2); + Sales_Record_Type'Read (Data_Stream, TC_Sale3); + Sales_Record_Type'Read (Data_Stream, TC_Sale4); + Sales_Record_Type'Read (Data_Stream, TC_Sale5); + + -- Verify product data was correctly written to/read from stream. + + if TC_Product1 /= Product_01 then + Report.Failed ("Data verification error, Product 1"); + end if; + if TC_Product2 /= Product_02 then + Report.Failed ("Data verification error, Product 2"); + end if; + + if TC_Sale1 /= Sale_Rec_01 then + Report.Failed ("Data verification error, Sale_Rec_01"); + end if; + if TC_Sale2 /= Sale_Rec_02 then + Report.Failed ("Data verification error, Sale_Rec_02"); + end if; + if TC_Sale3 /= Sale_Rec_03 then + Report.Failed ("Data verification error, Sale_Rec_03"); + end if; + if TC_Sale4 /= Sale_Rec_04 then + Report.Failed ("Data verification error, Sale_Rec_04"); + end if; + if TC_Sale5 /= Sale_Rec_05 then + Report.Failed ("Data verification error, Sale_Rec_05"); + end if; + + -- Verify that the user defined subprograms were used to + -- override the default 'Read and 'Write attributes. + -- There were two "product" reads and two writes; there + -- were five "sale record" reads and five writes. + + if (TC_Read_Total /= -20) or (TC_Write_Total /= 60) then + Report.Failed ("Incorrect use of user defined attributes"); + end if; + + end Verify_Data_Block; + + exception + + when others => + Report.Failed ("Exception raised in Operational Test Block"); + + end Operational_Test_Block; + + if Ada.Streams.Stream_IO.Is_Open (Data_File) then + Ada.Streams.Stream_IO.Delete (Data_File); + else + Ada.Streams.Stream_IO.Open (Data_File, + Ada.Streams.Stream_IO.Out_File, + The_Filename); + Ada.Streams.Stream_IO.Delete (Data_File); + end if; + + + exception + + -- Since Use_Error or Name_Error can be raised if, for the specified + -- mode, the environment does not support Stream_IO operations, + -- the following handlers are included: + + when Ada.Streams.Stream_IO.Name_Error => + Report.Not_Applicable ("Name_Error raised on Stream IO Create"); + + when Ada.Streams.Stream_IO.Use_Error => + Report.Not_Applicable ("Use_Error raised on Stream IO Create"); + + when others => + Report.Failed ("Unexpected exception raised"); + + end Test_for_Stream_IO_Support; + + Report.Result; + +end CXACA02; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxacb01.a b/gcc/testsuite/ada/acats/tests/cxa/cxacb01.a new file mode 100644 index 000000000..ac4a905e8 --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxacb01.a @@ -0,0 +1,264 @@ +-- CXACB01.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 default attributes 'Input and 'Output work properly when +-- used with objects of a variety of types, including two-dimensional +-- arrays and records without default discriminants. +-- +-- TEST DESCRIPTION: +-- This test simulates utility company service record storage, using +-- Stream_IO to allow the storage of heterogeneous data in a single +-- stream file. +-- +-- Three types of data are written to the stream file for each utility +-- service customer. +-- First, the general information on the customer is written. +-- This is an object of a discriminated (without default) record +-- type. This is followed by an integer object containing a count of +-- the number of service months for the customer. Finally, a +-- two-dimensional array object with monthly consumption information for +-- the customer is written to the stream. +-- +-- Objects of record types with discriminants without defaults should +-- have their discriminants included in the stream when using 'Output. +-- Likewise, discriminants should be extracted +-- from the stream when using 'Input. Similarly, array bounds are written +-- to and read from the stream when using 'Output and 'Input with array +-- objects. +-- +-- APPLICABILITY CRITERIA: +-- Applicable to all implementations that support external +-- Stream_IO files. +-- +-- +-- CHANGE HISTORY: +-- 06 Dec 94 SAIC ACVC 2.0 +-- +--! + +with FXACB00; +with Ada.Streams.Stream_IO; +with Report; + +procedure CXACB01 is +begin + + Report.Test ("CXACB01", "Check that the default attributes 'Input and " & + "'Output work properly when used with objects " & + "of record, natural, and array types" ); + + Test_for_Stream_IO_Support: + declare + + Util_File : Ada.Streams.Stream_IO.File_Type; + Util_Stream : Ada.Streams.Stream_IO.Stream_Access; + Utility_Service_Filename : constant String := Report.Legal_File_Name; + + begin + + -- If an implementation does not support Stream_IO in a particular + -- environment, the exception Use_Error or Name_Error will be raised on + -- calls to various Stream_IO operations. This block statement + -- encloses a call to Create, which should produce an exception in a + -- non-supportive environment. These exceptions will be handled to + -- produce a Not_Applicable result. + + Ada.Streams.Stream_IO.Create (Util_File, + Ada.Streams.Stream_IO.Out_File, + Utility_Service_Filename); + + Operational_Test_Block: + declare + + -- The following procedure will store all of the customer specific + -- information into the stream. + + procedure Store_Data_In_Stream + (Customer : in FXACB00.Service_Type; + Months : in FXACB00.Months_In_Service_Type; + History : in FXACB00.Service_History_Type) is + begin + FXACB00.Service_Type'Output (Util_Stream, Customer); + FXACB00.Months_In_Service_Type'Output (Util_Stream, Months); + FXACB00.Service_History_Type'Output (Util_Stream, History); + end Store_Data_In_Stream; + + + -- The following procedure will remove from the stream all of the + -- customer related information. + + procedure Retrieve_Data_From_Stream + (Customer : out FXACB00.Service_Type; + Months : out FXACB00.Months_In_Service_Type; + History : out FXACB00.Service_History_Type) is + begin + Customer := FXACB00.Service_Type'Input (Util_Stream); + Months := FXACB00.Months_In_Service_Type'Input (Util_Stream); + History := FXACB00.Service_History_Type'Input (Util_Stream); + end Retrieve_Data_From_Stream; + + + begin + + Util_Stream := Ada.Streams.Stream_IO.Stream (Util_File); + + -- Write all of the customer service information (record, numeric, + -- and array objects) defined in package FXACB00 into the stream. + + Data_Storage_Block: + begin + + Store_Data_In_Stream (Customer => FXACB00.Customer1, + Months => FXACB00.C1_Months, + History => FXACB00.C1_Service_History); + + Store_Data_In_Stream (FXACB00.Customer2, + FXACB00.C2_Months, + History => FXACB00.C2_Service_History); + + Store_Data_In_Stream (Months => FXACB00.C3_Months, + History => FXACB00.C3_Service_History, + Customer => FXACB00.Customer3); + end Data_Storage_Block; + + + Data_Verification_Block: + declare + + TC_Residence : FXACB00.Service_Type (FXACB00.Residence); + TC_Apartment : FXACB00.Service_Type (FXACB00.Apartment); + TC_Commercial : FXACB00.Service_Type (FXACB00.Commercial); + + + TC_Months1, + TC_Months2, + TC_Months3 : FXACB00.Months_In_Service_Type := + FXACB00.Months_In_Service_Type'First; + + + TC_History1 : + FXACB00.Service_History_Type (FXACB00.Quarterly_Period_Type, + FXACB00.Month_In_Quarter_Type) := + (others => (others => FXACB00.Electric_Usage_Type'Last)); + + TC_History2 : + FXACB00.Service_History_Type + (FXACB00.Quarterly_Period_Type range + FXACB00.Spring .. FXACB00.Summer, + FXACB00.Month_In_Quarter_Type) := + (others => (others => FXACB00.Electric_Usage_Type'Last)); + + TC_History3 : + FXACB00.Service_History_Type (FXACB00.Quarterly_Period_Type, + FXACB00.Month_In_Quarter_Type) := + (others => (others => FXACB00.Electric_Usage_Type'Last)); + + begin + + Ada.Streams.Stream_IO.Reset (Util_File, + Ada.Streams.Stream_IO.In_File); + + -- Input all of the data that is contained in the stream. + -- Compare all data with the original data in package FXACB00 + -- that was written to the stream. + + Retrieve_Data_From_Stream (TC_Residence, TC_Months1, TC_History1); + Retrieve_Data_From_Stream (TC_Apartment, TC_Months2, TC_History2); + Retrieve_Data_From_Stream (Customer => TC_Commercial, + Months => TC_Months3, + History => TC_History3); + + -- After all the data has been correctly extracted, the file + -- should be empty. + + if not Ada.Streams.Stream_IO.End_Of_File (Util_File) then + Report.Failed ("Stream file not empty"); + end if; + + -- Verify that the data values read from the stream are the same + -- as those written to the stream. + + if ((FXACB00."/="(FXACB00.Customer1, TC_Residence)) or else + (FXACB00."/="(FXACB00.Customer2, TC_Apartment)) or else + (FXACB00."/="(FXACB00.Customer3, TC_Commercial))) + then + Report.Failed ("Customer information incorrect"); + end if; + + if ((FXACB00."/="(FXACB00.C1_Months, TC_Months1)) or + (FXACB00."/="(FXACB00.C2_Months, TC_Months2)) or + (FXACB00."/="(FXACB00.C3_Months, TC_Months3))) + then + Report.Failed ("Number of Months information incorrect"); + end if; + + if not ((FXACB00."="(FXACB00.C1_Service_History, TC_History1)) and + (FXACB00."="(FXACB00.C2_Service_History, TC_History2)) and + (FXACB00."="(FXACB00.C3_Service_History, TC_History3))) + then + Report.Failed ("Service history information incorrect"); + end if; + + end Data_Verification_Block; + + exception + + when others => + Report.Failed ("Exception raised in Operational Test Block"); + + end Operational_Test_Block; + + -- Delete the file. + if Ada.Streams.Stream_IO.Is_Open (Util_File) then + Ada.Streams.Stream_IO.Delete (Util_File); + else + Ada.Streams.Stream_IO.Open (Util_File, + Ada.Streams.Stream_IO.Out_File, + Utility_Service_Filename); + Ada.Streams.Stream_IO.Delete (Util_File); + end if; + + + exception + + -- Since Use_Error or Name_Error can be raised if, for the specified + -- mode, the environment does not support Stream_IO operations, + -- the following handlers are included: + + when Ada.Streams.Stream_IO.Name_Error => + Report.Not_Applicable ("Name_Error raised on Stream IO Create"); + + when Ada.Streams.Stream_IO.Use_Error => + Report.Not_Applicable ("Use_Error raised on Stream IO Create"); + + when others => + Report.Failed ("Unexpected exception raised"); + + end Test_for_Stream_IO_Support; + + Report.Result; + +end CXACB01; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxacb02.a b/gcc/testsuite/ada/acats/tests/cxa/cxacb02.a new file mode 100644 index 000000000..a0ade9ebe --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxacb02.a @@ -0,0 +1,421 @@ +-- CXACB02.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 user defined subprograms can override the default +-- attributes 'Input and 'Output using attribute definition clauses, +-- when used with objects of discriminated record and multi-dimensional +-- array types. +-- +-- TEST DESCRIPTION: +-- This test demonstrates that the default implementations of the +-- 'Input and 'Output attributes can be overridden by user specified +-- subprograms in conjunction with attribute definition clauses. +-- These attributes have been overridden below, and in the user defined +-- substitutes, values are added or subtracted to global variables. +-- Following the completion of the writing/reading test, the global +-- variables are evaluated to ensure that the user defined subprograms +-- were used in overriding the type-related default attributes. +-- +-- APPLICABILITY CRITERIA: +-- Applicable to all implementations that support external +-- Stream_IO files. +-- +-- +-- CHANGE HISTORY: +-- 06 Dec 94 SAIC ACVC 2.0 +-- 14 Nov 95 SAIC Corrected test errors for ACVC 2.0.1. +-- +--! + +with Report; +with Ada.Streams.Stream_IO; + +procedure CXACB02 is +begin + + Report.Test ("CXACB02", "Check that user defined subprograms can " & + "override the default attributes 'Input and " & + "'Output using attribute definition clauses"); + + Test_for_Stream_IO_Support: + declare + + Util_File : Ada.Streams.Stream_IO.File_Type; + Util_Stream : Ada.Streams.Stream_IO.Stream_Access; + Utility_Filename : constant String := Report.Legal_File_Name; + + begin + + -- If an implementation does not support Stream_IO in a particular + -- environment, the exception Use_Error or Name_Error will be raised on + -- calls to various Stream_IO operations. This block statement + -- encloses a call to Create, which should produce an exception in a + -- non-supportive environment. These exceptions will be handled to + -- produce a Not_Applicable result. + + Ada.Streams.Stream_IO.Create (Util_File, + Ada.Streams.Stream_IO.Out_File, + Utility_Filename); + + Operational_Test_Block: + declare + + type Customer_Type is (Residence, Apartment, Commercial); + type Electric_Usage_Type is range 0..100000; + type Months_In_Service_Type is range 1..12; + type Quarterly_Period_Type is (Spring, Summer, Autumn, Winter); + subtype Month_In_Quarter_Type is Positive range 1..3; + type Service_History_Type is + array (Quarterly_Period_Type range <>, + Month_In_Quarter_Type range <>) of Electric_Usage_Type; + + type Service_Type (Customer : Customer_Type) is + record + Name : String (1..21); + Account_ID : Natural range 0..100; + case Customer is + when Residence | Apartment => + Low_Income_Credit : Boolean := False; + when Commercial => + Baseline_Allowance : Natural range 0..1000; + Quantity_Discount : Boolean := False; + end case; + end record; + + + -- Mode conformant, user defined subprograms that will override + -- the type-related attributes. + -- In this test, the user defines these subprograms to add/subtract + -- specific values from global variables. + + function Service_Input + (Stream : access Ada.Streams.Root_Stream_Type'Class) + return Service_Type; + + procedure Service_Output + (Stream : access Ada.Streams.Root_Stream_Type'Class; + Item : Service_Type); + + function History_Input + (Stream : access Ada.Streams.Root_Stream_Type'Class) + return Service_History_Type; + + procedure History_Output + (Stream : access Ada.Streams.Root_Stream_Type'Class; + Item : Service_History_Type); + + + -- Attribute definition clauses. + + for Service_Type'Input use Service_Input; + for Service_Type'Output use Service_Output; + + for Service_History_Type'Input use History_Input; + for Service_History_Type'Output use History_Output; + + + -- Object Declarations + + Customer1 : Service_Type (Residence) := + (Residence, "1221 Morningstar Lane", 44, False); + Customer2 : Service_Type (Apartment) := + (Customer => Apartment, + Account_ID => 67, + Name => "15 South Front St. #8", + Low_Income_Credit => True); + Customer3 : Service_Type (Commercial) := + (Commercial, + "12442 Central Avenue ", + 100, + Baseline_Allowance => 938, + Quantity_Discount => True); + + C1_Service_History : + Service_History_Type (Quarterly_Period_Type, + Month_In_Quarter_Type) := + (Spring => (1 => 35, 2 => 39, 3 => 32), + Summer => (1 => 34, 2 => 33, 3 => 39), + Autumn => (1 => 45, 2 => 40, 3 => 38), + Winter => (1 => 53, 2 => 0, 3 => 0)); + + C2_Service_History : + Service_History_Type (Quarterly_Period_Type range Spring..Summer, + Month_In_Quarter_Type) := + (Spring => (23, 22, 0), Summer => (0, 0, 0)); + + C3_Service_History : + Service_History_Type (Quarterly_Period_Type, + Month_In_Quarter_Type) := + (others => (others => 200)); + + + TC_Input_Total : Integer := 0; + TC_Output_Total : Integer := 0; + + + -- Subprogram bodies. + -- These subprograms are designed to override the default attributes + -- 'Input and 'Output for the specified types. Each adds/subtracts + -- a quantity to/from a program control variable, indicating its + -- activity. Each user defined "Input" function uses the 'Read + -- attribute for the type to accomplish the operation. Likewise, + -- each user defined "Output" subprogram uses the 'Write attribute + -- for the type. + + function Service_Input + ( Stream : access Ada.Streams.Root_Stream_Type'Class ) + return Service_Type is + Customer : Customer_Type; + begin + TC_Input_Total := TC_Input_Total + 1; + + -- Extract the discriminant value from the stream. + -- This discriminant would not otherwise be extracted from the + -- stream when the Service_Type'Read attribute is used below. + Customer_Type'Read (Stream, Customer); + + declare + -- Declare a constant of Service_Type, using the value just + -- read from the stream as the discriminant value of the + -- object. + Service : Service_Type(Customer); + begin + Service_Type'Read (Stream, Service); + return Service; + end; + end Service_Input; + + + procedure Service_Output + ( Stream : access Ada.Streams.Root_Stream_Type'Class; + Item : Service_Type ) is + begin + TC_Output_Total := TC_Output_Total + 2; + -- Write the discriminant value to the stream. + -- The attribute 'Write (for the record type) will not write the + -- discriminant of the record object to the stream. Therefore, it + -- must be explicitly written using the 'Write attribute of the + -- discriminant type. + Customer_Type'Write (Stream, Item.Customer); + -- Write the record component values (but not the discriminant) to + -- the stream. + Service_Type'Write (Stream, Item); + end Service_Output; + + + function History_Input + ( Stream : access Ada.Streams.Root_Stream_Type'Class ) + return Service_History_Type is + Quarter_Bound_Low : Quarterly_Period_Type; + Quarter_Bound_High : Quarterly_Period_Type; + Month_Bound_Low : Month_In_Quarter_Type; + Month_Bound_High : Month_In_Quarter_Type; + begin + TC_Input_Total := TC_Input_Total + 3; + + -- Read the value of the array bounds from the stream. + -- Use these bounds in the creation of an array object that will + -- be used to store data from the stream. + -- The array bound values would not otherwise be read from the + -- stream by use of the Service_History_Type'Read attribute. + Quarterly_Period_Type'Read (Stream, Quarter_Bound_Low); + Quarterly_Period_Type'Read (Stream, Quarter_Bound_High); + Month_In_Quarter_Type'Read (Stream, Month_Bound_Low); + Month_In_Quarter_Type'Read (Stream, Month_Bound_High); + + declare + Service_History_Array : + Service_History_Type + (Quarterly_Period_Type range + Quarter_Bound_Low..Quarter_Bound_High, + Month_In_Quarter_Type range + Month_Bound_Low .. Month_Bound_High); + begin + Service_History_Type'Read (Stream, Service_History_Array); + return Service_History_Array; + end; + end History_Input; + + + procedure History_Output + ( Stream : access Ada.Streams.Root_Stream_Type'Class; + Item : Service_History_Type ) is + begin + TC_Output_Total := TC_Output_Total + 7; + -- Write the upper/lower bounds of the array object dimensions to + -- the stream. + Quarterly_Period_Type'Write (Stream, Item'First(1)); + Quarterly_Period_Type'Write (Stream, Item'Last(1)); + Month_In_Quarter_Type'Write (Stream, Item'First(2)); + Month_In_Quarter_Type'Write (Stream, Item'Last(2)); + -- Write the array values to the stream in canonical order (last + -- dimension varying fastest). + Service_History_Type'Write (Stream, Item); + end History_Output; + + + + begin + + Util_Stream := Ada.Streams.Stream_IO.Stream (Util_File); + + -- Write data to the stream. A customer service record is followed + -- by a service history array. + + Service_Type'Output (Util_Stream, Customer1); + Service_History_Type'Output (Util_Stream, C1_Service_History); + + Service_Type'Output (Util_Stream, Customer2); + Service_History_Type'Output (Util_Stream, C2_Service_History); + + Service_Type'Output (Util_Stream, Customer3); + Service_History_Type'Output (Util_Stream, C3_Service_History); + + + -- Read data from the stream, and verify the use of the user specified + -- attributes. + + Verify_Data_Block: + declare + + TC_Residence : Service_Type (Residence); + TC_Apartment : Service_Type (Apartment); + TC_Commercial : Service_Type (Commercial); + + TC_History1 : Service_History_Type (Quarterly_Period_Type, + Month_In_Quarter_Type) := + (others => (others => Electric_Usage_Type'First)); + + TC_History2 : Service_History_Type (Quarterly_Period_Type + range Spring .. Summer, + Month_In_Quarter_Type) := + (others => (others => Electric_Usage_Type'First)); + + TC_History3 : Service_History_Type (Quarterly_Period_Type, + Month_In_Quarter_Type) := + (others => (others => Electric_Usage_Type'First)); + + begin + + -- Reset Stream file to mode In_File. + + Ada.Streams.Stream_IO.Reset (Util_File, + Ada.Streams.Stream_IO.In_File); + + -- Read data from the stream. + + TC_Residence := Service_Type'Input (Util_Stream); + TC_History1 := Service_History_Type'Input (Util_Stream); + + TC_Apartment := Service_Type'Input (Util_Stream); + TC_History2 := Service_History_Type'Input (Util_Stream); + + TC_Commercial := Service_Type'Input (Util_Stream); + TC_History3 := Service_History_Type'Input (Util_Stream); + + + -- Verify product data was correctly written to/read from stream, + -- including discriminants and array bounds. + + if (TC_Residence /= Customer1) or + (TC_Residence.Customer /= Customer1.Customer) or + (TC_History1'Last(1) /= C1_Service_History'Last(1)) or + (TC_History1'First(1) /= C1_Service_History'First(1)) or + (TC_History1'Last(2) /= C1_Service_History'Last(2)) or + (TC_History1'First(2) /= C1_Service_History'First(2)) + then + Report.Failed ("Incorrect data from stream - 1"); + end if; + + if (TC_Apartment /= Customer2) or + (TC_Apartment.Customer /= Customer2.Customer) or + (TC_History2 /= C2_Service_History) or + (TC_History2'Last(1) /= C2_Service_History'Last(1)) or + (TC_History2'First(1) /= C2_Service_History'First(1)) or + (TC_History2'Last(2) /= C2_Service_History'Last(2)) or + (TC_History2'First(2) /= C2_Service_History'First(2)) + then + Report.Failed ("Incorrect data from stream - 2"); + end if; + + if (TC_Commercial /= Customer3) or + (TC_Commercial.Customer /= Customer3.Customer) or + (TC_History3 /= C3_Service_History) or + (TC_History3'Last(1) /= C3_Service_History'Last(1)) or + (TC_History3'First(1) /= C3_Service_History'First(1)) or + (TC_History3'Last(2) /= C3_Service_History'Last(2)) or + (TC_History3'First(2) /= C3_Service_History'First(2)) + then + Report.Failed ("Incorrect data from stream - 3"); + end if; + + -- Verify that the user defined subprograms were used to override + -- the default 'Input and 'Output attributes. + -- There were three calls on each of the user defined attributes. + + if (TC_Input_Total /= 12 ) or (TC_Output_Total /= 27 ) then + Report.Failed ("Incorrect use of user defined attributes"); + end if; + + end Verify_Data_Block; + + exception + + when others => + Report.Failed ("Exception raised in Operational Test Block"); + + end Operational_Test_Block; + + if Ada.Streams.Stream_IO.Is_Open (Util_File) then + Ada.Streams.Stream_IO.Delete (Util_File); + else + Ada.Streams.Stream_IO.Open (Util_File, + Ada.Streams.Stream_IO.Out_File, + Utility_Filename); + Ada.Streams.Stream_IO.Delete (Util_File); + end if; + + + exception + + -- Since Use_Error or Name_Error can be raised if, for the specified + -- mode, the environment does not support Stream_IO operations, + -- the following handlers are included: + + when Ada.Streams.Stream_IO.Name_Error => + Report.Not_Applicable ("Name_Error raised on Stream IO Create"); + + when Ada.Streams.Stream_IO.Use_Error => + Report.Not_Applicable ("Use_Error raised on Stream IO Create"); + + when others => + Report.Failed ("Unexpected exception raised"); + + end Test_for_Stream_IO_Support; + + Report.Result; + +end CXACB02; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxacc01.a b/gcc/testsuite/ada/acats/tests/cxa/cxacc01.a new file mode 100644 index 000000000..3ab88f40e --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxacc01.a @@ -0,0 +1,299 @@ +-- CXACC01.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 use of 'Class'Output and 'Class'Input allow stream +-- manipulation of objects of non-limited class-wide types. +-- +-- TEST DESCRIPTION: +-- This test demonstrates the uses of 'Class'Output and 'Class'Input +-- in moving objects of a particular class to and from a stream file. +-- A procedure uses a class-wide parameter to move objects of specific +-- types in the class to the stream, using the 'Class'Output attribute +-- of the root type of the class. A function returns a class-wide object, +-- using the 'Class'Input attribute of the root type of the class to +-- extract the object from the stream. +-- A field-by-field comparison of record objects is performed to validate +-- the data read from the stream. Operator precedence rules are used +-- in the comparison rather than parentheses. +-- +-- APPLICABILITY CRITERIA: +-- This test is applicable to all implementations capable of supporting +-- external Stream_IO files. +-- +-- +-- CHANGE HISTORY: +-- 06 Dec 94 SAIC ACVC 2.0 +-- 14 Nov 95 SAIC Corrected prefix of 'Tag attribute for ACVC 2.0.1. +-- 24 Aug 96 SAIC Changed a call to "Create" to "Reset". +-- 26 Feb 97 CTA.PWB Allowed for non-support of some IO operations. +--! + +with FXACC00, Ada.Streams.Stream_IO, Ada.Tags, Report; + +procedure CXACC01 is + + Order_File : Ada.Streams.Stream_IO.File_Type; + Order_Stream : Ada.Streams.Stream_IO.Stream_Access; + Order_Filename : constant String := + Report.Legal_File_Name ( Nam => "CXACC01" ); + Incomplete : exception; + +begin + + Report.Test ("CXACC01", "Check that the use of 'Class'Output " & + "and 'Class'Input allow stream manipulation " & + "of objects of non-limited class-wide types"); + + Test_for_Stream_IO_Support: + begin + + -- If an implementation does not support Stream_IO in a particular + -- environment, the exception Use_Error or Name_Error will be raised on + -- calls to various Stream_IO operations. This block statement + -- encloses a call to Create, which should produce an exception in a + -- non-supportive environment. These exceptions will be handled to + -- produce a Not_Applicable result. + + Ada.Streams.Stream_IO.Create (Order_File, + Ada.Streams.Stream_IO.Out_File, + Order_Filename); + + exception + + when Ada.Streams.Stream_IO.Use_Error | Ada.Streams.Stream_IO.Name_Error => + Report.Not_Applicable + ( "Files not supported - Create as Out_File for Stream_IO" ); + raise Incomplete; + + end Test_for_Stream_IO_Support; + + Operational_Test_Block: + declare + + -- Store tag values associated with objects of tagged types. + + TC_Box_Office_Tag : constant String := + Ada.Tags.External_Tag(FXACC00.Ticket_Request'Tag); + + TC_Summer_Tag : constant String := + Ada.Tags.External_Tag(FXACC00.Subscriber_Request'Tag); + + TC_Mayoral_Tag : constant String := + Ada.Tags.External_Tag(FXACC00.VIP_Request'Tag); + + TC_Late_Tag : constant String := + Ada.Tags.External_Tag(FXACC00.Last_Minute_Request'Tag); + + -- The following procedure will take an object of the Ticket_Request + -- class and output it to the stream. Objects of any extended type + -- in the class can be output to the stream with this procedure. + + procedure Order_Entry (Order : FXACC00.Ticket_Request'Class) is + begin + FXACC00.Ticket_Request'Class'Output (Order_Stream, Order); + end Order_Entry; + + + -- The following function will retrieve from the stream an object of + -- the Ticket_Request class. + + function Order_Retrieval return FXACC00.Ticket_Request'Class is + begin + return FXACC00.Ticket_Request'Class'Input (Order_Stream); + end Order_Retrieval; + + begin + + Order_Stream := Ada.Streams.Stream_IO.Stream (Order_File); + + -- Store the data objects in the stream. + -- Each of the objects is of a different type within the class. + + Order_Entry (FXACC00.Box_Office_Request); -- Object of root type + Order_Entry (FXACC00.Summer_Subscription); -- Obj. of extended type + Order_Entry (FXACC00.Mayoral_Ticket_Request); -- Obj. of extended type + Order_Entry (FXACC00.Late_Request); -- Object of twice + -- extended type. + + -- Reset mode of stream to In_File prior to reading data from it. + Reset1: + begin + Ada.Streams.Stream_IO.Reset (Order_File, + Ada.Streams.Stream_IO.In_File); + exception + when Ada.Streams.Stream_IO.Use_Error => + Report.Not_Applicable + ( "Reset to In_File not supported for Stream_IO - 1" ); + raise Incomplete; + end Reset1; + + Process_Order_Block: + declare + + use FXACC00; + + -- Declare variables of the root type class, + -- and initialize them with class-wide objects returned from + -- the stream as function result. + + Order_1 : Ticket_Request'Class := Order_Retrieval; + Order_2 : Ticket_Request'Class := Order_Retrieval; + Order_3 : Ticket_Request'Class := Order_Retrieval; + Order_4 : Ticket_Request'Class := Order_Retrieval; + + -- Declare objects of the specific types from within the class + -- that correspond to the types of the data written to the + -- stream. Perform a type conversion on the class-wide objects. + + Ticket_Order : Ticket_Request := + Ticket_Request(Order_1); + Subscriber_Order : Subscriber_Request := + Subscriber_Request(Order_2); + VIP_Order : VIP_Request := + VIP_Request(Order_3); + Last_Minute_Order : Last_Minute_Request := + Last_Minute_Request(Order_4); + + begin + + -- Perform a field-by-field comparison of all the class-wide + -- objects input from the stream with specific type objects + -- originally written to the stream. + + if Ticket_Order.Location /= + Box_Office_Request.Location or + Ticket_Order.Number_Of_Tickets /= + Box_Office_Request.Number_Of_Tickets + then + Report.Failed ("Ticket_Request object validation failure"); + end if; + + if Subscriber_Order.Location /= + Summer_Subscription.Location or + Subscriber_Order.Number_Of_Tickets /= + Summer_Subscription.Number_Of_Tickets or + Subscriber_Order.Subscription_Number /= + Summer_Subscription.Subscription_Number + then + Report.Failed ("Subscriber_Request object validation failure"); + end if; + + if VIP_Order.Location /= + Mayoral_Ticket_Request.Location or + VIP_Order.Number_Of_Tickets /= + Mayoral_Ticket_Request.Number_Of_Tickets or + VIP_Order.Rank /= + Mayoral_Ticket_Request.Rank + then + Report.Failed ("VIP_Request object validation failure"); + end if; + + if Last_Minute_Order.Location /= + Late_Request.Location or + Last_Minute_Order.Number_Of_Tickets /= + Late_Request.Number_Of_Tickets or + Last_Minute_Order.Rank /= + Late_Request.Rank or + Last_Minute_Order.Special_Consideration /= + Late_Request.Special_Consideration or + Last_Minute_Order.Donation /= + Late_Request.Donation + then + Report.Failed ("Last_Minute_Request object validation failure"); + end if; + + -- Verify tag values from before and after processing. + -- The 'Tag attribute is used with objects of a class-wide type. + + if TC_Box_Office_Tag /= + Ada.Tags.External_Tag(Order_1'Tag) + then + Report.Failed("Failed tag comparison - 1"); + end if; + + if TC_Summer_Tag /= + Ada.Tags.External_Tag(Order_2'Tag) + then + Report.Failed("Failed tag comparison - 2"); + end if; + + if TC_Mayoral_Tag /= + Ada.Tags.External_Tag(Order_3'Tag) + then + Report.Failed("Failed tag comparison - 3"); + end if; + + if TC_Late_Tag /= + Ada.Tags.External_Tag(Order_4'Tag) + then + Report.Failed("Failed tag comparison - 4"); + end if; + + end Process_Order_Block; + + -- After all the data has been correctly extracted, the file + -- should be empty. + + if not Ada.Streams.Stream_IO.End_Of_File (Order_File) then + Report.Failed ("Stream file not empty"); + end if; + + exception + when Incomplete => + raise; + when Constraint_Error => + Report.Failed ("Constraint_Error raised in Operational Block"); + when others => + Report.Failed ("Exception raised in Operational Test Block"); + end Operational_Test_Block; + + Deletion: + begin + if Ada.Streams.Stream_IO.Is_Open (Order_File) then + Ada.Streams.Stream_IO.Delete (Order_File); + else + Ada.Streams.Stream_IO.Open (Order_File, + Ada.Streams.Stream_IO.Out_File, + Order_Filename); + Ada.Streams.Stream_IO.Delete (Order_File); + end if; + exception + when others => + Report.Failed + ( "Delete not properly implemented for Stream_IO" ); + end Deletion; + + Report.Result; + +exception + + when Incomplete => + Report.Result; + when others => + Report.Failed ( "Unexpected exception" ); + Report.Result; + +end CXACC01; diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxaf001.a b/gcc/testsuite/ada/acats/tests/cxa/cxaf001.a new file mode 100644 index 000000000..ae3497abd --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/cxa/cxaf001.a @@ -0,0 +1,199 @@ +-- CXAF001.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 an implementation supports the functionality defined +-- in Package Ada.Command_Line. +-- +-- TEST DESCRIPTION: +-- This test verifies that an implementation supports the subprograms +-- contained in package Ada.Command_Line. Each of the subprograms +-- is exercised in a general sense, to ensure that it is available, +-- and that it provides the prescribed results in a known test +-- environment. Function Argument_Count must return zero, or the +-- number of arguments passed to the program calling it. Function +-- Argument is called with a parameter value one greater than the +-- actual number of arguments passed to the executing program, which +-- must result in Constraint_Error being raised. Function Command_Name +-- should return the name of the executing program that called it +-- (specifically, this test name). Function Set_Exit_Status is called +-- with two different parameter values, the constants Failure and +-- Success defined in package Ada.Command_Line. +-- +-- The setting of the variable TC_Verbose allows for some additional +-- output to be displayed during the running of the test as an aid in +-- tracing the processing flow of the test. +-- +-- APPLICABILITY CRITERIA: +-- This test is applicable to implementations that support the +-- declaration of package Command_Line as defined in the Ada Reference +-- manual. +-- An alternative declaration is allowed for package Command_Line if +-- different functionality is appropriate for the external execution +-- environment. +-- +-- +-- CHANGE HISTORY: +-- 10 Jul 95 SAIC Initial prerelease version. +-- 02 May 96 SAIC Incorporated reviewer comments for ACVC 2.1. +-- 05 AUG 98 EDS Allow Null string result to be returned from +-- Function Command +--! + +with Ada.Command_Line; +with Ada.Exceptions; +with Report; + +procedure CXAF001 is +begin + + Report.Test ("CXAF001", "Check that an implementation supports the " & + "functionality defined in Package " & + "Ada.Command_Line"); + + Test_Block: + declare + + use Ada.Exceptions; + + type String_Access is access all String; + + TC_Verbose : Boolean := False; + Number_Of_Arguments : Natural := Natural'Last; + Name_Of_Command : String_Access; + + begin + + -- Check the result of function Argument_Count. + -- Note: If the external environment does not support passing arguments + -- to the program invoking the function, the function result + -- will be zero. + + Number_Of_Arguments := Ada.Command_Line.Argument_Count; + if Number_Of_Arguments = Natural'Last then + Report.Failed("Argument_Count did not provide a return result"); + end if; + if TC_Verbose then + Report.Comment + ("Argument_Count = " & Integer'Image(Number_Of_Arguments)); + end if; + + + -- Check that the result of Function Argument is Constraint_Error + -- when the Number argument is outside the range of 1..Argument_Count. + + Test_Function_Argument_1 : + begin + declare + + -- Define a value that will be outside the range of + -- 1..Argument_Count. + -- Note: If the external execution environment does not support + -- passing arguments to a program, then Argument(N) for + -- any N will raise Constraint_Error, since + -- Argument_Count = 0; + + Arguments_Plus_One : Positive := + Ada.Command_Line.Argument_Count + 1; + + -- Using the above value in a call to Argument must result in + -- the raising of Constraint_Error. + + Argument_String : constant String := + Ada.Command_Line.Argument(Arguments_Plus_One); + + begin + Report.Failed("Constraint_Error not raised by Function " & + "Argument when provided a Number argument " & + "out of range"); + end; + exception + when Constraint_Error => null; -- OK, expected exception. + if TC_Verbose then + Report.Comment ("Argument_Count raised Constraint_Error"); + end if; + when others => + Report.Failed ("Unexpected exception raised by Argument " & + "in Test_Function_Argument_1 block"); + end Test_Function_Argument_1; + + + -- Check that Function Argument returns a string result. + + Test_Function_Argument_2 : + begin + if Ada.Command_Line.Argument_Count > 0 then + Report.Comment + ("Last argument is: " & + Ada.Command_Line.Argument(Ada.Command_Line.Argument_Count)); + elsif TC_Verbose then + Report.Comment("Argument_Count is zero, no test of Function " & + "Argument for string result"); + end if; + exception + when others => + Report.Failed ("Unexpected exception raised by Argument " & + "in Test_Function_Argument_2 block"); + end Test_Function_Argument_2; + + + -- Check the result of Function Command_Name. + + Name_Of_Command := new String'(Ada.Command_Line.Command_Name); + + if Name_Of_Command = null then + Report.Failed("Null string pointer returned from Function Command"); + elsif Name_Of_Command.all = "" then + Report.Comment("Null string result returned from Function Command"); + elsif TC_Verbose then + Report.Comment("Invoking command is " & Name_Of_Command.all); + end if; + + + -- Check that procedure Set_Exit_Status is available. + -- Note: If the external execution environment does not support + -- returning an exit value from a program, then Set_Exit_Status + -- does nothing. + + Ada.Command_Line.Set_Exit_Status(Ada.Command_Line.Failure); + if TC_Verbose then + Report.Comment("Exit status set to Failure"); + end if; + + Ada.Command_Line.Set_Exit_Status(Ada.Command_Line.Success); + if TC_Verbose then + Report.Comment("Exit status set to Success"); + end if; + + + exception + when The_Error : others => + Report.Failed ("The following exception was raised in the " & + "Test_Block: " & Exception_Name(The_Error)); + end Test_Block; + + Report.Result; + +end CXAF001; |