all repos — mgba @ 3b353ac62190a00765812938e86e04b753196736

mGBA Game Boy Advance Emulator

src/third-party/zlib/contrib/ada/mtest.adb (view raw)

  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--  Continuous test for ZLib multithreading. If the test would fail
  9--  we should provide thread safe allocation routines for the Z_Stream.
 10--
 11--  $Id: mtest.adb,v 1.4 2004/07/23 07:49:54 vagul Exp $
 12
 13with ZLib;
 14with Ada.Streams;
 15with Ada.Numerics.Discrete_Random;
 16with Ada.Text_IO;
 17with Ada.Exceptions;
 18with Ada.Task_Identification;
 19
 20procedure MTest is
 21   use Ada.Streams;
 22   use ZLib;
 23
 24   Stop : Boolean := False;
 25
 26   pragma Atomic (Stop);
 27
 28   subtype Visible_Symbols is Stream_Element range 16#20# .. 16#7E#;
 29
 30   package Random_Elements is
 31      new Ada.Numerics.Discrete_Random (Visible_Symbols);
 32
 33   task type Test_Task;
 34
 35   task body Test_Task is
 36      Buffer : Stream_Element_Array (1 .. 100_000);
 37      Gen : Random_Elements.Generator;
 38
 39      Buffer_First  : Stream_Element_Offset;
 40      Compare_First : Stream_Element_Offset;
 41
 42      Deflate : Filter_Type;
 43      Inflate : Filter_Type;
 44
 45      procedure Further (Item : in Stream_Element_Array);
 46
 47      procedure Read_Buffer
 48        (Item : out Ada.Streams.Stream_Element_Array;
 49         Last : out Ada.Streams.Stream_Element_Offset);
 50
 51      -------------
 52      -- Further --
 53      -------------
 54
 55      procedure Further (Item : in Stream_Element_Array) is
 56
 57         procedure Compare (Item : in Stream_Element_Array);
 58
 59         -------------
 60         -- Compare --
 61         -------------
 62
 63         procedure Compare (Item : in Stream_Element_Array) is
 64            Next_First : Stream_Element_Offset := Compare_First + Item'Length;
 65         begin
 66            if Buffer (Compare_First .. Next_First - 1) /= Item then
 67               raise Program_Error;
 68            end if;
 69
 70            Compare_First := Next_First;
 71         end Compare;
 72
 73         procedure Compare_Write is new ZLib.Write (Write => Compare);
 74      begin
 75         Compare_Write (Inflate, Item, No_Flush);
 76      end Further;
 77
 78      -----------------
 79      -- Read_Buffer --
 80      -----------------
 81
 82      procedure Read_Buffer
 83        (Item : out Ada.Streams.Stream_Element_Array;
 84         Last : out Ada.Streams.Stream_Element_Offset)
 85      is
 86         Buff_Diff   : Stream_Element_Offset := Buffer'Last - Buffer_First;
 87         Next_First : Stream_Element_Offset;
 88      begin
 89         if Item'Length <= Buff_Diff then
 90            Last := Item'Last;
 91
 92            Next_First := Buffer_First + Item'Length;
 93
 94            Item := Buffer (Buffer_First .. Next_First - 1);
 95
 96            Buffer_First := Next_First;
 97         else
 98            Last := Item'First + Buff_Diff;
 99            Item (Item'First .. Last) := Buffer (Buffer_First .. Buffer'Last);
100            Buffer_First := Buffer'Last + 1;
101         end if;
102      end Read_Buffer;
103
104      procedure Translate is new Generic_Translate
105                                   (Data_In  => Read_Buffer,
106                                    Data_Out => Further);
107
108   begin
109      Random_Elements.Reset (Gen);
110
111      Buffer := (others => 20);
112
113      Main : loop
114         for J in Buffer'Range loop
115            Buffer (J) := Random_Elements.Random (Gen);
116
117            Deflate_Init (Deflate);
118            Inflate_Init (Inflate);
119
120            Buffer_First  := Buffer'First;
121            Compare_First := Buffer'First;
122
123            Translate (Deflate);
124
125            if Compare_First /= Buffer'Last + 1 then
126               raise Program_Error;
127            end if;
128
129            Ada.Text_IO.Put_Line
130              (Ada.Task_Identification.Image
131                 (Ada.Task_Identification.Current_Task)
132               & Stream_Element_Offset'Image (J)
133               & ZLib.Count'Image (Total_Out (Deflate)));
134
135            Close (Deflate);
136            Close (Inflate);
137
138            exit Main when Stop;
139         end loop;
140      end loop Main;
141   exception
142      when E : others =>
143         Ada.Text_IO.Put_Line (Ada.Exceptions.Exception_Information (E));
144         Stop := True;
145   end Test_Task;
146
147   Test : array (1 .. 4) of Test_Task;
148
149   pragma Unreferenced (Test);
150
151   Dummy : Character;
152
153begin
154   Ada.Text_IO.Get_Immediate (Dummy);
155   Stop := True;
156end MTest;