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