From 95bad8548d1cdaf3092bf625c4795b903703ce86 Mon Sep 17 00:00:00 2001
From: Colin DAMON <cdamon@ippon.fr>
Date: Thu, 23 Jul 2020 14:02:30 +0200
Subject: [PATCH] Live implementation

---
 README.md                                     |  4 +
 .../fr/ippon/stringcalculator/Calculator.java | 41 +++++++++
 .../stringcalculator/CalculatorTest.java      | 89 +++++++++++++++++++
 3 files changed, 134 insertions(+)
 create mode 100644 stringCalculator/src/main/java/fr/ippon/stringcalculator/Calculator.java
 create mode 100644 stringCalculator/src/test/java/fr/ippon/stringcalculator/CalculatorTest.java

diff --git a/README.md b/README.md
index c8bbb25a..2fa755e8 100644
--- a/README.md
+++ b/README.md
@@ -23,3 +23,7 @@ Ce dépôt Git a pour but de partager les différents ateliers pouvant être ré
     * Niveau: Débutant
     * Lien: [Roman Numerals avec Julie et Colin](https://www.youtube.com/watch?v=CWJqq_k7hDY)
     * Go To: [RomanNumerals](/romanNumerals)
+* **[Presque String Calculator](https://codingdojo.org/kata/StringCalculator/)**: Par Marina FILLATRE et Colin DAMON le 23/07/2020
+    * Niveau: Moyen
+    * Lien: [Agility && TDD, Marina et Colin](https://www.twitch.tv/videos/688222419)
+    * Go To: [stringCalculator](/stringCalculator)
diff --git a/stringCalculator/src/main/java/fr/ippon/stringcalculator/Calculator.java b/stringCalculator/src/main/java/fr/ippon/stringcalculator/Calculator.java
new file mode 100644
index 00000000..792c5707
--- /dev/null
+++ b/stringCalculator/src/main/java/fr/ippon/stringcalculator/Calculator.java
@@ -0,0 +1,41 @@
+package fr.ippon.stringcalculator;
+
+import java.math.BigDecimal;
+import java.util.function.BinaryOperator;
+
+public class Calculator {
+
+  public static String sum(String first, String second) {
+    return operate(first, second, BigDecimal::add);
+  }
+
+  public static String substract(String first,
+      String second) {
+    return operate(first, second, BigDecimal::subtract);
+  }
+
+  private static String operate(String first,
+      String second, BinaryOperator<BigDecimal> operation) {
+    notNull(first);
+    notNull(second);
+
+    return operation
+        .apply(toBigDecimal(first), toBigDecimal(second))
+        .toPlainString();
+  }
+
+  private static BigDecimal toBigDecimal(String value) {
+    if (value.isBlank()) {
+      return BigDecimal.ZERO;
+    }
+
+    return new BigDecimal(value.replace(",", "."));
+  }
+
+  private static void notNull(String first) {
+    if (first == null) {
+      throw new IllegalArgumentException();
+    }
+  }
+
+}
diff --git a/stringCalculator/src/test/java/fr/ippon/stringcalculator/CalculatorTest.java b/stringCalculator/src/test/java/fr/ippon/stringcalculator/CalculatorTest.java
new file mode 100644
index 00000000..1b4d1668
--- /dev/null
+++ b/stringCalculator/src/test/java/fr/ippon/stringcalculator/CalculatorTest.java
@@ -0,0 +1,89 @@
+package fr.ippon.stringcalculator;
+
+import static org.assertj.core.api.Assertions.*;
+
+import org.junit.jupiter.api.Test;
+
+public class CalculatorTest {
+
+  @Test
+  void shouldNotSumWithNullFirstInput() {
+    assertThatThrownBy(() -> Calculator.sum(null, "3"))
+        .isExactlyInstanceOf(
+            IllegalArgumentException.class);
+  }
+
+  @Test
+  void shouldNotSumWithNullSecondInput() {
+    assertThatThrownBy(() -> Calculator.sum("3", null))
+        .isExactlyInstanceOf(
+            IllegalArgumentException.class);
+  }
+
+  @Test
+  void shouldSumEmptyInputs() {
+    assertThat(Calculator.sum("", "")).isEqualTo("0");
+  }
+
+  @Test
+  void shouldSumIntegerWithEmptyFirstInput() {
+    assertThat(Calculator.sum("", "4")).isEqualTo("4");
+  }
+
+  @Test
+  void shouldSumIntegerWithEmptySecondInput() {
+    assertThat(Calculator.sum("4", "")).isEqualTo("4");
+  }
+
+  @Test
+  void shouldSumIntegers() {
+    assertThat(Calculator.sum("1", "2")).isEqualTo("3");
+  }
+
+  @Test
+  void shouldSumFloats() {
+    assertThat(Calculator.sum("1.01", "2.02"))
+        .isEqualTo("3.03");
+  }
+
+  @Test
+  void shouldSumCommaSeparatedFloats() {
+    assertThat(Calculator.sum("1,01", "2,02"))
+        .isEqualTo("3.03");
+  }
+
+  @Test
+  void shouldSumNegativeCommaSeparatedFloats() {
+    assertThat(Calculator.sum("-1,01", "-2,02"))
+        .isEqualTo("-3.03");
+  }
+
+  @Test
+  void shouldNotSubstractNullInputs() {
+    assertThatThrownBy(
+        () -> Calculator.substract(null, "3"))
+            .isExactlyInstanceOf(
+                IllegalArgumentException.class);
+  }
+
+  @Test
+  void shouldNotSubstractWithNullSecondInputs() {
+    assertThatThrownBy(
+        () -> Calculator.substract("3", null))
+            .isExactlyInstanceOf(
+                IllegalArgumentException.class);
+  }
+
+  @Test
+  void shouldSubstractCommaSeparatedFloats() {
+    assertThat(Calculator.substract("1,01", "2,02"))
+        .isEqualTo("-1.01");
+  }
+
+  @Test
+  void shouldSumTooBigIntegers() {
+    assertThat(Calculator
+        .sum(String.valueOf(Integer.MAX_VALUE), "2,02"))
+            .isEqualTo("2147483649.02");
+  }
+}
-- 
GitLab