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_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_supprimer_tete(): l = Liste() l._inserer_apres(5) l._inserer_apres(2, l.queue) l._inserer_apres(3, l.tete) v = l.supprimer_tete() assert v == 5 and len(l) == 2 and l.tete.valeur == 3 and l.queue.valeur == 2 assert str(l) == "3 → 2"
def test_crochet(): l = Liste() l._inserer_apres(5) l._inserer_apres(2, l.queue) l._inserer_apres(3, l.tete) assert l[0] == 5 and l[1] == 3 and l[2] == 2 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_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
class Pile1: """ Pile implémentée sur la base d'une liste chainée simple""" def __init__(self): self.__liste = Liste() def __len__(self): return len(self.__liste) def empiler(self, valeur): """ à faire """ self.__liste._inserer_apres(valeur) def depiler(self): """ à faire """ if len(self.__liste) == 0: raise IndexError("Pile vide!") return self.__liste._supprimer_apres() def __str__(self): return str(self.__liste)
def test_inserer_apres(): l = Liste() l._inserer_apres(5) assert len(l) == 1 assert l.tete.valeur == 5 and l.queue.valeur == 5 assert str(l) == "5" l._inserer_apres(2, l.queue) assert l.tete.valeur == 5 and l.queue.valeur == 2 assert len(l) == 2 assert str(l) == "5 → 2" l._inserer_apres(3, l.tete) assert len(l) == 3 assert l.tete.valeur == 5 and l.queue.valeur == 2 assert str(l) == "5 → 3 → 2"
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"
def test_in(): l = Liste() l._inserer_apres(5) l._inserer_apres(2, l.queue) l._inserer_apres(3, l.tete) assert 2 in l and 5 in l and 3 in l and 10 not in l
def test_supprimer_apres(): l = Liste() l._inserer_apres(5) l._inserer_apres(2, l.queue) l._inserer_apres(3, l.tete) v = l._supprimer_apres() assert v == 5 and l.tete.valeur == 3 and l.queue.valeur == 2 assert len(l) == 2 and str(l) == "3 → 2" v = l._supprimer_apres(l.tete) assert v == 2 and l.tete is l.queue and l.tete.valeur == 3 assert len(l) == 1 and str(l) == "3" v = l._supprimer_apres() assert v == 3 and l.tete is None and l.queue is None assert len(l) == 0 and str(l) == "None"
def test_liste_str(): assert str(Liste()) == "None"
def __init__(self): """Création d'une file vide.""" self.__liste = Liste()
def __init__(self): self.__liste = Liste()