TP-programmation-imperative/td09/test_abr.adb
2023-06-10 21:03:54 +02:00

394 lines
9.6 KiB
Ada
Executable file

with Ada.Text_IO; use Ada.Text_IO;
with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;
with SDA_Exceptions; use SDA_Exceptions;
with Ada.Strings.Unbounded; use Ada.Strings.Unbounded;
--! Les Unbounded_String ont une capacité variable, contrairement au String
--! pour lesquelles une capacité doit être fixée.
with ABR;
procedure Test_ABR is
package ABR_String_Integer is
new ABR (T_Cle => Unbounded_String, T_Donnee => Integer, "<" => "<");
use ABR_String_Integer;
-- Est-ce que la Cle est utilisée dans la Sda
function Cle_Presente (Sda : in T_ABR ; Cle : in Unbounded_String) return Boolean is
begin
return False; -- TODO : à changer
end Cle_Presente;
-- Retourner une chaîne avec des guillemets autour de S
function Avec_Guillemets (S: Unbounded_String) return String is
begin
return '"' & To_String (S) & '"';
end;
-- Utiliser & entre String à gauche et Unbounded_String à droite. Des
-- guillemets sont ajoutées autour de la Unbounded_String
-- Il s'agit d'un masquage de l'opérteur & défini dans Strings.Unbounded
function "&" (Left: String; Right: Unbounded_String) return String is
begin
return Left & Avec_Guillemets (Right);
end;
-- Surcharge l'opérateur unaire "+" pour convertir une String
-- en Unbounded_String.
-- Cette astuce permet de simplifier l'initialisation
-- de cles un peu plus loin.
function "+" (Item : in String) return Unbounded_String
renames To_Unbounded_String;
-- Afficher une Unbounded_String et un entier.
procedure Afficher (S : in Unbounded_String; N: in Integer) is
begin
Put (Avec_Guillemets (S));
Put (" : ");
Put (N, 1);
New_Line;
end Afficher;
-- Afficher la Sda.
procedure Afficher is
new Pour_Chaque (Afficher);
Nb_Cles : constant Integer := 17;
Cles : constant array (1..Nb_Cles) of Unbounded_String
:= (+"Frank", +"Bob", +"Henri", +"Dick", +"Alice",
+"Eric", +"Giles", +"Jack", +"Irene", +"Chris",
+"un", +"deux", +"trois", +"quatre", +"cinq",
+"quatre-vingt-dix-neuf", +"vingt-et-un");
Inconnu : constant Unbounded_String := To_Unbounded_String ("Inconnu");
Donnees : constant array (1..Nb_Cles) of Integer
:= (6156, 9278, 1476, 9327, 3890,
9223, 4512, 6843, 0924, 3839,
1, 2, 3, 4, 5, 99, 21);
Somme_Donnees : constant Integer := 55468 + 135;
Somme_Donnees_Len4 : constant Integer := 25393 + 7; -- somme si Length (Cle) = 4
Somme_Donnees_Q: constant Integer := 103; -- somme si initiale de Cle = 'q'
-- Initialiser l'annuaire avec les Donnees et Cles ci-dessus.
-- Attention, c'est à l'appelant de libérer la mémoire associée en
-- utilisant Vider.
-- Si Bavard est vrai, les insertions sont tracées (affichées).
procedure Construire_Exemple_Sujet (Annuaire : out T_ABR; Bavard: Boolean := False) is
begin
Initialiser (Annuaire);
pragma Assert (Est_Vide (Annuaire));
pragma Assert (Taille (Annuaire) = 0);
for I in 1..Nb_Cles loop
Enregistrer (Annuaire, Cles (I), Donnees (I));
if Bavard then
Put_Line ("Après insertion de la clé " & Cles (I));
Afficher (Annuaire); New_Line;
else
null;
end if;
pragma Assert (not Est_Vide (Annuaire));
pragma Assert (Taille (Annuaire) = I);
for J in 1..I loop
pragma Assert (La_Donnee (Annuaire, Cles (J)) = Donnees (J));
end loop;
for J in I+1..Nb_Cles loop
pragma Assert (not Cle_Presente (Annuaire, Cles (J)));
end loop;
end loop;
end Construire_Exemple_Sujet;
procedure Tester_Exemple_Sujet is
Annuaire : T_ABR;
begin
Construire_Exemple_Sujet (Annuaire, True);
Vider (Annuaire);
end Tester_Exemple_Sujet;
-- Tester suppression en commençant par les derniers éléments ajoutés
procedure Tester_Supprimer_Inverse is
Annuaire : T_ABR;
begin
Put_Line ("=== Tester_Supprimer_Inverse..."); New_Line;
Construire_Exemple_Sujet (Annuaire);
for I in reverse 1..Nb_Cles loop
Supprimer (Annuaire, Cles (I));
Put_Line ("Après suppression de " & Cles (I) & " :");
Afficher (Annuaire); New_Line;
for J in 1..I-1 loop
pragma Assert (Cle_Presente (Annuaire, Cles (J)));
pragma Assert (La_Donnee (Annuaire, Cles (J)) = Donnees (J));
end loop;
for J in I..Nb_Cles loop
pragma Assert (not Cle_Presente (Annuaire, Cles (J)));
end loop;
end loop;
Vider (Annuaire);
end Tester_Supprimer_Inverse;
-- Tester suppression en commençant les les premiers éléments ajoutés
procedure Tester_Supprimer is
Annuaire : T_ABR;
begin
Put_Line ("=== Tester_Supprimer..."); New_Line;
Construire_Exemple_Sujet (Annuaire);
for I in 1..Nb_Cles loop
Put_Line ("Suppression de " & Cles (I) & " :");
Supprimer (Annuaire, Cles (I));
Afficher (Annuaire); New_Line;
for J in 1..I loop
pragma Assert (not Cle_Presente (Annuaire, Cles (J)));
end loop;
for J in I+1..Nb_Cles loop
pragma Assert (Cle_Presente (Annuaire, Cles (J)));
pragma Assert (La_Donnee (Annuaire, Cles (J)) = Donnees (J));
end loop;
end loop;
Vider (Annuaire);
end Tester_Supprimer;
procedure Tester_Supprimer_Un_Element is
-- Tester supprimer sur un élément, celui à Indice dans Cles.
procedure Tester_Supprimer_Un_Element (Indice: in Integer) is
Annuaire : T_ABR;
begin
Construire_Exemple_Sujet (Annuaire);
Put_Line ("Suppression de " & Cles (Indice) & " :");
Supprimer (Annuaire, Cles (Indice));
Afficher (Annuaire); New_Line;
for J in 1..Nb_Cles loop
if J = Indice then
pragma Assert (not Cle_Presente (Annuaire, Cles (J)));
else
pragma Assert (Cle_Presente (Annuaire, Cles (J)));
end if;
end loop;
Vider (Annuaire);
end Tester_Supprimer_Un_Element;
begin
Put_Line ("=== Tester_Supprimer_Un_Element..."); New_Line;
for I in 1..Nb_Cles loop
Tester_Supprimer_Un_Element (I);
end loop;
end Tester_Supprimer_Un_Element;
procedure Tester_Remplacer_Un_Element is
-- Tester enregistrer sur un élément présent, celui à Indice dans Cles.
procedure Tester_Remplacer_Un_Element (Indice: in Integer; Nouveau: in Integer) is
Annuaire : T_ABR;
begin
Construire_Exemple_Sujet (Annuaire);
Put_Line ("Remplacement de " & Cles (Indice)
& " par " & Integer'Image(Nouveau) & " :");
enregistrer (Annuaire, Cles (Indice), Nouveau);
Afficher (Annuaire); New_Line;
for J in 1..Nb_Cles loop
pragma Assert (Cle_Presente (Annuaire, Cles (J)));
if J = Indice then
pragma Assert (La_Donnee (Annuaire, Cles (J)) = Nouveau);
else
pragma Assert (La_Donnee (Annuaire, Cles (J)) = Donnees (J));
end if;
end loop;
Vider (Annuaire);
end Tester_Remplacer_Un_Element;
begin
Put_Line ("=== Tester_Remplacer_Un_Element..."); New_Line;
for I in 1..Nb_Cles loop
Tester_Remplacer_Un_Element (I, 0);
null;
end loop;
end Tester_Remplacer_Un_Element;
procedure Tester_Supprimer_Erreur is
Annuaire : T_ABR;
begin
begin
Put_Line ("=== Tester_Supprimer_Erreur..."); New_Line;
Construire_Exemple_Sujet (Annuaire);
Supprimer (Annuaire, Inconnu);
exception
when Cle_Absente_Exception =>
null;
when others =>
pragma Assert (False);
end;
Vider (Annuaire);
end Tester_Supprimer_Erreur;
procedure Tester_La_Donnee_Erreur is
Annuaire : T_ABR;
Inutile: Integer;
begin
begin
Put_Line ("=== Tester_Supprimer_Erreur..."); New_Line;
Construire_Exemple_Sujet (Annuaire);
Inutile := La_Donnee (Annuaire, Inconnu);
exception
when Cle_Absente_Exception =>
null;
when others =>
pragma Assert (False);
end;
Vider (Annuaire);
end Tester_La_Donnee_Erreur;
procedure Tester_Pour_chaque is
Annuaire : T_ABR;
Somme: Integer;
procedure Sommer (Cle: Unbounded_String; Donnee: Integer) is
begin
Put (" + ");
Put (Donnee, 2);
New_Line;
Somme := Somme + Donnee;
end;
procedure Sommer is
new Pour_Chaque (Sommer);
begin
Put_Line ("=== Tester_Pour_Chaque..."); New_Line;
Construire_Exemple_Sujet(Annuaire);
Somme := 0;
Sommer (Annuaire);
pragma Assert (Somme = Somme_Donnees);
Vider(Annuaire);
New_Line;
end Tester_Pour_chaque;
procedure Tester_Pour_chaque_Somme_Si_Cle_Commence_Par_Q is
Annuaire : T_ABR;
Somme: Integer;
procedure Sommer_Cle_Commence_Par_Q (Cle: Unbounded_String; Donnee: Integer) is
begin
if To_String (Cle) (1) = 'q' then
Put (" + ");
Put (Donnee, 2);
New_Line;
Somme := Somme + Donnee;
else
null;
end if;
end;
procedure Sommer is
new Pour_Chaque (Sommer_Cle_Commence_Par_Q);
begin
Put_Line ("=== Tester_Pour_Chaque_Somme_Si_Cle_Commence_Par_Q..."); New_Line;
Construire_Exemple_Sujet(Annuaire);
Somme := 0;
Sommer (Annuaire);
pragma Assert (Somme = Somme_Donnees_Q);
Vider(Annuaire);
New_Line;
end Tester_Pour_chaque_Somme_Si_Cle_Commence_Par_Q;
procedure Tester_Pour_chaque_Somme_Len4_Erreur is
Annuaire : T_ABR;
Somme: Integer;
procedure Sommer_Len4_Erreur (Cle: Unbounded_String; Donnee: Integer) is
Nouvelle_Exception: Exception;
begin
if Length (Cle) = 4 then
Put (" + ");
Put (Donnee, 2);
New_Line;
Somme := Somme + Donnee;
else
raise Nouvelle_Exception;
end if;
end;
procedure Sommer is
new Pour_Chaque (Sommer_Len4_Erreur);
begin
Put_Line ("=== Tester_Pour_Chaque_Somme_Len4_Erreur..."); New_Line;
Construire_Exemple_Sujet(Annuaire);
Somme := 0;
Sommer (Annuaire);
pragma Assert (Somme = Somme_Donnees_Len4);
Vider(Annuaire);
New_Line;
end Tester_Pour_chaque_Somme_Len4_Erreur;
begin
Tester_Exemple_Sujet;
Tester_Supprimer_Inverse;
Tester_Supprimer;
Tester_Supprimer_Un_Element;
Tester_Remplacer_Un_Element;
Tester_Supprimer_Erreur;
Tester_La_Donnee_Erreur;
Tester_Pour_chaque;
Tester_Pour_chaque_Somme_Si_Cle_Commence_Par_Q;
Tester_Pour_chaque_Somme_Len4_Erreur;
Put_Line ("Fin des tests : OK.");
end Test_ABR;