diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 6be72a4941e93c64fda2dc631ef5860e9eed6ea5..b6b2da7a952982fd20bcbe499f459014595da48c 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -37,3 +37,4 @@ include: - local: "/try-monade/.gitlab-ci.yml" - local: "/java-puzzles/.gitlab-ci.yml" - local: "/java-monades/.gitlab-ci.yml" + - local: "/java-diamond/.gitlab-ci.yml" diff --git a/java-diamond/.gitlab-ci.yml b/java-diamond/.gitlab-ci.yml new file mode 100644 index 0000000000000000000000000000000000000000..166a5eb43858426f24e7f1c18a8c300de6ada37c --- /dev/null +++ b/java-diamond/.gitlab-ci.yml @@ -0,0 +1,11 @@ +package-java-diamond: + variables: + PROJECT_FOLDER: "java-diamond" + extends: .java + only: + refs: + - master + - merge_requests + changes: + - ".gitlab-common-ci.yml" + - "java-diamond/**/*" diff --git a/java-diamond/pom.xml b/java-diamond/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..b6ec9017505c1d7aa890baf577bc10a3b66a7d04 --- /dev/null +++ b/java-diamond/pom.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <parent> + <version>1.0.0</version> + <groupId>fr.ippon.kata</groupId> + <artifactId>java-parent</artifactId> + <relativePath>../java-parent</relativePath> + </parent> + + <version>1.0.0-SNAPSHOT</version> + <artifactId>diamond</artifactId> + + <name>Diamond</name> + + <developers> + <developer> + <name>Sara TABHABIK</name> + </developer> + <developer> + <email>cdamon@ippon.fr</email> + <name>Colin DAMON</name> + </developer> + </developers> +</project> diff --git a/java-diamond/readme.md b/java-diamond/readme.md new file mode 100644 index 0000000000000000000000000000000000000000..4b336fbbc53bcb95a78fad10da90b89dcd694429 --- /dev/null +++ b/java-diamond/readme.md @@ -0,0 +1,9 @@ +# Diamond + +Résolution en Java du kata [Diamond](https://codingdojo.org/kata/Diamond/). + +- **Auteurs** : Sara TABHABIK et Colin DAMON +- **Date** : 20/05/2021 +- **Langage** : Java +- **Niveau** : Moyen +- **Replay** : [Twitch](https://www.twitch.tv/videos/1028994816) diff --git a/java-diamond/src/main/java/fr/craft/kata/Diamond.java b/java-diamond/src/main/java/fr/craft/kata/Diamond.java new file mode 100644 index 0000000000000000000000000000000000000000..2a4efa74cc406e28536ebe49939fcb730e058611 --- /dev/null +++ b/java-diamond/src/main/java/fr/craft/kata/Diamond.java @@ -0,0 +1,32 @@ +package fr.craft.kata; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.function.IntFunction; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +public class Diamond { + + public static List<String> of(char size) { + List<String> diamond = IntStream + .range((int) 'A', ((int) size) + 1) + .mapToObj(toLine(size)) + .collect(Collectors.toList()); + + List<String> secondPart = new ArrayList<>(diamond); + Collections.reverse(secondPart); + secondPart.remove(0); + + diamond.addAll(secondPart); + + return diamond; + } + + private static IntFunction<String> toLine(char size) { + return current -> Line.of((char) current, size) + .representation(); + } + +} diff --git a/java-diamond/src/main/java/fr/craft/kata/Line.java b/java-diamond/src/main/java/fr/craft/kata/Line.java new file mode 100644 index 0000000000000000000000000000000000000000..43924e7c95dec0d4c2422b9f3691ca0588735125 --- /dev/null +++ b/java-diamond/src/main/java/fr/craft/kata/Line.java @@ -0,0 +1,25 @@ +package fr.craft.kata; + +public record Line(String representation) { + + public static Line of(char character, char size) { + String outerSpaces = outerSpaces(character, size); + + if (character == 'A') { + return new Line(outerSpaces + "A" + outerSpaces); + } + + return new Line(outerSpaces + character + + innerSpaces(character) + character + outerSpaces); + } + + private static String outerSpaces(char character, + char size) { + return " ".repeat(size - character); + } + + private static String innerSpaces(char character) { + return " ".repeat(((character - 'A') - 1) * 2 + 1); + } + +} diff --git a/java-diamond/src/test/java/fr/craft/kata/DiamondTest.java b/java-diamond/src/test/java/fr/craft/kata/DiamondTest.java new file mode 100644 index 0000000000000000000000000000000000000000..111369ed1c01835b96f1f38ad2c655c00040dc34 --- /dev/null +++ b/java-diamond/src/test/java/fr/craft/kata/DiamondTest.java @@ -0,0 +1,43 @@ +package fr.craft.kata; + +import static org.assertj.core.api.Assertions.*; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.List; + +import org.junit.jupiter.api.Test; + +class DiamondTest { + + @Test + void shouldDrawDiamondOfA() { + assertThat(Diamond.of('A')).isEqualTo(diamond('A')); + } + + @Test + void shouldDrawDiamondOfB() { + assertThat(Diamond.of('B')).isEqualTo(diamond('B')); + } + + @Test + void shouldDrawDiamondOfC() { + assertThat(Diamond.of('C')).isEqualTo(diamond('C')); + } + + @Test + void shouldDrawDiamondOfD() { + assertThat(Diamond.of('D')).isEqualTo(diamond('D')); + } + + private List<String> diamond(char file) { + try { + return Files.readAllLines(Paths + .get("src/test/resources/" + String.valueOf(file) + .toLowerCase() + ".txt")); + } catch (IOException e) { + throw new AssertionError(e.getMessage(), e); + } + } +} diff --git a/java-diamond/src/test/java/fr/craft/kata/LineTest.java b/java-diamond/src/test/java/fr/craft/kata/LineTest.java new file mode 100644 index 0000000000000000000000000000000000000000..5ca947fc0fd73d1c0b990269dce2ae67690abdc1 --- /dev/null +++ b/java-diamond/src/test/java/fr/craft/kata/LineTest.java @@ -0,0 +1,39 @@ +package fr.craft.kata; + +import static org.assertj.core.api.Assertions.*; + +import org.junit.jupiter.api.Test; + +class LineTest { + + @Test + void shouldGetLetterALineForSizeA() { + assertThat(Line.of('A', 'A') + .representation()).isEqualTo("A"); + } + + @Test + void shouldGetLetterALineForSizeB() { + assertThat(Line.of('A', 'B') + .representation()).isEqualTo(" A "); + } + + @Test + void shouldGetLetterBLineForSizeB() { + assertThat(Line.of('B', 'B') + .representation()).isEqualTo("B B"); + } + + @Test + void shouldGetLetterBLineForSizeC() { + assertThat(Line.of('B', 'C') + .representation()).isEqualTo(" B B "); + } + + @Test + void shouldGetLetterDLineForSizeD() { + assertThat(Line.of('D', 'D') + .representation()) + .isEqualTo("D" + " ".repeat(5) + "D"); + } +} diff --git a/java-diamond/src/test/resources/a.txt b/java-diamond/src/test/resources/a.txt new file mode 100644 index 0000000000000000000000000000000000000000..8c7e5a667f1b771847fe88c01c3de34413a1b220 --- /dev/null +++ b/java-diamond/src/test/resources/a.txt @@ -0,0 +1 @@ +A \ No newline at end of file diff --git a/java-diamond/src/test/resources/b.txt b/java-diamond/src/test/resources/b.txt new file mode 100644 index 0000000000000000000000000000000000000000..1e22151204794fa7f6b9e77e73679eff3ea157c6 --- /dev/null +++ b/java-diamond/src/test/resources/b.txt @@ -0,0 +1,3 @@ + A +B B + A \ No newline at end of file diff --git a/java-diamond/src/test/resources/c.txt b/java-diamond/src/test/resources/c.txt new file mode 100644 index 0000000000000000000000000000000000000000..53f59c3491d8239567e89b9ad53219d5271c6518 --- /dev/null +++ b/java-diamond/src/test/resources/c.txt @@ -0,0 +1,5 @@ + A + B B +C C + B B + A \ No newline at end of file diff --git a/java-diamond/src/test/resources/d.txt b/java-diamond/src/test/resources/d.txt new file mode 100644 index 0000000000000000000000000000000000000000..df61f1d793d4057ffcfe81f35043b51d6d007fee --- /dev/null +++ b/java-diamond/src/test/resources/d.txt @@ -0,0 +1,7 @@ + A + B B + C C +D D + C C + B B + A \ No newline at end of file diff --git a/readme.md b/readme.md index 83a2aeef0e46acb2bfceeb69424a4a8a62199848..a9bbdf4cf5d0a4c9d083f848c29166c4e655b7aa 100644 --- a/readme.md +++ b/readme.md @@ -43,6 +43,7 @@ Un kata de code est un petit exercice pensé pour s'entrainer jusqu'à maitriser - [Bowling Game](/bowling-game) - [Tennis Refactoring kata](/tennis/refactoring) - [Puzzles](java-puzzles) +- [Diamond](java-diamond) ### Énervé