Merge branch 'master' of ssh://git.samba.org/data/git/samba into regsrv
[kai/samba-autobuild/.git] / lib / zlib / contrib / ada / test.adb
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;