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