reuse Coins.NONE object instance

This commit is contained in:
Carsten Otto
2022-05-03 18:35:16 +02:00
parent 3aa67eac7d
commit 296240b52c
2 changed files with 53 additions and 2 deletions

View File

@@ -6,13 +6,16 @@ import java.util.Locale;
public record Coins(long milliSatoshis) implements Comparable<Coins> {
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<Coins> {
}
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);
}

View File

@@ -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));