Skip to content
Snippets Groups Projects
Commit bb32a5c6 authored by Thomas Clavier's avatar Thomas Clavier
Browse files

Sujet OK

parent 02e9b3a5
No related branches found
No related tags found
No related merge requests found
# conf
# Pizzeria
Nous allons faire un jeu de simulation de pizzeria.
L'architecture que nous souhaitons avoir est la suivante :
![](./img/mmvc-pizzeria.svg)
Nous allons bien évidement tout écrire en TDD.
# Codons
Ajouter la dépendance javafx dans le pom
```xml
<plugins>
......@@ -22,27 +33,190 @@
</dependencies>
```
```mermaid
flowchart
Pizza --- Pizzaiolo
Pizzaiolo --- PizzasOven
Ajouter la dépendance JUnit dans le pom
subgraph Domain
Pizza
Pizzaiolo
PizzasOven
end
```xml
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.junit</groupId>
<artifactId>junit-bom</artifactId>
<version>5.9.2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
```
subgraph Model
Pizza
PizzasOven
end
et
subgraph Controleur
Pizzaiolo
end
```xml
<dependencies>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-suite</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
```
# Un affichage de bout en bout
Le premier test va nous permettre plusieurs choses :
subgraph Vue
ViewModel
end
* pour le domain : Un `Pizzaiolo` est capable de `fabriquer` des `Pizza` et de les `mettre à cuire` dans un `Four à Pizzas`
* pour le modèle de vue javafx : il existe une propriété perméttant de voir le nombre de pizzas dans le four
* fait émerger un pattern Observer / Observable avec un sujet `StringSubject` et `ViewModel` l'interface observatrice
* Petite particularité sur laquelle ce test n'est pas explicite : `public javafx.beans.property.StringProperty getPropertyNumberOfPizzasInOven() {` ce qui implique `private StringProperty numberOfPizzasInOven = new SimpleStringProperty();`
```java
public class PizzeriaViewModelTest {
@Test
void should_display_the_number_of_pizzas_in_the_oven_i_e_PizzaioloViewModel_can_observe_PizzasOven_andPizzaOven_is_observable() {
Pizzaiolo pizzaiolo = new Pizzaiolo();
Pizza margherita = pizzaiolo.makePizza(PizzaRecette.Margherita);
StringSubject pizzasOven = new PizzasOven();
((PizzasOven) pizzasOven).bake(margherita);
ViewModel pizzaioloViewModel = new PizzeriaViewModel(pizzaiolo, (PizzasOven) pizzasOven);
assertEquals("1", ((PizzeriaViewModel) pizzaioloViewModel).getPropertyNumberOfPizzasInOven().getValue());
}
}
```
Faire passer ce test au rouge i.e. créer toutes les classes et les interfaces pour que ça compile.
Désactiver ce premier test beaucoup trop gros pour être implémenté rapidement et ajouter ce test en double boucle qui ne concerne que le domaine
```java
public class PizzaioloTest {
@Test
void pizzaiolo_should_make_pizza_and_add_it_in_the_oven() {
Pizzaiolo pizzaiolo = new Pizzaiolo();
PizzasOven pizzasOven = new PizzasOven();
Pizza margherita = pizzaiolo.makePizza(PizzaRecette.Margherita);
pizzaiolo.cookIn(margherita, pizzasOven);
assertEquals(1, pizzasOven.getNumberOfPizzas());
}
}
```
Faire passer ce test au vert (il faudrat probablement créer une méthode `public void bake(Pizza margherita) {` sur la classe `PizzasOven`
Réactiver le premier test et faire passer tous les tests au vert. Il faudra pour ça attacher la vue `PizzeriaViewModel` au model `PizzasOven` dès sa construction et implémenter la partie testé du pattern observer / observable
N'oubliez pas la phase de restructuration.
Il est temps de créer notre premier écrant, ajouter la classe suivante :
```java
public class PizzeriaView {
private PizzeriaViewModel viewModel;
public PizzeriaView(PizzeriaViewModel viewModel) {
this.viewModel = viewModel;
}
public void start() {
Stage stage = new Stage();
TextField label = new TextField();
label.setPrefWidth(300);
label.textProperty().bindBidirectional(viewModel.getPropertyNumberOfPizzasInOven());
Scene scene = new Scene(new HBox(label));
stage.setScene(scene);
stage.show();
}
}
```
Ainsi que la classe `Main`
```java
public class Main extends Application {
@Override
public void start(Stage stage) {
// création du four et du cuisinier : Les modèles
PizzasOven pizzasOven = new PizzasOven();
Pizzaiolo pizzaiolo = new Pizzaiolo();
// création du model de vue
PizzeriaViewModel pizzeriaViewModel = new PizzeriaViewModel(pizzaiolo, pizzasOven);
// création de la vue javafx
PizzeriaView pizzeriaView = new PizzeriaView(pizzeriaViewModel);
// lancement de l'écran
pizzeriaView.start();
}
}
```
Pour lancer l'application rendez-vous dans un terminal `mvn javafx:run`
Ajouter le test suivant :
```java
@Test
void should_update_the_number_of_pizzas_in_the_oven() {
Pizzaiolo pizzaiolo = new Pizzaiolo();
Pizza margherita = pizzaiolo.makePizza(PizzaRecette.Margherita);
PizzasOven pizzasOven = new PizzasOven();
pizzaiolo.cookIn(margherita, pizzasOven);
PizzeriaViewModel pizzeriaViewModel = new PizzeriaViewModel(pizzaiolo, pizzasOven);
Pizza reine = pizzaiolo.makePizza(PizzaRecette.Reine);
pizzaiolo.cookIn(reine, pizzasOven);
assertEquals("2", pizzeriaViewModel.getPropertyNumberOfPizzasInOven().getValue());
}
```
Faire passer ce test au vert
N'oubliez pas la phase de restructuration, les tests ont permit de faire émerger le code, mais il est important de les rendre simple et lisible.
Ajouter le test suivant :
```java
@Test
void should_add_pizza_in_oven_from_UI() {
PizzasOven pizzasOven = new PizzasOven();
Pizzaiolo pizzaiolo = new Pizzaiolo();
PizzeriaViewModel pizzeriaViewModel = new PizzeriaViewModel(pizzaiolo, pizzasOven);
pizzeriaViewModel.cookNewReine();
assertEquals(1, pizzasOven.getNumberOfPizzas());
}
```
Le faire passer au vert, restructurer puis modifier la vue javafx pour avoir un bouton "Faire une pizza Reine" branché sur la méthode `pizzeriaViewModel.cookNewReine()`
Ajouter le test suivant pour ajouter l'attribut `private BooleanProperty enableCookNewReine = new SimpleBooleanProperty();` dans la classe `PizzeriaViewModel`
```java
@Test
void should_disable_plus_button_when_oven_is_full() {
PizzasOven pizzasOven = new PizzasOven();
Pizzaiolo pizzaiolo = new Pizzaiolo();
PizzeriaViewModel pizzeriaViewModel = new PizzeriaViewModel(pizzaiolo, pizzasOven);
pizzeriaViewModel.cookNewReine();
pizzeriaViewModel.cookNewReine();
pizzeriaViewModel.cookNewReine();
assertEquals(true, pizzeriaViewModel.getPropertyEnableCookNewReine().getValue());
}
```
Faire passer le test au vert puis brancher la `BooleanProperty` sur le bouton "Faire une pizza Reine", ça doit donner un truc comme `cookNewReine.disableProperty().bindBidirectional(viewModel.getPropertyEnableCookNewReine());` il faudra sans doute passer par la création d'une méthode `isFull()` sur `PizzasOven`.
Restructurez.
Ajouter de nouvelles fonctionnalités en TDD en respectant le MMVC. Vous pouvez vérifier le taux de couverture technique en utilisant la commande `mvn install site surefire-report:report` avant d'ouvrir la page `x-www-browser target/site/jacoco/index.html` Il n'y a que la classe `PizzeriaView` qui n'est pas testé toutes les autres doivent être à 100%.
Fonctionnalités à ajouter :
* Une pizza est cuite au bout de 30s, ajoutez un compteur de pizza cuite
* Il faut cliquer sur un bouton pour vendre une pizza cuite, affichez le bouton "Vendre une pizza"
* Ajouter le montant de la caisse
* Une pizza cuite depuis plus de 60s est invendable, ajouter un bouton "Mettre à la poubelle"
* maintenant que vous avez des sous, il va falloir acheter les ingrédients, ajouter l'achat des ingrédients de base pour faire vos différentes pizzas, il n'est alors possible de faire une pizza que si les ingrédients sont en stock.
* Ajouter l'achat d'un four plus grand
* Ajouter des prix différents en fonction des pizzas, avec des prix différents pour les ingrédients.
* Ajouter le fait que les ingrédients ne peuvent pas se garder indéfiniment.
* etc.
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="435.85812mm"
height="270.06326mm"
viewBox="0 0 435.85812 270.06326"
version="1.1"
id="svg5"
xml:space="preserve"
inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
sodipodi:docname="mmvc-pizzeria.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview7"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="mm"
showgrid="false"
inkscape:zoom="0.57565001"
inkscape:cx="959.78457"
inkscape:cy="427.34299"
inkscape:window-width="1920"
inkscape:window-height="1011"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="layer1" /><defs
id="defs2" /><g
inkscape:label="Calque 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(13.321701,-26.936734)"><text
xml:space="preserve"
style="font-size:8.46667px;line-height:1.25;font-family:Poppins;-inkscape-font-specification:'Poppins, Normal';letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
x="93.31179"
y="65.980537"
id="text401"><tspan
sodipodi:role="line"
id="tspan399"
style="stroke-width:0.264583"
x="93.31179"
y="65.980537">Domain</tspan></text><text
xml:space="preserve"
style="font-size:8.46667px;line-height:1.25;font-family:Poppins;-inkscape-font-specification:'Poppins, Normal';letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
x="309.24695"
y="86.927025"
id="text401-3"><tspan
sodipodi:role="line"
id="tspan399-1"
style="stroke-width:0.264583"
x="309.24695"
y="86.927025">View JavaFX</tspan></text><text
xml:space="preserve"
style="font-size:8.46667px;line-height:1.25;font-family:Poppins;-inkscape-font-specification:'Poppins, Normal';letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
x="27.296183"
y="137.01274"
id="text405"><tspan
sodipodi:role="line"
id="tspan403"
style="stroke-width:0.264583"
x="27.296183"
y="137.01274">Pizza</tspan></text><text
xml:space="preserve"
style="font-size:8.46667px;line-height:1.25;font-family:Poppins;-inkscape-font-specification:'Poppins, Normal';letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
x="27.06286"
y="150.3197"
id="text459"><tspan
sodipodi:role="line"
id="tspan457"
style="stroke-width:0.264583"
x="27.06286"
y="150.3197">PizzasOven</tspan></text><text
xml:space="preserve"
style="font-size:8.46667px;line-height:1.25;font-family:Poppins;-inkscape-font-specification:'Poppins, Normal';letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
x="84.394455"
y="261.30859"
id="text463"><tspan
sodipodi:role="line"
id="tspan461"
style="stroke-width:0.264583"
x="84.394455"
y="261.30859">Pizzaiolo</tspan></text><text
xml:space="preserve"
style="font-size:8.46667px;line-height:1.25;font-family:Poppins;-inkscape-font-specification:'Poppins, Normal';letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
x="167.70819"
y="164.72791"
id="text467"><tspan
sodipodi:role="line"
id="tspan465"
style="stroke-width:0.264583"
x="167.70819"
y="164.72791">ViewModel</tspan></text><rect
style="fill:none;stroke:#3c845c;stroke-width:1.5;stroke-linecap:round"
id="rect469"
width="79.484276"
height="64.494659"
x="17.54697"
y="101.58195" /><text
xml:space="preserve"
style="font-size:8.46667px;line-height:1.25;font-family:Poppins;-inkscape-font-specification:'Poppins, Normal';letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
x="46.86982"
y="115.27436"
id="text525"><tspan
sodipodi:role="line"
id="tspan523"
style="stroke-width:0.264583"
x="46.86982"
y="115.27436">Model</tspan></text><text
xml:space="preserve"
style="font-size:8.46667px;line-height:1.25;font-family:Poppins;-inkscape-font-specification:'Poppins, Normal';letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
x="179.43909"
y="138.5708"
id="text529"><tspan
sodipodi:role="line"
id="tspan527"
style="stroke-width:0.264583"
x="179.43909"
y="138.5708">View</tspan></text><text
xml:space="preserve"
style="font-size:8.46667px;line-height:1.25;font-family:Poppins;-inkscape-font-specification:'Poppins, Normal';letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
x="83.765656"
y="234.86102"
id="text533"><tspan
sodipodi:role="line"
id="tspan531"
style="stroke-width:0.264583"
x="83.765656"
y="234.86102">Controler</tspan></text><rect
style="fill:none;stroke:#c35151;stroke-width:1.5;stroke-linecap:round"
id="rect535"
width="64.975128"
height="51.8629"
x="68.964554"
y="220.56473" /><rect
style="fill:none;stroke:#01526d;stroke-width:1.5;stroke-linecap:round"
id="rect537"
width="80.811195"
height="51.361427"
x="149.07074"
y="126.35768" /><path
d="m 74.824712,212.10623 c -0.365785,0.20425 -0.794162,0.24587 -1.196558,0.13184 l -8.584234,-2.43263 c -0.402387,-0.11402 -0.745249,-0.37421 -0.949474,-0.74002 -0.42052,-0.75312 -0.144956,-1.72555 0.608158,-2.14607 l 2.754223,-1.5379 -12.303208,-22.03375 -2.754223,1.53791 c -0.753115,0.42052 -1.725547,0.14494 -2.146064,-0.60816 -0.204252,-0.3658 -0.245867,-0.79418 -0.131839,-1.19657 l 2.432631,-8.58424 c 0.114036,-0.40239 0.374204,-0.74525 0.740021,-0.94947 0.365792,-0.20426 0.794169,-0.24587 1.196564,-0.13185 l 8.584234,2.43263 c 0.40239,0.11404 0.745249,0.37421 0.949483,0.74003 0.420517,0.7531 0.144955,1.72555 -0.608159,2.14607 l -2.754217,1.53789 12.303209,22.03375 2.754223,-1.53791 c 0.7531,-0.42052 1.725538,-0.14495 2.146058,0.60817 0.204249,0.36578 0.245873,0.79417 0.131837,1.19656 l -2.432631,8.58423 c -0.114036,0.40239 -0.374205,0.74525 -0.740028,0.94948 z"
id="path991"
style="fill:none;stroke:#000000;stroke-width:1.5;stroke-dasharray:none" /><path
d="m 173.75719,188.54123 c 0.34512,0.2375 0.57214,0.60315 0.64811,1.01443 l 1.62059,8.77385 c 0.076,0.41128 -0.005,0.83391 -0.243,1.17902 -0.489,0.71056 -1.48291,0.89415 -2.19347,0.40515 l -2.59862,-1.78832 -14.30653,20.78889 2.59861,1.78832 c 0.71057,0.489 0.89414,1.48291 0.40515,2.19347 -0.23751,0.34513 -0.60316,0.57215 -1.01444,0.64812 l -8.77385,1.62059 c -0.41128,0.076 -0.83391,-0.005 -1.17902,-0.243 -0.34513,-0.23751 -0.57216,-0.60316 -0.64813,-1.01444 l -1.62059,-8.77385 c -0.076,-0.41128 0.005,-0.8339 0.24301,-1.17903 0.48899,-0.71055 1.48291,-0.89415 2.19347,-0.40515 l 2.59861,1.78832 14.30653,-20.78889 -2.59862,-1.78832 c -0.71055,-0.48899 -0.89414,-1.4829 -0.40514,-2.19346 0.23751,-0.34512 0.60316,-0.57216 1.01444,-0.64812 l 8.77385,-1.62059 c 0.41128,-0.076 0.8339,0.005 1.17903,0.24301 z"
id="path991-2"
style="fill:none;stroke:#000000;stroke-width:1.5;stroke-dasharray:none" /><path
d="m 111.45756,131.77659 23.79838,8.8066 1.16723,-2.93061 c 0.31917,-0.80134 1.24756,-1.20087 2.04892,-0.88169 0.38922,0.15502 0.69171,0.46119 0.85706,0.84536 l 3.52675,8.19565 c 0.1653,0.38418 0.17968,0.81433 0.0246,1.20354 -0.15502,0.38923 -0.46121,0.69169 -0.84535,0.85706 l -8.19565,3.52675 c -0.38418,0.16531 -0.81434,0.17968 -1.20356,0.0246 -0.80133,-0.31915 -1.20087,-1.24756 -0.88169,-2.04891 l 1.16722,-2.93061 -23.59712,-8.754 z"
id="path991-1"
style="fill:none;stroke:#000000;stroke-width:1.5;stroke-dasharray:none"
sodipodi:nodetypes="ccssccccccscccc" /><ellipse
style="fill:none;stroke:#c39e64;stroke-width:1.5;stroke-linecap:round;stroke-dasharray:none"
id="path1863"
ry="126.24812"
rx="128.03526"
cy="170.00188"
cx="115.46356" /><ellipse
style="fill:none;stroke:#01526d;stroke-width:1.5;stroke-linecap:round;stroke-dasharray:none"
id="path1917"
cx="345.91324"
cy="121.61957"
rx="75.873192"
ry="51.719978" /><path
d="m 271.93196,155.00966 -24.18792,7.67228 0.8795,3.02942 c 0.24048,0.82836 -0.24658,1.71397 -1.07497,1.95446 -0.40234,0.11681 -0.82911,0.0611 -1.1956,-0.14046 l -7.8178,-4.29984 c -0.36645,-0.20157 -0.64206,-0.53213 -0.75882,-0.9345 -0.11682,-0.40235 -0.061,-0.82911 0.14045,-1.1956 l 4.29984,-7.8178 c 0.20157,-0.36646 0.53214,-0.64207 0.93452,-0.75883 0.82834,-0.2405 1.71397,0.24658 1.95445,1.07495 l 0.8795,3.02942 23.9968,-7.59014 z"
id="path991-1-7"
style="fill:#3c845c;stroke:#000000;stroke-width:1.5;stroke-dasharray:none"
sodipodi:nodetypes="ccssccccccscccc" /><path
d="m 199.36096,68.4976 c -0.45545,0.773574 -1.21604,1.336857 -2.04744,1.552056 l -23.54561,6.113817 c -0.85415,0.201802 -1.79251,0.07827 -2.56608,-0.37718 -0.77357,-0.45545 -1.33686,-1.216036 -1.55205,-2.047435 l -6.07767,-23.554967 c -0.23795,-0.844795 -0.11443,-1.783155 0.34103,-2.55673 0.45545,-0.773573 1.21604,-1.336851 2.08359,-1.561407 l 2.68833,-0.715135 c 0.85414,-0.201803 1.7925,-0.07828 2.56608,0.377179 0.77357,0.45545 1.33685,1.216036 1.55205,2.047435 l 2.75081,10.627456 9.43054,-16.017507 c 0.9377,-1.592648 3.03427,-2.13532 4.62692,-1.197624 l 2.91227,1.714643 c 1.59266,0.937699 2.13533,3.034266 1.19763,4.626915 l -9.43055,16.017506 10.62746,-2.750804 c 0.8314,-0.215199 1.76976,-0.09167 2.54333,0.36378 0.77357,0.455454 1.33686,1.21604 1.57481,2.060835 l 0.70173,2.711086 c 0.2018,0.854152 0.0783,1.792507 -0.37718,2.566081 z"
id="path3823"
style="stroke-width:0.0264027" /><text
xml:space="preserve"
style="font-size:8.46667px;line-height:1.25;font-family:Poppins;-inkscape-font-specification:'Poppins, Normal';letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
x="176.31534"
y="33.40527"
id="text4199"><tspan
sodipodi:role="line"
id="tspan4197"
style="stroke-width:0.264583"
x="176.31534"
y="33.40527">Pas de javafx ici</tspan></text><text
xml:space="preserve"
style="font-size:8.46667px;line-height:1.25;font-family:Poppins;-inkscape-font-specification:'Poppins, Normal';letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
x="334.73587"
y="123.05457"
id="text4929"><tspan
sodipodi:role="line"
id="tspan4927"
style="stroke-width:0.264583"
x="334.73587"
y="123.05457">PizzeriaViewModel</tspan></text><text
xml:space="preserve"
style="font-size:8.46667px;line-height:1.25;font-family:Poppins;-inkscape-font-specification:'Poppins, Normal';letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
x="286.58432"
y="147.98929"
id="text4933"><tspan
sodipodi:role="line"
id="tspan4931"
style="stroke-width:0.264583"
x="286.58432"
y="147.98929">PizzeriaView</tspan></text></g></svg>
pom.xml 0 → 100644
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>fr.univlille.iut.r402</groupId>
<artifactId>tp4</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<build>
<plugins>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.8</version>
<executions>
<execution>
<id>prepare-agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>report</id>
<phase>prepare-package</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
<execution>
<id>post-unit-test</id>
<phase>test</phase>
<goals>
<goal>report-aggregate</goal>
</goals>
<configuration>
<!-- Sets the output directory for the code coverage report. -->
<outputDirectory>target/jacoco-ut</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>11</source>
<target>11</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M5</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-site-plugin</artifactId>
<version>3.9.1</version>
</plugin>
</plugins>
</build>
<dependencies>
</dependencies>
</project>
package fr.univlille.iut.r402.domain;
public enum PizzaRecette {
Reine, Margherita
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment