diff --git a/config/checkstyle/checkstyle-suppressions.xml b/config/checkstyle/checkstyle-suppressions.xml index d189734..3cc6b15 100644 --- a/config/checkstyle/checkstyle-suppressions.xml +++ b/config/checkstyle/checkstyle-suppressions.xml @@ -25,6 +25,8 @@ + + \ No newline at end of file diff --git a/src/main/java/dev/sorn/fmp4j/exceptions/FmpInvalidMinorUnitException.java b/src/main/java/dev/sorn/fmp4j/exceptions/FmpInvalidMinorUnitException.java new file mode 100644 index 0000000..c3fb473 --- /dev/null +++ b/src/main/java/dev/sorn/fmp4j/exceptions/FmpInvalidMinorUnitException.java @@ -0,0 +1,7 @@ +package dev.sorn.fmp4j.exceptions; + +public class FmpInvalidMinorUnitException extends FmpException { + public FmpInvalidMinorUnitException(String message, Object... args) { + super(message, args); + } +} diff --git a/src/main/java/dev/sorn/fmp4j/models/FmpBalanceSheetStatement.java b/src/main/java/dev/sorn/fmp4j/models/FmpBalanceSheetStatement.java index 4539dc9..78d5e8d 100644 --- a/src/main/java/dev/sorn/fmp4j/models/FmpBalanceSheetStatement.java +++ b/src/main/java/dev/sorn/fmp4j/models/FmpBalanceSheetStatement.java @@ -74,5 +74,5 @@ public record FmpBalanceSheetStatement( Long netDebt) implements FmpModel, FmpStatement { @Serial - private static final long serialVersionUID = 5L; + private static final long serialVersionUID = 6L; } diff --git a/src/main/java/dev/sorn/fmp4j/models/FmpBalanceSheetStatementGrowth.java b/src/main/java/dev/sorn/fmp4j/models/FmpBalanceSheetStatementGrowth.java index da292c8..1927144 100644 --- a/src/main/java/dev/sorn/fmp4j/models/FmpBalanceSheetStatementGrowth.java +++ b/src/main/java/dev/sorn/fmp4j/models/FmpBalanceSheetStatementGrowth.java @@ -66,5 +66,5 @@ public record FmpBalanceSheetStatementGrowth( Double growthTreasuryStock) implements FmpModel, FmpStatement { @Serial - private static final long serialVersionUID = 2L; + private static final long serialVersionUID = 3L; } diff --git a/src/main/java/dev/sorn/fmp4j/models/FmpCashFlowStatement.java b/src/main/java/dev/sorn/fmp4j/models/FmpCashFlowStatement.java index f861736..adaf75b 100644 --- a/src/main/java/dev/sorn/fmp4j/models/FmpCashFlowStatement.java +++ b/src/main/java/dev/sorn/fmp4j/models/FmpCashFlowStatement.java @@ -60,5 +60,5 @@ public record FmpCashFlowStatement( Long interestPaid) implements FmpModel, FmpStatement { @Serial - private static final long serialVersionUID = 5L; + private static final long serialVersionUID = 6L; } diff --git a/src/main/java/dev/sorn/fmp4j/models/FmpCashFlowStatementGrowth.java b/src/main/java/dev/sorn/fmp4j/models/FmpCashFlowStatementGrowth.java index 6e5ee9e..0888126 100644 --- a/src/main/java/dev/sorn/fmp4j/models/FmpCashFlowStatementGrowth.java +++ b/src/main/java/dev/sorn/fmp4j/models/FmpCashFlowStatementGrowth.java @@ -52,5 +52,5 @@ public record FmpCashFlowStatementGrowth( Double growthInterestPaid) implements FmpModel, FmpStatement { @Serial - private static final long serialVersionUID = 2L; + private static final long serialVersionUID = 3L; } diff --git a/src/main/java/dev/sorn/fmp4j/models/FmpCompanies.java b/src/main/java/dev/sorn/fmp4j/models/FmpCompanies.java index 3426f1b..91aaaf8 100644 --- a/src/main/java/dev/sorn/fmp4j/models/FmpCompanies.java +++ b/src/main/java/dev/sorn/fmp4j/models/FmpCompanies.java @@ -50,5 +50,5 @@ public record FmpCompanies( Boolean isFund) implements FmpModel { @Serial - private static final long serialVersionUID = 8L; + private static final long serialVersionUID = 9L; } diff --git a/src/main/java/dev/sorn/fmp4j/models/FmpCompany.java b/src/main/java/dev/sorn/fmp4j/models/FmpCompany.java index fc6ab4b..0f318d3 100644 --- a/src/main/java/dev/sorn/fmp4j/models/FmpCompany.java +++ b/src/main/java/dev/sorn/fmp4j/models/FmpCompany.java @@ -49,5 +49,5 @@ public record FmpCompany( Boolean isFund) implements FmpModel { @Serial - private static final long serialVersionUID = 8L; + private static final long serialVersionUID = 9L; } diff --git a/src/main/java/dev/sorn/fmp4j/models/FmpEtfInfo.java b/src/main/java/dev/sorn/fmp4j/models/FmpEtfInfo.java index af52939..01b82c3 100644 --- a/src/main/java/dev/sorn/fmp4j/models/FmpEtfInfo.java +++ b/src/main/java/dev/sorn/fmp4j/models/FmpEtfInfo.java @@ -30,7 +30,7 @@ public record FmpEtfInfo( List sectorsList) implements FmpModel { @Serial - private static final long serialVersionUID = 6L; + private static final long serialVersionUID = 7L; // The first parameter is sector information, however FMP API wrongly returns as "industry" // API sample return in stable/etf/info/%3Fsymbol=SPY.json diff --git a/src/main/java/dev/sorn/fmp4j/models/FmpFinancialGrowth.java b/src/main/java/dev/sorn/fmp4j/models/FmpFinancialGrowth.java index 6b27061..f730d19 100644 --- a/src/main/java/dev/sorn/fmp4j/models/FmpFinancialGrowth.java +++ b/src/main/java/dev/sorn/fmp4j/models/FmpFinancialGrowth.java @@ -54,5 +54,5 @@ public record FmpFinancialGrowth( Double threeYBottomLineNetIncomeGrowthPerShare) implements FmpModel, FmpStatement { @Serial - private static final long serialVersionUID = 4L; + private static final long serialVersionUID = 5L; } diff --git a/src/main/java/dev/sorn/fmp4j/models/FmpIncomeStatement.java b/src/main/java/dev/sorn/fmp4j/models/FmpIncomeStatement.java index cdd751d..6bb8a32 100644 --- a/src/main/java/dev/sorn/fmp4j/models/FmpIncomeStatement.java +++ b/src/main/java/dev/sorn/fmp4j/models/FmpIncomeStatement.java @@ -52,5 +52,5 @@ public record FmpIncomeStatement( Long weightedAverageShsOutDil) implements FmpModel, FmpStatement { @Serial - private static final long serialVersionUID = 5L; + private static final long serialVersionUID = 6L; } diff --git a/src/main/java/dev/sorn/fmp4j/models/FmpIncomeStatementGrowth.java b/src/main/java/dev/sorn/fmp4j/models/FmpIncomeStatementGrowth.java index e174c28..3a9007b 100644 --- a/src/main/java/dev/sorn/fmp4j/models/FmpIncomeStatementGrowth.java +++ b/src/main/java/dev/sorn/fmp4j/models/FmpIncomeStatementGrowth.java @@ -44,5 +44,5 @@ public record FmpIncomeStatementGrowth( Double growthNetIncomeDeductions) implements FmpModel, FmpStatement { @Serial - private static final long serialVersionUID = 2L; + private static final long serialVersionUID = 3L; } diff --git a/src/main/java/dev/sorn/fmp4j/models/FmpKeyMetric.java b/src/main/java/dev/sorn/fmp4j/models/FmpKeyMetric.java index d6dbd30..6230b32 100644 --- a/src/main/java/dev/sorn/fmp4j/models/FmpKeyMetric.java +++ b/src/main/java/dev/sorn/fmp4j/models/FmpKeyMetric.java @@ -57,5 +57,5 @@ public record FmpKeyMetric( Long netCurrentAssetValue) implements FmpModel { @Serial - private static final long serialVersionUID = 4L; + private static final long serialVersionUID = 5L; } diff --git a/src/main/java/dev/sorn/fmp4j/models/FmpRatio.java b/src/main/java/dev/sorn/fmp4j/models/FmpRatio.java index 72418d2..8392c83 100644 --- a/src/main/java/dev/sorn/fmp4j/models/FmpRatio.java +++ b/src/main/java/dev/sorn/fmp4j/models/FmpRatio.java @@ -74,5 +74,5 @@ public record FmpRatio( Double dividendPerShare) implements FmpModel { @Serial - private static final long serialVersionUID = 4L; + private static final long serialVersionUID = 5L; } diff --git a/src/main/java/dev/sorn/fmp4j/models/FmpRevenueGeographicSegmentation.java b/src/main/java/dev/sorn/fmp4j/models/FmpRevenueGeographicSegmentation.java index 3ce765e..7fb8141 100644 --- a/src/main/java/dev/sorn/fmp4j/models/FmpRevenueGeographicSegmentation.java +++ b/src/main/java/dev/sorn/fmp4j/models/FmpRevenueGeographicSegmentation.java @@ -17,5 +17,5 @@ public record FmpRevenueGeographicSegmentation( Map data) implements FmpModel { @Serial - private static final long serialVersionUID = 4L; + private static final long serialVersionUID = 5L; } diff --git a/src/main/java/dev/sorn/fmp4j/models/FmpRevenueProductSegmentation.java b/src/main/java/dev/sorn/fmp4j/models/FmpRevenueProductSegmentation.java index 38a6df1..017911b 100644 --- a/src/main/java/dev/sorn/fmp4j/models/FmpRevenueProductSegmentation.java +++ b/src/main/java/dev/sorn/fmp4j/models/FmpRevenueProductSegmentation.java @@ -17,5 +17,5 @@ public record FmpRevenueProductSegmentation( Map data) implements FmpModel { @Serial - private static final long serialVersionUID = 4L; + private static final long serialVersionUID = 5L; } diff --git a/src/main/java/dev/sorn/fmp4j/models/FmpSearchByCik.java b/src/main/java/dev/sorn/fmp4j/models/FmpSearchByCik.java index 8545b01..cdcec93 100644 --- a/src/main/java/dev/sorn/fmp4j/models/FmpSearchByCik.java +++ b/src/main/java/dev/sorn/fmp4j/models/FmpSearchByCik.java @@ -10,5 +10,5 @@ public record FmpSearchByCik( FmpSymbol symbol, String companyName, FmpCik cik, FmpExchange exchange, FmpCurrency currency) implements FmpModel { @Serial - private static final long serialVersionUID = 4L; + private static final long serialVersionUID = 5L; } diff --git a/src/main/java/dev/sorn/fmp4j/models/FmpSearchByName.java b/src/main/java/dev/sorn/fmp4j/models/FmpSearchByName.java index e49baa7..b5e9ab8 100644 --- a/src/main/java/dev/sorn/fmp4j/models/FmpSearchByName.java +++ b/src/main/java/dev/sorn/fmp4j/models/FmpSearchByName.java @@ -8,5 +8,5 @@ public record FmpSearchByName(FmpSymbol symbol, String name, FmpCurrency currency, FmpExchange exchange) implements FmpModel { @Serial - private static final long serialVersionUID = 4L; + private static final long serialVersionUID = 5L; } diff --git a/src/main/java/dev/sorn/fmp4j/models/FmpSearchBySymbol.java b/src/main/java/dev/sorn/fmp4j/models/FmpSearchBySymbol.java index b7ecde5..95ba3e3 100644 --- a/src/main/java/dev/sorn/fmp4j/models/FmpSearchBySymbol.java +++ b/src/main/java/dev/sorn/fmp4j/models/FmpSearchBySymbol.java @@ -8,5 +8,5 @@ public record FmpSearchBySymbol(FmpSymbol symbol, String name, FmpCurrency currency, FmpExchange exchange) implements FmpModel { @Serial - private static final long serialVersionUID = 3L; + private static final long serialVersionUID = 4L; } diff --git a/src/main/java/dev/sorn/fmp4j/types/FmpCurrency.java b/src/main/java/dev/sorn/fmp4j/types/FmpCurrency.java index dff43f2..3aa9de7 100644 --- a/src/main/java/dev/sorn/fmp4j/types/FmpCurrency.java +++ b/src/main/java/dev/sorn/fmp4j/types/FmpCurrency.java @@ -12,6 +12,7 @@ */ public final class FmpCurrency implements Comparable, FmpValueObject { public static final Pattern FMP_CURRENCY_PATTERN = compile("^[A-Z]{3}$"); + public static final FmpCurrency EUR = currency("EUR"); public static final FmpCurrency USD = currency("USD"); private final String value; @@ -25,7 +26,7 @@ public static FmpCurrency currency(String value) { if (value == null) { throw new FmpInvalidCurrencyException("'value' is required"); } - String normalized = value.toUpperCase(); + final var normalized = value.toUpperCase(); if (!FMP_CURRENCY_PATTERN.matcher(normalized).matches()) { throw new FmpInvalidCurrencyException( "'value' [%s] does not match pattern [%s]", value, FMP_CURRENCY_PATTERN.pattern()); diff --git a/src/main/java/dev/sorn/fmp4j/types/FmpMinorUnit.java b/src/main/java/dev/sorn/fmp4j/types/FmpMinorUnit.java new file mode 100644 index 0000000..a3c4d01 --- /dev/null +++ b/src/main/java/dev/sorn/fmp4j/types/FmpMinorUnit.java @@ -0,0 +1,56 @@ +package dev.sorn.fmp4j.types; + +import static java.lang.String.valueOf; + +import dev.sorn.fmp4j.exceptions.FmpInvalidMinorUnitException; + +public final class FmpMinorUnit implements FmpValueObject { + public static final int MIN_MINOR_UNIT_VALUE = 0; + public static final int MAX_MINOR_UNIT_VALUE = 24; + private final int value; + + private FmpMinorUnit(int value) { + if (value < 0) { + throw new FmpInvalidMinorUnitException( + "[%d] is below the minimum allowed value [%d]", value, MIN_MINOR_UNIT_VALUE); + } + if (value > MAX_MINOR_UNIT_VALUE) { + throw new FmpInvalidMinorUnitException( + "[%d] exceeds the maximum allowed value [%d]", value, MAX_MINOR_UNIT_VALUE); + } + this.value = value; + } + + public static FmpMinorUnit minorUnit(int value) { + return new FmpMinorUnit(value); + } + + @Override + public Integer value() { + return value; + } + + @Override + public String toString() { + return valueOf(value); + } + + @Override + public int hashCode() { + return value; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (!(obj instanceof FmpMinorUnit that)) { + return false; + } + return this.value == that.value; + } +} diff --git a/src/main/java/dev/sorn/fmp4j/types/FmpMoney.java b/src/main/java/dev/sorn/fmp4j/types/FmpMoney.java new file mode 100644 index 0000000..0874746 --- /dev/null +++ b/src/main/java/dev/sorn/fmp4j/types/FmpMoney.java @@ -0,0 +1,129 @@ +package dev.sorn.fmp4j.types; + +import static dev.sorn.fmp4j.utils.FmpNumbers.decimal; +import static java.lang.String.format; +import static java.math.BigDecimal.ZERO; +import static java.util.Objects.hash; + +import java.math.BigDecimal; +import java.util.function.BiFunction; + +public class FmpMoney implements Comparable { + private final FmpCurrency currency; + private final BigDecimal quantity; + + private FmpMoney(FmpCurrency currency, BigDecimal quantity) { + this.currency = currency; + this.quantity = quantity; + } + + public static FmpMoney money(FmpCurrency currency, BigDecimal quantity) { + return new FmpMoney(currency, quantity); + } + + public static FmpMoney zero(FmpCurrency currency) { + return new FmpMoney(currency, decimal(0L)); + } + + public static FmpMoney unit(FmpCurrency currency) { + return new FmpMoney(currency, decimal(1L)); + } + + public static FmpMoney thousand(FmpCurrency currency) { + return new FmpMoney(currency, decimal(1_000L)); + } + + public static FmpMoney million(FmpCurrency currency) { + return new FmpMoney(currency, decimal(1_000_000L)); + } + + public FmpCurrency currency() { + return currency; + } + + public BigDecimal quantity() { + return quantity; + } + + public boolean isPositive() { + return quantity.compareTo(ZERO) > 0; + } + + public boolean isNegative() { + return quantity.compareTo(ZERO) < 0; + } + + public boolean isZero() { + return quantity.compareTo(ZERO) == 0; + } + + public FmpMoney abs() { + return new FmpMoney(currency, quantity.abs()); + } + + public FmpMoney neg() { + return new FmpMoney(currency, quantity.negate()); + } + + public FmpMoney add(FmpMoney that) { + return perform(that, "add", BigDecimal::add); + } + + public FmpMoney sub(FmpMoney that) { + return perform(that, "sub", BigDecimal::subtract); + } + + public FmpMoney mul(FmpMoney that) { + return perform(that, "mul", BigDecimal::multiply); + } + + public FmpMoney div(FmpMoney that) { + return perform(that, "div", BigDecimal::divide); + } + + public int compareTo(FmpMoney money) { + final var that = checkThat(money, "cmp"); + return this.quantity.compareTo(that.quantity); + } + + @Override + public String toString() { + return currency.toString() + " " + quantity; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (!(obj instanceof FmpMoney that)) { + return false; + } + if (!this.currency.equals(that.currency)) { + return false; + } + return this.quantity.compareTo(that.quantity) == 0; + } + + @Override + public int hashCode() { + return hash(currency.hashCode(), quantity); + } + + private FmpMoney perform(FmpMoney that, String opName, BiFunction op) { + final var money = checkThat(that, opName); + return new FmpMoney(currency, op.apply(this.quantity, money.quantity)); + } + + private FmpMoney checkThat(FmpMoney that, String opName) { + if (!this.currency.equals(that.currency)) { + throw new IllegalArgumentException(format( + "Cannot apply operation [%s] for different currencies [%s] and [%s]", + opName, this.currency, that.currency)); + } + return that; + } +} diff --git a/src/main/java/dev/sorn/fmp4j/utils/FmpNumbers.java b/src/main/java/dev/sorn/fmp4j/utils/FmpNumbers.java new file mode 100644 index 0000000..dc254d7 --- /dev/null +++ b/src/main/java/dev/sorn/fmp4j/utils/FmpNumbers.java @@ -0,0 +1,20 @@ +package dev.sorn.fmp4j.utils; + +import static java.math.RoundingMode.HALF_EVEN; + +import java.math.BigDecimal; +import java.math.RoundingMode; + +public class FmpNumbers { + public static BigDecimal decimal(double value) { + return decimal(value, 2, HALF_EVEN); + } + + public static BigDecimal decimal(double value, int scale, RoundingMode mode) { + return BigDecimal.valueOf(value).setScale(scale, mode); + } + + private FmpNumbers() { + // prevent direct instantiation + } +} diff --git a/src/test/java/dev/sorn/fmp4j/types/FmpMinorUnitTest.java b/src/test/java/dev/sorn/fmp4j/types/FmpMinorUnitTest.java new file mode 100644 index 0000000..3515eb4 --- /dev/null +++ b/src/test/java/dev/sorn/fmp4j/types/FmpMinorUnitTest.java @@ -0,0 +1,131 @@ +package dev.sorn.fmp4j.types; + +import static dev.sorn.fmp4j.types.FmpLimit.limit; +import static dev.sorn.fmp4j.types.FmpMinorUnit.MAX_MINOR_UNIT_VALUE; +import static dev.sorn.fmp4j.types.FmpMinorUnit.MIN_MINOR_UNIT_VALUE; +import static dev.sorn.fmp4j.types.FmpMinorUnit.minorUnit; +import static java.lang.String.format; +import static java.lang.String.valueOf; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import dev.sorn.fmp4j.exceptions.FmpInvalidMinorUnitException; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +class FmpMinorUnitTest { + @ParameterizedTest(name = "[{index}]") + @ValueSource(ints = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24}) + void valid_minor_unit(int limit) { + // given // when + var minorUnit = minorUnit(limit); + + // then + assertThat(minorUnit.value()).isEqualTo(limit); + } + + @Test + void below_minimum_minor_unit() { + // given + var minorUnit = -1; + + // when // then + assertThatThrownBy(() -> minorUnit(minorUnit)) + .isInstanceOf(FmpInvalidMinorUnitException.class) + .hasMessage(format("[%d] is below the minimum allowed value [%d]", minorUnit, MIN_MINOR_UNIT_VALUE)); + } + + @Test + void exceeds_maximum_minor_unit() { + // given + var minorUnit = 25; + + // when // then + assertThatThrownBy(() -> minorUnit(minorUnit)) + .isInstanceOf(FmpInvalidMinorUnitException.class) + .hasMessage(format("[%d] exceeds the maximum allowed value [%d]", minorUnit, MAX_MINOR_UNIT_VALUE)); + } + + @ParameterizedTest(name = "[{index}]") + @ValueSource(ints = {2, 3}) + void toString_returns_value(int limit) { + // given // when + var minorUnit = minorUnit(limit); + + // then + assertThat(minorUnit.toString()).isEqualTo(valueOf(limit)); + } + + @Test + void hash_code_value() { + // given + var i = 3; + var minorUnit = minorUnit(i); + + // when + var hc = minorUnit.hashCode(); + + // then + assertThat(hc).isEqualTo(i); + } + + @Test + void equals_same_true() { + // given + var minorUnit = minorUnit(10); + + // when + var eq = minorUnit.equals(minorUnit); + + assertThat(eq).isTrue(); + } + + @Test + void equals_identical_true() { + // given + var minorUnit1 = limit(10); + var minorUnit2 = limit(10); + + // when + var eq = minorUnit1.equals(minorUnit2); + + assertThat(eq).isTrue(); + } + + @Test + void equals_null_false() { + // given + var minorUnit1 = limit(3); + var minorUnit2 = (FmpLimit) null; + + // when + var eq = minorUnit1.equals(minorUnit2); + + assertThat(eq).isFalse(); + } + + @Test + void equals_different_false() { + // given + var minorUnit1 = limit(3); + var minorUnit2 = limit(5); + + // when + var eq = minorUnit1.equals(minorUnit2); + + assertThat(eq).isFalse(); + } + + @Test + void equals_wrong_instance_false() { + // given + var minorUnit1 = limit(1); + var minorUnit2 = 3; + + // when + var eq = minorUnit1.equals(minorUnit2); + + assertThat(eq).isFalse(); + } +} diff --git a/src/test/java/dev/sorn/fmp4j/types/FmpMoneyTest.java b/src/test/java/dev/sorn/fmp4j/types/FmpMoneyTest.java new file mode 100644 index 0000000..e7968a4 --- /dev/null +++ b/src/test/java/dev/sorn/fmp4j/types/FmpMoneyTest.java @@ -0,0 +1,646 @@ +package dev.sorn.fmp4j.types; + +import static dev.sorn.fmp4j.types.FmpCurrency.EUR; +import static dev.sorn.fmp4j.types.FmpCurrency.USD; +import static dev.sorn.fmp4j.types.FmpMoney.million; +import static dev.sorn.fmp4j.types.FmpMoney.money; +import static dev.sorn.fmp4j.types.FmpMoney.thousand; +import static dev.sorn.fmp4j.types.FmpMoney.unit; +import static dev.sorn.fmp4j.types.FmpMoney.zero; +import static dev.sorn.fmp4j.utils.FmpNumbers.decimal; +import static java.util.Objects.hash; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.mockito.Mockito.mock; + +import java.util.function.BiFunction; +import org.junit.jupiter.api.Test; + +class FmpMoneyTest { + @Test + void creates_money() { + // given + var currency = USD; + var quantity = decimal(1000); + + // when + var money = money(currency, quantity); + + // then + assertThat(money.currency()).isEqualTo(currency); + assertThat(money.quantity()).isEqualTo(decimal(1000L)); + } + + @Test + void zero_quantity_from_currency() { + // given + var currency = USD; + + // when + var money = zero(currency); + + // then + assertThat(money.currency()).isEqualTo(USD); + assertThat(money.quantity()).isEqualTo(decimal(0L)); + } + + @Test + void unit_quantity_from_currency() { + // given + var currency = USD; + + // when + var money = unit(currency); + + // then + assertThat(money.currency()).isEqualTo(USD); + assertThat(money.quantity()).isEqualTo(decimal(1L)); + } + + @Test + void thousand_from_currency() { + // given + var currency = USD; + + // when + var money = thousand(currency); + + // then + assertThat(money.currency()).isEqualTo(USD); + assertThat(money.quantity()).isEqualTo(decimal(1_000L)); + } + + @Test + void million_from_currency() { + // given + var currency = USD; + + // when + var money = million(currency); + + // then + assertThat(money.currency()).isEqualTo(USD); + assertThat(money.quantity()).isEqualTo(decimal(1_000_000L)); + } + + @Test + void is_positive_returns_true_only_when_positive() { + // given + var positive = money(USD, decimal(1)); + var negative = money(USD, decimal(-1)); + var zero = zero(USD); + + // when // then + assertThat(positive.isPositive()).isTrue(); + assertThat(negative.isPositive()).isFalse(); + assertThat(zero.isPositive()).isFalse(); + } + + @Test + void is_negative_returns_true_only_when_negative() { + // given + var positive = money(USD, decimal(1)); + var negative = money(USD, decimal(-1)); + var zero = zero(USD); + + // when // then + assertThat(positive.isNegative()).isFalse(); + assertThat(negative.isNegative()).isTrue(); + assertThat(zero.isNegative()).isFalse(); + } + + @Test + void is_zero_returns_true_only_when_zero() { + // given + var positive = money(USD, decimal(1)); + var negative = money(USD, decimal(-1)); + var zero = zero(USD); + + // when // then + assertThat(positive.isZero()).isFalse(); + assertThat(negative.isZero()).isFalse(); + assertThat(zero.isZero()).isTrue(); + } + + @Test + void equals_returns_true_when_equal() { + // given + var money1 = money(USD, decimal(1)); + var money2 = money(USD, decimal(1)); + + // when + var eq = money1.equals(money2); + + // then + assertThat(eq).isTrue(); + } + + @Test + void equals_returns_false_when_not_equal() { + // given + var money1 = money(USD, decimal(1)); + var money2 = money(USD, decimal(2)); + + // when + var eq = money1.equals(money2); + + // then + assertThat(eq).isFalse(); + } + + @Test + void abs_of_positive_returns_positive() { + // given + var money = money(USD, decimal(1)); + + // when + var abs = money.abs(); + + // then + assertThat(abs).isEqualTo(money(USD, decimal(1))); + } + + @Test + void abs_of_negative_returns_positive() { + // given + var money = money(USD, decimal(-1)); + + // when + var abs = money.abs(); + + // then + assertThat(abs).isEqualTo(money(USD, decimal(1))); + } + + @Test + void abs_of_zero_returns_zero() { + // given + var money = zero(USD); + + // when + var abs = money.abs(); + + // then + assertThat(abs).isEqualTo(zero(USD)); + } + + @Test + void abs_of_negative_zero_returns_zero() { + // given + var money = money(USD, decimal(-0)); + + // when + var abs = money.abs(); + + // then + assertThat(abs).isEqualTo(zero(USD)); + } + + @Test + void neg_of_positive_returns_negative() { + // given + var money = money(USD, decimal(1)); + + // when + var neg = money.neg(); + + // then + assertThat(neg).isEqualTo(money(USD, decimal(-1))); + } + + @Test + void neg_of_negative_returns_positive() { + // given + var money = money(USD, decimal(-1)); + + // when + var neg = money.neg(); + + // then + assertThat(neg).isEqualTo(money(USD, decimal(1))); + } + + @Test + void neg_of_zero_returns_zero() { + // given + var money = zero(USD); + + // when + var neg = money.neg(); + + // then + assertThat(neg).isEqualTo(money); + } + + @Test + void add_positive_with_positive() { + // given + var money1 = money(USD, decimal(1)); + var money2 = money(USD, decimal(2)); + + // when + var sum = money1.add(money2); + + // then + assertThat(sum).isEqualTo(money(USD, decimal(3))); + } + + @Test + void add_positive_with_negative() { + // given + var money1 = money(USD, decimal(1)); + var money2 = money(USD, decimal(-2)); + + // when + var sum = money1.add(money2); + + // then + assertThat(sum).isEqualTo(money(USD, decimal(-1))); + } + + @Test + void add_negative_with_positive() { + // given + var money1 = money(USD, decimal(-1)); + var money2 = money(USD, decimal(2)); + + // when + var sum = money1.add(money2); + + // then + assertThat(sum).isEqualTo(money(USD, decimal(1))); + } + + @Test + void add_positive_with_zero() { + // given + var money1 = money(USD, decimal(1)); + var money2 = money(USD, decimal(0)); + + // when + var sum = money1.add(money2); + + // then + assertThat(sum).isEqualTo(money1); + } + + @Test + void add_negative_with_zero() { + // given + var money1 = money(USD, decimal(-1)); + var money2 = money(USD, decimal(0)); + + // when + var sum = money1.add(money2); + + // then + assertThat(sum).isEqualTo(money1); + } + + @Test + void add_different_units_throws() { + // given + var money1 = money(USD, decimal(1)); + var money2 = money(EUR, decimal(1)); + + // when + BiFunction f = FmpMoney::add; + + // then + assertThatThrownBy(() -> f.apply(money1, money2)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("Cannot apply operation [add] for different currencies [USD] and [EUR]"); + } + + @Test + void sub_positive_with_positive() { + // given + var money1 = money(USD, decimal(1)); + var money2 = money(USD, decimal(2)); + + // when + var diff = money1.sub(money2); + + // then + assertThat(diff).isEqualTo(money(USD, decimal(-1))); + } + + @Test + void sub_positive_with_negative() { + // given + var money1 = money(USD, decimal(1)); + var money2 = money(USD, decimal(-2)); + + // when + var diff = money1.sub(money2); + + // then + assertThat(diff).isEqualTo(money(USD, decimal(3))); + } + + @Test + void sub_negative_with_positive() { + // given + var money1 = money(USD, decimal(-1)); + var money2 = money(USD, decimal(2)); + + // when + var diff = money1.sub(money2); + + // then + assertThat(diff).isEqualTo(money(USD, decimal(-3))); + } + + @Test + void sub_positive_with_zero() { + // given + var money1 = money(USD, decimal(1)); + var money2 = money(USD, decimal(0)); + + // when + var diff = money1.sub(money2); + + // then + assertThat(diff).isEqualTo(money1); + } + + @Test + void sub_negative_with_zero() { + // given + var money1 = money(USD, decimal(-1)); + var money2 = money(USD, decimal(0)); + + // when + var diff = money1.sub(money2); + + // then + assertThat(diff).isEqualTo(money1); + } + + @Test + void sub_different_units_throws() { + // given + var money1 = money(USD, decimal(1)); + var money2 = money(EUR, decimal(1)); + + // when + BiFunction f = FmpMoney::sub; + + // then + assertThatThrownBy(() -> f.apply(money1, money2)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("Cannot apply operation [sub] for different currencies [USD] and [EUR]"); + } + + @Test + void mul_positive_with_positive() { + // given + var money1 = money(USD, decimal(1)); + var money2 = money(USD, decimal(2)); + + // when + var product = money1.mul(money2); + + // then + assertThat(product).isEqualTo(money(USD, decimal(2))); + } + + @Test + void mul_negative_with_negative() { + // given + var money1 = money(USD, decimal(1)); + var money2 = money(USD, decimal(-2)); + + // when + var product = money1.mul(money2); + + // then + assertThat(product).isEqualTo(money(USD, decimal(-2))); + } + + @Test + void mul_different_units_throws() { + // given + var money1 = money(USD, decimal(1)); + var money2 = money(EUR, decimal(1)); + + // when + BiFunction f = FmpMoney::mul; + + // then + assertThatThrownBy(() -> f.apply(money1, money2)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("Cannot apply operation [mul] for different currencies [USD] and [EUR]"); + } + + @Test + void div_positive_with_positive() { + // given + var money1 = money(USD, decimal(420)); + var money2 = money(USD, decimal(28)); + + // when + var quotient = money1.div(money2); + + // then + assertThat(quotient).isEqualTo(money(USD, decimal(15))); + } + + @Test + void div_positive_with_negative() { + // given + var money1 = money(USD, decimal(20)); + var money2 = money(USD, decimal(-10)); + + // when + var quotient = money1.div(money2); + + // then + assertThat(quotient).isEqualTo(money(USD, decimal(-2))); + } + + @Test + void div_positive_by_zero_amount_throws() { + // given + var money1 = money(USD, decimal(1)); + var money2 = zero(USD); + + // when + BiFunction f = FmpMoney::div; + + // then + assertThatThrownBy(() -> f.apply(money1, money2)) + .isInstanceOf(RuntimeException.class) + .hasMessage("Division by zero"); + } + + @Test + void div_different_units_throws() { + // given + var money1 = money(USD, decimal(1)); + var money2 = money(EUR, decimal(1)); + + // when + BiFunction f = FmpMoney::div; + + // then + assertThatThrownBy(() -> f.apply(money1, money2)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("Cannot apply operation [div] for different currencies [USD] and [EUR]"); + } + + @Test + void to_string_returns_currency_code_space_quantity() { + // given + var money = money(USD, decimal(42)); + + // when + var str = money.toString(); + + // then + assertThat(str).isEqualTo("USD 42.00"); + } + + @Test + void hash_code_is_hash_of_currency_and_quantity() { + // given + var money = money(USD, decimal(42)); + + // when + var hc = money.hashCode(); + + // then + assertThat(hc).isEqualTo(hash(USD, decimal(42L))); + } + + @Test + void equals_same_true() { + // given + var money = money(USD, decimal(42)); + + // when + var eq = money.equals(money); + + // then + assertThat(eq).isTrue(); + } + + @Test + void equals_identical_true() { + // given + var money1 = money(USD, decimal(42)); + var money2 = money(USD, decimal(42)); + + // when + var eq = money1.equals(money2); + + // then + assertThat(eq).isTrue(); + } + + @Test + void equals_null_false() { + // given + var money1 = money(USD, decimal(13)); + var money2 = (FmpMoney) null; + + // when + var eq = money1.equals(money2); + + // then + assertThat(eq).isFalse(); + } + + @Test + void equals_different_currency_false() { + // given + var money1 = money(USD, decimal(13)); + var money2 = money(EUR, decimal(13)); + + // when + var eq = money1.equals(money2); + + // then + assertThat(eq).isFalse(); + } + + @Test + void equals_different_quantity_false() { + // given + var money1 = money(USD, decimal(13)); + var money2 = money(USD, decimal(23)); + + // when + var eq = money1.equals(money2); + + // then + assertThat(eq).isFalse(); + } + + @Test + void equals_wrong_instance_false() { + // given + var money1 = money(USD, decimal(13)); + var money2 = mock(Object.class); + + // when + var eq = money1.equals(money2); + + // then + assertThat(eq).isFalse(); + } + + @Test + void compare_to_greater_than() { + // given + var money1 = money(USD, decimal(2)); + var money2 = money(USD, decimal(1)); + + // when + var cmp = money1.compareTo(money2); + + // then + assertThat(cmp).isEqualTo(1); + } + + @Test + void compare_to_less_than() { + // given + var money1 = money(USD, decimal(1)); + var money2 = money(USD, decimal(2)); + + // when + var cmp = money1.compareTo(money2); + + // then + assertThat(cmp).isEqualTo(-1); + } + + @Test + void compare_to_equal() { + // given + var money1 = money(USD, decimal(42)); + var money2 = money(USD, decimal(42)); + + // when + var cmp = money1.compareTo(money2); + + // then + assertThat(cmp).isEqualTo(0); + } + + @Test + void compare_to_different_units_throws() { + // given + var money1 = money(USD, decimal(13)); + var money2 = money(EUR, decimal(13)); + + // when + BiFunction f = Comparable::compareTo; + + // then + assertThatThrownBy(() -> f.apply(money1, money2)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("Cannot apply operation [cmp] for different currencies [USD] and [EUR]"); + } +} diff --git a/src/testFixtures/resources/models/serialization/FmpBalanceSheetStatement.snapshot b/src/testFixtures/resources/models/serialization/FmpBalanceSheetStatement.snapshot index fcbfe16..c7e7e42 100644 Binary files a/src/testFixtures/resources/models/serialization/FmpBalanceSheetStatement.snapshot and b/src/testFixtures/resources/models/serialization/FmpBalanceSheetStatement.snapshot differ diff --git a/src/testFixtures/resources/models/serialization/FmpBalanceSheetStatement.version b/src/testFixtures/resources/models/serialization/FmpBalanceSheetStatement.version index 62f3e6f..fa902fa 100644 Binary files a/src/testFixtures/resources/models/serialization/FmpBalanceSheetStatement.version and b/src/testFixtures/resources/models/serialization/FmpBalanceSheetStatement.version differ diff --git a/src/testFixtures/resources/models/serialization/FmpBalanceSheetStatementGrowth.snapshot b/src/testFixtures/resources/models/serialization/FmpBalanceSheetStatementGrowth.snapshot index 11f64d2..a91a4c4 100644 Binary files a/src/testFixtures/resources/models/serialization/FmpBalanceSheetStatementGrowth.snapshot and b/src/testFixtures/resources/models/serialization/FmpBalanceSheetStatementGrowth.snapshot differ diff --git a/src/testFixtures/resources/models/serialization/FmpBalanceSheetStatementGrowth.version b/src/testFixtures/resources/models/serialization/FmpBalanceSheetStatementGrowth.version index ccfcbf4..29ce11c 100644 Binary files a/src/testFixtures/resources/models/serialization/FmpBalanceSheetStatementGrowth.version and b/src/testFixtures/resources/models/serialization/FmpBalanceSheetStatementGrowth.version differ diff --git a/src/testFixtures/resources/models/serialization/FmpCashFlowStatement.snapshot b/src/testFixtures/resources/models/serialization/FmpCashFlowStatement.snapshot index adf103a..bb7d486 100644 Binary files a/src/testFixtures/resources/models/serialization/FmpCashFlowStatement.snapshot and b/src/testFixtures/resources/models/serialization/FmpCashFlowStatement.snapshot differ diff --git a/src/testFixtures/resources/models/serialization/FmpCashFlowStatement.version b/src/testFixtures/resources/models/serialization/FmpCashFlowStatement.version index 62f3e6f..fa902fa 100644 Binary files a/src/testFixtures/resources/models/serialization/FmpCashFlowStatement.version and b/src/testFixtures/resources/models/serialization/FmpCashFlowStatement.version differ diff --git a/src/testFixtures/resources/models/serialization/FmpCashFlowStatementGrowth.snapshot b/src/testFixtures/resources/models/serialization/FmpCashFlowStatementGrowth.snapshot index 450f632..cf10f85 100644 Binary files a/src/testFixtures/resources/models/serialization/FmpCashFlowStatementGrowth.snapshot and b/src/testFixtures/resources/models/serialization/FmpCashFlowStatementGrowth.snapshot differ diff --git a/src/testFixtures/resources/models/serialization/FmpCashFlowStatementGrowth.version b/src/testFixtures/resources/models/serialization/FmpCashFlowStatementGrowth.version index ccfcbf4..29ce11c 100644 Binary files a/src/testFixtures/resources/models/serialization/FmpCashFlowStatementGrowth.version and b/src/testFixtures/resources/models/serialization/FmpCashFlowStatementGrowth.version differ diff --git a/src/testFixtures/resources/models/serialization/FmpCompanies.snapshot b/src/testFixtures/resources/models/serialization/FmpCompanies.snapshot index 71043a1..5d37924 100644 Binary files a/src/testFixtures/resources/models/serialization/FmpCompanies.snapshot and b/src/testFixtures/resources/models/serialization/FmpCompanies.snapshot differ diff --git a/src/testFixtures/resources/models/serialization/FmpCompanies.version b/src/testFixtures/resources/models/serialization/FmpCompanies.version index d9e6aa6..9a6f654 100644 Binary files a/src/testFixtures/resources/models/serialization/FmpCompanies.version and b/src/testFixtures/resources/models/serialization/FmpCompanies.version differ diff --git a/src/testFixtures/resources/models/serialization/FmpCompany.snapshot b/src/testFixtures/resources/models/serialization/FmpCompany.snapshot index 3220923..0a1b6f8 100644 Binary files a/src/testFixtures/resources/models/serialization/FmpCompany.snapshot and b/src/testFixtures/resources/models/serialization/FmpCompany.snapshot differ diff --git a/src/testFixtures/resources/models/serialization/FmpCompany.version b/src/testFixtures/resources/models/serialization/FmpCompany.version index d9e6aa6..9a6f654 100644 Binary files a/src/testFixtures/resources/models/serialization/FmpCompany.version and b/src/testFixtures/resources/models/serialization/FmpCompany.version differ diff --git a/src/testFixtures/resources/models/serialization/FmpEtfInfo.snapshot b/src/testFixtures/resources/models/serialization/FmpEtfInfo.snapshot index 91c4074..55fea87 100644 Binary files a/src/testFixtures/resources/models/serialization/FmpEtfInfo.snapshot and b/src/testFixtures/resources/models/serialization/FmpEtfInfo.snapshot differ diff --git a/src/testFixtures/resources/models/serialization/FmpEtfInfo.version b/src/testFixtures/resources/models/serialization/FmpEtfInfo.version index fa902fa..379d85c 100644 Binary files a/src/testFixtures/resources/models/serialization/FmpEtfInfo.version and b/src/testFixtures/resources/models/serialization/FmpEtfInfo.version differ diff --git a/src/testFixtures/resources/models/serialization/FmpFinancialGrowth.snapshot b/src/testFixtures/resources/models/serialization/FmpFinancialGrowth.snapshot index 45a2d65..958e806 100644 Binary files a/src/testFixtures/resources/models/serialization/FmpFinancialGrowth.snapshot and b/src/testFixtures/resources/models/serialization/FmpFinancialGrowth.snapshot differ diff --git a/src/testFixtures/resources/models/serialization/FmpFinancialGrowth.version b/src/testFixtures/resources/models/serialization/FmpFinancialGrowth.version index eb52963..62f3e6f 100644 Binary files a/src/testFixtures/resources/models/serialization/FmpFinancialGrowth.version and b/src/testFixtures/resources/models/serialization/FmpFinancialGrowth.version differ diff --git a/src/testFixtures/resources/models/serialization/FmpIncomeStatement.snapshot b/src/testFixtures/resources/models/serialization/FmpIncomeStatement.snapshot index ffaef51..4427d27 100644 Binary files a/src/testFixtures/resources/models/serialization/FmpIncomeStatement.snapshot and b/src/testFixtures/resources/models/serialization/FmpIncomeStatement.snapshot differ diff --git a/src/testFixtures/resources/models/serialization/FmpIncomeStatement.version b/src/testFixtures/resources/models/serialization/FmpIncomeStatement.version index 62f3e6f..fa902fa 100644 Binary files a/src/testFixtures/resources/models/serialization/FmpIncomeStatement.version and b/src/testFixtures/resources/models/serialization/FmpIncomeStatement.version differ diff --git a/src/testFixtures/resources/models/serialization/FmpIncomeStatementGrowth.snapshot b/src/testFixtures/resources/models/serialization/FmpIncomeStatementGrowth.snapshot index fa78c69..0df0c32 100644 Binary files a/src/testFixtures/resources/models/serialization/FmpIncomeStatementGrowth.snapshot and b/src/testFixtures/resources/models/serialization/FmpIncomeStatementGrowth.snapshot differ diff --git a/src/testFixtures/resources/models/serialization/FmpIncomeStatementGrowth.version b/src/testFixtures/resources/models/serialization/FmpIncomeStatementGrowth.version index ccfcbf4..29ce11c 100644 Binary files a/src/testFixtures/resources/models/serialization/FmpIncomeStatementGrowth.version and b/src/testFixtures/resources/models/serialization/FmpIncomeStatementGrowth.version differ diff --git a/src/testFixtures/resources/models/serialization/FmpKeyMetric.snapshot b/src/testFixtures/resources/models/serialization/FmpKeyMetric.snapshot index 13fab5e..9eb4f3c 100644 Binary files a/src/testFixtures/resources/models/serialization/FmpKeyMetric.snapshot and b/src/testFixtures/resources/models/serialization/FmpKeyMetric.snapshot differ diff --git a/src/testFixtures/resources/models/serialization/FmpKeyMetric.version b/src/testFixtures/resources/models/serialization/FmpKeyMetric.version index eb52963..62f3e6f 100644 Binary files a/src/testFixtures/resources/models/serialization/FmpKeyMetric.version and b/src/testFixtures/resources/models/serialization/FmpKeyMetric.version differ diff --git a/src/testFixtures/resources/models/serialization/FmpRatio.snapshot b/src/testFixtures/resources/models/serialization/FmpRatio.snapshot index 5bfdfc0..5f446cf 100644 Binary files a/src/testFixtures/resources/models/serialization/FmpRatio.snapshot and b/src/testFixtures/resources/models/serialization/FmpRatio.snapshot differ diff --git a/src/testFixtures/resources/models/serialization/FmpRatio.version b/src/testFixtures/resources/models/serialization/FmpRatio.version index eb52963..62f3e6f 100644 Binary files a/src/testFixtures/resources/models/serialization/FmpRatio.version and b/src/testFixtures/resources/models/serialization/FmpRatio.version differ diff --git a/src/testFixtures/resources/models/serialization/FmpRevenueGeographicSegmentation.snapshot b/src/testFixtures/resources/models/serialization/FmpRevenueGeographicSegmentation.snapshot index eebdbf7..d2d7309 100644 Binary files a/src/testFixtures/resources/models/serialization/FmpRevenueGeographicSegmentation.snapshot and b/src/testFixtures/resources/models/serialization/FmpRevenueGeographicSegmentation.snapshot differ diff --git a/src/testFixtures/resources/models/serialization/FmpRevenueGeographicSegmentation.version b/src/testFixtures/resources/models/serialization/FmpRevenueGeographicSegmentation.version index eb52963..62f3e6f 100644 Binary files a/src/testFixtures/resources/models/serialization/FmpRevenueGeographicSegmentation.version and b/src/testFixtures/resources/models/serialization/FmpRevenueGeographicSegmentation.version differ diff --git a/src/testFixtures/resources/models/serialization/FmpRevenueProductSegmentation.snapshot b/src/testFixtures/resources/models/serialization/FmpRevenueProductSegmentation.snapshot index 5e07c76..157850f 100644 Binary files a/src/testFixtures/resources/models/serialization/FmpRevenueProductSegmentation.snapshot and b/src/testFixtures/resources/models/serialization/FmpRevenueProductSegmentation.snapshot differ diff --git a/src/testFixtures/resources/models/serialization/FmpRevenueProductSegmentation.version b/src/testFixtures/resources/models/serialization/FmpRevenueProductSegmentation.version index eb52963..62f3e6f 100644 Binary files a/src/testFixtures/resources/models/serialization/FmpRevenueProductSegmentation.version and b/src/testFixtures/resources/models/serialization/FmpRevenueProductSegmentation.version differ diff --git a/src/testFixtures/resources/models/serialization/FmpSearchByCik.snapshot b/src/testFixtures/resources/models/serialization/FmpSearchByCik.snapshot index 7382ec5..9f34594 100644 Binary files a/src/testFixtures/resources/models/serialization/FmpSearchByCik.snapshot and b/src/testFixtures/resources/models/serialization/FmpSearchByCik.snapshot differ diff --git a/src/testFixtures/resources/models/serialization/FmpSearchByCik.version b/src/testFixtures/resources/models/serialization/FmpSearchByCik.version index eb52963..62f3e6f 100644 Binary files a/src/testFixtures/resources/models/serialization/FmpSearchByCik.version and b/src/testFixtures/resources/models/serialization/FmpSearchByCik.version differ diff --git a/src/testFixtures/resources/models/serialization/FmpSearchByName.snapshot b/src/testFixtures/resources/models/serialization/FmpSearchByName.snapshot index 2ad891a..2727424 100644 Binary files a/src/testFixtures/resources/models/serialization/FmpSearchByName.snapshot and b/src/testFixtures/resources/models/serialization/FmpSearchByName.snapshot differ diff --git a/src/testFixtures/resources/models/serialization/FmpSearchByName.version b/src/testFixtures/resources/models/serialization/FmpSearchByName.version index eb52963..62f3e6f 100644 Binary files a/src/testFixtures/resources/models/serialization/FmpSearchByName.version and b/src/testFixtures/resources/models/serialization/FmpSearchByName.version differ diff --git a/src/testFixtures/resources/models/serialization/FmpSearchBySymbol.snapshot b/src/testFixtures/resources/models/serialization/FmpSearchBySymbol.snapshot index 26b6ced..0be558e 100644 Binary files a/src/testFixtures/resources/models/serialization/FmpSearchBySymbol.snapshot and b/src/testFixtures/resources/models/serialization/FmpSearchBySymbol.snapshot differ diff --git a/src/testFixtures/resources/models/serialization/FmpSearchBySymbol.version b/src/testFixtures/resources/models/serialization/FmpSearchBySymbol.version index 29ce11c..eb52963 100644 Binary files a/src/testFixtures/resources/models/serialization/FmpSearchBySymbol.version and b/src/testFixtures/resources/models/serialization/FmpSearchBySymbol.version differ