-- $Date: 2004/01/02 10:02:29 $
-- $Revision: 1.7 $
-- $Author: jcrocholl $

with Ada.Text_IO;

with String_Lists;
use String_Lists;

procedure Test_Suite is
   L : List;

   procedure Null_List is
   begin
      null;
      pragma Assert(Count(L) = 0);
      pragma Assert(Index(L) = 0);
      pragma Assert(Empty(L));
      pragma Assert(End_Of_List(L));
   end Null_List;

   procedure Construct is
   begin
      pragma Assert(Count(L) = 0);

      Push(L, "one");
      pragma Assert(Count(L) = 1);
      pragma Assert(Index(L) = 0);

      Unshift(L, "zero");
      pragma Assert(Count(L) = 2);
      pragma Assert(Index(L) = 0);

      Push(L, "two");
      pragma Assert(Count(L) = 3);
      pragma Assert(Index(L) = 0);

      Unshift(L, "");
      pragma Assert(Count(L) = 4);
      pragma Assert(Index(L) = 0);

      pragma Assert(not Empty(L));
      pragma Assert(End_Of_List(L));
   end Construct;

   procedure Iterate is
   begin
      Reset(L);
      pragma Assert(End_Of_List(L));

      pragma Assert(Count(L) = 4);
      pragma Assert(Index(L) = 0);

      pragma Assert(Next(L));
      pragma Assert(Count(L) = 4);
      pragma Assert(Index(L) = 1);
      pragma Assert(Current(L) = "");
      pragma Assert(not End_Of_List(L));

      Next(L);
      pragma Assert(Count(L) = 4);
      pragma Assert(Index(L) = 2);
      pragma Assert(Current(L) = "zero");
      pragma Assert(not End_Of_List(L));

      pragma Assert(Next(L));
      pragma Assert(Count(L) = 4);
      pragma Assert(Index(L) = 3);
      pragma Assert(Current(L) = "one");
      pragma Assert(not End_Of_List(L));

      Next(L);
      pragma Assert(Count(L) = 4);
      pragma Assert(Index(L) = 4);
      pragma Assert(Current(L) = "two");
      pragma Assert(not End_Of_List(L));

      pragma Assert(not Next(L));
      pragma Assert(End_Of_List(L));

      pragma Assert(Count(L) = 4);
      pragma Assert(Index(L) = 0);
   end Iterate;

   procedure Remove is
   begin
      Reset(L);
      pragma Assert(Count(L) = 4);
      pragma Assert(Index(L) = 0);

      pragma Assert(Next(L));
      pragma Assert(Count(L) = 4);
      pragma Assert(Index(L) = 1);
      pragma Assert(Current(L) = "");

      Remove_Current(L);
      pragma Assert(Count(L) = 3);
      pragma Assert(Index(L) = 1);
      pragma Assert(Current(L) = "zero");

      Next(L);
      pragma Assert(Count(L) = 3);
      pragma Assert(Index(L) = 2);
      pragma Assert(Current(L) = "one");

      Remove_Current(L);
      pragma Assert(Count(L) = 2);
      pragma Assert(Index(L) = 2);
      pragma Assert(Current(L) = "two");
   end Remove;

   procedure Insert is
   begin
      Reset(L);
      pragma Assert(Count(L) = 2);
      pragma Assert(Index(L) = 0);

      pragma Assert(Next(L));
      pragma Assert(Count(L) = 2);
      pragma Assert(Index(L) = 1);

      Insert_Before_Current(L, "");
      pragma Assert(Count(L) = 3);
      pragma Assert(Index(L) = 2);
      pragma Assert(Current(L) = "zero");

      Insert_After_Current(L, "one");
      pragma Assert(Count(L) = 4);
      pragma Assert(Index(L) = 2);
      pragma Assert(Current(L) = "zero");

      pragma Assert(Next(L));
      pragma Assert(Count(L) = 4);
      pragma Assert(Index(L) = 3);
      pragma Assert(Current(L) = "one");

      pragma Assert(Next(L));
      pragma Assert(Count(L) = 4);
      pragma Assert(Index(L) = 4);
      pragma Assert(Current(L) = "two");
   end Insert;

   procedure Update is
   begin
      Update_Current(L, "three");
      pragma Assert(Count(L) = 4);
      pragma Assert(Index(L) = 4);
      pragma Assert(Current(L) = "three");

      Update_Current(L, "two");
      pragma Assert(Count(L) = 4);
      pragma Assert(Index(L) = 4);
      pragma Assert(Current(L) = "two");
   end Update;

begin
   Null_List;
   Construct;
   Iterate;
   Iterate; -- again
   Remove;
   Insert;
   Update;
   Iterate; -- again
   pragma Debug(Ada.Text_IO.Put_Line("all tests succeeded"));
end Test_Suite;