class File1: """ File implémentée sur la base d'une liste chainée simple""" def __init__(self): """Création d'une file vide.""" self.__liste = Liste() def __len__(self): """Renvoie la longueur de la file.""" return len(self.__liste) def enfiler(self, valeur): """Enfile un objet au début de la file.""" self.__liste.inserer_queue(valeur) def defiler(self): """Retire le premier objet de la file.""" if len(self.__liste) == 0: raise IndexError("File vide !") else: self.__liste.supprimer_tete() def __str__(self): """Convertis la file en une chaîne de caractères.""" chaine = "" longueur_file = len(self.__liste) for i in reversed(range(longueur_file)): if i == 0: chaine += f"{self.__liste[i]}" else: chaine += f"{self.__liste[i]} → " return chaine def __getitem__(self, index): """Renvoie l'objet demandé par rapport à son index.""" return self.__liste.__getitem__(index)
def test_setitem(): l = Liste() for _ in range(5): l.inserer_queue(0) l[2] = 10 assert l[2] == 10 and str(l) == "0 → 0 → 10 → 0 → 0" with pytest.raises(IndexError): assert l[-1] assert l[20] assert l["truc"]
def test_eq(): # test si l'opérateur == fonctionne correctement sur une liste chaînée simple l = Liste() l2 = Liste() for i in range(5): l.inserer_queue(i) l2.inserer_queue(i) assert l == l2 l2[0] = 56 assert l != l2
def test_delitem(): # test de l'opération «del l[i]» où l est une liste. l = Liste() for i in range(5): l.inserer_queue(i) del l[0] assert str(l) == "1 → 2 → 3 → 4" and l.tete.valeur == 1 and l.queue.valeur == 4 del l[3] assert str(l) == "1 → 2 → 3" and l.tete.valeur == 1 and l.queue.valeur == 3 for _ in range(3): del l[0] assert str(l) == "None" and l.tete is l.queue
def test_iteration_avec_for(): l = Liste() for v in range(10): l.inserer_queue(v) i = 0 for v in l: # fonctionne du fait de la définition de # __getitem__; pas efficace!!!! # semble traduit en # i = 0 # while True: # try: # v = l[i] # est O(i) (la liste est reparcourue à chaque accès) # except IndexError: # break # i += 1 # <corps de boucle> # assert v == i i += 1
def test_inserer_queue(): l = Liste() for v in range(5): l.inserer_queue(v) assert len(l) == 5 and l.tete.valeur == 0 and l.queue.valeur == 4 assert str(l) == "0 → 1 → 2 → 3 → 4"