ADDED tests/natools-s_expressions-atom_buffers-tests.adb Index: tests/natools-s_expressions-atom_buffers-tests.adb ================================================================== --- tests/natools-s_expressions-atom_buffers-tests.adb +++ tests/natools-s_expressions-atom_buffers-tests.adb @@ -0,0 +1,330 @@ +------------------------------------------------------------------------------ +-- Copyright (c) 2014, Natacha Porté -- +-- -- +-- Permission to use, copy, modify, and distribute this software for any -- +-- purpose with or without fee is hereby granted, provided that the above -- +-- copyright notice and this permission notice appear in all copies. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -- +-- WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -- +-- MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -- +-- ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -- +-- WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -- +-- ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -- +-- OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -- +------------------------------------------------------------------------------ + +with Natools.S_Expressions.Test_Tools; + +package body Natools.S_Expressions.Atom_Buffers.Tests is + + ---------------------- + -- Whole Test Suite -- + ---------------------- + + procedure All_Tests (Report : in out NT.Reporter'Class) is + begin + Test_Block_Append (Report); + Test_Octet_Append (Report); + Test_Preallocate (Report); + Test_Query (Report); + Test_Query_Null (Report); + Test_Reset (Report); + end All_Tests; + + + + ---------------------- + -- Individual Tests -- + ---------------------- + + procedure Test_Block_Append (Report : in out NT.Reporter'Class) is + Name : constant String := "Append in blocks"; + Data : Atom (0 .. 255); + begin + for O in Octet loop + Data (Count (O)) := O; + end loop; + + declare + Buffer : Atom_Buffer; + begin + Buffer.Append (Data (0 .. 10)); + Buffer.Append (Data (11 .. 11)); + Buffer.Append (Data (12 .. 101)); + Buffer.Append (Data (102 .. 101)); + Buffer.Append (Data (102 .. 255)); + + Test_Tools.Test_Atom (Report, Name, Data, Buffer.Query.Data.all); + end; + exception + when Error : others => Report.Report_Exception (Name, Error); + end Test_Block_Append; + + + procedure Test_Octet_Append (Report : in out NT.Reporter'Class) is + Name : constant String := "Append octet by octet"; + Data : Atom (0 .. 255); + begin + for O in Octet loop + Data (Count (O)) := O; + end loop; + + declare + Buffer : Atom_Buffer; + begin + for O in Octet loop + Buffer.Append (O); + end loop; + + Test_Tools.Test_Atom (Report, Name, Data, Buffer.Query.Data.all); + end; + exception + when Error : others => Report.Report_Exception (Name, Error); + end Test_Octet_Append; + + + procedure Test_Preallocate (Report : in out NT.Reporter'Class) is + Name : constant String := "Preallocation of memory"; + begin + declare + Buffer : Atom_Buffer; + begin + Buffer.Preallocate (256); + + declare + Old_Accessor : Atom_Refs.Accessor := Buffer.Query; + begin + for O in Octet loop + Buffer.Append (O); + end loop; + + Report.Item (Name, + NT.To_Result (Old_Accessor.Data = Buffer.Query.Data)); + end; + end; + exception + when Error : others => Report.Report_Exception (Name, Error); + end Test_Preallocate; + + + procedure Test_Query (Report : in out NT.Reporter'Class) is + Name : constant String := "Query in all its variants"; + Data : Atom (0 .. 255); + begin + for O in Octet loop + Data (Count (O)) := O; + end loop; + + declare + Buffer : Atom_Buffer; + begin + Buffer.Append (Data); + + if Buffer.Length /= Data'Length then + Report.Item (Name, NT.Fail); + Report.Info ("Buffer.Length returned" & Count'Image (Buffer.Length) + & ", expected" & Count'Image (Data'Length)); + return; + end if; + + if Buffer.Query /= Data then + Report.Item (Name, NT.Fail); + Report.Info ("Query returning an Atom"); + Test_Tools.Dump_Atom (Report, Buffer.Query, "Found"); + Test_Tools.Dump_Atom (Report, Data, "Expected"); + return; + end if; + + if Buffer.Query.Data.all /= Data then + Report.Item (Name, NT.Fail); + Report.Info ("Query returning an accessor"); + Test_Tools.Dump_Atom (Report, Buffer.Query.Data.all, "Found"); + Test_Tools.Dump_Atom (Report, Data, "Expected"); + return; + end if; + + if Buffer.Element (25) /= Data (24) then + Report.Item (Name, NT.Fail); + Report.Info ("Query returning an octet"); + return; + end if; + + declare + Retrieved : Atom (10 .. 310); + Length : Count; + begin + Buffer.Query (Retrieved, Length); + if Length /= Data'Length + or else Retrieved (10 .. Length + 9) /= Data + then + Report.Item (Name, NT.Fail); + Report.Info ("Query into an existing buffer"); + Report.Info ("Length returned" & Count'Image (Length) + & ", expected" & Count'Image (Data'Length)); + Test_Tools.Dump_Atom + (Report, Retrieved (10 .. Length + 9), "Found"); + Test_Tools.Dump_Atom (Report, Data, "Expected"); + return; + end if; + end; + + declare + Retrieved : Atom (20 .. 50); + Length : Count; + begin + Buffer.Query (Retrieved, Length); + if Length /= Data'Length or else Retrieved /= Data (0 .. 30) then + Report.Item (Name, NT.Fail); + Report.Info ("Query into a buffer too small"); + Report.Info ("Length returned" & Count'Image (Length) + & ", expected" & Count'Image (Data'Length)); + Test_Tools.Dump_Atom (Report, Retrieved, "Found"); + Test_Tools.Dump_Atom (Report, Data (0 .. 30), "Expected"); + return; + end if; + end; + + declare + procedure Check (Found : in Atom); + + Result : Boolean := False; + + procedure Check (Found : in Atom) is + begin + Result := Found = Data; + end Check; + begin + Buffer.Query (Check'Access); + if not Result then + Report.Item (Name, NT.Fail); + Report.Info ("Query with callback"); + return; + end if; + end; + end; + + Report.Item (Name, NT.Success); + exception + when Error : others => Report.Report_Exception (Name, Error); + end Test_Query; + + + procedure Test_Query_Null (Report : in out NT.Reporter'Class) is + Name : constant String := "Query variants against a null buffer"; + begin + declare + Buffer : Atom_Buffer; + begin + if Buffer.Query /= Null_Atom then + Report.Item (Name, NT.Fail); + Report.Info ("Query returning an Atom"); + Test_Tools.Dump_Atom (Report, Buffer.Query, "Found"); + return; + end if; + + if Buffer.Query.Data.all /= Null_Atom then + Report.Item (Name, NT.Fail); + Report.Info ("Query returning an accessor"); + Test_Tools.Dump_Atom (Report, Buffer.Query.Data.all, "Found"); + return; + end if; + + declare + Retrieved : Atom (1 .. 10); + Length : Count; + begin + Buffer.Query (Retrieved, Length); + if Length /= 0 then + Report.Item (Name, NT.Fail); + Report.Info ("Query into an existing buffer"); + Report.Info ("Length returned" & Count'Image (Length) + & ", expected 0"); + return; + end if; + end; + + declare + procedure Check (Found : in Atom); + + Result : Boolean := False; + + procedure Check (Found : in Atom) is + begin + Result := Found = Null_Atom; + end Check; + begin + Buffer.Query (Check'Access); + if not Result then + Report.Item (Name, NT.Fail); + Report.Info ("Query with callback"); + return; + end if; + end; + end; + + Report.Item (Name, NT.Success); + exception + when Error : others => Report.Report_Exception (Name, Error); + end Test_Query_Null; + + + procedure Test_Reset (Report : in out NT.Reporter'Class) is + Name : constant String := "Reset procedures"; + begin + declare + Buffer : Atom_Buffer; + begin + for O in Octet loop + Buffer.Append (O); + end loop; + + declare + Accessor : Atom_Refs.Accessor := Buffer.Query; + begin + Buffer.Soft_Reset; + + if Buffer.Length /= 0 then + Report.Item (Name, NT.Fail); + Report.Info ("Soft reset left length" + & Count'Image (Buffer.Length)); + return; + end if; + + if Buffer.Query.Data /= Accessor.Data then + Report.Item (Name, NT.Fail); + Report.Info ("Soft reset changed storage area"); + return; + end if; + + if Buffer.Query.Data.all'Length /= Buffer.Available then + Report.Item (Name, NT.Fail); + Report.Info ("Available length inconsistency, recorded" + & Count'Image (Buffer.Available) & ", actual" + & Count'Image (Buffer.Query.Data.all'Length)); + return; + end if; + end; + + for O in Octet'(10) .. Octet'(50) loop + Buffer.Append (O); + end loop; + + Buffer.Hard_Reset; + + if Buffer.Length /= 0 + or else Buffer.Available /= 0 + or else not Buffer.Ref.Is_Empty + then + Report.Item (Name, NT.Fail); + Report.Info ("Hard reset did not completely clean structure"); + end if; + end; + + Report.Item (Name, NT.Success); + exception + when Error : others => Report.Report_Exception (Name, Error); + end Test_Reset; + +end Natools.S_Expressions.Atom_Buffers.Tests; + ADDED tests/natools-s_expressions-atom_buffers-tests.ads Index: tests/natools-s_expressions-atom_buffers-tests.ads ================================================================== --- tests/natools-s_expressions-atom_buffers-tests.ads +++ tests/natools-s_expressions-atom_buffers-tests.ads @@ -0,0 +1,38 @@ +------------------------------------------------------------------------------ +-- Copyright (c) 2014, Natacha Porté -- +-- -- +-- Permission to use, copy, modify, and distribute this software for any -- +-- purpose with or without fee is hereby granted, provided that the above -- +-- copyright notice and this permission notice appear in all copies. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -- +-- WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -- +-- MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -- +-- ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -- +-- WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -- +-- ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -- +-- OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -- +------------------------------------------------------------------------------ + +------------------------------------------------------------------------------ +-- Natools.S_Expressions.Atom_Buffers.Tests provides a test suite for -- +-- atom buffers. -- +------------------------------------------------------------------------------ + +with Natools.Tests; + +package Natools.S_Expressions.Atom_Buffers.Tests is + pragma Preelaborate (Tests); + + package NT renames Natools.Tests; + + procedure All_Tests (Report : in out NT.Reporter'Class); + + procedure Test_Block_Append (Report : in out NT.Reporter'Class); + procedure Test_Octet_Append (Report : in out NT.Reporter'Class); + procedure Test_Preallocate (Report : in out NT.Reporter'Class); + procedure Test_Query (Report : in out NT.Reporter'Class); + procedure Test_Query_Null (Report : in out NT.Reporter'Class); + procedure Test_Reset (Report : in out NT.Reporter'Class); + +end Natools.S_Expressions.Atom_Buffers.Tests; Index: tests/test_all.adb ================================================================== --- tests/test_all.adb +++ tests/test_all.adb @@ -21,10 +21,11 @@ with Ada.Command_Line; with Ada.Text_IO; with Natools.Chunked_Strings.Tests; with Natools.Getopt_Long_Tests; with Natools.Reference_Tests; +with Natools.S_Expressions.Atom_Buffers.Tests; with Natools.S_Expressions.Encodings.Tests; with Natools.String_Slice_Set_Tests; with Natools.String_Slice_Tests; with Natools.Tests.Text_IO; @@ -66,10 +67,14 @@ Report.End_Section; Report.Section ("References"); Natools.Reference_Tests.All_Tests (Report); Report.End_Section; + + Report.Section ("S_Expressions.Atom_Buffers"); + Natools.S_Expressions.Atom_Buffers.Tests.All_Tests (Report); + Report.End_Section; Report.Section ("S_Expressions.Encodings"); Natools.S_Expressions.Encodings.Tests.All_Tests (Report); Report.End_Section;