symbian-qemu-0.9.1-12/zlib-1.2.3/contrib/ada/test.adb
changeset 1 2fb8b9db1c86
equal deleted inserted replaced
0:ffa851df0825 1:2fb8b9db1c86
       
     1 ----------------------------------------------------------------
       
     2 --  ZLib for Ada thick binding.                               --
       
     3 --                                                            --
       
     4 --  Copyright (C) 2002-2003 Dmitriy Anisimkov                 --
       
     5 --                                                            --
       
     6 --  Open source license information is in the zlib.ads file.  --
       
     7 ----------------------------------------------------------------
       
     8 
       
     9 --  $Id: test.adb,v 1.17 2003/08/12 12:13:30 vagul Exp $
       
    10 
       
    11 --  The program has a few aims.
       
    12 --  1. Test ZLib.Ada95 thick binding functionality.
       
    13 --  2. Show the example of use main functionality of the ZLib.Ada95 binding.
       
    14 --  3. Build this program automatically compile all ZLib.Ada95 packages under
       
    15 --     GNAT Ada95 compiler.
       
    16 
       
    17 with ZLib.Streams;
       
    18 with Ada.Streams.Stream_IO;
       
    19 with Ada.Numerics.Discrete_Random;
       
    20 
       
    21 with Ada.Text_IO;
       
    22 
       
    23 with Ada.Calendar;
       
    24 
       
    25 procedure Test is
       
    26 
       
    27    use Ada.Streams;
       
    28    use Stream_IO;
       
    29 
       
    30    ------------------------------------
       
    31    --  Test configuration parameters --
       
    32    ------------------------------------
       
    33 
       
    34    File_Size   : Count   := 100_000;
       
    35    Continuous  : constant Boolean := False;
       
    36 
       
    37    Header      : constant ZLib.Header_Type := ZLib.Default;
       
    38                                               --  ZLib.None;
       
    39                                               --  ZLib.Auto;
       
    40                                               --  ZLib.GZip;
       
    41    --  Do not use Header other then Default in ZLib versions 1.1.4
       
    42    --  and older.
       
    43 
       
    44    Strategy    : constant ZLib.Strategy_Type := ZLib.Default_Strategy;
       
    45    Init_Random : constant := 10;
       
    46 
       
    47    -- End --
       
    48 
       
    49    In_File_Name  : constant String := "testzlib.in";
       
    50    --  Name of the input file
       
    51 
       
    52    Z_File_Name   : constant String := "testzlib.zlb";
       
    53    --  Name of the compressed file.
       
    54 
       
    55    Out_File_Name : constant String := "testzlib.out";
       
    56    --  Name of the decompressed file.
       
    57 
       
    58    File_In   : File_Type;
       
    59    File_Out  : File_Type;
       
    60    File_Back : File_Type;
       
    61    File_Z    : ZLib.Streams.Stream_Type;
       
    62 
       
    63    Filter : ZLib.Filter_Type;
       
    64 
       
    65    Time_Stamp : Ada.Calendar.Time;
       
    66 
       
    67    procedure Generate_File;
       
    68    --  Generate file of spetsified size with some random data.
       
    69    --  The random data is repeatable, for the good compression.
       
    70 
       
    71    procedure Compare_Streams
       
    72      (Left, Right : in out Root_Stream_Type'Class);
       
    73    --  The procedure compearing data in 2 streams.
       
    74    --  It is for compare data before and after compression/decompression.
       
    75 
       
    76    procedure Compare_Files (Left, Right : String);
       
    77    --  Compare files. Based on the Compare_Streams.
       
    78 
       
    79    procedure Copy_Streams
       
    80      (Source, Target : in out Root_Stream_Type'Class;
       
    81       Buffer_Size    : in     Stream_Element_Offset := 1024);
       
    82    --  Copying data from one stream to another. It is for test stream
       
    83    --  interface of the library.
       
    84 
       
    85    procedure Data_In
       
    86      (Item : out Stream_Element_Array;
       
    87       Last : out Stream_Element_Offset);
       
    88    --  this procedure is for generic instantiation of
       
    89    --  ZLib.Generic_Translate.
       
    90    --  reading data from the File_In.
       
    91 
       
    92    procedure Data_Out (Item : in Stream_Element_Array);
       
    93    --  this procedure is for generic instantiation of
       
    94    --  ZLib.Generic_Translate.
       
    95    --  writing data to the File_Out.
       
    96 
       
    97    procedure Stamp;
       
    98    --  Store the timestamp to the local variable.
       
    99 
       
   100    procedure Print_Statistic (Msg : String; Data_Size : ZLib.Count);
       
   101    --  Print the time statistic with the message.
       
   102 
       
   103    procedure Translate is new ZLib.Generic_Translate
       
   104                                 (Data_In  => Data_In,
       
   105                                  Data_Out => Data_Out);
       
   106    --  This procedure is moving data from File_In to File_Out
       
   107    --  with compression or decompression, depend on initialization of
       
   108    --  Filter parameter.
       
   109 
       
   110    -------------------
       
   111    -- Compare_Files --
       
   112    -------------------
       
   113 
       
   114    procedure Compare_Files (Left, Right : String) is
       
   115       Left_File, Right_File : File_Type;
       
   116    begin
       
   117       Open (Left_File, In_File, Left);
       
   118       Open (Right_File, In_File, Right);
       
   119       Compare_Streams (Stream (Left_File).all, Stream (Right_File).all);
       
   120       Close (Left_File);
       
   121       Close (Right_File);
       
   122    end Compare_Files;
       
   123 
       
   124    ---------------------
       
   125    -- Compare_Streams --
       
   126    ---------------------
       
   127 
       
   128    procedure Compare_Streams
       
   129      (Left, Right : in out Ada.Streams.Root_Stream_Type'Class)
       
   130    is
       
   131       Left_Buffer, Right_Buffer : Stream_Element_Array (0 .. 16#FFF#);
       
   132       Left_Last, Right_Last : Stream_Element_Offset;
       
   133    begin
       
   134       loop
       
   135          Read (Left, Left_Buffer, Left_Last);
       
   136          Read (Right, Right_Buffer, Right_Last);
       
   137 
       
   138          if Left_Last /= Right_Last then
       
   139             Ada.Text_IO.Put_Line ("Compare error :"
       
   140               & Stream_Element_Offset'Image (Left_Last)
       
   141               & " /= "
       
   142               & Stream_Element_Offset'Image (Right_Last));
       
   143 
       
   144             raise Constraint_Error;
       
   145 
       
   146          elsif Left_Buffer (0 .. Left_Last)
       
   147                /= Right_Buffer (0 .. Right_Last)
       
   148          then
       
   149             Ada.Text_IO.Put_Line ("ERROR: IN and OUT files is not equal.");
       
   150             raise Constraint_Error;
       
   151 
       
   152          end if;
       
   153 
       
   154          exit when Left_Last < Left_Buffer'Last;
       
   155       end loop;
       
   156    end Compare_Streams;
       
   157 
       
   158    ------------------
       
   159    -- Copy_Streams --
       
   160    ------------------
       
   161 
       
   162    procedure Copy_Streams
       
   163      (Source, Target : in out Ada.Streams.Root_Stream_Type'Class;
       
   164       Buffer_Size    : in     Stream_Element_Offset := 1024)
       
   165    is
       
   166       Buffer : Stream_Element_Array (1 .. Buffer_Size);
       
   167       Last   : Stream_Element_Offset;
       
   168    begin
       
   169       loop
       
   170          Read  (Source, Buffer, Last);
       
   171          Write (Target, Buffer (1 .. Last));
       
   172 
       
   173          exit when Last < Buffer'Last;
       
   174       end loop;
       
   175    end Copy_Streams;
       
   176 
       
   177    -------------
       
   178    -- Data_In --
       
   179    -------------
       
   180 
       
   181    procedure Data_In
       
   182      (Item : out Stream_Element_Array;
       
   183       Last : out Stream_Element_Offset) is
       
   184    begin
       
   185       Read (File_In, Item, Last);
       
   186    end Data_In;
       
   187 
       
   188    --------------
       
   189    -- Data_Out --
       
   190    --------------
       
   191 
       
   192    procedure Data_Out (Item : in Stream_Element_Array) is
       
   193    begin
       
   194       Write (File_Out, Item);
       
   195    end Data_Out;
       
   196 
       
   197    -------------------
       
   198    -- Generate_File --
       
   199    -------------------
       
   200 
       
   201    procedure Generate_File is
       
   202       subtype Visible_Symbols is Stream_Element range 16#20# .. 16#7E#;
       
   203 
       
   204       package Random_Elements is
       
   205          new Ada.Numerics.Discrete_Random (Visible_Symbols);
       
   206 
       
   207       Gen    : Random_Elements.Generator;
       
   208       Buffer : Stream_Element_Array := (1 .. 77 => 16#20#) & 10;
       
   209 
       
   210       Buffer_Count : constant Count := File_Size / Buffer'Length;
       
   211       --  Number of same buffers in the packet.
       
   212 
       
   213       Density : constant Count := 30; --  from 0 to Buffer'Length - 2;
       
   214 
       
   215       procedure Fill_Buffer (J, D : in Count);
       
   216       --  Change the part of the buffer.
       
   217 
       
   218       -----------------
       
   219       -- Fill_Buffer --
       
   220       -----------------
       
   221 
       
   222       procedure Fill_Buffer (J, D : in Count) is
       
   223       begin
       
   224          for K in 0 .. D loop
       
   225             Buffer
       
   226               (Stream_Element_Offset ((J + K) mod (Buffer'Length - 1) + 1))
       
   227              := Random_Elements.Random (Gen);
       
   228 
       
   229          end loop;
       
   230       end Fill_Buffer;
       
   231 
       
   232    begin
       
   233       Random_Elements.Reset (Gen, Init_Random);
       
   234 
       
   235       Create (File_In, Out_File, In_File_Name);
       
   236 
       
   237       Fill_Buffer (1, Buffer'Length - 2);
       
   238 
       
   239       for J in 1 .. Buffer_Count loop
       
   240          Write (File_In, Buffer);
       
   241 
       
   242          Fill_Buffer (J, Density);
       
   243       end loop;
       
   244 
       
   245       --  fill remain size.
       
   246 
       
   247       Write
       
   248         (File_In,
       
   249          Buffer
       
   250            (1 .. Stream_Element_Offset
       
   251                    (File_Size - Buffer'Length * Buffer_Count)));
       
   252 
       
   253       Flush (File_In);
       
   254       Close (File_In);
       
   255    end Generate_File;
       
   256 
       
   257    ---------------------
       
   258    -- Print_Statistic --
       
   259    ---------------------
       
   260 
       
   261    procedure Print_Statistic (Msg : String; Data_Size : ZLib.Count) is
       
   262       use Ada.Calendar;
       
   263       use Ada.Text_IO;
       
   264 
       
   265       package Count_IO is new Integer_IO (ZLib.Count);
       
   266 
       
   267       Curr_Dur : Duration := Clock - Time_Stamp;
       
   268    begin
       
   269       Put (Msg);
       
   270 
       
   271       Set_Col (20);
       
   272       Ada.Text_IO.Put ("size =");
       
   273 
       
   274       Count_IO.Put
       
   275         (Data_Size,
       
   276          Width => Stream_IO.Count'Image (File_Size)'Length);
       
   277 
       
   278       Put_Line (" duration =" & Duration'Image (Curr_Dur));
       
   279    end Print_Statistic;
       
   280 
       
   281    -----------
       
   282    -- Stamp --
       
   283    -----------
       
   284 
       
   285    procedure Stamp is
       
   286    begin
       
   287       Time_Stamp := Ada.Calendar.Clock;
       
   288    end Stamp;
       
   289 
       
   290 begin
       
   291    Ada.Text_IO.Put_Line ("ZLib " & ZLib.Version);
       
   292 
       
   293    loop
       
   294       Generate_File;
       
   295 
       
   296       for Level in ZLib.Compression_Level'Range loop
       
   297 
       
   298          Ada.Text_IO.Put_Line ("Level ="
       
   299             & ZLib.Compression_Level'Image (Level));
       
   300 
       
   301          --  Test generic interface.
       
   302          Open   (File_In, In_File, In_File_Name);
       
   303          Create (File_Out, Out_File, Z_File_Name);
       
   304 
       
   305          Stamp;
       
   306 
       
   307          --  Deflate using generic instantiation.
       
   308 
       
   309          ZLib.Deflate_Init
       
   310                (Filter   => Filter,
       
   311                 Level    => Level,
       
   312                 Strategy => Strategy,
       
   313                 Header   => Header);
       
   314 
       
   315          Translate (Filter);
       
   316          Print_Statistic ("Generic compress", ZLib.Total_Out (Filter));
       
   317          ZLib.Close (Filter);
       
   318 
       
   319          Close (File_In);
       
   320          Close (File_Out);
       
   321 
       
   322          Open   (File_In, In_File, Z_File_Name);
       
   323          Create (File_Out, Out_File, Out_File_Name);
       
   324 
       
   325          Stamp;
       
   326 
       
   327          --  Inflate using generic instantiation.
       
   328 
       
   329          ZLib.Inflate_Init (Filter, Header => Header);
       
   330 
       
   331          Translate (Filter);
       
   332          Print_Statistic ("Generic decompress", ZLib.Total_Out (Filter));
       
   333 
       
   334          ZLib.Close (Filter);
       
   335 
       
   336          Close (File_In);
       
   337          Close (File_Out);
       
   338 
       
   339          Compare_Files (In_File_Name, Out_File_Name);
       
   340 
       
   341          --  Test stream interface.
       
   342 
       
   343          --  Compress to the back stream.
       
   344 
       
   345          Open   (File_In, In_File, In_File_Name);
       
   346          Create (File_Back, Out_File, Z_File_Name);
       
   347 
       
   348          Stamp;
       
   349 
       
   350          ZLib.Streams.Create
       
   351            (Stream          => File_Z,
       
   352             Mode            => ZLib.Streams.Out_Stream,
       
   353             Back            => ZLib.Streams.Stream_Access
       
   354                                  (Stream (File_Back)),
       
   355             Back_Compressed => True,
       
   356             Level           => Level,
       
   357             Strategy        => Strategy,
       
   358             Header          => Header);
       
   359 
       
   360          Copy_Streams
       
   361            (Source => Stream (File_In).all,
       
   362             Target => File_Z);
       
   363 
       
   364          --  Flushing internal buffers to the back stream.
       
   365 
       
   366          ZLib.Streams.Flush (File_Z, ZLib.Finish);
       
   367 
       
   368          Print_Statistic ("Write compress",
       
   369                           ZLib.Streams.Write_Total_Out (File_Z));
       
   370 
       
   371          ZLib.Streams.Close (File_Z);
       
   372 
       
   373          Close (File_In);
       
   374          Close (File_Back);
       
   375 
       
   376          --  Compare reading from original file and from
       
   377          --  decompression stream.
       
   378 
       
   379          Open (File_In,   In_File, In_File_Name);
       
   380          Open (File_Back, In_File, Z_File_Name);
       
   381 
       
   382          ZLib.Streams.Create
       
   383            (Stream          => File_Z,
       
   384             Mode            => ZLib.Streams.In_Stream,
       
   385             Back            => ZLib.Streams.Stream_Access
       
   386                                  (Stream (File_Back)),
       
   387             Back_Compressed => True,
       
   388             Header          => Header);
       
   389 
       
   390          Stamp;
       
   391          Compare_Streams (Stream (File_In).all, File_Z);
       
   392 
       
   393          Print_Statistic ("Read decompress",
       
   394                           ZLib.Streams.Read_Total_Out (File_Z));
       
   395 
       
   396          ZLib.Streams.Close (File_Z);
       
   397          Close (File_In);
       
   398          Close (File_Back);
       
   399 
       
   400          --  Compress by reading from compression stream.
       
   401 
       
   402          Open (File_Back, In_File, In_File_Name);
       
   403          Create (File_Out, Out_File, Z_File_Name);
       
   404 
       
   405          ZLib.Streams.Create
       
   406            (Stream          => File_Z,
       
   407             Mode            => ZLib.Streams.In_Stream,
       
   408             Back            => ZLib.Streams.Stream_Access
       
   409                                  (Stream (File_Back)),
       
   410             Back_Compressed => False,
       
   411             Level           => Level,
       
   412             Strategy        => Strategy,
       
   413             Header          => Header);
       
   414 
       
   415          Stamp;
       
   416          Copy_Streams
       
   417            (Source => File_Z,
       
   418             Target => Stream (File_Out).all);
       
   419 
       
   420          Print_Statistic ("Read compress",
       
   421                           ZLib.Streams.Read_Total_Out (File_Z));
       
   422 
       
   423          ZLib.Streams.Close (File_Z);
       
   424 
       
   425          Close (File_Out);
       
   426          Close (File_Back);
       
   427 
       
   428          --  Decompress to decompression stream.
       
   429 
       
   430          Open   (File_In,   In_File, Z_File_Name);
       
   431          Create (File_Back, Out_File, Out_File_Name);
       
   432 
       
   433          ZLib.Streams.Create
       
   434            (Stream          => File_Z,
       
   435             Mode            => ZLib.Streams.Out_Stream,
       
   436             Back            => ZLib.Streams.Stream_Access
       
   437                                  (Stream (File_Back)),
       
   438             Back_Compressed => False,
       
   439             Header          => Header);
       
   440 
       
   441          Stamp;
       
   442 
       
   443          Copy_Streams
       
   444            (Source => Stream (File_In).all,
       
   445             Target => File_Z);
       
   446 
       
   447          Print_Statistic ("Write decompress",
       
   448                           ZLib.Streams.Write_Total_Out (File_Z));
       
   449 
       
   450          ZLib.Streams.Close (File_Z);
       
   451          Close (File_In);
       
   452          Close (File_Back);
       
   453 
       
   454          Compare_Files (In_File_Name, Out_File_Name);
       
   455       end loop;
       
   456 
       
   457       Ada.Text_IO.Put_Line (Count'Image (File_Size) & " Ok.");
       
   458 
       
   459       exit when not Continuous;
       
   460 
       
   461       File_Size := File_Size + 1;
       
   462    end loop;
       
   463 end Test;