diff --git a/build.gradle b/build.gradle index 4e7734cd..d83388d0 100644 --- a/build.gradle +++ b/build.gradle @@ -1,13 +1,16 @@ +import dev.sorn.fmp4j.CoveragePlugin +import dev.sorn.fmp4j.SnakeCaseMethodFormatter + plugins { id 'java-library' id 'java-test-fixtures' id 'checkstyle' id 'jacoco' id 'com.vanniktech.maven.publish' version '0.34.0' - id 'com.diffplug.spotless' version '7.2.0' + id 'com.diffplug.spotless' } -apply plugin: dev.sorn.fmp4j.CoveragePlugin +apply plugin: CoveragePlugin group = 'dev.sorn.fmp4j' version = projectVersion @@ -18,6 +21,14 @@ java { } } +spotless { + java { + googleJavaFormat() + removeUnusedImports() + addStep(new SnakeCaseMethodFormatter()) + } +} + repositories { mavenCentral() } @@ -28,6 +39,8 @@ dependencies { implementation("com.fasterxml.jackson.core:jackson-databind:${jacksonVersion}") implementation("org.apache.httpcomponents.client5:httpclient5:${apacheHttpComponentsVersion}") implementation("org.apache.commons:commons-lang3:${apacheCommonsVersion}") + implementation("com.diffplug.spotless:spotless-plugin-gradle:${spotlessVersion}") + testImplementation("org.mockito:mockito-core:${mockitoCoreVersion}") testImplementation("org.mockito:mockito-junit-jupiter:${mockitoJunitVersion}") testImplementation(platform("org.junit:junit-bom:${junitVersion}")) diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle index 2d087cae..1f4fd27e 100644 --- a/buildSrc/build.gradle +++ b/buildSrc/build.gradle @@ -9,4 +9,15 @@ repositories { dependencies { implementation gradleApi() implementation localGroovy() + implementation("com.diffplug.spotless:spotless-plugin-gradle:${spotlessVersion}") + implementation("com.github.javaparser:javaparser-core:${javaparserVersion}") + + testImplementation(platform("org.junit:junit-bom:${junitVersion}")) + testImplementation("org.junit.jupiter:junit-jupiter-api") + testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine") + testRuntimeOnly("org.junit.platform:junit-platform-launcher") +} + +test { + useJUnitPlatform() } \ No newline at end of file diff --git a/buildSrc/gradle.properties b/buildSrc/gradle.properties new file mode 100644 index 00000000..20859db4 --- /dev/null +++ b/buildSrc/gradle.properties @@ -0,0 +1,3 @@ +spotlessVersion=7.2.0 +javaparserVersion=3.27.0 +junitVersion=5.10.0 \ No newline at end of file diff --git a/buildSrc/src/main/groovy/CoveragePlugin.groovy b/buildSrc/src/main/groovy/dev/sorn/fmp4j/CoveragePlugin.groovy similarity index 100% rename from buildSrc/src/main/groovy/CoveragePlugin.groovy rename to buildSrc/src/main/groovy/dev/sorn/fmp4j/CoveragePlugin.groovy diff --git a/buildSrc/src/main/java/dev/sorn/fmp4j/SnakeCaseMethodFormatter.java b/buildSrc/src/main/java/dev/sorn/fmp4j/SnakeCaseMethodFormatter.java new file mode 100644 index 00000000..357b0036 --- /dev/null +++ b/buildSrc/src/main/java/dev/sorn/fmp4j/SnakeCaseMethodFormatter.java @@ -0,0 +1,67 @@ +package dev.sorn.fmp4j; + +import com.diffplug.spotless.FormatterStep; +import java.io.File; +import java.io.Serial; +import java.util.Locale; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + + +public class SnakeCaseMethodFormatter implements FormatterStep { + @Serial + private static final long serialVersionUID = 1L; + + // Set of annotations that identify a method as a unit test + private static final Pattern TEST_METHOD_PATTERN = Pattern.compile( + "(@(?:Test|ParameterizedTest|RepeatedTest|TestFactory)(?:[\\s\\S](?!;|\\{))*?\\s+)([a-zA-Z0-9_]+)(\\s*\\()" + ); + + private static final Pattern SNAKE_CASE_PATTERN = Pattern.compile("^[a-z][a-z0-9_]*$"); + + @Override + public String getName() { + return "Unit test Naming Enforcement (snake_case)"; + } + + @Override + public String format(String rawUnix, File file) throws Exception { + Matcher matcher = TEST_METHOD_PATTERN.matcher(rawUnix); + StringBuilder sb = new StringBuilder(); + + while (matcher.find()) { + String context = matcher.group(1); // Annotation + modifiers + return type + String methodName = matcher.group(2); // Current method name + String paramsStart = matcher.group(3); // "(" + + // Only replace if it fails snake_case check + if (!SNAKE_CASE_PATTERN.matcher(methodName).matches()) { + String newName = toSnakeCase(methodName); + // Replace the name group, preserving context and params + matcher.appendReplacement(sb, Matcher.quoteReplacement(context + newName + paramsStart)); + } + } + matcher.appendTail(sb); + + return sb.toString(); + } + + /** + * Converts a camelCase string to snake_case. + * Example: "testUserProfile" -> "test_user_profile" + */ + private String toSnakeCase(String input) { + // Regex to look for instances of LowerUpper (e.g. "tU") and insert underscore + String regex = "([a-z])([A-Z]+)"; + String replacement = "$1_$2"; + + // Apply replacement and convert to lowercase + return input.replaceAll(regex, replacement).toLowerCase(Locale.ROOT); + } + + @Override + public void close() throws Exception { + // No resources to close + } +} + diff --git a/buildSrc/src/test/java/dev/sorn/fmp4j/SnakeCaseMethodFormatterTest.java b/buildSrc/src/test/java/dev/sorn/fmp4j/SnakeCaseMethodFormatterTest.java new file mode 100644 index 00000000..302f387f --- /dev/null +++ b/buildSrc/src/test/java/dev/sorn/fmp4j/SnakeCaseMethodFormatterTest.java @@ -0,0 +1,156 @@ +package dev.sorn.fmp4j; + +import static org.junit.jupiter.api.Assertions.assertAll; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import java.io.File; + + +class SnakeCaseMethodFormatterTest { + + private SnakeCaseMethodFormatter formatter; + + @BeforeEach + void setUp() { + formatter = new SnakeCaseMethodFormatter(); + } + + @Test + void should_rename_camel_case_unit_test_to_snake_case() throws Exception { + // Given: A class with a camelCase @Test method + String source = """ + public class MyTest { + @Test + public void testLoginFeature() { + System.out.println("Testing..."); + } + } + """; + + // When + String result = formatter.format(source, new File("dummy.java")); + + // Then + assertTrue(result.contains("void test_login_feature()"), + "The method name should be converted to snake_case"); + assertFalse(result.contains("testLoginFeature"), + "The old camelCase name should no longer exist"); + } + + @Test + void should_not_rename_non_test_methods() throws Exception { + // Given: A class with a helper method (no @Test annotation) + String source = """ + public class MyTest { + public void helperMethod() { + // do something + } + } + """; + + // When + String result = formatter.format(source, null); + + // Then + assertTrue(result.contains("void helperMethod()"), + "Non-test methods should retain their original name"); + } + + @Test + void should_ignore_already_snake_case_tests() throws Exception { + // Given: A class with an existing snake_case test + String source = """ + public class MyTest { + @Test + public void test_existing_snake_case() { + } + } + """; + + // When + String result = formatter.format(source, null); + + // Then: The method returns the original string if no changes were made + assertEquals(source, result, + "The source code should remain unchanged if the name is already correct"); + } + + @Test + void should_handle_mixed_methods_correctly() throws Exception { + // Given: One test to rename, one helper to ignore, one test already correct + String source = """ + public class MixedTest { + @Test + public void shouldCalculateSum() {} + + public void setupDatabase() {} + + @Test + public void test_already_good() {} + } + """; + + // When + String result = formatter.format(source, null); + + // Then + assertAll("Verify all method states", + () -> assertTrue(result.contains("void should_calculate_sum()"), "CamelCase test should be renamed"), + () -> assertTrue(result.contains("void setupDatabase()"), "Helper method should not change"), + () -> assertTrue(result.contains("void test_already_good()"), "Snake case test should stay snake case") + ); + } + + @Test + void should_handle_complex_test_annotations() throws Exception { + // Given: One test to rename, one helper to ignore, one test already correct + String source = """ + public class MixedTest { + @ParameterizedTest + @MethodSource("someFactoryMethod") + void validValue() { + //do something + } + } + """; + + // When + String result = formatter.format(source, null); + + // Then + assertAll("Verify all method states", + () -> assertTrue(result.contains("void valid_value()"), "CamelCase test should be renamed"), + () -> assertTrue(result.contains("@ParameterizedTest"), "Annotation should not be moved"), + () -> assertTrue(result.contains("@MethodSource(\"someFactoryMethod\")"), "Annotation should not be moved") + ); + } + + @Test + void should_handle_inline_comment() throws Exception { + // Given: One test to rename, one helper to ignore, one test already correct + String source = """ + class InlineCommentTest { + @Test + void doSomethingHere() { + Stream.of( + "" // empty string + ); + } + } + """; + + // When + String result = formatter.format(source, null); + + // Then + assertAll("Verify all method states", + () -> assertTrue(result.contains("do_something_here"), "CamelCase test should be renamed"), + () -> assertTrue(result.contains("\"\" // empty string"), "Inline comment should remain in place") + ); + } +} + diff --git a/gradle.properties b/gradle.properties index 75435c08..a0a9b294 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,6 +8,7 @@ apacheCommonsVersion=3.18.0 apacheHttpComponentsVersion=5.5 jacksonVersion=2.19.2 jacksonCsvVersion=2.17.2 +spotlessVersion=7.2.0 # Publishing mavenCentralPublishing=true diff --git a/src/main/java/dev/sorn/fmp4j/types/FmpSymbol.java b/src/main/java/dev/sorn/fmp4j/types/FmpSymbol.java index 7830cc59..ce9cb904 100644 --- a/src/main/java/dev/sorn/fmp4j/types/FmpSymbol.java +++ b/src/main/java/dev/sorn/fmp4j/types/FmpSymbol.java @@ -16,8 +16,13 @@ public final class FmpSymbol implements Comparable, FmpValueObject(); // guarantee order symbols.add(symbol("BTCUSD")); @@ -929,7 +929,7 @@ void cryptoNews_multiple() { } @Test - void forexNews() { + void forex_news() { // given var symbols = Set.of(symbol("EURUSD")); var endpoint = "news/forex"; @@ -946,7 +946,7 @@ void forexNews() { } @Test - void stockNews() { + void stock_news() { // given var symbols = Set.of(symbol("AAPL")); var endpoint = "news/stock"; @@ -963,7 +963,7 @@ void stockNews() { } @Test - void cryptoNews_withFromTo() { + void crypto_news_with_from_to() { // given var symbols = Set.of(symbol("BTCUSD")); var from = Optional.of(LocalDate.of(2025, 1, 1)); @@ -985,7 +985,7 @@ void cryptoNews_withFromTo() { } @Test - void etfSectorWeightings() { + void etf_sector_weightings() { // given var symbol = symbol("SPY"); var endpoint = "etf/sector-weightings"; @@ -1000,7 +1000,7 @@ void etfSectorWeightings() { } @Test - void fullQuotes() { + void full_quotes() { // given var symbol = symbol("AAPL"); var endpoint = "quote"; @@ -1015,7 +1015,7 @@ void fullQuotes() { } @Test - void partialQuotes() { + void partial_quotes() { // given var symbol = symbol("AAPL"); var endpoint = "quote-short"; @@ -1030,7 +1030,7 @@ void partialQuotes() { } @Test - void priceChange() { + void price_change() { // given var symbol = symbol("AAPL"); var endpoint = "stock-price-change"; @@ -1045,7 +1045,7 @@ void priceChange() { } @Test - void secFilingsSearchBySymbol() { + void sec_filings_search_by_symbol() { // given var symbol = symbol("AAPL"); var from = LocalDate.parse("2024-01-01"); @@ -1066,7 +1066,7 @@ void secFilingsSearchBySymbol() { } @Test - void treasuryRates() { + void treasury_rates() { // given var from = LocalDate.parse("2024-12-30"); var to = LocalDate.parse("2025-01-01"); @@ -1082,7 +1082,7 @@ void treasuryRates() { } @Test - void earningCallTranscript() { + void earning_call_transcript() { // given var symbol = symbol("AAPL"); var year = year(2020); @@ -1099,7 +1099,7 @@ void earningCallTranscript() { } @Test - void earningCallTranscriptDates() { + void earning_call_transcript_dates() { // given var symbol = symbol("AAPL"); var endpoint = "earning-call-transcript-dates"; @@ -1114,7 +1114,7 @@ void earningCallTranscriptDates() { } @Test - void earningCallTranscriptLatest() { + void earning_call_transcript_latest() { // given var page = page(0); var limit = limit(2); @@ -1130,7 +1130,7 @@ void earningCallTranscriptLatest() { } @Test - void earningsTranscriptList() { + void earnings_transcript_list() { // given var endpoint = "earnings-transcript-list"; var file = format("stable/%s/excerpt.json", endpoint); diff --git a/src/test/java/dev/sorn/fmp4j/TestUtils.java b/src/test/java/dev/sorn/fmp4j/TestUtils.java index 015c6a1c..80c7c933 100644 --- a/src/test/java/dev/sorn/fmp4j/TestUtils.java +++ b/src/test/java/dev/sorn/fmp4j/TestUtils.java @@ -125,7 +125,8 @@ public static void verifySerialization(T obj) throws IOException { // Verify against existing snapshot byte[] expected = Files.readAllBytes(snapshotPath); if (!Arrays.equals(expected, currentData)) { - throw new AssertionError("Serialization data mismatch for " + clazz.getSimpleName() + throw new AssertionError("Serialization data mismatch for " + + clazz.getSimpleName() + ". Update serialVersionUID if this is intentional."); } } diff --git a/src/test/java/dev/sorn/fmp4j/csv/FmpCsvDeserializerTest.java b/src/test/java/dev/sorn/fmp4j/csv/FmpCsvDeserializerTest.java index 2090e393..eab9d0a8 100644 --- a/src/test/java/dev/sorn/fmp4j/csv/FmpCsvDeserializerTest.java +++ b/src/test/java/dev/sorn/fmp4j/csv/FmpCsvDeserializerTest.java @@ -12,6 +12,7 @@ import org.junit.jupiter.api.Test; class FmpCsvDeserializerTest { + private FmpCsvDeserializer deserializer; @BeforeEach @@ -29,22 +30,18 @@ void deserialize_array() { GOOGL,Alphabet Inc.,2800.50,50 MSFT,Microsoft Corp.,300.75,75 """; - // when var result = deserializer.deserialize(csv, typeRef(TestCsvObject[].class)); - // then assertEquals(3, result.length); assertEquals("AAPL", result[0].symbol()); assertEquals("Apple Inc.", result[0].name()); assertEquals(150.25, result[0].price()); assertEquals(100, result[0].quantity()); - assertEquals("GOOGL", result[1].symbol()); assertEquals("Alphabet Inc.", result[1].name()); assertEquals(2800.50, result[1].price()); assertEquals(50, result[1].quantity()); - assertEquals("MSFT", result[2].symbol()); assertEquals("Microsoft Corp.", result[2].name()); assertEquals(300.75, result[2].price()); @@ -60,17 +57,14 @@ void deserialize_array_with_null_values() { AAPL,Apple Inc.,,100 GOOGL,,2800.50, """; - // when var result = deserializer.deserialize(csv, typeRef(TestCsvObject[].class)); - // then assertEquals(2, result.length); assertEquals("AAPL", result[0].symbol()); assertEquals("Apple Inc.", result[0].name()); assertNull(result[0].price()); assertEquals(100, result[0].quantity()); - assertEquals("GOOGL", result[1].symbol()); assertNull(result[1].name()); assertEquals(2800.50, result[1].price()); @@ -78,17 +72,15 @@ void deserialize_array_with_null_values() { } @Test - void deserialize_array_withByteOrderMark() { + void deserialize_array_with_byte_order_mark() { // given var csv = """ \uFEFFsymbol,name,price,quantity AAPL,Apple Inc.,150.25,100 """; - // when var result = deserializer.deserialize(csv, typeRef(TestCsvObject[].class)); - // then assertEquals(1, result.length); assertEquals("AAPL", result[0].symbol()); @@ -103,10 +95,8 @@ void deserialize_array_empty_content() { var csv = """ symbol,name,price,quantity """; - // when var result = deserializer.deserialize(csv, typeRef(TestCsvObject[].class)); - // then assertEquals(0, result.length); } @@ -119,7 +109,6 @@ void deserialize_array_fails_on_malformed_csv() { symbol,name,price,quantity AAPL,Apple Inc.,not_a_number,100 """; - // when // then var e = assertThrows( FmpDeserializationException.class, @@ -140,10 +129,8 @@ void deserialize_array_with_trailing_comma() { symbol,name,price,quantity, AAPL,Apple Inc.,150.25,100, """; - // when var result = deserializer.deserialize(csv, typeRef(TestCsvObject[].class)); - // then assertEquals(1, result.length); assertEquals("AAPL", result[0].symbol()); @@ -159,10 +146,8 @@ void deserialize_array_with_empty_string_as_null() { symbol,name,price,quantity AAPL,"",150.25,100 """; - // when var result = deserializer.deserialize(csv, typeRef(TestCsvObject[].class)); - // then assertEquals(1, result.length); assertEquals("AAPL", result[0].symbol()); diff --git a/src/test/java/dev/sorn/fmp4j/http/FmpUriUtilsTest.java b/src/test/java/dev/sorn/fmp4j/http/FmpUriUtilsTest.java index 4af80936..7bd6c7c5 100644 --- a/src/test/java/dev/sorn/fmp4j/http/FmpUriUtilsTest.java +++ b/src/test/java/dev/sorn/fmp4j/http/FmpUriUtilsTest.java @@ -15,7 +15,7 @@ class FmpUriUtilsTest { @Test - void uriWithParams_single_param() { + void uri_with_params_single_param() { // given var uri = uri("https://example.com"); var params = Map.of("param", 42); @@ -28,7 +28,7 @@ void uriWithParams_single_param() { } @Test - void uriWithParams_multiple_params() { + void uri_with_params_multiple_params() { // given var uri = uri("https://example.com"); var params = Map.of("param", 42); @@ -41,7 +41,7 @@ void uriWithParams_multiple_params() { } @Test - void uriWithParams_null_params() { + void uri_with_params_null_params() { // given var uri = uri("https://example.com"); var params = (Map) null; @@ -54,7 +54,7 @@ void uriWithParams_null_params() { } @Test - void uriWithParams_empty_params() { + void uri_with_params_empty_params() { // given var uri = uri("https://example.com"); var params = Map.of(); @@ -67,7 +67,7 @@ void uriWithParams_empty_params() { } @Test - void uriWithParams_illegalQueryKey_throwsFmpHttpException() { + void uri_with_params_illegal_query_key_throws_fmp_http_exception() { var uri = URI.create("https:/.com"); var params = Map.of("param", 42); @@ -79,7 +79,7 @@ void uriWithParams_illegalQueryKey_throwsFmpHttpException() { } @Test - void privateConstructor_throwsAssertionError() throws Exception { + void private_constructor_throws_assertion_error() throws Exception { Constructor constructor = FmpUriUtils.class.getDeclaredConstructor(); constructor.setAccessible(true); diff --git a/src/test/java/dev/sorn/fmp4j/json/FmpJsonDeserializerTest.java b/src/test/java/dev/sorn/fmp4j/json/FmpJsonDeserializerTest.java index 899919cf..510e41ed 100644 --- a/src/test/java/dev/sorn/fmp4j/json/FmpJsonDeserializerTest.java +++ b/src/test/java/dev/sorn/fmp4j/json/FmpJsonDeserializerTest.java @@ -12,6 +12,7 @@ import org.junit.jupiter.api.Test; class FmpJsonDeserializerTest { + private FmpJsonDeserializer deserializer; @BeforeEach @@ -31,10 +32,8 @@ void deserialize_object() { } } """; - // when var obj = deserializer.deserialize(json, typeRef(TestObject.class)); - // then assertEquals("key", obj.key()); assertEquals(new TestObjectValue(42), obj.object()); @@ -60,10 +59,8 @@ void deserialize_array() { } ] """; - // when var obj = deserializer.deserialize(json, typeRef(TestObject[].class)); - // then assertEquals(2, obj.length); assertEquals("key3", obj[0].key()); @@ -73,10 +70,9 @@ void deserialize_array() { } @Test - void deserialize_object_failsOnMalformedJson() { + void deserialize_object_fails_on_malformed_json() { // given var malformedJson = "{"; - // when // then var e = assertThrows( FmpDeserializationException.class, @@ -85,10 +81,9 @@ void deserialize_object_failsOnMalformedJson() { } @Test - void deserialize_array_failsOnMalformedJson() { + void deserialize_array_fails_on_malformed_json() { // given var malformedJson = "["; - // when // then var e = assertThrows( FmpDeserializationException.class, @@ -97,7 +92,7 @@ void deserialize_array_failsOnMalformedJson() { } @Test - void deserialize_object_failsOnTypeMismatch() { + void deserialize_object_fails_on_type_mismatch() { // given var mismatchedJson = """ @@ -106,7 +101,6 @@ void deserialize_object_failsOnTypeMismatch() { "object": "not_an_object" } """; - // when // then var e = assertThrows( FmpDeserializationException.class, @@ -123,7 +117,7 @@ void deserialize_object_failsOnTypeMismatch() { } @Test - void deserialize_array_failsOnElementTypeMismatch() { + void deserialize_array_fails_on_element_type_mismatch() { var invalidElementJson = """ [ @@ -131,7 +125,6 @@ void deserialize_array_failsOnElementTypeMismatch() { {"key": "invalid", "object": "not_an_object"} ] """; - // when // then var e = assertThrows( FmpDeserializationException.class, diff --git a/src/test/java/dev/sorn/fmp4j/types/FmpApiKeyTest.java b/src/test/java/dev/sorn/fmp4j/types/FmpApiKeyTest.java index a1288fff..14dfd034 100644 --- a/src/test/java/dev/sorn/fmp4j/types/FmpApiKeyTest.java +++ b/src/test/java/dev/sorn/fmp4j/types/FmpApiKeyTest.java @@ -32,7 +32,7 @@ void value_returns_raw_value() { } @Test - void toString_masked() { + void to_string_masked() { // given var apiKey = new FmpApiKey("ABCDEf0ghIjklmNO1pqRsT2u34VWx5y6"); @@ -86,7 +86,7 @@ void invalid_pattern_throws(String value) { } @Test - void hashCode_value() { + void hash_code_value() { // given var str = "ABCDEf0ghIjklmNO1pqRsT2u34VWx5y6"; var k = new FmpApiKey("ABCDEf0ghIjklmNO1pqRsT2u34VWx5y6"); diff --git a/src/test/java/dev/sorn/fmp4j/types/FmpCikTest.java b/src/test/java/dev/sorn/fmp4j/types/FmpCikTest.java index bee6ebd2..cb02d0e8 100644 --- a/src/test/java/dev/sorn/fmp4j/types/FmpCikTest.java +++ b/src/test/java/dev/sorn/fmp4j/types/FmpCikTest.java @@ -46,7 +46,7 @@ void is_serializable() throws IOException, ClassNotFoundException { } @Test - void toString_returns_value() { + void to_string_returns_value() { // given var c = cik("320193"); @@ -58,7 +58,7 @@ void toString_returns_value() { } @Test - void hashCode_value() { + void hash_code_value() { // given var str = "0000320193"; var c = cik("320193"); @@ -135,7 +135,7 @@ void equals_wrong_instance_false() { } @Test - void compareTo_null_throws() { + void compare_to_null_throws() { // given var c1 = cik("320193"); var c2 = (FmpCik) null; @@ -146,7 +146,7 @@ void compareTo_null_throws() { } @Test - void compareTo_less_than() { + void compare_to_less_than() { // given var c1 = cik("0000000001"); var c2 = cik("0000000002"); @@ -159,7 +159,7 @@ void compareTo_less_than() { } @Test - void compareTo_greater_than() { + void compare_to_greater_than() { // given var c1 = cik("0000000002"); var c2 = cik("0000000001"); @@ -172,7 +172,7 @@ void compareTo_greater_than() { } @Test - void compareTo_equal() { + void compare_to_equal() { // given var c1 = cik("320193"); var c2 = cik("320193"); diff --git a/src/test/java/dev/sorn/fmp4j/types/FmpCurrencyTest.java b/src/test/java/dev/sorn/fmp4j/types/FmpCurrencyTest.java index d5c51c29..5b1ec204 100644 --- a/src/test/java/dev/sorn/fmp4j/types/FmpCurrencyTest.java +++ b/src/test/java/dev/sorn/fmp4j/types/FmpCurrencyTest.java @@ -45,7 +45,7 @@ void is_serializable() throws IOException, ClassNotFoundException { } @Test - void toString_returns_value() { + void to_string_returns_value() { // given var c = currency("USD"); @@ -57,7 +57,7 @@ void toString_returns_value() { } @Test - void hashCode_value() { + void hash_code_value() { // given var str = "USD"; var c = currency(str); @@ -134,7 +134,7 @@ void equals_wrong_instance_false() { } @Test - void compareTo_null_throws() { + void compare_to_null_throws() { // given var c1 = currency("USD"); var c2 = (FmpCurrency) null; @@ -145,7 +145,7 @@ void compareTo_null_throws() { } @Test - void compareTo_less_than() { + void compare_to_less_than() { // given var c1 = currency("EUR"); var c2 = currency("USD"); @@ -158,7 +158,7 @@ void compareTo_less_than() { } @Test - void compareTo_greater_than() { + void compare_to_greater_than() { // given var c1 = currency("USD"); var c2 = currency("EUR"); @@ -171,7 +171,7 @@ void compareTo_greater_than() { } @Test - void compareTo_equal() { + void compare_to_equal() { // given var c1 = currency("USD"); var c2 = currency("USD"); diff --git a/src/test/java/dev/sorn/fmp4j/types/FmpCusipTest.java b/src/test/java/dev/sorn/fmp4j/types/FmpCusipTest.java index 878b80d9..37239f40 100644 --- a/src/test/java/dev/sorn/fmp4j/types/FmpCusipTest.java +++ b/src/test/java/dev/sorn/fmp4j/types/FmpCusipTest.java @@ -45,7 +45,7 @@ void is_serializable() throws IOException, ClassNotFoundException { } @Test - void toString_returns_value() { + void to_string_returns_value() { // given var c = cusip("037833100"); @@ -57,7 +57,7 @@ void toString_returns_value() { } @Test - void hashCode_value() { + void hash_code_value() { // given var str = "037833100"; var c = cusip(str); @@ -134,7 +134,7 @@ void equals_wrong_instance_false() { } @Test - void compareTo_null_throws() { + void compare_to_null_throws() { // given var c1 = cusip("037833100"); var c2 = (FmpCusip) null; @@ -145,7 +145,7 @@ void compareTo_null_throws() { } @Test - void compareTo_less_than() { + void compare_to_less_than() { // given var c1 = cusip("037833100"); var c2 = cusip("594918104"); @@ -158,7 +158,7 @@ void compareTo_less_than() { } @Test - void compareTo_greater_than() { + void compare_to_greater_than() { // given var c1 = cusip("594918104"); var c2 = cusip("037833100"); @@ -171,7 +171,7 @@ void compareTo_greater_than() { } @Test - void compareTo_equal() { + void compare_to_equal() { // given var c1 = cusip("037833100"); var c2 = cusip("037833100"); diff --git a/src/test/java/dev/sorn/fmp4j/types/FmpExchangeTest.java b/src/test/java/dev/sorn/fmp4j/types/FmpExchangeTest.java index c074d78b..83d12ab3 100644 --- a/src/test/java/dev/sorn/fmp4j/types/FmpExchangeTest.java +++ b/src/test/java/dev/sorn/fmp4j/types/FmpExchangeTest.java @@ -131,7 +131,7 @@ void should_not_null_country_code() { } @Test - void should_not_null_suffixSymbol() { + void should_not_null_suffix_symbol() { var nullSuffixSymbol = Arrays.stream(FmpExchange.values()) .map(FmpExchange::suffixSymbol) .filter(Objects::isNull) diff --git a/src/test/java/dev/sorn/fmp4j/types/FmpFormTypeTest.java b/src/test/java/dev/sorn/fmp4j/types/FmpFormTypeTest.java index f16cebc3..29b1e7a3 100644 --- a/src/test/java/dev/sorn/fmp4j/types/FmpFormTypeTest.java +++ b/src/test/java/dev/sorn/fmp4j/types/FmpFormTypeTest.java @@ -57,7 +57,7 @@ void is_serializable() throws IOException, ClassNotFoundException { } @Test - void toString_returns_value() { + void to_string_returns_value() { // given var s = FORM_10Q; @@ -69,7 +69,7 @@ void toString_returns_value() { } @Test - void hashCode_value() { + void hash_code_value() { // given var str = "10-Q"; var ft = formType(str); @@ -134,7 +134,7 @@ void equals_wrong_instance_false() { } @Test - void compareTo_null_throws() { + void compare_to_null_throws() { // given var ft1 = FORM_10Q; var ft2 = (FmpFormType) null; @@ -145,7 +145,7 @@ void compareTo_null_throws() { } @Test - void compareTo_less_than() { + void compare_to_less_than() { // given var ft1 = FORM_10Q; var ft2 = formType("4-K"); @@ -158,7 +158,7 @@ void compareTo_less_than() { } @Test - void compareTo_greater_than() { + void compare_to_greater_than() { // given var ft1 = formType("4-K"); var ft2 = FORM_10Q; @@ -171,7 +171,7 @@ void compareTo_greater_than() { } @Test - void compareTo_equal() { + void compare_to_equal() { // given var ft1 = FORM_10Q; var ft2 = FORM_10Q; diff --git a/src/test/java/dev/sorn/fmp4j/types/FmpIndustryTest.java b/src/test/java/dev/sorn/fmp4j/types/FmpIndustryTest.java index 684ee6aa..29fae6fa 100644 --- a/src/test/java/dev/sorn/fmp4j/types/FmpIndustryTest.java +++ b/src/test/java/dev/sorn/fmp4j/types/FmpIndustryTest.java @@ -48,7 +48,7 @@ void testInvalidIndustries(String label) { // toString test @Test - void testToString() { + void test_to_string() { // given var industry = FmpIndustry.STEEL; diff --git a/src/test/java/dev/sorn/fmp4j/types/FmpIsinTest.java b/src/test/java/dev/sorn/fmp4j/types/FmpIsinTest.java index fd408a65..5c6f0e19 100644 --- a/src/test/java/dev/sorn/fmp4j/types/FmpIsinTest.java +++ b/src/test/java/dev/sorn/fmp4j/types/FmpIsinTest.java @@ -22,11 +22,11 @@ * @author chat.deepseek.com */ class FmpIsinTest { + @Test void null_isin_throws() { // given var value = (String) null; - // when // then var e = assertThrows(FmpInvalidIsinException.class, () -> isin(value)); assertEquals("'value' is required", e.getMessage()); @@ -36,35 +36,29 @@ void null_isin_throws() { void is_serializable() throws IOException, ClassNotFoundException { // given var before = isin("US0378331005"); - // when var after = (FmpIsin) deserialize(serialize(before)); - // then assertEquals(before, after); } @Test - void toString_returns_value() { + void to_string_returns_value() { // given var i = isin("US0378331005"); - // when var str = i.toString(); - // then assertEquals("US0378331005", str); } @Test - void hashCode_value() { + void hash_code_value() { // given var str = "US0378331005"; var i = isin(str); - // when var hc = i.hashCode(); - // then assertEquals(str.hashCode(), hc); } @@ -73,10 +67,8 @@ void hashCode_value() { void equals_same_true() { // given var i = isin("US0378331005"); - // when var eq = i.equals(i); - // then assertTrue(eq); } @@ -86,10 +78,8 @@ void equals_identical_true() { // given var i1 = isin("US0378331005"); var i2 = isin("US0378331005"); - // when var eq = i1.equals(i2); - // then assertTrue(eq); } @@ -99,10 +89,8 @@ void equals_null_false() { // given var i1 = isin("US0378331005"); var i2 = (FmpIsin) null; - // when var eq = i1.equals(i2); - // then assertFalse(eq); } @@ -112,10 +100,8 @@ void equals_different_false() { // given var i1 = isin("US0378331005"); var i2 = isin("US5949181045"); - // when var eq = i1.equals(i2); - // then assertFalse(eq); } @@ -125,69 +111,59 @@ void equals_wrong_instance_false() { // given var i1 = isin("US0378331005"); var i2 = "US0378331005"; - // when var eq = i1.equals(i2); - // then assertFalse(eq); } @Test - void compareTo_null_throws() { + void compare_to_null_throws() { // given var i1 = isin("US0378331005"); var i2 = (FmpIsin) null; - // when // then var e = assertThrows(FmpInvalidIsinException.class, () -> i1.compareTo(i2)); assertEquals("'that.value' is required", e.getMessage()); } @Test - void compareTo_less_than() { + void compare_to_less_than() { // given var i1 = isin("US0378331005"); var i2 = isin("US5949181045"); - // when int cmp = i1.compareTo(i2); - // then assertEquals(-5, cmp); } @Test - void compareTo_greater_than() { + void compare_to_greater_than() { // given var i1 = isin("US5949181045"); var i2 = isin("US0378331005"); - // when int cmp = i1.compareTo(i2); - // then assertEquals(5, cmp); } @Test - void compareTo_equal() { + void compare_to_equal() { // given var i1 = isin("US0378331005"); var i2 = isin("US0378331005"); - // when int cmp = i1.compareTo(i2); - // then assertEquals(0, cmp); } @Test - void isValidLuhn_covers_both_branches() { + void is_valid_luhn_covers_both_branches() { var left = isin("US0378331005"); assertEquals("US0378331005", left.value()); - var right = isin("GB00B03MLX29"); assertEquals("GB00B03MLX29", right.value()); } @@ -197,7 +173,6 @@ void isValidLuhn_covers_both_branches() { void valid_isins(String value) { // given // when var isin = isin(value); - // then assertEquals(value, isin.value()); } @@ -207,7 +182,6 @@ void valid_isins(String value) { void invalid_isins(String value) { // given // when Function f = FmpIsin::isin; - // then var e = assertThrows(FmpInvalidIsinException.class, () -> f.apply(value)); assertEquals( @@ -219,7 +193,6 @@ void invalid_isins(String value) { void invalid_isins_due_to_check_digit(String value) { // given // when Function f = FmpIsin::isin; - // then var e = assertThrows(FmpInvalidIsinException.class, () -> f.apply(value)); assertEquals(format("'value' [%s] has invalid check digit", value), e.getMessage()); diff --git a/src/test/java/dev/sorn/fmp4j/types/FmpLimitTest.java b/src/test/java/dev/sorn/fmp4j/types/FmpLimitTest.java index 4bdaea4f..5d5a8d10 100644 --- a/src/test/java/dev/sorn/fmp4j/types/FmpLimitTest.java +++ b/src/test/java/dev/sorn/fmp4j/types/FmpLimitTest.java @@ -57,7 +57,7 @@ void toString_returns_value(int limit) { } @Test - void hashCode_value() { + void hash_code_value() { // given var i = 3; var lim = limit(i); diff --git a/src/test/java/dev/sorn/fmp4j/types/FmpPageTest.java b/src/test/java/dev/sorn/fmp4j/types/FmpPageTest.java index a6bf5c20..cb44d241 100644 --- a/src/test/java/dev/sorn/fmp4j/types/FmpPageTest.java +++ b/src/test/java/dev/sorn/fmp4j/types/FmpPageTest.java @@ -67,7 +67,7 @@ void toString_returns_value(int page) { } @Test - void hashCode_value() { + void hash_code_value() { // given var page = 999; var p = page(page); @@ -139,7 +139,7 @@ void equals_wrong_instance_false() { } @Test - void compareTo_null_throws() { + void compare_to_null_throws() { // given var p1 = page("999"); var p2 = (FmpPage) null; @@ -150,7 +150,7 @@ void compareTo_null_throws() { } @Test - void compareTo_less_than() { + void compare_to_less_than() { // given var p1 = page("1"); var p2 = page("999"); @@ -163,7 +163,7 @@ void compareTo_less_than() { } @Test - void compareTo_greater_than() { + void compare_to_greater_than() { // given var p1 = page("999"); var p2 = page("1"); @@ -176,7 +176,7 @@ void compareTo_greater_than() { } @Test - void compareTo_equal() { + void compare_to_equal() { // given var p1 = page("1"); var p2 = page("1"); diff --git a/src/test/java/dev/sorn/fmp4j/types/FmpPartTest.java b/src/test/java/dev/sorn/fmp4j/types/FmpPartTest.java index f70466d4..ea8d461c 100644 --- a/src/test/java/dev/sorn/fmp4j/types/FmpPartTest.java +++ b/src/test/java/dev/sorn/fmp4j/types/FmpPartTest.java @@ -67,7 +67,7 @@ void toString_returns_value(int part) { } @Test - void hashCode_value() { + void hash_code_value() { // given var part = 999; var p = part(part); @@ -139,7 +139,7 @@ void equals_wrong_instance_false() { } @Test - void compareTo_null_throws() { + void compare_to_null_throws() { // given var p1 = part("999"); var p2 = (FmpPart) null; @@ -150,7 +150,7 @@ void compareTo_null_throws() { } @Test - void compareTo_less_than() { + void compare_to_less_than() { // given var p1 = part("1"); var p2 = part("999"); @@ -163,7 +163,7 @@ void compareTo_less_than() { } @Test - void compareTo_greater_than() { + void compare_to_greater_than() { // given var p1 = part("999"); var p2 = part("1"); @@ -176,7 +176,7 @@ void compareTo_greater_than() { } @Test - void compareTo_equal() { + void compare_to_equal() { // given var p1 = part("1"); var p2 = part("1"); diff --git a/src/test/java/dev/sorn/fmp4j/types/FmpQuarterTest.java b/src/test/java/dev/sorn/fmp4j/types/FmpQuarterTest.java index 3ed1a244..9107cd07 100644 --- a/src/test/java/dev/sorn/fmp4j/types/FmpQuarterTest.java +++ b/src/test/java/dev/sorn/fmp4j/types/FmpQuarterTest.java @@ -57,7 +57,7 @@ void toString_returns_value(int quarter) { } @Test - void hashCode_value() { + void hash_code_value() { // given var quarter = 4; var q = quarter(quarter); @@ -134,7 +134,7 @@ void equals_wrong_instance_false() { } @Test - void compareTo_null_throws() { + void compare_to_null_throws() { // given var q1 = quarter(4); var q2 = (FmpQuarter) null; @@ -145,7 +145,7 @@ void compareTo_null_throws() { } @Test - void compareTo_less_than() { + void compare_to_less_than() { // given var q1 = quarter(1); var q2 = quarter(2); @@ -158,7 +158,7 @@ void compareTo_less_than() { } @Test - void compareTo_greater_than() { + void compare_to_greater_than() { // given var q1 = quarter(2); var q2 = quarter(1); @@ -171,7 +171,7 @@ void compareTo_greater_than() { } @Test - void compareTo_equal() { + void compare_to_equal() { // given var q1 = quarter(1); var q2 = quarter(1); diff --git a/src/test/java/dev/sorn/fmp4j/types/FmpSymbolTest.java b/src/test/java/dev/sorn/fmp4j/types/FmpSymbolTest.java index 082943d1..91724945 100644 --- a/src/test/java/dev/sorn/fmp4j/types/FmpSymbolTest.java +++ b/src/test/java/dev/sorn/fmp4j/types/FmpSymbolTest.java @@ -49,7 +49,7 @@ void is_serializable() throws IOException, ClassNotFoundException { } @Test - void toString_returns_value() { + void to_string_returns_value() { // given var s = symbol("AAPL"); @@ -61,7 +61,7 @@ void toString_returns_value() { } @Test - void hashCode_value() { + void hash_code_value() { // given var str = "AAPL"; var s = symbol(str); @@ -138,7 +138,7 @@ void equals_wrong_instance_false() { } @Test - void compareTo_null_throws() { + void compare_to_null_throws() { // given var s1 = symbol("AAPL"); var s2 = (FmpSymbol) null; @@ -149,7 +149,7 @@ void compareTo_null_throws() { } @Test - void compareTo_less_than() { + void compare_to_less_than() { // given var s1 = symbol("A"); var s2 = symbol("B"); @@ -162,7 +162,7 @@ void compareTo_less_than() { } @Test - void compareTo_greater_than() { + void compare_to_greater_than() { // given var s1 = symbol("B"); var s2 = symbol("A"); @@ -175,7 +175,7 @@ void compareTo_greater_than() { } @Test - void compareTo_equal() { + void compare_to_equal() { // given var s1 = symbol("A"); var s2 = symbol("A"); @@ -214,7 +214,8 @@ void invalid_symbols(String value) { @Test void check_all_symbols() { // How to set up: - // 1. Download JSON: https://financialmodelingprep.com/stable/financial-statement-symbol-list?apikey=yourapikey + // 1. Download JSON: + // https://financialmodelingprep.com/stable/financial-statement-symbol-list?apikey=yourapikey // 2. Add it to `testFixtures/resources/stable/financial-statement-symbol-list/full.json` // 3. Open the file // 4. Replace (CMD+R) diff --git a/src/test/java/dev/sorn/fmp4j/types/FmpYearTest.java b/src/test/java/dev/sorn/fmp4j/types/FmpYearTest.java index 745b0012..8e0c0de7 100644 --- a/src/test/java/dev/sorn/fmp4j/types/FmpYearTest.java +++ b/src/test/java/dev/sorn/fmp4j/types/FmpYearTest.java @@ -67,7 +67,7 @@ void toString_returns_value(int year) { } @Test - void hashCode_value() { + void hash_code_value() { // given var year = 2000; var y = year(year); @@ -144,7 +144,7 @@ void equals_wrong_instance_false() { } @Test - void compareTo_null_throws() { + void compare_to_null_throws() { // given var y1 = year("1999"); var y2 = (FmpYear) null; @@ -155,7 +155,7 @@ void compareTo_null_throws() { } @Test - void compareTo_less_than() { + void compare_to_less_than() { // given var y1 = year("1999"); var y2 = year("2000"); @@ -168,7 +168,7 @@ void compareTo_less_than() { } @Test - void compareTo_greater_than() { + void compare_to_greater_than() { // given var y1 = year("2000"); var y2 = year("1999"); @@ -181,7 +181,7 @@ void compareTo_greater_than() { } @Test - void compareTo_equal() { + void compare_to_equal() { // given var y1 = year("1999"); var y2 = year("1999");