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