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