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

First import

parents
No related branches found
No related tags found
No related merge requests found
README.md 0 → 100644
# Documentation depuis les tests
Les tests d'un projet visent 3 objectifs :
* La documentation fonctionnelle du projet
* La non régression
* Faire émerger le code
Il existe différentes façons d'utiliser les tests pour documenter un projet.
* Utiliser des noms de méthode explicite évoquant avec précision les différentes règles métier.
* Construire un DSL de test avec le vocabulaire du métier.
* Utiliser du Gherkin pour décrire les scénarios de tests
* Générer des fichiers structurés de documentation depuis les tests
C'est cette dernière option que nous allons faire aujourd'hui.
## Génération de Markdown
Écrire le test suivant et le faire passer au vert.
```java
@Test
void should_add_integers() {
assertEquals("3", Calculator.add(1, 2));
}
```
Transformer le test pour faire apparaitre l'opération réalisée :
```java
@Test
void should_add_integers() {
assertEquals("1 + 2 = 3", "1 + 2 = " + Calculator.add(1, 2));
}
```
Transformer le test pour produire un fichier markdown
```java
@Test
void should_add_integers() throws IOException {
Path path = Paths.get("target", "calculator.md");
String markdown = "" +
"# Calculator\n" +
"## Add\n";
String operation = "1 + 2 = ";
String expected = operation + "3";
assertEquals(expected, operation + Calculator.add(1, 2));
markdown += expected;
Files.write(path, markdown.getBytes());
}
```
Regarder le fichier `target/calculator.md`
Restructurer le test pour obtenir un code propre.
Ajouter un nouveau test qui vérifie qu'il n'est pas possible d'additionner `1` à `Integer.MAX_VALUE`.
Nous souhaitons que les tests produisent le texte suivant dans le fichier Markdown :
```markdown
# Calculator
## Add 2 integers
It's possible to add 2 integers like :
1 + 3 = 4
17342 + 62356 = 79698
The result must be lower than the integer max value,
if the result of addition is greater than 2147483647,
then the method `Calculator.Add` return "To big"
```
## Une caisse de bar restaurant
L'objectif maintenant est de produire une librairie java et sa documentation pour calculer le bon taux de TVA à appliquer sur un ensemble de lignes de ticket de caisse en fonction du lieu de vente.
Notre calculateur de TVA aura la signature suivante :
```java
public class TvaCalculator {
public TvaCalculator(PointOfSale pointOfSale);
public List<TicketLine> compute(List<CartItem> lines);
}
```
Vous trouverez un ensemble de classes à compléter pour faire fonctionner le projet.
Implémenter en TDD toutes les classes de notre projet accompagné d'une documentation en Markdown de toutes les règles de calcul de TVA applicable dans un bar restaurant français. Chaque règle de calcul de TVA sera accompagné d'au moins un exemple.
Vous trouverez l'ensemble de ces règles sur les sites suivants :
* https://entreprendre.service-public.fr/vosdroits/F23567
* https://bofip.impots.gouv.fr/bofip/7204-PGP.html
## Le cas des menus
Un menu est un lot de marchandises et en france depuis le cas Free, les lots doivent être ventilés en respectant les proratas des prix hors lot.
Ajouter la possibilité de faire des menus et d'afficher les taux de TVA du menu.
Vous pouvez modifier `CartItem` pour qu'il contienne un ensemble de `CartItem`
Ex 1:
Étant donné la commande suivante prise à la carte :
| Produit | Prix TTC | TVA | Ratio sur la facture |
|---------------|----------|-----|----------------------|
| Poulet grillé | 12€ | 10% | 60% |
| Bière du mois | 8€ | 20% | 40% |
Avec les mêmes produits prix dans un menu sur place à 15€ boisson comprise, le plat TTC doit représenter 60% des 15€ et la boisson TTC doit représenter 40% des 15€ donc le ticket de caisse doit indiquer :
```
Menu boisson comprise : 15€ TTC
dont TVA 10% : 0,82€
TVA 20% : 1,00€
```
En effet :
* 15€ × 60% = 9€ TTC donc 8.18€ HT soit 0,82€ de TVA à 10%
* 15€ × 40% = 6€ TTC donc 6.00€ HT soit 1,00€ de TVA à 20%
Ex 2:
Étant donné la commande suivante prise à la carte :
| Produit | Prix TTC | TVA | Ratio sur la facture |
|--------------------|----------|-----|----------------------|
| Carbonade Flamande | 17€ | 10% | 85% |
| Chti cola | 3€ | 10% | 15% |
Avec les mêmes produits prix dans un menu sur place à 15€ boisson comprise, le plat TTC doit représenter 60% des 15€ et la boisson TTC doit représenter 40% des 15€ donc le ticket de caisse doit indiquer :
```
Menu boisson comprise : 15€ TTC
dont TVA 10% : 1,36€
```
En effet :
* 15€ × 85% = 14.45€ TTC donc 12.75€ HT soit 1.16€ de TVA à 10%
* 15€ × 15% = 2.25€ TTC donc 2.05€ HT soit 0.20€ de TVA à 10%
## Le cas des notes de frais
Au moment de payer l'addition, certains payent exactement ce qu'ils ont pris, les autres divisent l'addition en parts égales, la TVA aussi. Ajouter l'édition de notes de frais à votre API.
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>
<properties>
<junit.version>5.7.0</junit.version>
</properties>
<groupId>fr.univlille.iut.info.r402</groupId>
<artifactId>documentation</artifactId>
<version>1.0</version>
<build>
<plugins>
<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.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.4</version>
<executions>
<execution>
<id>prepare-agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<!-- junit 5 -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
package fr.univlille.iut.info.r402.frenchvat;
public final class CartItem {
CartItem(String libel, Float priceIncVat, boolean isFrozen, boolean isMaintainable, boolean isPackagedToBeMaintainable, boolean containsOpenSeafood, int quantity) {
}
}
package fr.univlille.iut.info.r402.frenchvat;
public enum Department {
Nord, CorseDuNord, CorseDuSud, Guadeloupe, Martinique, Réunion, Guyane, Mayotte;
}
package fr.univlille.iut.info.r402.frenchvat;
public final class PointOfSale {
PointOfSale(String name, boolean withServicesToEatOnSite, Department department) {
}
}
package fr.univlille.iut.info.r402.frenchvat;
import java.util.Map;
public class TicketLine {
TicketLine(String libel, Float priceIncVat, int quantity, Map<VAT, Float> vats) {
}
}
package fr.univlille.iut.info.r402.frenchvat;
public enum VAT {
Normal(20), Intermediate(10), Reduced(5.5), Particular(2.1);
private double rate;
VAT(double rate) {
this.rate = rate;
}
public double getRate() {
return rate;
}
}
package fr.univlille.iut.info.r402.frenchvat;
import java.util.List;
public class VatCalculator {
public VatCalculator(PointOfSale pointOfSale) {
}
public List<TicketLine> compute( List<CartItem> products) {
return null;
}
}
package fr.univlille.iut.info.r402.frenchvat;
public class VatCalculatorTest {
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment