Chris@43: ---------------------------------------------------------------- Chris@43: -- ZLib for Ada thick binding. -- Chris@43: -- -- Chris@43: -- Copyright (C) 2002-2003 Dmitriy Anisimkov -- Chris@43: -- -- Chris@43: -- Open source license information is in the zlib.ads file. -- Chris@43: ---------------------------------------------------------------- Chris@43: Chris@43: -- $Id: test.adb,v 1.17 2003/08/12 12:13:30 vagul Exp $ Chris@43: Chris@43: -- The program has a few aims. Chris@43: -- 1. Test ZLib.Ada95 thick binding functionality. Chris@43: -- 2. Show the example of use main functionality of the ZLib.Ada95 binding. Chris@43: -- 3. Build this program automatically compile all ZLib.Ada95 packages under Chris@43: -- GNAT Ada95 compiler. Chris@43: Chris@43: with ZLib.Streams; Chris@43: with Ada.Streams.Stream_IO; Chris@43: with Ada.Numerics.Discrete_Random; Chris@43: Chris@43: with Ada.Text_IO; Chris@43: Chris@43: with Ada.Calendar; Chris@43: Chris@43: procedure Test is Chris@43: Chris@43: use Ada.Streams; Chris@43: use Stream_IO; Chris@43: Chris@43: ------------------------------------ Chris@43: -- Test configuration parameters -- Chris@43: ------------------------------------ Chris@43: Chris@43: File_Size : Count := 100_000; Chris@43: Continuous : constant Boolean := False; Chris@43: Chris@43: Header : constant ZLib.Header_Type := ZLib.Default; Chris@43: -- ZLib.None; Chris@43: -- ZLib.Auto; Chris@43: -- ZLib.GZip; Chris@43: -- Do not use Header other then Default in ZLib versions 1.1.4 Chris@43: -- and older. Chris@43: Chris@43: Strategy : constant ZLib.Strategy_Type := ZLib.Default_Strategy; Chris@43: Init_Random : constant := 10; Chris@43: Chris@43: -- End -- Chris@43: Chris@43: In_File_Name : constant String := "testzlib.in"; Chris@43: -- Name of the input file Chris@43: Chris@43: Z_File_Name : constant String := "testzlib.zlb"; Chris@43: -- Name of the compressed file. Chris@43: Chris@43: Out_File_Name : constant String := "testzlib.out"; Chris@43: -- Name of the decompressed file. Chris@43: Chris@43: File_In : File_Type; Chris@43: File_Out : File_Type; Chris@43: File_Back : File_Type; Chris@43: File_Z : ZLib.Streams.Stream_Type; Chris@43: Chris@43: Filter : ZLib.Filter_Type; Chris@43: Chris@43: Time_Stamp : Ada.Calendar.Time; Chris@43: Chris@43: procedure Generate_File; Chris@43: -- Generate file of spetsified size with some random data. Chris@43: -- The random data is repeatable, for the good compression. Chris@43: Chris@43: procedure Compare_Streams Chris@43: (Left, Right : in out Root_Stream_Type'Class); Chris@43: -- The procedure compearing data in 2 streams. Chris@43: -- It is for compare data before and after compression/decompression. Chris@43: Chris@43: procedure Compare_Files (Left, Right : String); Chris@43: -- Compare files. Based on the Compare_Streams. Chris@43: Chris@43: procedure Copy_Streams Chris@43: (Source, Target : in out Root_Stream_Type'Class; Chris@43: Buffer_Size : in Stream_Element_Offset := 1024); Chris@43: -- Copying data from one stream to another. It is for test stream Chris@43: -- interface of the library. Chris@43: Chris@43: procedure Data_In Chris@43: (Item : out Stream_Element_Array; Chris@43: Last : out Stream_Element_Offset); Chris@43: -- this procedure is for generic instantiation of Chris@43: -- ZLib.Generic_Translate. Chris@43: -- reading data from the File_In. Chris@43: Chris@43: procedure Data_Out (Item : in Stream_Element_Array); Chris@43: -- this procedure is for generic instantiation of Chris@43: -- ZLib.Generic_Translate. Chris@43: -- writing data to the File_Out. Chris@43: Chris@43: procedure Stamp; Chris@43: -- Store the timestamp to the local variable. Chris@43: Chris@43: procedure Print_Statistic (Msg : String; Data_Size : ZLib.Count); Chris@43: -- Print the time statistic with the message. Chris@43: Chris@43: procedure Translate is new ZLib.Generic_Translate Chris@43: (Data_In => Data_In, Chris@43: Data_Out => Data_Out); Chris@43: -- This procedure is moving data from File_In to File_Out Chris@43: -- with compression or decompression, depend on initialization of Chris@43: -- Filter parameter. Chris@43: Chris@43: ------------------- Chris@43: -- Compare_Files -- Chris@43: ------------------- Chris@43: Chris@43: procedure Compare_Files (Left, Right : String) is Chris@43: Left_File, Right_File : File_Type; Chris@43: begin Chris@43: Open (Left_File, In_File, Left); Chris@43: Open (Right_File, In_File, Right); Chris@43: Compare_Streams (Stream (Left_File).all, Stream (Right_File).all); Chris@43: Close (Left_File); Chris@43: Close (Right_File); Chris@43: end Compare_Files; Chris@43: Chris@43: --------------------- Chris@43: -- Compare_Streams -- Chris@43: --------------------- Chris@43: Chris@43: procedure Compare_Streams Chris@43: (Left, Right : in out Ada.Streams.Root_Stream_Type'Class) Chris@43: is Chris@43: Left_Buffer, Right_Buffer : Stream_Element_Array (0 .. 16#FFF#); Chris@43: Left_Last, Right_Last : Stream_Element_Offset; Chris@43: begin Chris@43: loop Chris@43: Read (Left, Left_Buffer, Left_Last); Chris@43: Read (Right, Right_Buffer, Right_Last); Chris@43: Chris@43: if Left_Last /= Right_Last then Chris@43: Ada.Text_IO.Put_Line ("Compare error :" Chris@43: & Stream_Element_Offset'Image (Left_Last) Chris@43: & " /= " Chris@43: & Stream_Element_Offset'Image (Right_Last)); Chris@43: Chris@43: raise Constraint_Error; Chris@43: Chris@43: elsif Left_Buffer (0 .. Left_Last) Chris@43: /= Right_Buffer (0 .. Right_Last) Chris@43: then Chris@43: Ada.Text_IO.Put_Line ("ERROR: IN and OUT files is not equal."); Chris@43: raise Constraint_Error; Chris@43: Chris@43: end if; Chris@43: Chris@43: exit when Left_Last < Left_Buffer'Last; Chris@43: end loop; Chris@43: end Compare_Streams; Chris@43: Chris@43: ------------------ Chris@43: -- Copy_Streams -- Chris@43: ------------------ Chris@43: Chris@43: procedure Copy_Streams Chris@43: (Source, Target : in out Ada.Streams.Root_Stream_Type'Class; Chris@43: Buffer_Size : in Stream_Element_Offset := 1024) Chris@43: is Chris@43: Buffer : Stream_Element_Array (1 .. Buffer_Size); Chris@43: Last : Stream_Element_Offset; Chris@43: begin Chris@43: loop Chris@43: Read (Source, Buffer, Last); Chris@43: Write (Target, Buffer (1 .. Last)); Chris@43: Chris@43: exit when Last < Buffer'Last; Chris@43: end loop; Chris@43: end Copy_Streams; Chris@43: Chris@43: ------------- Chris@43: -- Data_In -- Chris@43: ------------- Chris@43: Chris@43: procedure Data_In Chris@43: (Item : out Stream_Element_Array; Chris@43: Last : out Stream_Element_Offset) is Chris@43: begin Chris@43: Read (File_In, Item, Last); Chris@43: end Data_In; Chris@43: Chris@43: -------------- Chris@43: -- Data_Out -- Chris@43: -------------- Chris@43: Chris@43: procedure Data_Out (Item : in Stream_Element_Array) is Chris@43: begin Chris@43: Write (File_Out, Item); Chris@43: end Data_Out; Chris@43: Chris@43: ------------------- Chris@43: -- Generate_File -- Chris@43: ------------------- Chris@43: Chris@43: procedure Generate_File is Chris@43: subtype Visible_Symbols is Stream_Element range 16#20# .. 16#7E#; Chris@43: Chris@43: package Random_Elements is Chris@43: new Ada.Numerics.Discrete_Random (Visible_Symbols); Chris@43: Chris@43: Gen : Random_Elements.Generator; Chris@43: Buffer : Stream_Element_Array := (1 .. 77 => 16#20#) & 10; Chris@43: Chris@43: Buffer_Count : constant Count := File_Size / Buffer'Length; Chris@43: -- Number of same buffers in the packet. Chris@43: Chris@43: Density : constant Count := 30; -- from 0 to Buffer'Length - 2; Chris@43: Chris@43: procedure Fill_Buffer (J, D : in Count); Chris@43: -- Change the part of the buffer. Chris@43: Chris@43: ----------------- Chris@43: -- Fill_Buffer -- Chris@43: ----------------- Chris@43: Chris@43: procedure Fill_Buffer (J, D : in Count) is Chris@43: begin Chris@43: for K in 0 .. D loop Chris@43: Buffer Chris@43: (Stream_Element_Offset ((J + K) mod (Buffer'Length - 1) + 1)) Chris@43: := Random_Elements.Random (Gen); Chris@43: Chris@43: end loop; Chris@43: end Fill_Buffer; Chris@43: Chris@43: begin Chris@43: Random_Elements.Reset (Gen, Init_Random); Chris@43: Chris@43: Create (File_In, Out_File, In_File_Name); Chris@43: Chris@43: Fill_Buffer (1, Buffer'Length - 2); Chris@43: Chris@43: for J in 1 .. Buffer_Count loop Chris@43: Write (File_In, Buffer); Chris@43: Chris@43: Fill_Buffer (J, Density); Chris@43: end loop; Chris@43: Chris@43: -- fill remain size. Chris@43: Chris@43: Write Chris@43: (File_In, Chris@43: Buffer Chris@43: (1 .. Stream_Element_Offset Chris@43: (File_Size - Buffer'Length * Buffer_Count))); Chris@43: Chris@43: Flush (File_In); Chris@43: Close (File_In); Chris@43: end Generate_File; Chris@43: Chris@43: --------------------- Chris@43: -- Print_Statistic -- Chris@43: --------------------- Chris@43: Chris@43: procedure Print_Statistic (Msg : String; Data_Size : ZLib.Count) is Chris@43: use Ada.Calendar; Chris@43: use Ada.Text_IO; Chris@43: Chris@43: package Count_IO is new Integer_IO (ZLib.Count); Chris@43: Chris@43: Curr_Dur : Duration := Clock - Time_Stamp; Chris@43: begin Chris@43: Put (Msg); Chris@43: Chris@43: Set_Col (20); Chris@43: Ada.Text_IO.Put ("size ="); Chris@43: Chris@43: Count_IO.Put Chris@43: (Data_Size, Chris@43: Width => Stream_IO.Count'Image (File_Size)'Length); Chris@43: Chris@43: Put_Line (" duration =" & Duration'Image (Curr_Dur)); Chris@43: end Print_Statistic; Chris@43: Chris@43: ----------- Chris@43: -- Stamp -- Chris@43: ----------- Chris@43: Chris@43: procedure Stamp is Chris@43: begin Chris@43: Time_Stamp := Ada.Calendar.Clock; Chris@43: end Stamp; Chris@43: Chris@43: begin Chris@43: Ada.Text_IO.Put_Line ("ZLib " & ZLib.Version); Chris@43: Chris@43: loop Chris@43: Generate_File; Chris@43: Chris@43: for Level in ZLib.Compression_Level'Range loop Chris@43: Chris@43: Ada.Text_IO.Put_Line ("Level =" Chris@43: & ZLib.Compression_Level'Image (Level)); Chris@43: Chris@43: -- Test generic interface. Chris@43: Open (File_In, In_File, In_File_Name); Chris@43: Create (File_Out, Out_File, Z_File_Name); Chris@43: Chris@43: Stamp; Chris@43: Chris@43: -- Deflate using generic instantiation. Chris@43: Chris@43: ZLib.Deflate_Init Chris@43: (Filter => Filter, Chris@43: Level => Level, Chris@43: Strategy => Strategy, Chris@43: Header => Header); Chris@43: Chris@43: Translate (Filter); Chris@43: Print_Statistic ("Generic compress", ZLib.Total_Out (Filter)); Chris@43: ZLib.Close (Filter); Chris@43: Chris@43: Close (File_In); Chris@43: Close (File_Out); Chris@43: Chris@43: Open (File_In, In_File, Z_File_Name); Chris@43: Create (File_Out, Out_File, Out_File_Name); Chris@43: Chris@43: Stamp; Chris@43: Chris@43: -- Inflate using generic instantiation. Chris@43: Chris@43: ZLib.Inflate_Init (Filter, Header => Header); Chris@43: Chris@43: Translate (Filter); Chris@43: Print_Statistic ("Generic decompress", ZLib.Total_Out (Filter)); Chris@43: Chris@43: ZLib.Close (Filter); Chris@43: Chris@43: Close (File_In); Chris@43: Close (File_Out); Chris@43: Chris@43: Compare_Files (In_File_Name, Out_File_Name); Chris@43: Chris@43: -- Test stream interface. Chris@43: Chris@43: -- Compress to the back stream. Chris@43: Chris@43: Open (File_In, In_File, In_File_Name); Chris@43: Create (File_Back, Out_File, Z_File_Name); Chris@43: Chris@43: Stamp; Chris@43: Chris@43: ZLib.Streams.Create Chris@43: (Stream => File_Z, Chris@43: Mode => ZLib.Streams.Out_Stream, Chris@43: Back => ZLib.Streams.Stream_Access Chris@43: (Stream (File_Back)), Chris@43: Back_Compressed => True, Chris@43: Level => Level, Chris@43: Strategy => Strategy, Chris@43: Header => Header); Chris@43: Chris@43: Copy_Streams Chris@43: (Source => Stream (File_In).all, Chris@43: Target => File_Z); Chris@43: Chris@43: -- Flushing internal buffers to the back stream. Chris@43: Chris@43: ZLib.Streams.Flush (File_Z, ZLib.Finish); Chris@43: Chris@43: Print_Statistic ("Write compress", Chris@43: ZLib.Streams.Write_Total_Out (File_Z)); Chris@43: Chris@43: ZLib.Streams.Close (File_Z); Chris@43: Chris@43: Close (File_In); Chris@43: Close (File_Back); Chris@43: Chris@43: -- Compare reading from original file and from Chris@43: -- decompression stream. Chris@43: Chris@43: Open (File_In, In_File, In_File_Name); Chris@43: Open (File_Back, In_File, Z_File_Name); Chris@43: Chris@43: ZLib.Streams.Create Chris@43: (Stream => File_Z, Chris@43: Mode => ZLib.Streams.In_Stream, Chris@43: Back => ZLib.Streams.Stream_Access Chris@43: (Stream (File_Back)), Chris@43: Back_Compressed => True, Chris@43: Header => Header); Chris@43: Chris@43: Stamp; Chris@43: Compare_Streams (Stream (File_In).all, File_Z); Chris@43: Chris@43: Print_Statistic ("Read decompress", Chris@43: ZLib.Streams.Read_Total_Out (File_Z)); Chris@43: Chris@43: ZLib.Streams.Close (File_Z); Chris@43: Close (File_In); Chris@43: Close (File_Back); Chris@43: Chris@43: -- Compress by reading from compression stream. Chris@43: Chris@43: Open (File_Back, In_File, In_File_Name); Chris@43: Create (File_Out, Out_File, Z_File_Name); Chris@43: Chris@43: ZLib.Streams.Create Chris@43: (Stream => File_Z, Chris@43: Mode => ZLib.Streams.In_Stream, Chris@43: Back => ZLib.Streams.Stream_Access Chris@43: (Stream (File_Back)), Chris@43: Back_Compressed => False, Chris@43: Level => Level, Chris@43: Strategy => Strategy, Chris@43: Header => Header); Chris@43: Chris@43: Stamp; Chris@43: Copy_Streams Chris@43: (Source => File_Z, Chris@43: Target => Stream (File_Out).all); Chris@43: Chris@43: Print_Statistic ("Read compress", Chris@43: ZLib.Streams.Read_Total_Out (File_Z)); Chris@43: Chris@43: ZLib.Streams.Close (File_Z); Chris@43: Chris@43: Close (File_Out); Chris@43: Close (File_Back); Chris@43: Chris@43: -- Decompress to decompression stream. Chris@43: Chris@43: Open (File_In, In_File, Z_File_Name); Chris@43: Create (File_Back, Out_File, Out_File_Name); Chris@43: Chris@43: ZLib.Streams.Create Chris@43: (Stream => File_Z, Chris@43: Mode => ZLib.Streams.Out_Stream, Chris@43: Back => ZLib.Streams.Stream_Access Chris@43: (Stream (File_Back)), Chris@43: Back_Compressed => False, Chris@43: Header => Header); Chris@43: Chris@43: Stamp; Chris@43: Chris@43: Copy_Streams Chris@43: (Source => Stream (File_In).all, Chris@43: Target => File_Z); Chris@43: Chris@43: Print_Statistic ("Write decompress", Chris@43: ZLib.Streams.Write_Total_Out (File_Z)); Chris@43: Chris@43: ZLib.Streams.Close (File_Z); Chris@43: Close (File_In); Chris@43: Close (File_Back); Chris@43: Chris@43: Compare_Files (In_File_Name, Out_File_Name); Chris@43: end loop; Chris@43: Chris@43: Ada.Text_IO.Put_Line (Count'Image (File_Size) & " Ok."); Chris@43: Chris@43: exit when not Continuous; Chris@43: Chris@43: File_Size := File_Size + 1; Chris@43: end loop; Chris@43: end Test;