------------------------------------------------------------------------------ -- M A G I C R U N T I M E -- -- -- -- Copyright (C) 2020-2021, AdaCore -- -- -- -- This library is free software; you can redistribute it and/or modify it -- -- under terms of the GNU General Public License as published by the Free -- -- Software Foundation; either version 3, or (at your option) any later -- -- version. This library is distributed in the hope that it will be useful, -- -- but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN- -- -- TABILITY or FITNESS FOR A PARTICULAR PURPOSE. -- -- -- -- As a special exception under Section 7 of GPL version 3, you are granted -- -- additional permissions described in the GCC Runtime Library Exception, -- -- version 3.1, as published by the Free Software Foundation. -- -- -- -- You should have received a copy of the GNU General Public License and -- -- a copy of the GCC Runtime Library Exception along with this program; -- -- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -- -- . -- -- -- ------------------------------------------------------------------------------ with Ada.Calendar; with Ada.Command_Line; with Ada.Streams.Stream_IO; with Ada.Text_IO; with Interfaces; with VSS.Strings.Conversions; with VSS.JSON.Pull_Readers.Simple; with Tests_Text_Streams; procedure Test_JSON_Reader is use all type VSS.JSON.Pull_Readers.JSON_Event_Kind; use all type VSS.JSON.Pull_Readers.JSON_Reader_Error; Input : aliased Tests_Text_Streams.Memory_UTF8_Input_Stream; Reader : VSS.JSON.Pull_Readers.Simple.JSON_Simple_Pull_Reader; Count : Natural := 0; Perfomance : Boolean := False; Incremental : Boolean := False; Log_File : Ada.Text_IO.File_Type; begin if Ada.Command_Line.Argument_Count /= 3 then raise Program_Error with "incorrect command line arguments"; end if; if Ada.Command_Line.Argument (1) = "s" then Incremental := False; Perfomance := False; elsif Ada.Command_Line.Argument (1) = "sp" then Incremental := False; Perfomance := True; elsif Ada.Command_Line.Argument (1) = "i" then Incremental := True; Perfomance := False; elsif Ada.Command_Line.Argument (1) = "ip" then Incremental := True; Perfomance := True; else raise Program_Error with "incorrect parsing mode"; end if; Ada.Text_IO.Create (Log_File, Ada.Text_IO.Out_File, Ada.Command_Line.Argument (3), "text_translation=no"); declare File : Ada.Streams.Stream_IO.File_Type; Aux : Ada.Streams.Stream_Element_Array (1 .. 1_024); Last : Ada.Streams.Stream_Element_Offset; begin Ada.Streams.Stream_IO.Open (File, Ada.Streams.Stream_IO.In_File, Ada.Command_Line.Argument (2), "text_translation=no"); while not Ada.Streams.Stream_IO.End_Of_File (File) loop Ada.Streams.Stream_IO.Read (File, Aux, Last); for J in Aux'First .. Last loop Input.Buffer.Append (Aux (J)); end loop; end loop; Ada.Streams.Stream_IO.Close (File); end; declare use type Ada.Calendar.Time; Start : constant Ada.Calendar.Time := Ada.Calendar.Clock; begin Input.Set_Incremental (Incremental); Reader.Set_Stream (Input'Unchecked_Access); while not Reader.At_End loop Reader.Read_Next; case Reader.Event_Kind is when Invalid => if Reader.Error /= Premature_End_Of_Document then Ada.Text_IO.Put_Line (Log_File, VSS.JSON.Pull_Readers.JSON_Event_Kind'Image (Reader.Event_Kind) & ' ' & VSS.JSON.Pull_Readers.JSON_Reader_Error'Image (Reader.Error) & " """ & VSS.Strings.Conversions.To_UTF_8_String (Reader.Error_Message) & '"'); if Reader.Error /= Not_Valid then raise Program_Error; end if; elsif not Incremental then raise Program_Error; else Count := Count + 1; if Count > 1_000 then raise Program_Error; end if; end if; when Key_Name => Count := 0; if not Perfomance then Ada.Text_IO.Put_Line (Log_File, VSS.JSON.Pull_Readers.JSON_Event_Kind'Image (Reader.Event_Kind) & " """ & VSS.Strings.Conversions.To_UTF_8_String (Reader.Key_Name) & '"'); end if; when String_Value => Count := 0; if not Perfomance then Ada.Text_IO.Put_Line (Log_File, VSS.JSON.Pull_Readers.JSON_Event_Kind'Image (Reader.Event_Kind) & " """ & VSS.Strings.Conversions.To_UTF_8_String (Reader.String_Value) & '"'); end if; when Number_Value => Count := 0; if not Perfomance then Ada.Text_IO.Put_Line (Log_File, VSS.JSON.Pull_Readers.JSON_Event_Kind'Image (Reader.Event_Kind) & ' ' & VSS.JSON.JSON_Number_Kind'Image (Reader.Number_Value.Kind) & ' ' & (case Reader.Number_Value.Kind is when VSS.JSON.None => "", when VSS.JSON.Out_Of_Range => VSS.Strings.Conversions.To_UTF_8_String (Reader.String_Value), when VSS.JSON.JSON_Integer => Interfaces.Integer_64'Image (Reader.Number_Value.Integer_Value), when VSS.JSON.JSON_Float => Interfaces.IEEE_Float_64'Image (Reader.Number_Value.Float_Value))); end if; when Boolean_Value => Count := 0; if not Perfomance then Ada.Text_IO.Put_Line (Log_File, VSS.JSON.Pull_Readers.JSON_Event_Kind'Image (Reader.Event_Kind) & " " & Boolean'Image (Reader.Boolean_Value)); end if; when others => Count := 0; if not Perfomance then Ada.Text_IO.Put_Line (Log_File, VSS.JSON.Pull_Readers.JSON_Event_Kind'Image (Reader.Event_Kind)); end if; end case; end loop; if Perfomance then Ada.Text_IO.Put_Line (Duration'Image (Ada.Calendar.Clock - Start)); end if; end; Ada.Text_IO.Close (Log_File); end Test_JSON_Reader;