-- 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. --! 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; 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;