def test_probleme_encodage(): """Test.""" personnel_str_1 = """ Février / 3 / Mars / 4 / Avril / 7 / 7 """ personnel_str_2 = """ Février / 3 / Mars / 4 / Avril / 7 / 8 """ echange_str = """ 3 / .33 """ couts_str = """ 160 / 200 / 200 """ h_supp_str = """ .25 """ with pytest.raises(ValueError): Probleme.par_str(personnel_str_1, echange_str, couts_str, h_supp_str) with pytest.raises(ValueError): Probleme.par_str(personnel_str_2, echange_str, couts_str, h_supp_str)
def test_instanciation(personnel, echange, couts, h_supp): """Création.""" probleme = Probleme(personnel, echange, couts, h_supp) assert isinstance(probleme, Probleme) assert probleme._personnel == { prerequis.mois: prerequis for prerequis in personnel }
def test_encode_echange(): """Teste l'encodage d'une ligne en un objet de classe Echange.""" correspondance = { "3 / .33": Echange(ajout_max=3, suppression_max=.33), "2 / .25": Echange(ajout_max=2, suppression_max=.25) } for entree, attendu in correspondance.items(): assert attendu == Probleme._encode_echange(entree)
def probleme_sans_solution(): """Retranscription du problème d'exemple en graphe.""" return Probleme(personnel=[ Prerequis(mois="Février", nb_employes_min=3, nb_employes_max=Inf), Prerequis(mois="Mars", nb_employes_min=7, nb_employes_max=7) ], echange=Echange(3, 1 / 3), couts=Couts(160, 200, 200), h_supp=1 / 4)
def probleme(): """Problème utilisé pour les tests.""" return Probleme(personnel=[ Prerequis(mois="Février", nb_employes_min=3, nb_employes_max=Inf), Prerequis(mois="Mars", nb_employes_min=4, nb_employes_max=Inf), Prerequis(mois="Avril", nb_employes_min=2, nb_employes_max=2) ], echange=Echange(1, 1 / 2), couts=Couts(90, 100, 300), h_supp=1 / 4)
def test_encode_couts(): """Teste l'encodage d'une ligne en objet de classe Couts.""" correspondance = { "100 / 200 / 40": Couts(changement=100, sur_effectif=200, sous_effectif=40), "10 / 2000 / 400": Couts(changement=10, sur_effectif=2000, sous_effectif=400) } for entree, attendu in correspondance.items(): assert attendu == Probleme._encode_couts(entree)
def test_encode_prerequis(): """Teste l'encodage d'une ligne en un objet de classe Prerequis.""" correspondance = { "Février / 1 / 6": Prerequis(mois="Février", nb_employes_min=1, nb_employes_max=6), "Mars / 2 / 9": Prerequis(mois="Mars", nb_employes_min=2, nb_employes_max=9) } for entree, attendu in correspondance.items(): assert attendu == Probleme._encode_prerequis(entree)
def probleme_non_valide(): """Problème ne pouvant pas être résolu.""" return Probleme( personnel = [ Prerequis(mois = "Février", nb_employes_min = 3, nb_employes_max = Inf), Prerequis(mois = "Mars", nb_employes_min = 1, nb_employes_max = 1) ], echange = Echange(3, 1/3), couts = Couts(160, 200, 200), h_supp = 1/4 )
def test_constructeur(personnel, echange, couts, h_supp): """Constructeur alternatif.""" personnel_str = """ Février / 3 / Mars / 4 / Avril / 7 / Mai / 7 / Juin / 5 / 5 """ echange_str = """ 3 / .33 """ couts_str = """ 160 / 200 / 200 """ h_supp_str = """ .25 """ probleme = Probleme.par_str(personnel_str, echange_str, couts_str, h_supp_str) assert probleme == Probleme(personnel, echange, couts, h_supp)
def test_repr(): """Teste le repr.""" probleme = Probleme(personnel=[ Prerequis(mois="Mars", nb_employes_min=2, nb_employes_max=Inf), Prerequis(mois="Avril", nb_employes_min=4, nb_employes_max=4) ], echange=Echange(3, .33), couts=Couts(160, 200, 200), h_supp=1 / 4) assert ( repr(probleme) == "Probleme(personnel = [Prerequis(mois='Mars', nb_employes_min=2, nb_employes_max=inf), Prerequis(mois='Avril', nb_employes_min=4, nb_employes_max=4)], echange = Echange(ajout_max=3, suppression_max=0.33), couts = Couts(changement=160, sur_effectif=200, sous_effectif=200), h_supp = 0.25)" )
def _sur_clique(self, b): self.zone_probleme.clear_output() self.zone_solution.clear_output() self.zone_graphique.clear_output() echange_str = f""" {str(self.zone_entree_ajout_max.value)} / {str(self.zone_entree_suppression_max.value/100)} """ couts_str = f""" {str(self.zone_entree_couts_changement.value)} / {str(self.zone_entree_couts_sur_effectif.value)} / {str(self.zone_entree_couts_sous_effectif.value)} """ try: probleme = Probleme.par_str( self.zone_entree_personnel.value + " \n" + self.zone_entree_objectif.value, echange_str, couts_str, str(self.zone_entree_h_supp.value / 100)) solution = Resolution(grapheD=GrapheD(probleme=probleme)) except ValueError: probleme = None with self.zone_probleme: if probleme is not None: display(probleme.genere_table_personnel()) display(probleme.genere_table_contraintes()) display(probleme._couts.genere_table_couts()) else: print( f"Veuillez relire le mode d'emploi \npour rentrer les données correctement !" ) with self.zone_solution: if probleme is not None: if solution._est_resolvable(): display(solution.genere_table()) solution.genere_graphique() else: print( f"Configuration incorrecte ! \nIl ne peut pas y avoir {probleme[probleme.mois[-1]].nb_employes_min} employé(s) présent(s) au mois de {probleme[probleme.mois[-1]].mois}." )
def test_personnel(personnel, echange, couts, h_supp): """Teste la propriété personnel. La propriété personnel ne doit pas faire partie des attributs de la classe Probleme.""" probleme = Probleme(personnel, echange, couts, h_supp) assert "personnel" not in vars(probleme) assert personnel == list(probleme.personnel)
def test_validation_doublon(personnel, echange, couts, h_supp): """Vérifie la détection de deux prérequis associés au même mois.""" a, b, c, d, e = personnel f = Prerequis(mois="Mars", nb_employes_min=2, nb_employes_max=8) with pytest.raises(ValueError): Probleme([a, b, c, d, e, f], echange, couts, h_supp)
def test_egalite(personnel, echange, couts, h_supp): """Doit être différent de l'identité.""" probleme1 = Probleme(personnel, echange, couts, h_supp) probleme2 = Probleme(personnel, echange, couts, h_supp) assert probleme1 == probleme2
def test_getitem(personnel, echange, couts, h_supp): """Utilisation de [].""" probleme = Probleme(personnel, echange, couts, h_supp) assert probleme["Février"] == personnel[0]
def test_mois(personnel, echange, couts, h_supp): """Teste la propriété mois. La propriété mois ne doit pas faire partie des attributs de la classe Probleme.""" probleme = Probleme(personnel, echange, couts, h_supp) assert "mois" not in vars(probleme) assert ("Février Mars Avril Mai Juin").split() == list(probleme.mois)