-- CDD2001.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 the default implementation of Read and Input raise End_Error
--    if the end of stream is reached before the reading of a value is
--    completed.  (Defect Report 8652/0045,
--    Technical Corrigendum 13.13.2(35.1/1)).
--
-- CHANGE HISTORY:
--    12 FEB 2001   PHL   Initial version.
--    29 JUN 2001   RLB   Reformatted for ACATS.
--
--!

with Ada.Streams;
use Ada.Streams;
package CDD2001_0 is

    type My_Stream (Size : Stream_Element_Count) is new Root_Stream_Type with
	record
	    First : Stream_Element_Offset := 1;
	    Last : Stream_Element_Offset := 0;
	    Contents : Stream_Element_Array (1 .. Size);
	end record;

    procedure Clear (Stream : in out My_Stream);

    procedure Read (Stream : in out My_Stream;
		    Item : out Stream_Element_Array;
		    Last : out Stream_Element_Offset);

    procedure Write (Stream : in out My_Stream; Item : in Stream_Element_Array);

end CDD2001_0;

package body CDD2001_0 is

    procedure Clear (Stream : in out My_Stream) is
    begin
	Stream.First := 1;
	Stream.Last := 0;
    end Clear;

    procedure Read (Stream : in out My_Stream;
		    Item : out Stream_Element_Array;
		    Last : out Stream_Element_Offset) is
    begin
	if Item'Length >= Stream.Last - Stream.First + 1 then
	    Item (Item'First .. Item'First + Stream.Last - Stream.First) :=
	       Stream.Contents (Stream.First .. Stream.Last);
	    Last := Item'First + Stream.Last - Stream.First;
	    Stream.First := Stream.Last + 1;
	else
	    Item := Stream.Contents (Stream.First ..
					Stream.First + Item'Length - 1);
	    Last := Item'Last;
	    Stream.First := Stream.First + Item'Length;
	end if;
    end Read;

    procedure Write (Stream : in out My_Stream;
		     Item : in Stream_Element_Array) is
    begin
	Stream.Contents (Stream.Last + 1 .. Stream.Last + Item'Length) := Item;
	Stream.Last := Stream.Last + Item'Length;
    end Write;

end CDD2001_0;

with Ada.Exceptions;
use Ada.Exceptions;
with CDD2001_0;
use CDD2001_0;
with Io_Exceptions;
use Io_Exceptions;
with Report;
use Report;
procedure CDD2001 is

    subtype Int is Integer range -20 .. 20;

    type R (D : Int) is
	record
	    C1 : Character := Ident_Char ('a');
	    case D is
		when 0 .. 20 =>
		    C2 : String (1 .. D) := (others => Ident_Char ('b'));
		when others =>
		    C3, C4 : Float := Float (-D);
	    end case;
	end record;

    S : aliased My_Stream (200);

begin
    Test
       ("CDD2001",
	   "Check that the default implementation of Read and Input " &
	   "raise End_Error if the end of stream is reached before the " &
           "reading of a value is completed");

    Read:
	declare
	    X : R (Ident_Int (13));
	begin
	    Clear (S);

	    -- A complete object.
	    R'Write (S'Access, X);
	    X.C1 := Ident_Char ('A');
	    X.C2 := (others => Ident_Char ('B'));
	    R'Read (S'Access, X);
	    if X.C1 /= Ident_Char ('a') or X.C2 /=
					      (1 .. 13 => Ident_Char ('b')) then
		Failed ("Read did not produce the expected result");
	    end if;

	    Clear (S);

	    -- Not enough data.
	    Character'Write (S'Access, 'a');
	    String'Write (S'Access, "bbb");

	    begin
		R'Read (S'Access, X);
		Failed
		   ("No exception raised when the end of stream is reached " &
		    "before the reading of a value is completed - 1");
	    exception
		when End_Error =>
		    null;
		when E: others =>
		    Failed ("Wrong Exception " & Exception_Name (E) &
			    " - " & Exception_Information (E) &
			    " - " & Exception_Message (E) & " - 1");
	    end;

	end Read;

    Input:
	declare
	    X : R (Ident_Int (-11));
	begin
	    Clear (S);

	    -- A complete object.
	    R'Output (S'Access, X);
	    X.C1 := Ident_Char ('A');
	    X.C3 := 4.0;
	    X.C4 := 5.0;
	    X := R'Input (S'Access);
	    if X.C1 /= Ident_Char ('a') or X.C3 /= 11.0 or X.C4 /= 11.0 then
		Failed ("Input did not produce the expected result");
	    end if;

	    Clear (S);

	    -- Not enough data.
	    Integer'Output (S'Access, Ident_Int (-11)); -- The discriminant
	    Character'Output (S'Access, 'a');
	    Float'Output (S'Access, 11.0);

	    begin
		X := R'Input (S'Access);
		Failed
		   ("No exception raised when the end of stream is reached " &
		    "before the reading of a value is completed - 2");
	    exception
		when End_Error =>
		    null;
		when E: others =>
		    Failed ("Wrong exception " & Exception_Name (E) &
			    " - " & Exception_Message (E) & " - 2");
	    end;

	end Input;

    Result;
end CDD2001;

