def test_constructeur(lots): """Constructeur alternatif.""" a, b, c, d, e, f, g = lots entree = """ Lot1 / 5 / caillou ciseau / 10 1 Lot2 / 2 / caillou ciseau / 7 2 60 10 """ probleme2 = Probleme(lots=[a, b], demande=[60, 10]) probleme = Probleme.par_str(entree) assert probleme == probleme2
def probleme(): """Crée 1 problème simple avec deux lots.""" probleme = Probleme.par_str( """ Lot1 / 5 / caillou ciseau / 10 1 Lot2 / 7 / caillou ciseau / 7 2 60 10 """ ) return probleme
def test_encode(): """Teste l'encodage d'une ligne.""" correspondance = { "Lot1 / 5 / caillou ciseau / 10 2": Lot(nom="Lot1", cout=5, type_arme=["caillou", "ciseau"], quantite=[10, 2]), "Lot2 / 10 / caillou ciseau / 9 4": Lot(nom="Lot2", cout=10, type_arme=["caillou", "ciseau"], quantite=[9, 4]) } for entree, attendu in correspondance.items(): assert attendu == Probleme._encode(entree)
def test_repr(): """Teste le repr.""" probleme = Probleme(lots=[ Lot(nom='Lot1', cout=5, type_arme=['caillou', 'ciseau'], quantite=[10, 1]), Lot(nom='Lot2', cout=2, type_arme=['caillou', 'ciseau'], quantite=[7, 2]) ], demande=[60, 10]) assert ( repr(probleme) == "probleme(lots=[Lot(nom='Lot1', cout=5, type_arme=['caillou', 'ciseau'], quantite=[10, 1]), Lot(nom='Lot2', cout=2, type_arme=['caillou', 'ciseau'], quantite=[7, 2])],demande = [60, 10])" )
def __init__(self): self.bouton = ipw.Button(description="Résoudre") self.bouton2 = ipw.Button(description = "actualiser") self.zone_entree = ipw.Textarea(value= """Lot1 / 5 / caillou ciseau / 10 1 Lot2 / 7 / caillou ciseau / 7 2 60 10 """, layout=ipw.Layout(height="80px", width = "700px"), description = "données") self.probleme = Probleme.par_str(self.zone_entree.value) self.zone_probleme = ipw.Output() self.zone_solution_primal = ipw.Output() self.zone_solution_dual = ipw.Output() self.zone_curs_cout = ipw.Output() self.zone_titre = ipw.Output() self.zone_text_init = ipw.Textarea(value="""'nom_lot' / 'cout_lot' / 'liste_types' / quantite_par_type' -> une ligne par lot Demande -> une seule ligne - Un exemple introductif est déjà présent. - Attention de respecter le même ordre pour pour les listes type d'arme et quantités - 'Résoudre' résoud le problème à partir des données rentrées dans le tableau de donnée . - 'Actualiser' résoud avec les valeurs de coût actualisée par les curseurs. - Les curseurs s'afficheront automatiquement après la première résolution - Pour une explication détaillée du contexte du problème, voir les fichiers 'README' et 'rapport'""", layout=ipw.Layout(height="100px", width = "700px"), disabled=True) self.zone_titre_init = ipw.Output() self.total = ipw.VBox( [ ipw.Box([self.zone_titre], layout = ipw.Layout(justify_content = "center")), ipw.VBox([self.zone_titre_init, self.zone_text_init]), ipw.VBox([self.bouton, self.zone_entree]), ipw.HBox( [ self.zone_probleme, self.zone_solution_primal, self.zone_solution_dual ]), ipw.HBox([self.zone_curs_cout, self.bouton2]), ] ) self.bouton.on_click(self._sur_clique) self.bouton2.on_click(self._sur_clique2)
def _sur_clique(self, b): try: self.probleme = Probleme.par_str(self.zone_entree.value) self.zone_curs_cout.clear_output() self.zone_probleme.clear_output() self.zone_solution_primal.clear_output() self.zone_solution_dual.clear_output() with self.zone_probleme: display(affichage.genere_table(self.probleme)) with self.zone_solution_primal: display(affichage.tables_solutions(self.probleme, primal = True, frac = False)) with self.zone_solution_dual: display(affichage.tables_solutions(self.probleme, primal = False, frac = False)) with self.zone_curs_cout: for i in range(0,len(self.probleme.lots)): a = self.probleme.lots[i].cout display(curseur = ipw.interact(self.probleme.lots[i]._set_cout, coût=(0, a*2, round((a/100),1)))) except Mon_exception: with self.zone_probleme: self.zone_probleme.clear_output() self.zone_solution_primal.clear_output() self.zone_solution_dual.clear_output() self.zone_curs_cout.clear_output() display(erreur= print("Il y a un problème avec les données rentrées. \nLe problème n'est pas valide.")) except Mon_exception_lot: with self.zone_probleme: self.zone_probleme.clear_output() self.zone_solution_primal.clear_output() self.zone_solution_dual.clear_output() self.zone_curs_cout.clear_output() display(erreur= print("Il y a un problème avec les données rentrées. \nUn des lots n'est pas valide.")) except ValueError: with self.zone_probleme: self.zone_probleme.clear_output() self.zone_solution_primal.clear_output() self.zone_solution_dual.clear_output() self.zone_curs_cout.clear_output() display(erreur= print("Il y a un problème avec les données rentrées. \nAssurez vous d'avoir correctement saisi les données."))
#! /usr/bin/env python # -*- coding: utf-8 -*- """Description. Démonstration du module. """ from prog_dual import resolution, Probleme, Mon_exception, affichage mon_probleme = Probleme.par_str(""" Lot1 / 10000000 / Fusils Grenades Chars Mitrailleuses Bazookas / 500 1000 10 100 80 Lot2 / 12000000 / Fusils Grenades Chars Mitrailleuses Bazookas / 300 2000 20 80 120 Lot3 / 15000000 / Fusils Grenades Chars Mitrailleuses Bazookas / 800 1500 15 15 200 100000 200000 100 400 400 """) print(affichage.genere_table(mon_probleme)) affichage.affichage_solutions(mon_probleme, False)
def test_verif_deux_lots_min(lots): """vérifie que le pb est composé d'au moins deux lot""" a, b, c, d, e, f, g = lots with pytest.raises(Mon_exception): probleme = Probleme([a], [60, 10])
def test_verif_noms(lots): """vérifie que que deux lots n'ont pas le même nom.""" a, b, c, d, e, f, g = lots with pytest.raises(Mon_exception): probleme = Probleme([f, g], [60, 10])
def test_verif_lots_differents(lots): """vérifie que deux lots n'ont pas les mêmes quantités pour tous les types d'armes""" a, b, c, d, e, f, g = lots with pytest.raises(Mon_exception): probleme = Probleme([e, f], [60, 10])
def test_verif_lots_meme_taille(lots): """vérifie que les lots ont la même longueur.""" a, b, c, d, e, f, g = lots with pytest.raises(Mon_exception): probleme = Probleme([c, e], [60, 10])
def test_verif_same_type_arme(lots): """vérifie que les lots sont composés du même type d'armes""" a, b, c, d, e, f, g = lots with pytest.raises(Mon_exception): probleme = Probleme([c, d], [60, 10])
def test_instanciation(lots): """Création.""" a, b, c, d, e, f, g = lots probleme = Probleme(lots=[a, b], demande=[60, 10]) assert isinstance(probleme, Probleme)
def test_egalite(lots): """Doit être différent de l'identité.""" a, b, c, d, e, f, g = lots probleme1 = Probleme([a, b], [60, 10]) probleme2 = Probleme([a, b], [60, 10]) assert probleme1 == probleme2
def test_acces(lots): """Utilisation de [].""" a, b, c, d, e, f, g = lots probleme = Probleme([a, b], [60, 10]) assert probleme.lots[0] == a
def test_noms(lots): """Teste la propriété noms.""" a, b, c, d, e, f, g = lots probleme = Probleme([a, b], [60, 10]) assert ["Lot1", "Lot2"] == [lot.nom for lot in probleme.lots]
def test_lots(lots): """Teste la propriété lots.""" a, b, c, d, e, f, g = lots probleme = Probleme([a, b], [60, 10]) assert [a, b] == list(probleme.lots)
def test_verif_lenDemand_len_arme(lots): """vérifie que la longueur de liste demande = nb de type d'arme.""" a, b, c, d, e, f, g = lots with pytest.raises(Mon_exception): probleme = Probleme([a, b], [60, 10, 30])