From 296240b52cc91632027faddeb76fe533d8a1d9ed Mon Sep 17 00:00:00 2001 From: Carsten Otto Date: Tue, 3 May 2022 18:35:16 +0200 Subject: [PATCH] reuse Coins.NONE object instance --- .../java/de/cotto/lndmanagej/model/Coins.java | 16 +++++++- .../de/cotto/lndmanagej/model/CoinsTest.java | 39 +++++++++++++++++++ 2 files changed, 53 insertions(+), 2 deletions(-) diff --git a/model/src/main/java/de/cotto/lndmanagej/model/Coins.java b/model/src/main/java/de/cotto/lndmanagej/model/Coins.java index fae32442..d0a821a9 100644 --- a/model/src/main/java/de/cotto/lndmanagej/model/Coins.java +++ b/model/src/main/java/de/cotto/lndmanagej/model/Coins.java @@ -6,13 +6,16 @@ import java.util.Locale; public record Coins(long milliSatoshis) implements Comparable { private static final int SCALE = 3; - public static final Coins NONE = Coins.ofSatoshis(0); + public static final Coins NONE = new Coins(0); public static Coins ofSatoshis(long satoshis) { - return new Coins(satoshis * 1_000); + return ofMilliSatoshis(satoshis * 1_000); } public static Coins ofMilliSatoshis(long milliSatoshis) { + if (milliSatoshis == 0) { + return NONE; + } return new Coins(milliSatoshis); } @@ -24,10 +27,19 @@ public record Coins(long milliSatoshis) implements Comparable { } public Coins add(Coins summand) { + if (summand.milliSatoshis == 0) { + return this; + } + if (this.milliSatoshis == 0) { + return summand; + } return Coins.ofMilliSatoshis(milliSatoshis + summand.milliSatoshis); } public Coins subtract(Coins subtrahend) { + if (subtrahend.milliSatoshis == 0) { + return this; + } return Coins.ofMilliSatoshis(milliSatoshis - subtrahend.milliSatoshis); } diff --git a/model/src/test/java/de/cotto/lndmanagej/model/CoinsTest.java b/model/src/test/java/de/cotto/lndmanagej/model/CoinsTest.java index 90aa77ca..bdd567e4 100644 --- a/model/src/test/java/de/cotto/lndmanagej/model/CoinsTest.java +++ b/model/src/test/java/de/cotto/lndmanagej/model/CoinsTest.java @@ -8,6 +8,7 @@ import java.util.Locale; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; +@SuppressWarnings("PMD.GodClass") class CoinsTest { private static final Coins ONE_COIN = Coins.ofSatoshis(100_000_000); @@ -22,6 +23,44 @@ class CoinsTest { assertThat(Coins.ofMilliSatoshis(400).add(Coins.ofMilliSatoshis(600))).isEqualTo(Coins.ofSatoshis(1)); } + @Test + void zero_sum_is_none_object() { + assertThat(Coins.ofMilliSatoshis(400).add(Coins.ofMilliSatoshis(-400))).isSameAs(Coins.NONE); + } + + @Test + void difference_resulting_in_zero_is_none_object() { + assertThat(Coins.ofMilliSatoshis(400).subtract(Coins.ofMilliSatoshis(400))).isSameAs(Coins.NONE); + } + + @Test + void zero_milli_satoshis_is_non_object() { + assertThat(Coins.ofMilliSatoshis(0)).isSameAs(Coins.NONE); + } + + @Test + void zero_satoshis_is_non_object() { + assertThat(Coins.ofSatoshis(0)).isSameAs(Coins.NONE); + } + + @Test + void add_zero_gives_same_instance() { + Coins original = Coins.ofSatoshis(1); + assertThat(original.add(Coins.NONE)).isSameAs(original); + } + + @Test + void adding_to_zero_gives_same_instance() { + Coins original = Coins.ofSatoshis(1); + assertThat(Coins.NONE.add(original)).isSameAs(original); + } + + @Test + void subtract_zero_gives_same_instance() { + Coins original = Coins.ofSatoshis(1); + assertThat(original.subtract(Coins.NONE)).isSameAs(original); + } + @Test void subtract() { assertThat(Coins.ofSatoshis(456).subtract(Coins.ofSatoshis(123))).isEqualTo(Coins.ofSatoshis(456 - 123));