From 7a09c2b5e6483613b2400b8e9e8c60f8bfc55aea Mon Sep 17 00:00:00 2001
From: Benjamin Chausse <benjamin@chausse.xyz>
Date: Tue, 10 Jan 2023 11:53:46 -0500
Subject: Initial commit

---
 rapport/main.tex | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 66 insertions(+)
 create mode 100644 rapport/main.tex

(limited to 'rapport/main.tex')

diff --git a/rapport/main.tex b/rapport/main.tex
new file mode 100644
index 0000000..f7afdcb
--- /dev/null
+++ b/rapport/main.tex
@@ -0,0 +1,66 @@
+\documentclass[a11paper, 11pt]{article}
+
+\usepackage{document}
+\usepackage{titlepage}
+\usepackage{float}
+\usepackage{algorithm}
+\usepackage{algpseudocode}
+\usepackage{frpseudocode}
+\usepackage[T1]{fontenc}
+\usepackage[french]{babel}
+
+% \addbibresource{bibliography.bib}
+% \nofiles
+
+% \institution{Université de Sherbrooke}
+% \faculty{Faculté de génie}
+% \department{Département de génie électrique et de génie informatique}
+\title{Titre du document}
+\classnb{GEN420}
+\class{Mathématiques des circuits logiques}
+\author{
+  \addtolength{\tabcolsep}{-0.4em}
+  \begin{tabular}{rcl} % Ajouter des auteurs au besoin
+  Benjamin Chausse & -- & chab1704 \\
+  Édouard Laurent  & -- & laue \\ % TODO: demander le numéro du CIP
+  \end{tabular}
+}
+% \teacher{Benjamin Chausse}
+% \location{Sherbrooke}
+% \date{\today}
+
+
+\begin{document}
+\maketitle
+\newpage
+% \tableofcontents
+% \newpage
+
+\section{Diagrammes UML}
+
+\section{Pseudo-code}
+
+Ceci est un test pour voir comment le package frpseudocode fonctionne.
+Du pseudo-code est pertinent pour l'APP ira ici.
+
+\begin{algorithm}
+\caption{Euclid's algorithm}\label{alg:euclid}
+\begin{algorithmic}[1]
+  \Function{Euclid}{$a, b$}
+    \While{$a \neq b$}
+      \If{$a > b$}
+        \State $a \gets a - b$
+      \Else
+        \State $b \gets b - a$
+      \EndIf
+    \EndWhile
+    \State \Return $a$
+  \EndFunction
+\end{algorithmic}
+\end{algorithm}
+
+
+
+% \newpage
+% \printbibliography[heading=bibintoc]
+\end{document}
-- 
cgit v1.2.3


From d9e7b4893a0debc0d170122285db780a7b93e703 Mon Sep 17 00:00:00 2001
From: Benjamin Chausse <benjamin@chausse.xyz>
Date: Tue, 10 Jan 2023 12:00:43 -0500
Subject: Update page présentation
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 rapport/main.tex | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

(limited to 'rapport/main.tex')

diff --git a/rapport/main.tex b/rapport/main.tex
index f7afdcb..5e9cccf 100644
--- a/rapport/main.tex
+++ b/rapport/main.tex
@@ -15,17 +15,17 @@
 % \institution{Université de Sherbrooke}
 % \faculty{Faculté de génie}
 % \department{Département de génie électrique et de génie informatique}
-\title{Titre du document}
-\classnb{GEN420}
-\class{Mathématiques des circuits logiques}
+\title{Rapport d'APP}
+\classnb{GEN241}
+\class{Modélisation et programmation orientée objet}
 \author{
   \addtolength{\tabcolsep}{-0.4em}
   \begin{tabular}{rcl} % Ajouter des auteurs au besoin
   Benjamin Chausse & -- & chab1704 \\
-  Édouard Laurent  & -- & laue \\ % TODO: demander le numéro du CIP
+  Édouard Laurent  & -- & laue\textbf{XXXX} \\ % TODO: demander numéro du CIP
   \end{tabular}
 }
-% \teacher{Benjamin Chausse}
+\teacher{Eugène Morin}
 % \location{Sherbrooke}
 % \date{\today}
 
@@ -33,8 +33,8 @@
 \begin{document}
 \maketitle
 \newpage
-% \tableofcontents
-% \newpage
+\tableofcontents
+\newpage
 
 \section{Diagrammes UML}
 
-- 
cgit v1.2.3


From 8dd2515cc25fc558f70884894bbc9c7d994e9754 Mon Sep 17 00:00:00 2001
From: Benjamin Chausse <benjamin@chausse.xyz>
Date: Sun, 15 Jan 2023 00:48:25 -0500
Subject: Remove never present teammate from authors

---
 rapport/main.pdf | Bin 138334 -> 137828 bytes
 rapport/main.tex |   1 -
 2 files changed, 1 deletion(-)

(limited to 'rapport/main.tex')

diff --git a/rapport/main.pdf b/rapport/main.pdf
index 7336053..1fbfb35 100644
Binary files a/rapport/main.pdf and b/rapport/main.pdf differ
diff --git a/rapport/main.tex b/rapport/main.tex
index 5e9cccf..a465927 100644
--- a/rapport/main.tex
+++ b/rapport/main.tex
@@ -22,7 +22,6 @@
   \addtolength{\tabcolsep}{-0.4em}
   \begin{tabular}{rcl} % Ajouter des auteurs au besoin
   Benjamin Chausse & -- & chab1704 \\
-  Édouard Laurent  & -- & laue\textbf{XXXX} \\ % TODO: demander numéro du CIP
   \end{tabular}
 }
 \teacher{Eugène Morin}
-- 
cgit v1.2.3


From e37d4911c750550896c4155f452736200d977b83 Mon Sep 17 00:00:00 2001
From: Benjamin Chausse <benjamin@chausse.xyz>
Date: Mon, 16 Jan 2023 02:51:22 -0500
Subject: Almost done...

---
 .gitignore                |   3 +
 canevas.cpp               |  18 +++--
 canevas.h                 |  23 +++---
 couche.h                  |   5 +-
 forme.h                   |   8 +-
 rapport/algpseudocode.sty |  92 +++++++++++++++++++++++
 rapport/class.png         | Bin 0 -> 142596 bytes
 rapport/frpseudocode.sty  |   7 +-
 rapport/main.pdf          | Bin 137828 -> 577604 bytes
 rapport/main.tex          | 183 ++++++++++++++++++++++++++++++++++++++++++----
 rapport/sequence.png      | Bin 0 -> 102706 bytes
 rapport/usecase.png       | Bin 0 -> 264876 bytes
 rectangle.h               |  12 +--
 tests.cpp                 |  68 +++++++++++++++++
 tests.h                   |   1 -
 vecteur.h                 |  21 +++---
 16 files changed, 375 insertions(+), 66 deletions(-)
 create mode 100644 rapport/algpseudocode.sty
 create mode 100644 rapport/class.png
 create mode 100644 rapport/sequence.png
 create mode 100644 rapport/usecase.png

(limited to 'rapport/main.tex')

diff --git a/.gitignore b/.gitignore
index 6a1ed24..71895e2 100644
--- a/.gitignore
+++ b/.gitignore
@@ -31,3 +31,6 @@ tags
 *.run.xml
 *.synctex
 _minted-*
+*.lof
+*.lot
+*.toc
diff --git a/canevas.cpp b/canevas.cpp
index 959e681..edcb8be 100644
--- a/canevas.cpp
+++ b/canevas.cpp
@@ -10,7 +10,7 @@
 
 Canevas::Canevas() {
  Couche couches[MAX_COUCHES];
- couches[0].changerEtat(STATE_ACTIVE);
+ activerCouche(0);
 }
 
 Canevas::~Canevas() {
@@ -37,13 +37,6 @@ bool Canevas::activerCouche(int index) {
   return couches[index].changerEtat(STATE_ACTIVE);
 };
 
-bool Canevas::cacherCouche(int index) {
-  if (index < 0 || index >= MAX_COUCHES)
-    return false;
-  couches[index].changerEtat(STATE_INACTIVE);
- return true;
-};
-
 bool Canevas::ajouterForme(Forme *p_forme) {
   int active = -1;
   for (int i = 0; i < MAX_COUCHES; i++)
@@ -88,6 +81,15 @@ void Canevas::afficher(ostream & s) {
   };
 };
 
+void Canevas::getEtats(ostream &s) {
+  s << "[ ";
+  for (int i = 0; i < MAX_COUCHES; i++) {
+    s << STATES[couches[i].getEtat()];
+    if (i < MAX_COUCHES - 1) s << ", ";
+    else s << " ]\n";
+  };
+}
+
 bool Canevas::reinitialiserCouche(int index) {
   if (index < 0 || index >= MAX_COUCHES){
     return false;
diff --git a/canevas.h b/canevas.h
index 64b833a..6ccd68a 100644
--- a/canevas.h
+++ b/canevas.h
@@ -22,22 +22,17 @@ class Canevas {
 public:
    Canevas();
    ~Canevas();
-
-   bool reinitialiser();
-
-   bool activerCouche(int index);
-   bool cacherCouche(int index);
-
-   bool ajouterForme(Forme *p_forme);
-   bool retirerForme(int index);
-
+   bool   reinitialiser();
+   bool   activerCouche(int index);
+   bool   ajouterForme(Forme *p_forme);
+   bool   retirerForme(int index);
    double aire();
-   bool translater(int deltaX, int deltaY);
-   void afficher(ostream & s);
-   bool reinitialiserCouche(int index);
-
+   bool   translater(int deltaX, int deltaY);
+   void   afficher(ostream &s);
+   void   getEtats(ostream &s);
+   bool   reinitialiserCouche(int index);
 private:
-     Couche couches[MAX_COUCHES];
+   Couche couches[MAX_COUCHES];
 };
 
 #endif
diff --git a/couche.h b/couche.h
index 4ef44a2..ec71444 100644
--- a/couche.h
+++ b/couche.h
@@ -19,18 +19,15 @@
 
 class Couche {
   private:
-    int state;
+    int     state;
     Vecteur vecteur;
   public:
-    // Initialisation
     Couche();
     ~Couche();
-    // Informations
     int    getEtat();
     Forme  *getForme(int index);
     double aire();
     void   afficher(ostream &s);
-    // Modifications
     bool   changerEtat(int newState);
     bool   translater(int deltaX, int deltaY);
     bool   ajouterForme(Forme *f);
diff --git a/forme.h b/forme.h
index c719366..f1fb5b6 100644
--- a/forme.h
+++ b/forme.h
@@ -19,11 +19,11 @@ class Forme {
 public:
   Forme(int x = 0, int y = 0);
   virtual ~Forme();
-  void translater(int deltaX, int deltaY);
+  void       translater(int deltaX, int deltaY);
   Coordonnee getAncrage();
-  void setAncrage(Coordonnee c);
-  virtual double aire() = 0;
-  virtual void afficher(ostream & s) = 0;
+  void       setAncrage(Coordonnee c);
+  virtual    double aire() = 0;
+  virtual    void afficher(ostream & s) = 0;
 protected:
 	Coordonnee ancrage;
 };
diff --git a/rapport/algpseudocode.sty b/rapport/algpseudocode.sty
new file mode 100644
index 0000000..8cc2bf0
--- /dev/null
+++ b/rapport/algpseudocode.sty
@@ -0,0 +1,92 @@
+% PSEUDOCODE ALGORITHMIC STYLE -- Released 27 APR 2005
+%    for LaTeX version 2e
+%
+% Copyright Szasz Janos
+% E-mail szaszjanos@users.sourceforge.net
+% Based on Peter Williams's algorithmic.sty
+%
+\NeedsTeXFormat{LaTeX2e}%
+\ProvidesPackage{algpseudocode}%
+\RequirePackage{ifthen}%
+\RequirePackage{algorithmicx}%
+\typeout{Document Style - pseudocode environments for use with the `algorithmicx' style}%
+%
+\def\ALG@noend{f}%
+\newboolean{ALG@compatible}%
+\setboolean{ALG@compatible}{false}%
+%
+\DeclareOption{noend}{\def\ALG@noend{t}}%
+\DeclareOption{end}{\def\ALG@noend{f}}%
+\DeclareOption{compatible}{\typeout{For compatibility mode use algcompatible.sty!!!}\setboolean{ALG@compatible}{true}}%
+\DeclareOption{noncompatible}{\setboolean{ALG@noncompatible}{false}}%
+\ProcessOptions%
+%
+%      ***      DECLARATIONS      ***
+%
+\algnewlanguage{pseudocode}%
+\alglanguage{pseudocode}%
+%
+%      ***      KEYWORDS      ***
+%
+\algnewcommand\algorithmicend{\textbf{end}}
+\algnewcommand\algorithmicdo{\textbf{do}}
+\algnewcommand\algorithmicwhile{\textbf{while}}
+\algnewcommand\algorithmicfor{\textbf{for}}
+\algnewcommand\algorithmicforall{\textbf{for all}}
+\algnewcommand\algorithmicloop{\textbf{loop}}
+\algnewcommand\algorithmicrepeat{\textbf{repeat}}
+\algnewcommand\algorithmicuntil{\textbf{until}}
+\algnewcommand\algorithmicprocedure{\textbf{procedure}}
+\algnewcommand\algorithmicfunction{\textbf{function}}
+\algnewcommand\algorithmicif{\textbf{if}}
+\algnewcommand\algorithmicthen{\textbf{then}}
+\algnewcommand\algorithmicelse{\textbf{else}}
+\algnewcommand\algorithmicrequire{\textbf{Require:}}
+\algnewcommand\algorithmicensure{\textbf{Ensure:}}
+\algnewcommand\algorithmicreturn{\textbf{return}}
+\algnewcommand\textproc{\textsc}
+%
+%      ***      DECLARED LOOPS      ***
+%
+\algdef{SE}[WHILE]{While}{EndWhile}[1]{\algorithmicwhile\ #1\ \algorithmicdo}{\algorithmicend\ \algorithmicwhile}%
+\algdef{SE}[FOR]{For}{EndFor}[1]{\algorithmicfor\ #1\ \algorithmicdo}{\algorithmicend\ \algorithmicfor}%
+\algdef{S}[FOR]{ForAll}[1]{\algorithmicforall\ #1\ \algorithmicdo}%
+\algdef{SE}[LOOP]{Loop}{EndLoop}{\algorithmicloop}{\algorithmicend\ \algorithmicloop}%
+\algdef{SE}[REPEAT]{Repeat}{Until}{\algorithmicrepeat}[1]{\algorithmicuntil\ #1}%
+\algdef{SE}[IF]{If}{EndIf}[1]{\algorithmicif\ #1\ \algorithmicthen}{\algorithmicend\ \algorithmicif}%
+\algdef{C}[IF]{IF}{ElsIf}[1]{\algorithmicelse\ \algorithmicif\ #1\ \algorithmicthen}%
+\algdef{Ce}[ELSE]{IF}{Else}{EndIf}{\algorithmicelse}%
+\algdef{SE}[PROCEDURE]{Procedure}{EndProcedure}%
+   [2]{\algorithmicprocedure\ \textproc{#1}\ifthenelse{\equal{#2}{}}{}{(#2)}}%
+   {\algorithmicend\ \algorithmicprocedure}%
+\algdef{SE}[FUNCTION]{Function}{EndFunction}%
+   [2]{\algorithmicfunction\ \textproc{#1}\ifthenelse{\equal{#2}{}}{}{(#2)}}%
+   {\algorithmicend}%
+%
+\ifthenelse{\equal{\ALG@noend}{t}}%
+   {%
+   \algtext*{EndWhile}%
+   \algtext*{EndFor}%
+   \algtext*{EndLoop}%
+   \algtext*{EndIf}%
+   \algtext*{EndProcedure}%
+   \algtext*{EndFunction}%
+   }{}%
+%
+%      ***      OTHER DECLARATIONS      ***
+%
+\algnewcommand\Require{\item[\algorithmicrequire]}%
+\algnewcommand\Ensure{\item[\algorithmicensure]}%
+\algnewcommand\Return{\algorithmicreturn{} }%
+\algnewcommand\Call[2]{\textproc{#1}\ifthenelse{\equal{#2}{}}{}{(#2)}}%
+%
+%
+%
+\ifthenelse{\boolean{ALG@compatible}}%
+   {%
+   \ifthenelse{\equal{\ALG@noend}{t}}%
+      {\RequirePackage[noend]{algcompatible}}%
+      {\RequirePackage{algcompatible}}%
+   }%
+   {}%
+%
diff --git a/rapport/class.png b/rapport/class.png
new file mode 100644
index 0000000..cfb3804
Binary files /dev/null and b/rapport/class.png differ
diff --git a/rapport/frpseudocode.sty b/rapport/frpseudocode.sty
index 06be0cc..8e1732a 100644
--- a/rapport/frpseudocode.sty
+++ b/rapport/frpseudocode.sty
@@ -9,7 +9,7 @@
 %% Functions %%
 \algrenewcommand\algorithmicprocedure{\textbf{PROCÉDURE}}
 \algrenewcommand\algorithmicfunction{\textbf{FONCTION}}
-\algrenewcommand\algorithmicreturn{\textbf{RENVOYER}}
+\algrenewcommand\algorithmicreturn{Retourner}
 
 \algrenewtext{Procedure}[2]%
 {\algorithmicprocedure\ \textproc{#1}\ifthenelse{\equal{#2}{}}{}{(#2)}\ :}
@@ -68,6 +68,11 @@
 \algrenewtext{ENDIF}[0]%
 {\algorithmicend\ \algorithmicifm}
 
+
+\algtext*{EndWhile}% Remove "end while" text
+\algtext*{EndIf}% Remove "end if" text
+% \algtext*{EndFunction}% Remove "end if" text
+
 %% Logical
 %\algrenewcommand{\algorithmicnot}{\textbf{non}}
 %\algrenewcommand{\algorithmicand}{\textbf{et}}
diff --git a/rapport/main.pdf b/rapport/main.pdf
index 1fbfb35..325b471 100644
Binary files a/rapport/main.pdf and b/rapport/main.pdf differ
diff --git a/rapport/main.tex b/rapport/main.tex
index a465927..638a69d 100644
--- a/rapport/main.tex
+++ b/rapport/main.tex
@@ -4,6 +4,9 @@
 \usepackage{titlepage}
 \usepackage{float}
 \usepackage{algorithm}
+\usepackage{amsmath}
+\usepackage{graphicx}
+\usepackage{tikz-uml}
 \usepackage{algpseudocode}
 \usepackage{frpseudocode}
 \usepackage[T1]{fontenc}
@@ -12,6 +15,7 @@
 % \addbibresource{bibliography.bib}
 % \nofiles
 
+
 % \institution{Université de Sherbrooke}
 % \faculty{Faculté de génie}
 % \department{Département de génie électrique et de génie informatique}
@@ -24,7 +28,7 @@
   Benjamin Chausse & -- & chab1704 \\
   \end{tabular}
 }
-\teacher{Eugène Morin}
+\teacher{Domingo Palao Muñoz}
 % \location{Sherbrooke}
 % \date{\today}
 
@@ -33,31 +37,178 @@
 \maketitle
 \newpage
 \tableofcontents
+\listoffigures
+\listoftables
 \newpage
 
 \section{Diagrammes UML}
 
-\section{Pseudo-code}
+La figure \ref{fig:class} montre les diverses relation entre les classes de
+graphicus-02. Elle permet d'observer la hiérarchie des classes ainsi que les
+facteurs de dépendance entre les classes.
+
+\begin{figure}[H] % Diagramme de classes {{{
+\centering
+\caption{Diagrame de classes de graphicus-02}\label{fig:class}
+\includegraphics[width=0.8\textwidth]{class.png}
+\end{figure} % }}}
+
+La figure \ref{fig:sequence} montre comment l'application procéderait
+lorsqu'un utilisateur voudrait activer la couche 1 du canevas alors que la
+couche 0 est présentement active. Les autres couches ont été omises pour
+alléger le diagramme.
+
+\begin{figure}[H] % Diagramme de séquence {{{
+\centering
+\caption{Diagrame de séquence d'activation de couche}\label{fig:sequence}
+\includegraphics[width=\textwidth]{sequence.png}
+\end{figure} % }}}
+
 
-Ceci est un test pour voir comment le package frpseudocode fonctionne.
-Du pseudo-code est pertinent pour l'APP ira ici.
+La figure \ref{fig:usecase} montre les différentes actions que l'utilisateur
+peut exécuter dans l'application. Nous voyos par la suite comment certaines de
+ces actions agissent en arrière plan et dépendent d'autres actions (parfois
+même d'autres actions accessibles à l'utilisateur).
 
-\begin{algorithm}
-\caption{Euclid's algorithm}\label{alg:euclid}
+\begin{figure}[H]
+\centering\caption{Diagramme de cas d'utilisation}\label{fig:usecase}
+\includegraphics[width=\textwidth]{usecase.png}
+\end{figure}
+
+
+\section{Pseudo-code}
+
+\begin{algorithm} % {{{
+\caption{Ajout d'un élément au vecteur}\label{alg:ajouterForme}
 \begin{algorithmic}[1]
-  \Function{Euclid}{$a, b$}
-    \While{$a \neq b$}
-      \If{$a > b$}
-        \State $a \gets a - b$
-      \Else
-        \State $b \gets b - a$
-      \EndIf
-    \EndWhile
-    \State \Return $a$
+  \Function{Vecteur::ajouterForme}{$f$}{ Booléen}\\
+  \hspace{.5cm}// $f$: Forme à ajouter au vecteur\\
+  \hspace{.5cm}// $Vecteur::taille$: nombre d'éléments actuellement dans le vecteur (entier)\\
+  \hspace{.5cm}// $Vecteur::capacite$: capacité maximale du vecteur actuellement (entier)\\
+  \hspace{.5cm}// $Vecteur::formes$: Liste de pointeurs vers les formes du vecteur (*Forme)\\
+  \textbf{DÉBUT}\\
+  \hspace{.5cm}// $newCapacite$: nouvelle capacité du vecteur (entier)\\
+  \hspace{.5cm}// $newFormes$: nouvelle liste de pointeurs vers les formes du vecteur (*Forme)
+  \If{$f$ est de valeur nulle}
+    \Comment{Vérifier si la forme est valide}
+    \State\Return{Faux}
+  \EndIf
+  \If{$Vecteur::taille =\joinrel= Vecteur::capacite$}
+    \Comment{Si le vecteur est plein}
+    \State $newCapacite := Vecteur::capacite\times2$
+    \If{L'espace disponible en mémoire $<$ $newCapacite\times taille(Forme)$}
+      \State\Return{Faux}
+    \EndIf
+    \State $newFormes :=\ $allouer$(newCapacite\times taille(Forme))$
+    \For{\textbf{CHAQUE} Forme $i$ dans $Vecteur::formes$}
+      \State $newFormes[i] := Vecteur::formes[i]$
+    \EndFor
+    \State $Vecteur::capacite := newCapacite$
+    \State libérer$(Vecteur::formes)$
+    \State $Vecteur::formes := newFormes$
+  \EndIf
+  \State $Vecteur::taille := Vecteur::taille + 1$
+  \State $Vecteur::formes[Vecteur::taille] := f$
+  \State \Return{Vrai}
   \EndFunction
 \end{algorithmic}
-\end{algorithm}
+\end{algorithm} % }}}
+
+\section{Plan de test}
+
+\subsection{Identification}
+\begin{table}[H] % {{{
+\centering\caption{Informations générales du plan de test}\label{fig:planTest}
+\begin{tabular}{rl}
+  \\ \toprule
+  Nom:               & Scénario de test du rapport d'APP \\
+  But:               & Vérifier les fonctionnalitées globales de graphicus-02\\
+  Acteur principal:  & classe \verb|Test| \\
+  Date de création:  & 2023-01-14 \\
+  Auteur:            & Benjamin Chausse -- chab1704 \\
+  Version:           & 1.0 \\
+  \bottomrule
+\end{tabular}
+\end{table}% }}}
+
+\subsection{Scénario}
+
+\subsubsection{Préconditions}
+
+\begin{itemize}
+  \item Un canevas vierge vient d'être créé
+  \item Ce cas d'utilisation emploie la méthode \verb|tests_application_cas_02|
+    de la classe \verb|Tests|. La première ayant été utilisée lors de la
+    validation en classe.
+\end{itemize}
+
+
+\subsubsection{Postconditions}
+
+\begin{itemize}
+  \item Le déroulement du test se fait sans intervention de l'utilisateur.
+  \item L'affichage doit-être accessible à l'évaluateur:
+      \begin{itemize}
+        \item soit par écriture dans un fichier
+        \item soit par affichage dans un terminal
+      \end{itemize}
+  \item Le numéro de chaque étape est identifié avant son exécution.
+  \item La description de chaque étape est affichée avant son exécution.
+  \item Les informations passées à chaque étape sont affichées avant son exécution.
+\end{itemize}
+
+
+\subsubsection{Limitations}
+
+\begin{itemize}
+  \item Le test ne vérifie pas la totalité des cas limites
+    (ex: capacité insuffisante en mémoire pour agrandir le vecteur).
+\end{itemize}
+
+
+\subsection{Enchaînement nominal}
+
+\subsubsection{Étapes 1 à 4}
+\begin{enumerate}
+  % \setcounter{enumi}{1}
+  \item Activer la couche d'index 4
+  \item Ajouter les formes suivantes au canevas:
+    \begin{itemize}
+      \item un cercle de centre (1, 2) et de rayon $\frac{1}{\sqrt{\pi}}$
+      \item un rectangle anchré en (3, 4), de largeur
+      \item un carré anchré en (-1, -1), de côté 2
+    \end{itemize}
+  \item Afficher le canevas
+  \item Imprimer l'aire du canevas (doit être égale à $1+12+4$ soit $17$)
+\end{enumerate}
 
+\subsubsection{Étapes 5 à 13}
+\begin{enumerate}
+  \setcounter{enumi}{4}
+  \item Activer la couche d'index 3
+  \item Ajouter les formes par défaut au canevas. Soit:
+  \begin{itemize}
+    \item un cercle de centre (0, 0) et de rayon 1
+    \item un rectangle anchré en (0, 0), de largeur 1 et de hauteur 1
+    \item un carré anchré en (0, 0), de côté 1
+  \end{itemize}
+  \item Afficher le canevas
+  \item Translater le canevas de (1, 1)
+  \item Afficher le canevas
+  \item Supprimer la forme de l'index 0 (la première)
+  \item Activer la couche 4
+  \item Supprimer la forme de l'index 2 (la dernière)
+  \item Afficher le canevas
+\end{enumerate}
+\subsubsection{Étapes 14 à 18}
+\begin{enumerate}
+  \setcounter{enumi}{13}
+  \item Initialiser la couche 4
+  \item Afficher le canevas
+  \item Imprimer l'aire du canevas (doit être égale à $1+1$ soit $2$)
+  \item Réinitialiser le canevas
+  \item Afficher le canevas
+\end{enumerate}
 
 
 % \newpage
diff --git a/rapport/sequence.png b/rapport/sequence.png
new file mode 100644
index 0000000..bdb1aae
Binary files /dev/null and b/rapport/sequence.png differ
diff --git a/rapport/usecase.png b/rapport/usecase.png
new file mode 100644
index 0000000..2bf4ea9
Binary files /dev/null and b/rapport/usecase.png differ
diff --git a/rectangle.h b/rectangle.h
index 59b990b..02aeb98 100644
--- a/rectangle.h
+++ b/rectangle.h
@@ -10,13 +10,13 @@ class Rectangle:public Forme{
   public:
     Rectangle(int x=0, int y=0, int l=1, int h=1);
     ~Rectangle();
-    int getLargeur();
-    int getHauteur();
+    int        getLargeur();
+    int        getHauteur();
     Coordonnee getAncrageForme();
-    void setLargeur(int l);
-    void setHauteur(int h);
-    double aire();
-    void afficher(ostream &s);
+    void       setLargeur(int l);
+    void       setHauteur(int h);
+    double     aire();
+    void       afficher(ostream &s);
 };
 
 #endif
diff --git a/tests.cpp b/tests.cpp
index e3a283c..9a2f359 100644
--- a/tests.cpp
+++ b/tests.cpp
@@ -197,6 +197,74 @@ void Tests::tests_unitaires_couche() {
 
 // Tests sur la classe Canevas {{{
 void Tests::tests_unitaires_canevas() {
+  cout << "----- Tests de la classe Canevas -----\n\n";
+
+  cout << "--- Initialisation d'un canevas ---\n";
+  Canevas c1;
+  cout << "Couches: ";
+  c1.getEtats(cout);
+  cout << "Affichage: {\n";
+  c1.afficher(cout);
+  cout << "}\n\n";
+
+  cout << "--- Ajout d'une forme (doit aller dans la couche 0) ---\n";
+  cout << "Couches: ";
+  c1.getEtats(cout);
+  cout << "Reussite: " << (c1.ajouterForme(new Carre())? "Oui":"Non")
+       << "\nAffichage: {\n";
+  c1.afficher(cout);
+  cout << "}\n\n";
+
+  cout << "--- Activation de la couche 3 ---\n";
+  cout << "Reussite: " << (c1.activerCouche(3)? "Oui":"Non")
+       << "\nCouches: ";
+  c1.getEtats(cout);
+  cout << "Affichage: {\n";
+  c1.afficher(cout);
+  cout << "}\n\n";
+
+  cout << "--- Ajout de forme (doit aller dans la couche 3) ---\n";
+  cout << "Reussite: " << (c1.ajouterForme(new Carre())? "Oui":"Non")
+       << "\nCouches: ";
+  c1.getEtats(cout);
+  cout << "Affichage: {\n";
+  c1.afficher(cout);
+  cout << "}\n\n";
+
+  cout << "--- Reinitialisation de la couche active (3) ---\n";
+  cout << "Reussite: " << (c1.reinitialiserCouche(3)? "Oui":"Non")
+       << "\nCouches: ";
+  c1.getEtats(cout);
+  cout << "Affichage: {\n";
+  c1.afficher(cout);
+  cout << "}\n\n";
+
+  cout << "--- Translation de couche initialisée (couche 3 par 1,2) ---\n";
+  cout << "Reussite: " << (c1.translater(1, 2)? "Oui":"Non")
+       << "\nCouches: ";
+  c1.getEtats(cout);
+  cout << "Affichage: {\n";
+  c1.afficher(cout);
+  cout << "}\n\n";
+
+  cout << "--- Translation d'une couche active (couche 0 par 1,2) ---\n";
+  c1.activerCouche(0);
+  cout << "Reussite: " << (c1.translater(1, 2)? "Oui":"Non")
+       << "\nCouches: ";
+  c1.getEtats(cout);
+  cout << "Affichage: {\n";
+  c1.afficher(cout);
+  cout << "}\n\n";
+
+  cout << "--- Réinitialisation du canevas ---\n";
+  cout << "Reussite: " << (c1.reinitialiser()? "Oui":"Non")
+       << "\nCouches: ";
+  c1.getEtats(cout);
+  cout << "Affichage: {\n";
+  c1.afficher(cout);
+  cout << "}\n";
+
+
 }; // }}}
 
 // Execution de tout les tests unitaires {{{
diff --git a/tests.h b/tests.h
index 73aaaad..ebafc72 100644
--- a/tests.h
+++ b/tests.h
@@ -27,7 +27,6 @@ public:
    void tests_unitaires_couche();
    void tests_unitaires_canevas();
    void tests_unitaires(); // Appel de tous les tests unitaires
-
    // Methodes pour les tests unitaires des classes
    void tests_application_cas_01();
    void tests_application_cas_02();
diff --git a/vecteur.h b/vecteur.h
index de5e163..0f36348 100644
--- a/vecteur.h
+++ b/vecteur.h
@@ -8,23 +8,20 @@ using namespace std;
 
 class Vecteur {
   private:
-    int capacite; // capacité maximale actuelle du vecteur
-    int taille;
-    // dynamic array of pointers to Forme
-    Forme **formes;
+    int   capacite; // capacité maximale actuelle du vecteur
+    int   taille;   // nombre d'éléments actuellement dans le vecteur
+    Forme **formes; // dynamic array of pointers to Forme
   public:
     Vecteur();
     ~Vecteur();
-    // Informations
-    bool estVide();
+    bool  estVide();
     Forme *getForme(int index);
-    int getTaille();
-    int getCapacite();
-    void afficher(ostream &s);
-    // Manipulations
-    bool ajouterForme(Forme *f);
+    int   getTaille();
+    int   getCapacite();
+    void  afficher(ostream &s);
+    bool  ajouterForme(Forme *f);
     Forme *supprimerForme(int index);
-    void vider();
+    void  vider();
 };
 
 #endif
-- 
cgit v1.2.3


From 5f8fa959dab1106105f9e58325f65d0b51bb1631 Mon Sep 17 00:00:00 2001
From: Benjamin Chausse <benjamin@chausse.xyz>
Date: Mon, 16 Jan 2023 03:25:45 -0500
Subject: One graph left...

---
 cas-dapplication-01.txt |  95 ++++++++++++++++++++++++++++++++++++++++++++++++
 cas-dapplication-02.txt |  95 ++++++++++++++++++++++++++++++++++++++++++++++++
 couche.cpp              |   1 -
 graphicus-02.cpp        |   2 +-
 rapport/main.pdf        | Bin 577604 -> 577902 bytes
 rapport/main.tex        |   8 ++--
 tests.cpp               |  78 ++++++++++++++++++++++++++++++++++++++-
 7 files changed, 272 insertions(+), 7 deletions(-)
 create mode 100644 cas-dapplication-01.txt
 create mode 100644 cas-dapplication-02.txt

(limited to 'rapport/main.tex')

diff --git a/cas-dapplication-01.txt b/cas-dapplication-01.txt
new file mode 100644
index 0000000..35821ca
--- /dev/null
+++ b/cas-dapplication-01.txt
@@ -0,0 +1,95 @@
+TESTS APPLICATION (CAS 01)
+Etape 1: Activation de la couche 1
+Etape 2: Ajout des trois formes géométriques suivantes
+	* Un rectangle (x=0, y=0, largeur=2, hauteur=3)
+	* Un carré (x=2, y=3, cote=4)
+	* Un cercle (x=7, y=8, rayon=6)
+Etape 3: Activer la couche 2
+Etape 4: Ajouter la forme géométrique suivante
+	* Un rectangle (x=0, y=0, largeur=4, hauteur=5)
+Etape 5: Afficher le canevas
+----- Couche 0
+----- Couche 1
+Rectangle:(x=0, y=0, l=2, h=3, aire=6)
+Carre(x=2, y=3, c=4, a=16)
+Cercle (x=7, y=8, r=6, aire=113.097)
+----- Couche 2
+Rectangle:(x=0, y=0, l=4, h=5, aire=20)
+----- Couche 3
+Couche initialisée
+----- Couche 4
+Couche initialisée
+Etape 6: Afficher l'aire du canevas
+	* Aire du canevas: 155.097
+Etape 7: Activer la couche 0 et ajouter les formes suivantes
+	* Un rectangle (x=0, y=0, largeur=1, hauteur=1)
+	* Un carré (x=0, y=0, cote=1)
+	* Un cercle (x=0, y=0, rayon=1)
+Etape 8: Translater les formes de la couche selon x=5, y=5 pour obtenir les formes suivantes lorsque affiché
+	* Un rectangle (x=5, y=5, largeur=1, hauteur=1)
+	* Un carré (x=5, y=5, cote=1)
+	* Un cercle (x=5, y=5, rayon=1)
+----- Couche 0
+Rectangle:(x=5, y=5, l=1, h=1, aire=1)
+Carre(x=5, y=5, c=1, a=1)
+Cercle (x=5, y=5, r=1, aire=3.14159)
+----- Couche 1
+Rectangle:(x=0, y=0, l=2, h=3, aire=6)
+Carre(x=2, y=3, c=4, a=16)
+Cercle (x=7, y=8, r=6, aire=113.097)
+----- Couche 2
+Rectangle:(x=0, y=0, l=4, h=5, aire=20)
+----- Couche 3
+Couche initialisée
+----- Couche 4
+Couche initialisée
+Etape 9: Couche 2 - initialisée
+Etape 10: Couche 3 - initialisée
+Etape 11: Couche 4 - initialisée
+Etape 12: Afficher le canevas
+----- Couche 0
+Rectangle:(x=5, y=5, l=1, h=1, aire=1)
+Carre(x=5, y=5, c=1, a=1)
+Cercle (x=5, y=5, r=1, aire=3.14159)
+----- Couche 1
+Rectangle:(x=0, y=0, l=2, h=3, aire=6)
+Carre(x=2, y=3, c=4, a=16)
+Cercle (x=7, y=8, r=6, aire=113.097)
+----- Couche 2
+Couche initialisée
+----- Couche 3
+Couche initialisée
+----- Couche 4
+Couche initialisée
+Etape 13: Afficher l'aire du canevas
+Etape 14: Retirer la première forme de la couche 1
+Etape 15: Afficher le canevas
+----- Couche 0
+Rectangle:(x=5, y=5, l=1, h=1, aire=1)
+Carre(x=5, y=5, c=1, a=1)
+Cercle (x=5, y=5, r=1, aire=3.14159)
+----- Couche 1
+Carre(x=2, y=3, c=4, a=16)
+Cercle (x=7, y=8, r=6, aire=113.097)
+----- Couche 2
+Couche initialisée
+----- Couche 3
+Couche initialisée
+----- Couche 4
+Couche initialisée
+Etape 16: Afficher l'aire du canevas
+	* Aire du canevas: 134.239
+Etape 17: Réinitialiser le canevas
+Etape 18: Afficher le canevas
+----- Couche 0
+Couche initialisée
+----- Couche 1
+Couche initialisée
+----- Couche 2
+Couche initialisée
+----- Couche 3
+Couche initialisée
+----- Couche 4
+Couche initialisée
+Etape 19: Afficher l'aire du canevas
+	* Aire du canevas: 0
diff --git a/cas-dapplication-02.txt b/cas-dapplication-02.txt
new file mode 100644
index 0000000..3bee6df
--- /dev/null
+++ b/cas-dapplication-02.txt
@@ -0,0 +1,95 @@
+TESTS APPLICATION (CAS 02)
+Étape 1: Activer la couche d'index 4
+Étape 2: Ajouter les formes suivantes au canevas:
+	- Un cercle    (x= 1, y= 2, rayon=1/sqrt(pi) )
+	- Un rectangle (x= 3, y= 4, largeur=3, hauteur=4)
+	- Un carré     (x=-1, y=-1, cote=2)
+Étape 3: Afficher le canevas
+----- Couche 0
+----- Couche 1
+Couche initialisée
+----- Couche 2
+Couche initialisée
+----- Couche 3
+Couche initialisée
+----- Couche 4
+Cercle (x=1, y=2, r=0, aire=0)
+Rectangle:(x=3, y=4, l=3, h=4, aire=12)
+Carre(x=-1, y=-1, c=2, a=4)
+Étape 4: Imprimer l'aire du canevas (doit etre egale a 1+12+4 soit 17)
+	* Aire du canevas: 16
+Étape 5: Activer la couche d'index 3
+Étape 6: Ajouter les formes par défaut au canevas. Soit:
+	- Un cercle    (x=0, y=0, rayon=1)
+	- Un rectangle (x=0, y=0, largeur=1, hauteur=1)
+	- Un carre     (x=0, y=0, cote=1)
+Étape 7: Afficher le canevas
+----- Couche 0
+----- Couche 1
+Couche initialisée
+----- Couche 2
+Couche initialisée
+----- Couche 3
+Cercle (x=0, y=0, r=1, aire=3.14159)
+Rectangle:(x=0, y=0, l=1, h=1, aire=1)
+Carre(x=0, y=0, c=1, a=1)
+----- Couche 4
+Cercle (x=1, y=2, r=0, aire=0)
+Rectangle:(x=3, y=4, l=3, h=4, aire=12)
+Carre(x=-1, y=-1, c=2, a=4)
+Étape 8: Translater la couche active de (1,1)
+Étape 9: Afficher le canevas
+----- Couche 0
+----- Couche 1
+Couche initialisée
+----- Couche 2
+Couche initialisée
+----- Couche 3
+Cercle (x=1, y=1, r=1, aire=3.14159)
+Rectangle:(x=1, y=1, l=1, h=1, aire=1)
+Carre(x=1, y=1, c=1, a=1)
+----- Couche 4
+Cercle (x=1, y=2, r=0, aire=0)
+Rectangle:(x=3, y=4, l=3, h=4, aire=12)
+Carre(x=-1, y=-1, c=2, a=4)
+Étape 10: Supprimer la forme d'index 0 (la premiere)
+Étape 11: Activer la couche d'index 4
+Étape 12: Supprimer la forme d'index 2 (la dernière)
+Étape 13: Afficher le canevas
+----- Couche 0
+----- Couche 1
+Couche initialisée
+----- Couche 2
+Couche initialisée
+----- Couche 3
+Rectangle:(x=1, y=1, l=1, h=1, aire=1)
+Carre(x=1, y=1, c=1, a=1)
+----- Couche 4
+Cercle (x=1, y=2, r=0, aire=0)
+Rectangle:(x=3, y=4, l=3, h=4, aire=12)
+Étape 14: Initialiser la couche d'index 4
+Étape 15: Afficher le canevas
+----- Couche 0
+----- Couche 1
+Couche initialisée
+----- Couche 2
+Couche initialisée
+----- Couche 3
+Rectangle:(x=1, y=1, l=1, h=1, aire=1)
+Carre(x=1, y=1, c=1, a=1)
+----- Couche 4
+Couche initialisée
+Étape 16: Imprimer l'aire du canevas
+	* Aire du canevas: 2
+Étape 17: Réinitialiser le canevas
+Étape 18: Afficher le canevas
+----- Couche 0
+Couche initialisée
+----- Couche 1
+Couche initialisée
+----- Couche 2
+Couche initialisée
+----- Couche 3
+Couche initialisée
+----- Couche 4
+Couche initialisée
diff --git a/couche.cpp b/couche.cpp
index b84cc73..3d31ebb 100644
--- a/couche.cpp
+++ b/couche.cpp
@@ -71,7 +71,6 @@ Forme *Couche::supprimerForme(int index) {
 };
 
 bool Couche::reinitialiser() {
-  if (state == STATE_INIT) return false;
   state = STATE_INIT;
   vecteur.vider();
   return true;
diff --git a/graphicus-02.cpp b/graphicus-02.cpp
index f9081d9..800b393 100644
--- a/graphicus-02.cpp
+++ b/graphicus-02.cpp
@@ -13,7 +13,7 @@ int main() {
   Tests tests;
 
   /* tests.tests_unitaires(); */
-  tests.tests_application_cas_01();
+  tests.tests_application();
 
   return 0;
 }
diff --git a/rapport/main.pdf b/rapport/main.pdf
index 325b471..e705be0 100644
Binary files a/rapport/main.pdf and b/rapport/main.pdf differ
diff --git a/rapport/main.tex b/rapport/main.tex
index 638a69d..bdf975e 100644
--- a/rapport/main.tex
+++ b/rapport/main.tex
@@ -175,7 +175,7 @@ même d'autres actions accessibles à l'utilisateur).
   \item Ajouter les formes suivantes au canevas:
     \begin{itemize}
       \item un cercle de centre (1, 2) et de rayon $\frac{1}{\sqrt{\pi}}$
-      \item un rectangle anchré en (3, 4), de largeur
+      \item un rectangle anchré en (3, 4), de dimensions $3\times4$
       \item un carré anchré en (-1, -1), de côté 2
     \end{itemize}
   \item Afficher le canevas
@@ -193,17 +193,17 @@ même d'autres actions accessibles à l'utilisateur).
     \item un carré anchré en (0, 0), de côté 1
   \end{itemize}
   \item Afficher le canevas
-  \item Translater le canevas de (1, 1)
+  \item Translater la couche active de (1, 1)
   \item Afficher le canevas
   \item Supprimer la forme de l'index 0 (la première)
-  \item Activer la couche 4
+  \item Activer la couche d'index 4
   \item Supprimer la forme de l'index 2 (la dernière)
   \item Afficher le canevas
 \end{enumerate}
 \subsubsection{Étapes 14 à 18}
 \begin{enumerate}
   \setcounter{enumi}{13}
-  \item Initialiser la couche 4
+  \item Initialiser la couche d'index 4
   \item Afficher le canevas
   \item Imprimer l'aire du canevas (doit être égale à $1+1$ soit $2$)
   \item Réinitialiser le canevas
diff --git a/tests.cpp b/tests.cpp
index 9a2f359..843454b 100644
--- a/tests.cpp
+++ b/tests.cpp
@@ -8,6 +8,8 @@
 ********/
 
 #include "tests.h"
+#include "math.h"
+
 
 // Tests sur les formes geometriques {{{
 void Tests::tests_unitaires_formes() {
@@ -387,8 +389,82 @@ void Tests::tests_application_cas_01() {
   cout << "\t* Aire du canevas: " << c.aire() << endl;
 }; // }}}
 
+// takes an int pointer and increments it, prints the message: "Step i: msg\n"
+void step(string msg, int *i) {
+    cout << "Étape " << *i << ": " << msg << endl;
+    (*i)++;
+}
+
 // Deuxieme application {{{
 void Tests::tests_application_cas_02() {
   cout << "TESTS APPLICATION (CAS 02)" << endl;
-  // Il faut ajouter les operations realisant ce scenario de test.
+  // Mise en place
+  Canevas c;
+  int etape = 1;
+
+
+  step("Activer la couche d'index 4", &etape);
+  c.activerCouche(4);
+
+  step("Ajouter les formes suivantes au canevas:", &etape);
+  cout << "\t- Un cercle    (x= 1, y= 2, rayon=1/sqrt(pi) )\n"
+       << "\t- Un rectangle (x= 3, y= 4, largeur=3, hauteur=4)\n"
+       << "\t- Un carré     (x=-1, y=-1, cote=2)\n";
+  c.ajouterForme(new Cercle(1, 2, 1/sqrt(M_PI)));
+  c.ajouterForme(new Rectangle(3, 4, 3, 4));
+  c.ajouterForme(new Carre(-1, -1, 2));
+
+  step("Afficher le canevas", &etape);
+  c.afficher(cout);
+
+  step("Imprimer l'aire du canevas (doit etre egale a 1+12+4 soit 17)", &etape);
+  cout << "\t* Aire du canevas: " << c.aire() << endl;
+
+  step("Activer la couche d'index 3", &etape);
+  c.activerCouche(3);
+
+  step("Ajouter les formes par défaut au canevas. Soit:", &etape);
+  cout << "\t- Un cercle    (x=0, y=0, rayon=1)\n"
+       << "\t- Un rectangle (x=0, y=0, largeur=1, hauteur=1)\n"
+       << "\t- Un carre     (x=0, y=0, cote=1)\n";
+  c.ajouterForme(new Cercle());
+  c.ajouterForme(new Rectangle());
+  c.ajouterForme(new Carre());
+
+  step("Afficher le canevas", &etape);
+  c.afficher(cout);
+
+  step("Translater la couche active de (1,1)", &etape);
+  c.translater(1, 1);
+
+  step("Afficher le canevas", &etape);
+  c.afficher(cout);
+
+  step("Supprimer la forme d'index 0 (la premiere)", &etape);
+  c.retirerForme(0);
+
+  step("Activer la couche d'index 4", &etape);
+  c.activerCouche(4);
+
+  step("Supprimer la forme d'index 2 (la dernière)", &etape);
+  c.retirerForme(2);
+
+  step("Afficher le canevas", &etape);
+  c.afficher(cout);
+
+  step("Initialiser la couche d'index 4", &etape);
+  c.reinitialiserCouche(4);
+
+  step("Afficher le canevas", &etape);
+  c.afficher(cout);
+
+  step("Imprimer l'aire du canevas", &etape);
+  cout << "\t* Aire du canevas: " << c.aire() << endl;
+
+  step("Réinitialiser le canevas", &etape);
+  c.reinitialiser();
+
+  step("Afficher le canevas", &etape);
+  c.afficher(cout);
+
 }; // }}}
-- 
cgit v1.2.3

