From c68c8920f2a7961188a0e13cc2dd21820575bdf7 Mon Sep 17 00:00:00 2001
From: Maxime Dezette <mdezette@ippon.fr>
Date: Tue, 13 Oct 2020 16:43:44 +0200
Subject: [PATCH] Mustache replacer implementation

---
 .gitlab-ci.yml                                |  1 +
 README.md                                     |  1 +
 mustache-replacer/.gitlab-ci.yml              | 11 ++++++
 mustache-replacer/README.md                   |  9 +++++
 mustache-replacer/pom.xml                     | 29 +++++++++++++++
 .../src/main/java/ArgumentReplacer.java       | 27 ++++++++++++++
 .../src/test/java/ArgumentReplacerTest.java   | 35 +++++++++++++++++++
 7 files changed, 113 insertions(+)
 create mode 100644 mustache-replacer/.gitlab-ci.yml
 create mode 100644 mustache-replacer/README.md
 create mode 100644 mustache-replacer/pom.xml
 create mode 100644 mustache-replacer/src/main/java/ArgumentReplacer.java
 create mode 100644 mustache-replacer/src/test/java/ArgumentReplacerTest.java

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 2f145983..5f888029 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -10,3 +10,4 @@ include:
   - local: "/ugly-trivia/.gitlab-ci.yml"
   - local: "/borestop/.gitlab-ci.yml"
   - local: "/java-pagination-seven/.gitlab-ci.yml"
+  - local: "/mustache-replacer/.gitlab-ci.yml"
diff --git a/README.md b/README.md
index 587bf0c0..be83cf08 100644
--- a/README.md
+++ b/README.md
@@ -26,3 +26,4 @@ Ce dépôt Git a pour but de partager les différents ateliers pouvant être ré
 8. [Borestop](/borestop)
 9. [Java pagination Seven](/java-pagination-seven)
 10. [PadBowl](https://gitlab.com/cdamon/padbowl)
+11. [Mustache Replacer](/mustache-replacer)
diff --git a/mustache-replacer/.gitlab-ci.yml b/mustache-replacer/.gitlab-ci.yml
new file mode 100644
index 00000000..901a849a
--- /dev/null
+++ b/mustache-replacer/.gitlab-ci.yml
@@ -0,0 +1,11 @@
+package-mustache-replacer:
+  variables:
+    PROJECT_FOLDER: "mustache-replacer"
+  extends: .java
+  only:
+    refs:
+      - master
+      - merge_requests
+    changes:
+      - ".gitlab-common-ci.yml"
+      - "mustache-replacer/**/*"
diff --git a/mustache-replacer/README.md b/mustache-replacer/README.md
new file mode 100644
index 00000000..68116cf7
--- /dev/null
+++ b/mustache-replacer/README.md
@@ -0,0 +1,9 @@
+# Mustache Replacer
+
+Résolution en TDD et avec explications d'un exercice de remplacement d'arguments dans une phrase.
+
+-   **Auteurs** : Colin DAMON et Maxime DEZETTE
+-   **Date** : 13/10/2020
+-   **Langage** : Java
+-   **Niveau** : Débutant
+-   **Replay** : [](#)
diff --git a/mustache-replacer/pom.xml b/mustache-replacer/pom.xml
new file mode 100644
index 00000000..ef88c1e2
--- /dev/null
+++ b/mustache-replacer/pom.xml
@@ -0,0 +1,29 @@
+<?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>string-calculator</artifactId>
+
+    <name>MustacheReplacer</name>
+
+    <developers>
+        <developer>
+            <email>cdamon@ippon.fr</email>
+            <name>Colin DAMON</name>
+        </developer>
+        <developer>
+            <email>mdezette@ippon.fr</email>
+            <name>Maxime DEZETTE</name>
+        </developer>
+    </developers>
+</project>
diff --git a/mustache-replacer/src/main/java/ArgumentReplacer.java b/mustache-replacer/src/main/java/ArgumentReplacer.java
new file mode 100644
index 00000000..68361634
--- /dev/null
+++ b/mustache-replacer/src/main/java/ArgumentReplacer.java
@@ -0,0 +1,27 @@
+import java.util.Map;
+import java.util.function.BinaryOperator;
+
+public class ArgumentReplacer {
+
+    public static final String BEGINING_MUSTACH = "\\{\\{\\s*";
+    public static final String ENDING_MUSTACH = "\\s*\\}\\}";
+
+    public static String replace(String template, Map<String, String> arguments) {
+        if (needNoReplace(template, arguments)) {
+            return template;
+        }
+
+       return arguments.entrySet().stream().reduce(template, ArgumentReplacer::replaceEntry, nothing());
+    }
+
+    private static boolean needNoReplace(String template, Map<String, String> arguments) {
+        return template == null || arguments == null;
+    }
+    private static String replaceEntry(String result, Map.Entry<String, String> entry) {
+        return result.replaceAll(BEGINING_MUSTACH + entry.getKey() + ENDING_MUSTACH, entry.getValue());
+    }
+
+    private static BinaryOperator<String> nothing() {
+        return (k, v) -> v;
+    }
+}
diff --git a/mustache-replacer/src/test/java/ArgumentReplacerTest.java b/mustache-replacer/src/test/java/ArgumentReplacerTest.java
new file mode 100644
index 00000000..3b89e1d5
--- /dev/null
+++ b/mustache-replacer/src/test/java/ArgumentReplacerTest.java
@@ -0,0 +1,35 @@
+import org.assertj.core.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import java.util.Map;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+class SampleTest {
+
+    @Test
+    void shouldGetInputStringWithoutArgumentToReplace() {
+
+        assertThat(ArgumentReplacer.replace("Bonjour Homer", null)).isEqualTo("Bonjour Homer");
+    }
+
+    @Test
+    void shouldGetInputStringWithArgumentReplaced() {
+
+        assertThat(ArgumentReplacer.replace("Bonjour {{firstname}}", Map.of("firstname", "Homer"))).isEqualTo("Bonjour Homer");
+    }
+
+    @Test
+    void shouldGetNullResultWithoutTemplate(){
+
+        assertThat(ArgumentReplacer.replace(null, Map.of("firstname", "Homer"))).isNull();
+    }
+
+    @Test
+    void shouldGetInputStringReplacedWithSpace(){
+
+        assertThat(ArgumentReplacer.replace("Bonjour {{firstname}} {{ lastname  }}", Map.of("firstname","Homer", "lastname", "Simpson"))).isEqualTo("Bonjour Homer Simpson");
+    }
+
+
+}
-- 
GitLab