"""
Séquence 1, Séance 2 — Programmation orientée objet : la classe Point
=============================================================================

Ce fichier correspond à la section « La programmation orientée objet » de
la fiche « Interfaces, implémentation bas niveau et POO ».

Il contient :
  - le code du cours (classe Point, avec __init__, deplace, __repr__) ;
  - le code des Exercices 6 et 7 (rotation180, attribut couleur) ;
  - les tests correspondants.

Pour l'exécuter : télécharger ce fichier, puis dans un terminal, dans le
même dossier :
    python3 point_poo.py

Si tout est correct, le programme affiche "Tests de la classe Point : OK".
"""


class Point:
    "Un point du plan muni d'un repère"

    # Méthode constructeur
    def __init__(self, x, y, col="#000000"):
        self.abscisse = x
        self.ordonne = y
        self.couleur = col          # couleur au format RVB, ex. "#FF00AA"

    # Méthode deplace : translate le point de (dx, dy)
    def deplace(self, dx, dy):
        self.abscisse += dx
        self.ordonne += dy

    # Exercice 6 : rotation180 = symétrique du point par rapport à l'origine
    def rotation180(self):
        self.abscisse, self.ordonne = -self.abscisse, -self.ordonne

    # Méthode pour représenter le point à l'affichage
    def __repr__(self):
        return f'({self.abscisse!r} ; {self.ordonne!r}) couleur : {self.couleur}'


def test_illustration_console():
    """Reprend l'illustration console du cours (création, affichage, deplace)."""
    A = Point(3, 4)
    assert A.abscisse == 3 and A.ordonne == 4
    assert repr(A) == "(3 ; 4) couleur : #000000"

    A.deplace(0, 10)
    assert (A.abscisse, A.ordonne) == (3, 14), "deplace(0, 10) doit laisser l'abscisse inchangée"
    assert repr(A) == "(3 ; 14) couleur : #000000"

    print("Illustration console : OK")


def test_exercice_6():
    """Exercice 6 : rotation180, symétrique par rapport à l'origine du repère."""
    B = Point(3, 14)
    B.rotation180()
    assert (B.abscisse, B.ordonne) == (-3, -14)

    # Une double rotation180 doit rendre le point à sa position initiale
    B.rotation180()
    assert (B.abscisse, B.ordonne) == (3, 14)

    print("Exercice 6 : OK")


def test_exercice_7():
    """Exercice 7 : ajouter un attribut couleur (RVB, #000000 à #FFFFFF)."""
    C = Point(0, 0, "#FF00AA")
    assert C.couleur == "#FF00AA"
    assert repr(C) == "(0 ; 0) couleur : #FF00AA"

    # Sans couleur précisée, la valeur par défaut doit être utilisée
    D = Point(1, 1)
    assert D.couleur == "#000000"

    print("Exercice 7 : OK")


if __name__ == "__main__":
    test_illustration_console()
    test_exercice_6()
    test_exercice_7()
    print("Tests de la classe Point : OK")
