Files
plusone-commons/src/test/java/xyz/zhouxy/plusone/commons/time/YearQuarterTests.java

1177 lines
44 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* Copyright 2024-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package xyz.zhouxy.plusone.commons.time;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
import lombok.extern.slf4j.Slf4j;
import java.time.DateTimeException;
import java.time.LocalDate;
import java.time.Month;
import java.time.Year;
import java.time.YearMonth;
import java.util.Calendar;
import java.util.Date;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotEquals;
import static org.junit.jupiter.api.Assertions.assertSame;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
@Slf4j
public class YearQuarterTests {
// ================================
// #region - of(int year, int quarter)
// ================================
@ParameterizedTest
@ValueSource(ints = { 1, 2, 3, 4 })
void of_ValidYearAndQuarterValue_CreatesYearQuarter(int quarter) {
{
int year = 2024;
YearQuarter yearQuarter = YearQuarter.of(year, quarter);
log.info("{}", yearQuarter);
assertEquals(year, yearQuarter.getYear());
assertEquals(Quarter.of(quarter), yearQuarter.getQuarter());
assertEquals(quarter, yearQuarter.getQuarterValue());
}
{
int year = Year.MIN_VALUE;
YearQuarter yearQuarter = YearQuarter.of(year, quarter);
assertEquals(year, yearQuarter.getYear());
assertEquals(Quarter.of(quarter), yearQuarter.getQuarter());
assertEquals(quarter, yearQuarter.getQuarterValue());
}
{
int year = Year.MAX_VALUE;
YearQuarter yearQuarter = YearQuarter.of(year, quarter);
assertEquals(year, yearQuarter.getYear());
assertEquals(Quarter.of(quarter), yearQuarter.getQuarter());
assertEquals(quarter, yearQuarter.getQuarterValue());
}
}
@ParameterizedTest
@ValueSource(ints = { -1, 0, 5, 108 })
void of_ValidYearAndInvalidQuarterValue_DateTimeException(int quarter) {
int year = 2024;
assertThrows(DateTimeException.class, () -> {
YearQuarter.of(year, quarter);
});
}
@ParameterizedTest
@ValueSource(ints = { Year.MIN_VALUE - 1, Year.MAX_VALUE + 1 })
void of_InvalidYearAndValidQuarterValue_DateTimeException(int year) {
assertThrows(DateTimeException.class, () -> {
YearQuarter.of(year, 1);
});
assertThrows(DateTimeException.class, () -> {
YearQuarter.of(year, 2);
});
assertThrows(DateTimeException.class, () -> {
YearQuarter.of(year, 3);
});
assertThrows(DateTimeException.class, () -> {
YearQuarter.of(year, 4);
});
}
@Test
void of_InvalidYearAndInvalidQuarterValue_DateTimeException() {
final int[] years = { Year.MIN_VALUE - 1, Year.MAX_VALUE + 1 };
final int[] quarters = { -1, 0, 5, 108 };
for (int year : years) {
final int yearValue = year;
for (int quarter : quarters) {
final int quarterValue = quarter;
assertThrows(DateTimeException.class,
() -> YearQuarter.of(yearValue, quarterValue));
}
}
}
// ================================
// #endregion - of(int year, int quarter)
// ================================
// ================================
// #region - of(int year, Quarter quarter)
// ================================
@ParameterizedTest
@ValueSource(ints = { 1, 2, 3, 4 })
void of_ValidYearAndQuarter_CreatesYearQuarter(int quarterValue) {
{
int year = 2024;
Quarter quarter = Quarter.of(quarterValue);
YearQuarter yearQuarter = YearQuarter.of(year, quarter);
log.info("{}", yearQuarter);
assertEquals(year, yearQuarter.getYear());
assertEquals(quarter, yearQuarter.getQuarter());
assertEquals(quarterValue, yearQuarter.getQuarterValue());
}
{
int year = Year.MIN_VALUE;
Quarter quarter = Quarter.of(quarterValue);
YearQuarter yearQuarter = YearQuarter.of(year, quarter);
assertEquals(year, yearQuarter.getYear());
assertEquals(quarter, yearQuarter.getQuarter());
assertEquals(quarterValue, yearQuarter.getQuarterValue());
}
{
int year = Year.MAX_VALUE;
Quarter quarter = Quarter.of(quarterValue);
YearQuarter yearQuarter = YearQuarter.of(year, quarter);
assertEquals(year, yearQuarter.getYear());
assertEquals(quarter, yearQuarter.getQuarter());
assertEquals(quarterValue, yearQuarter.getQuarterValue());
}
}
@Test
void of_ValidYearAndNullQuarter_NullPointerException() {
int year = 2024;
assertThrows(NullPointerException.class, () -> {
YearQuarter.of(year, null);
});
}
@ParameterizedTest
@ValueSource(ints = { Year.MIN_VALUE - 1, Year.MAX_VALUE + 1 })
void of_InvalidYearAndValidQuarter_DateTimeException(int year) {
assertThrows(DateTimeException.class, () -> {
YearQuarter.of(year, Quarter.Q1);
});
assertThrows(DateTimeException.class, () -> {
YearQuarter.of(year, Quarter.Q2);
});
assertThrows(DateTimeException.class, () -> {
YearQuarter.of(year, Quarter.Q3);
});
assertThrows(DateTimeException.class, () -> {
YearQuarter.of(year, Quarter.Q4);
});
}
@Test
void of_InvalidYearAndNullQuarter_DateTimeException() {
final int[] years = { Year.MIN_VALUE - 1, Year.MAX_VALUE + 1 };
for (int year : years) {
final int yearValue = year;
assertThrows(DateTimeException.class,
() -> YearQuarter.of(yearValue, null));
}
}
// ================================
// #endregion - of(int year, Quarter quarter)
// ================================
// ================================
// #region - of(LocalDate date)
// ================================
@ParameterizedTest
@ValueSource(ints = {
2023, // 非闰年
2024, // 闰年
Year.MIN_VALUE,
Year.MAX_VALUE,
})
void of_ValidLocalDate_CreatesYearQuarter_Q1(int year) {
{
LocalDate date = YearMonth.of(year, 1).atDay(1);
YearQuarter yq = YearQuarter.of(date);
assertEquals(year, yq.getYear());
assertEquals(1, yq.getQuarterValue());
assertSame(Quarter.Q1, yq.getQuarter());
}
{
LocalDate date = YearMonth.of(year, 1).atEndOfMonth();
YearQuarter yq = YearQuarter.of(date);
assertEquals(year, yq.getYear());
assertEquals(1, yq.getQuarterValue());
assertSame(Quarter.Q1, yq.getQuarter());
}
{
LocalDate date = YearMonth.of(year, 2).atDay(1);
YearQuarter yq = YearQuarter.of(date);
assertEquals(year, yq.getYear());
assertEquals(1, yq.getQuarterValue());
assertSame(Quarter.Q1, yq.getQuarter());
}
{
LocalDate date = YearMonth.of(year, 2).atEndOfMonth();
YearQuarter yq = YearQuarter.of(date);
assertEquals(year, yq.getYear());
assertEquals(1, yq.getQuarterValue());
assertSame(Quarter.Q1, yq.getQuarter());
}
{
LocalDate date = YearMonth.of(year, 3).atDay(1);
YearQuarter yq = YearQuarter.of(date);
assertEquals(year, yq.getYear());
assertEquals(1, yq.getQuarterValue());
assertSame(Quarter.Q1, yq.getQuarter());
}
{
LocalDate date = YearMonth.of(year, 3).atEndOfMonth();
YearQuarter yq = YearQuarter.of(date);
assertEquals(year, yq.getYear());
assertEquals(1, yq.getQuarterValue());
assertSame(Quarter.Q1, yq.getQuarter());
}
}
@ParameterizedTest
@ValueSource(ints = {
2023, // 非闰年
2024, // 闰年
Year.MIN_VALUE,
Year.MAX_VALUE,
})
void of_ValidLocalDate_CreatesYearQuarter_Q2(int year) {
{
LocalDate date = YearMonth.of(year, 4).atDay(1);
YearQuarter yq = YearQuarter.of(date);
assertEquals(year, yq.getYear());
assertEquals(2, yq.getQuarterValue());
assertSame(Quarter.Q2, yq.getQuarter());
}
{
LocalDate date = YearMonth.of(year, 4).atEndOfMonth();
YearQuarter yq = YearQuarter.of(date);
assertEquals(year, yq.getYear());
assertEquals(2, yq.getQuarterValue());
assertSame(Quarter.Q2, yq.getQuarter());
}
{
LocalDate date = YearMonth.of(year, 5).atDay(1);
YearQuarter yq = YearQuarter.of(date);
assertEquals(year, yq.getYear());
assertEquals(2, yq.getQuarterValue());
assertSame(Quarter.Q2, yq.getQuarter());
}
{
LocalDate date = YearMonth.of(year, 5).atEndOfMonth();
YearQuarter yq = YearQuarter.of(date);
assertEquals(year, yq.getYear());
assertEquals(2, yq.getQuarterValue());
assertSame(Quarter.Q2, yq.getQuarter());
}
{
LocalDate date = YearMonth.of(year, 6).atDay(1);
YearQuarter yq = YearQuarter.of(date);
assertEquals(year, yq.getYear());
assertEquals(2, yq.getQuarterValue());
assertSame(Quarter.Q2, yq.getQuarter());
}
{
LocalDate date = YearMonth.of(year, 6).atEndOfMonth();
YearQuarter yq = YearQuarter.of(date);
assertEquals(year, yq.getYear());
assertEquals(2, yq.getQuarterValue());
assertSame(Quarter.Q2, yq.getQuarter());
}
}
@ParameterizedTest
@ValueSource(ints = {
2023, // 非闰年
2024, // 闰年
Year.MIN_VALUE,
Year.MAX_VALUE,
})
void of_ValidLocalDate_CreatesYearQuarter_Q3(int year) {
{
LocalDate date = YearMonth.of(year, 7).atDay(1);
YearQuarter yq = YearQuarter.of(date);
assertEquals(year, yq.getYear());
assertEquals(3, yq.getQuarterValue());
assertSame(Quarter.Q3, yq.getQuarter());
}
{
LocalDate date = YearMonth.of(year, 7).atEndOfMonth();
YearQuarter yq = YearQuarter.of(date);
assertEquals(year, yq.getYear());
assertEquals(3, yq.getQuarterValue());
assertSame(Quarter.Q3, yq.getQuarter());
}
{
LocalDate date = YearMonth.of(year, 8).atDay(1);
YearQuarter yq = YearQuarter.of(date);
assertEquals(year, yq.getYear());
assertEquals(3, yq.getQuarterValue());
assertSame(Quarter.Q3, yq.getQuarter());
}
{
LocalDate date = YearMonth.of(year, 8).atEndOfMonth();
YearQuarter yq = YearQuarter.of(date);
assertEquals(year, yq.getYear());
assertEquals(3, yq.getQuarterValue());
assertSame(Quarter.Q3, yq.getQuarter());
}
{
LocalDate date = YearMonth.of(year, 9).atDay(1);
YearQuarter yq = YearQuarter.of(date);
assertEquals(year, yq.getYear());
assertEquals(3, yq.getQuarterValue());
assertSame(Quarter.Q3, yq.getQuarter());
}
{
LocalDate date = YearMonth.of(year, 9).atEndOfMonth();
YearQuarter yq = YearQuarter.of(date);
assertEquals(year, yq.getYear());
assertEquals(3, yq.getQuarterValue());
assertSame(Quarter.Q3, yq.getQuarter());
}
}
@ParameterizedTest
@ValueSource(ints = {
2023, // 非闰年
2024, // 闰年
Year.MIN_VALUE,
Year.MAX_VALUE,
})
void of_ValidLocalDate_CreatesYearQuarter_Q4(int year) {
{
LocalDate date = YearMonth.of(year, 10).atDay(1);
YearQuarter yq = YearQuarter.of(date);
assertEquals(year, yq.getYear());
assertEquals(4, yq.getQuarterValue());
assertSame(Quarter.Q4, yq.getQuarter());
}
{
LocalDate date = YearMonth.of(year, 10).atEndOfMonth();
YearQuarter yq = YearQuarter.of(date);
assertEquals(year, yq.getYear());
assertEquals(4, yq.getQuarterValue());
assertSame(Quarter.Q4, yq.getQuarter());
}
{
LocalDate date = YearMonth.of(year, 11).atDay(1);
YearQuarter yq = YearQuarter.of(date);
assertEquals(year, yq.getYear());
assertEquals(4, yq.getQuarterValue());
assertSame(Quarter.Q4, yq.getQuarter());
}
{
LocalDate date = YearMonth.of(year, 11).atEndOfMonth();
YearQuarter yq = YearQuarter.of(date);
assertEquals(year, yq.getYear());
assertEquals(4, yq.getQuarterValue());
assertSame(Quarter.Q4, yq.getQuarter());
}
{
LocalDate date = YearMonth.of(year, 12).atDay(1);
YearQuarter yq = YearQuarter.of(date);
assertEquals(year, yq.getYear());
assertEquals(4, yq.getQuarterValue());
assertSame(Quarter.Q4, yq.getQuarter());
}
{
LocalDate date = YearMonth.of(year, 12).atEndOfMonth();
YearQuarter yq = YearQuarter.of(date);
assertEquals(year, yq.getYear());
assertEquals(4, yq.getQuarterValue());
assertSame(Quarter.Q4, yq.getQuarter());
}
}
@Test
void of_NullLocalDate_NullPointerException() {
LocalDate date = null;
assertThrows(NullPointerException.class, () -> {
YearQuarter.of(date);
});
}
// ================================
// #endregion - of(LocalDate date)
// ================================
// ================================
// #region - of(Date date)
// ================================
@SuppressWarnings("deprecation")
@ParameterizedTest
@ValueSource(ints = {
2023, // 非闰年
2024, // 闰年
1,
999999,
})
void of_ValidDate_CreatesYearQuarter(int year) {
{
Date date = new Date(year - 1900, 1 - 1, 1);
YearQuarter yq = YearQuarter.of(date);
assertEquals(year, yq.getYear());
assertEquals(1, yq.getQuarterValue());
assertSame(Quarter.Q1, yq.getQuarter());
}
{
Date date = new Date(year - 1900, 3 - 1, 31, 23, 59, 59);
YearQuarter yq = YearQuarter.of(date);
assertEquals(year, yq.getYear());
assertEquals(1, yq.getQuarterValue());
assertSame(Quarter.Q1, yq.getQuarter());
}
{
Date date = new Date(year - 1900, 4 - 1, 1);
YearQuarter yq = YearQuarter.of(date);
assertEquals(year, yq.getYear());
assertEquals(2, yq.getQuarterValue());
assertSame(Quarter.Q2, yq.getQuarter());
}
{
Date date = new Date(year - 1900, 6 - 1, 30, 23, 59, 59);
YearQuarter yq = YearQuarter.of(date);
assertEquals(year, yq.getYear());
assertEquals(2, yq.getQuarterValue());
assertSame(Quarter.Q2, yq.getQuarter());
}
{
Date date = new Date(year - 1900, 7 - 1, 1);
YearQuarter yq = YearQuarter.of(date);
assertEquals(year, yq.getYear());
assertEquals(3, yq.getQuarterValue());
assertSame(Quarter.Q3, yq.getQuarter());
}
{
Date date = new Date(year - 1900, 9 - 1, 30, 23, 59, 59);
YearQuarter yq = YearQuarter.of(date);
assertEquals(year, yq.getYear());
assertEquals(3, yq.getQuarterValue());
assertSame(Quarter.Q3, yq.getQuarter());
}
{
Date date = new Date(year - 1900, 10 - 1, 1);
YearQuarter yq = YearQuarter.of(date);
assertEquals(year, yq.getYear());
assertEquals(4, yq.getQuarterValue());
assertSame(Quarter.Q4, yq.getQuarter());
}
{
Date date = new Date(year - 1900, 12 - 1, 31, 23, 59, 59);
YearQuarter yq = YearQuarter.of(date);
assertEquals(year, yq.getYear());
assertEquals(4, yq.getQuarterValue());
assertSame(Quarter.Q4, yq.getQuarter());
}
}
@Test
void of_NullDate_NullPointerException() {
Date date = null;
assertThrows(NullPointerException.class, () -> {
YearQuarter.of(date);
});
}
// ================================
// #endregion - of(Date date)
// ================================
// ================================
// #region - of(Calendar date)
// ================================
@ParameterizedTest
@ValueSource(ints = {
2023, // 非闰年
2024, // 闰年
1,
999999,
})
void of_ValidCalendar_CreatesYearQuarter(int year) {
Calendar date = Calendar.getInstance();
{
date.set(year, 1 - 1, 1);
YearQuarter yq = YearQuarter.of(date);
assertEquals(year, yq.getYear());
assertEquals(1, yq.getQuarterValue());
assertSame(Quarter.Q1, yq.getQuarter());
}
{
date.set(year, 3 - 1, 31, 23, 59, 59);
YearQuarter yq = YearQuarter.of(date);
assertEquals(year, yq.getYear());
assertEquals(1, yq.getQuarterValue());
assertSame(Quarter.Q1, yq.getQuarter());
}
{
date.set(year, 4 - 1, 1);
YearQuarter yq = YearQuarter.of(date);
assertEquals(year, yq.getYear());
assertEquals(2, yq.getQuarterValue());
assertSame(Quarter.Q2, yq.getQuarter());
}
{
date.set(year, 6 - 1, 30, 23, 59, 59);
YearQuarter yq = YearQuarter.of(date);
assertEquals(year, yq.getYear());
assertEquals(2, yq.getQuarterValue());
assertSame(Quarter.Q2, yq.getQuarter());
}
{
date.set(year, 7 - 1, 1);
YearQuarter yq = YearQuarter.of(date);
assertEquals(year, yq.getYear());
assertEquals(3, yq.getQuarterValue());
assertSame(Quarter.Q3, yq.getQuarter());
}
{
date.set(year, 9 - 1, 30, 23, 59, 59);
YearQuarter yq = YearQuarter.of(date);
assertEquals(year, yq.getYear());
assertEquals(3, yq.getQuarterValue());
assertSame(Quarter.Q3, yq.getQuarter());
}
{
date.set(year, 10 - 1, 1);
YearQuarter yq = YearQuarter.of(date);
assertEquals(year, yq.getYear());
assertEquals(4, yq.getQuarterValue());
assertSame(Quarter.Q4, yq.getQuarter());
}
{
date.set(year, 12 - 1, 31, 23, 59, 59);
YearQuarter yq = YearQuarter.of(date);
assertEquals(year, yq.getYear());
assertEquals(4, yq.getQuarterValue());
assertSame(Quarter.Q4, yq.getQuarter());
}
}
@Test
void of_NullCalendar_NullPointerException() {
Calendar date = null;
assertThrows(NullPointerException.class, () -> {
YearQuarter.of(date);
});
}
// ================================
// #endregion - of(Calendar date)
// ================================
// ================================
// #region - of(YearMonth yearMonth)
// ================================
@ParameterizedTest
@ValueSource(ints = {
2023, // 非闰年
2024, // 闰年
Year.MIN_VALUE,
Year.MAX_VALUE,
})
void of_ValidYearMonth_CreatesYearMnoth_Q1(int year) {
{
YearMonth yearMonth = YearMonth.of(year, 1);
YearQuarter yearQuarter = YearQuarter.of(yearMonth);
assertEquals(year, yearQuarter.getYear());
assertEquals(1, yearQuarter.getQuarterValue());
assertSame(Quarter.Q1, yearQuarter.getQuarter());
}
{
YearMonth yearMonth = YearMonth.of(year, 2);
YearQuarter yearQuarter = YearQuarter.of(yearMonth);
assertEquals(year, yearQuarter.getYear());
assertEquals(1, yearQuarter.getQuarterValue());
assertSame(Quarter.Q1, yearQuarter.getQuarter());
}
{
YearMonth yearMonth = YearMonth.of(year, 3);
YearQuarter yearQuarter = YearQuarter.of(yearMonth);
assertEquals(year, yearQuarter.getYear());
assertEquals(1, yearQuarter.getQuarterValue());
assertSame(Quarter.Q1, yearQuarter.getQuarter());
}
}
@ParameterizedTest
@ValueSource(ints = {
2023, // 非闰年
2024, // 闰年
Year.MIN_VALUE,
Year.MAX_VALUE,
})
void of_ValidYearMonth_CreatesYearMnoth_Q2(int year) {
{
YearMonth yearMonth = YearMonth.of(year, 4);
YearQuarter yearQuarter = YearQuarter.of(yearMonth);
assertEquals(year, yearQuarter.getYear());
assertEquals(2, yearQuarter.getQuarterValue());
assertSame(Quarter.Q2, yearQuarter.getQuarter());
}
{
YearMonth yearMonth = YearMonth.of(year, 5);
YearQuarter yearQuarter = YearQuarter.of(yearMonth);
assertEquals(year, yearQuarter.getYear());
assertEquals(2, yearQuarter.getQuarterValue());
assertSame(Quarter.Q2, yearQuarter.getQuarter());
}
{
YearMonth yearMonth = YearMonth.of(year, 6);
YearQuarter yearQuarter = YearQuarter.of(yearMonth);
assertEquals(year, yearQuarter.getYear());
assertEquals(2, yearQuarter.getQuarterValue());
assertSame(Quarter.Q2, yearQuarter.getQuarter());
}
}
@ParameterizedTest
@ValueSource(ints = {
2023, // 非闰年
2024, // 闰年
Year.MIN_VALUE,
Year.MAX_VALUE,
})
void of_ValidYearMonth_CreatesYearMnoth_Q3(int year) {
{
YearMonth yearMonth = YearMonth.of(year, 7);
YearQuarter yearQuarter = YearQuarter.of(yearMonth);
assertEquals(year, yearQuarter.getYear());
assertEquals(3, yearQuarter.getQuarterValue());
assertSame(Quarter.Q3, yearQuarter.getQuarter());
}
{
YearMonth yearMonth = YearMonth.of(year, 8);
YearQuarter yearQuarter = YearQuarter.of(yearMonth);
assertEquals(year, yearQuarter.getYear());
assertEquals(3, yearQuarter.getQuarterValue());
assertSame(Quarter.Q3, yearQuarter.getQuarter());
}
{
YearMonth yearMonth = YearMonth.of(year, 9);
YearQuarter yearQuarter = YearQuarter.of(yearMonth);
assertEquals(year, yearQuarter.getYear());
assertEquals(3, yearQuarter.getQuarterValue());
assertSame(Quarter.Q3, yearQuarter.getQuarter());
}
}
@ParameterizedTest
@ValueSource(ints = {
2023, // 非闰年
2024, // 闰年
Year.MIN_VALUE,
Year.MAX_VALUE,
})
void of_ValidYearMonth_CreatesYearMnoth_Q4(int year) {
{
YearMonth yearMonth = YearMonth.of(year, 10);
YearQuarter yearQuarter = YearQuarter.of(yearMonth);
assertEquals(year, yearQuarter.getYear());
assertEquals(4, yearQuarter.getQuarterValue());
assertSame(Quarter.Q4, yearQuarter.getQuarter());
}
{
YearMonth yearMonth = YearMonth.of(year, 11);
YearQuarter yearQuarter = YearQuarter.of(yearMonth);
assertEquals(year, yearQuarter.getYear());
assertEquals(4, yearQuarter.getQuarterValue());
assertSame(Quarter.Q4, yearQuarter.getQuarter());
}
{
YearMonth yearMonth = YearMonth.of(year, 12);
YearQuarter yearQuarter = YearQuarter.of(yearMonth);
assertEquals(year, yearQuarter.getYear());
assertEquals(4, yearQuarter.getQuarterValue());
assertSame(Quarter.Q4, yearQuarter.getQuarter());
}
}
@ParameterizedTest
@ValueSource(ints = {
2023, // 非闰年
2024, // 闰年
Year.MIN_VALUE,
Year.MAX_VALUE,
})
void of_NullYearMonth_CreatesYearMnoth_Q4(int year) {
YearMonth yearMonth = null;
assertThrows(NullPointerException.class,
() -> YearQuarter.of(yearMonth));
}
// ================================
// #endregion - of(YearMonth yearMonth)
// ================================
// ================================
// #region - firstDate & lastDate
// ================================
@ParameterizedTest
@ValueSource(ints = { 1949, 1990, 2000, 2008, 2023, 2024, Year.MIN_VALUE, Year.MAX_VALUE })
void test_getFirstDate_And_getLastDate(int year) {
{
final int quarterValue = 1;
YearQuarter yearQuarter = YearQuarter.of(year, quarterValue);
LocalDate expectedFirstDate = LocalDate.of(year, 1, 1);
log.info("{} - expectedFirstDate: {}", yearQuarter, expectedFirstDate);
LocalDate expectedLastDate = LocalDate.of(year, 3, 31);
log.info("{} - expectedLastDate: {}", yearQuarter, expectedLastDate);
assertEquals(expectedFirstDate, yearQuarter.firstDate());
assertEquals(expectedLastDate, yearQuarter.lastDate());
}
{
final int quarterValue = 2;
YearQuarter yearQuarter = YearQuarter.of(year, quarterValue);
LocalDate expectedFirstDate = LocalDate.of(year, 4, 1);
log.info("{} - expectedFirstDate: {}", yearQuarter, expectedFirstDate);
LocalDate expectedLastDate = LocalDate.of(year, 6, 30);
log.info("{} - expectedLastDate: {}", yearQuarter, expectedLastDate);
assertEquals(expectedFirstDate, yearQuarter.firstDate());
assertEquals(expectedLastDate, yearQuarter.lastDate());
}
{
final int quarterValue = 3;
YearQuarter yearQuarter = YearQuarter.of(year, quarterValue);
LocalDate expectedFirstDate = LocalDate.of(year, 7, 1);
log.info("{} - expectedFirstDate: {}", yearQuarter, expectedFirstDate);
LocalDate expectedLastDate = LocalDate.of(year, 9, 30);
log.info("{} - expectedLastDate: {}", yearQuarter, expectedLastDate);
assertEquals(expectedFirstDate, yearQuarter.firstDate());
assertEquals(expectedLastDate, yearQuarter.lastDate());
}
{
final int quarterValue = 4;
YearQuarter yearQuarter = YearQuarter.of(year, quarterValue);
LocalDate expectedFirstDate = LocalDate.of(year, 10, 1);
log.info("{} - expectedFirstDate: {}", yearQuarter, expectedFirstDate);
LocalDate expectedLastDate = LocalDate.of(year, 12, 31);
log.info("{} - expectedLastDate: {}", yearQuarter, expectedLastDate);
assertEquals(expectedFirstDate, yearQuarter.firstDate());
assertEquals(expectedLastDate, yearQuarter.lastDate());
}
}
// ================================
// #endregion - firstDate & lastDate
// ================================
// ================================
// #region - firstYearMonth & lastYearMonth
// ================================
@ParameterizedTest
@ValueSource(ints = { 1949, 1990, 2000, 2008, 2023, 2024, Year.MIN_VALUE, Year.MAX_VALUE })
void test_firstYearMonth_And_lastYearMonth(int year) {
YearQuarter yq;
yq = YearQuarter.of(year, Quarter.Q1);
assertEquals(YearMonth.of(year, 1), yq.firstYearMonth());
yq = YearQuarter.of(year, Quarter.Q2);
assertEquals(YearMonth.of(year, 4), yq.firstYearMonth());
yq = YearQuarter.of(year, Quarter.Q3);
assertEquals(YearMonth.of(year, 7), yq.firstYearMonth());
yq = YearQuarter.of(year, Quarter.Q4);
assertEquals(YearMonth.of(year, 10), yq.firstYearMonth());
yq = YearQuarter.of(year, Quarter.Q1);
assertEquals(YearMonth.of(year, 3), yq.lastYearMonth());
yq = YearQuarter.of(year, Quarter.Q2);
assertEquals(YearMonth.of(year, 6), yq.lastYearMonth());
yq = YearQuarter.of(year, Quarter.Q3);
assertEquals(YearMonth.of(year, 9), yq.lastYearMonth());
yq = YearQuarter.of(year, Quarter.Q4);
assertEquals(YearMonth.of(year, 12), yq.lastYearMonth());
}
// ================================
// #endregion - firstYearMonth & lastYearMonth
// ================================
// ================================
// #region - firstMonth & lastMonth
// ================================
@ParameterizedTest
@ValueSource(ints = { 1949, 1990, 2000, 2008, 2023, 2024, Year.MIN_VALUE, Year.MAX_VALUE })
void testFirstMonthAndLastMonth(int year) {
YearQuarter q1 = YearQuarter.of(year, 1);
assertEquals(1, q1.firstMonthValue());
assertEquals(Month.JANUARY, q1.firstMonth());
assertEquals(3, q1.lastMonthValue());
assertEquals(Month.MARCH, q1.lastMonth());
YearQuarter q2 = YearQuarter.of(year, 2);
assertEquals(4, q2.firstMonthValue());
assertEquals(Month.APRIL, q2.firstMonth());
assertEquals(6, q2.lastMonthValue());
assertEquals(Month.JUNE, q2.lastMonth());
YearQuarter q3 = YearQuarter.of(year, 3);
assertEquals(7, q3.firstMonthValue());
assertEquals(Month.JULY, q3.firstMonth());
assertEquals(9, q3.lastMonthValue());
assertEquals(Month.SEPTEMBER, q3.lastMonth());
YearQuarter q4 = YearQuarter.of(year, 4);
assertEquals(10, q4.firstMonthValue());
assertEquals(Month.OCTOBER, q4.firstMonth());
assertEquals(12, q4.lastMonthValue());
assertEquals(Month.DECEMBER, q4.lastMonth());
}
// ================================
// #endregion - firstMonth & lastMonth
// ================================
// ================================
// #region - compareTo
// ================================
@Test
void testCompareTo() {
int year1;
int quarter1;
YearQuarter yearQuarter1;
year1 = 2024;
quarter1 = 1;
yearQuarter1 = YearQuarter.of(year1, Quarter.of(quarter1));
for (int year2 = 2000; year2 <= 2050; year2++) {
for (int quarter2 = 1; quarter2 <= 4; quarter2++) {
YearQuarter yearQuarter2 = YearQuarter.of(year2, Quarter.of(quarter2));
if (year1 == year2) {
// 同年
assertEquals(quarter1 - quarter2, yearQuarter1.compareTo(yearQuarter2));
if (quarter1 == quarter2) {
// 同年同季度
assertEquals(yearQuarter1, yearQuarter2);
assertEquals(0, yearQuarter1.compareTo(yearQuarter2));
} else if (quarter1 < quarter2) {
assertNotEquals(yearQuarter1, yearQuarter2);
assertTrue(yearQuarter1.isBefore(yearQuarter2));
assertFalse(yearQuarter1.isAfter(yearQuarter2));
assertFalse(yearQuarter2.isBefore(yearQuarter1));
assertTrue(yearQuarter2.isAfter(yearQuarter1));
} else if (quarter1 > quarter2) {
assertNotEquals(yearQuarter1, yearQuarter2);
assertFalse(yearQuarter1.isBefore(yearQuarter2));
assertTrue(yearQuarter1.isAfter(yearQuarter2));
assertTrue(yearQuarter2.isBefore(yearQuarter1));
assertFalse(yearQuarter2.isAfter(yearQuarter1));
}
} else {
// 不同年
assertEquals(year1 - year2, yearQuarter1.compareTo(yearQuarter2));
assertNotEquals(0, yearQuarter1.compareTo(yearQuarter2));
if (year1 < year2) {
assertNotEquals(yearQuarter1, yearQuarter2);
assertTrue(yearQuarter1.isBefore(yearQuarter2));
assertFalse(yearQuarter1.isAfter(yearQuarter2));
assertFalse(yearQuarter2.isBefore(yearQuarter1));
assertTrue(yearQuarter2.isAfter(yearQuarter1));
} else if (year1 > year2) {
assertNotEquals(yearQuarter1, yearQuarter2);
assertFalse(yearQuarter1.isBefore(yearQuarter2));
assertTrue(yearQuarter1.isAfter(yearQuarter2));
assertTrue(yearQuarter2.isBefore(yearQuarter1));
assertFalse(yearQuarter2.isAfter(yearQuarter1));
}
}
}
}
}
// ================================
// #endregion - compareTo
// ================================
@ParameterizedTest
@ValueSource(ints = { Year.MIN_VALUE + 25, Year.MAX_VALUE - 25, -1, 0, 1, 1949, 1990, 2000, 2008, 2023, 2024 })
void testPlusQuartersAndMinusQuarters(int year) {
for (int quarter = 1; quarter <= 4; quarter++) {
YearQuarter yq1 = YearQuarter.of(year, quarter);
for (int quartersToAdd = -100; quartersToAdd <= 100; quartersToAdd++) {
YearQuarter plus = yq1.plusQuarters(quartersToAdd);
YearQuarter minus = yq1.minusQuarters(-quartersToAdd);
assertEquals(plus, minus);
// offset: 表示自 公元 0000年以来经历了多少季度。所以 0 表示 -0001,Q4; 1 表示 0000 Q1
long offset = (year * 4L + quarter) + quartersToAdd;
if (offset > 0) {
assertEquals((offset - 1) / 4, plus.getYear());
assertEquals(((offset - 1) % 4) + 1, plus.getQuarterValue());
} else {
assertEquals((offset / 4 - 1), plus.getYear());
assertEquals((4 + offset % 4), plus.getQuarterValue());
}
}
}
}
@ParameterizedTest
@ValueSource(ints = { Year.MIN_VALUE + 1, Year.MAX_VALUE - 1, -1, 0, 1, 1900, 1990, 2000, 2023, 2024 })
void test_nextQuarter_And_lastQuarter(int year) {
int quarter;
YearQuarter yq;
YearQuarter next;
YearQuarter last;
quarter = 1;
yq = YearQuarter.of(year, quarter);
next = yq.nextQuarter();
assertEquals(year, next.getYear());
assertEquals(2, next.getQuarterValue());
last = yq.lastQuarter();
assertEquals(year - 1, last.getYear());
assertEquals(4, last.getQuarterValue());
quarter = 2;
yq = YearQuarter.of(year, quarter);
next = yq.nextQuarter();
assertEquals(year, next.getYear());
assertEquals(3, next.getQuarterValue());
last = yq.lastQuarter();
assertEquals(year, last.getYear());
assertEquals(1, last.getQuarterValue());
quarter = 3;
yq = YearQuarter.of(year, quarter);
next = yq.nextQuarter();
assertEquals(year, next.getYear());
assertEquals(4, next.getQuarterValue());
last = yq.lastQuarter();
assertEquals(year, last.getYear());
assertEquals(2, last.getQuarterValue());
quarter = 4;
yq = YearQuarter.of(year, quarter);
next = yq.nextQuarter();
assertEquals(year + 1, next.getYear());
assertEquals(1, next.getQuarterValue());
last = yq.lastQuarter();
assertEquals(year, last.getYear());
assertEquals(3, last.getQuarterValue());
}
@ParameterizedTest
@ValueSource(ints = { Year.MIN_VALUE + 100, Year.MAX_VALUE - 100, -1, 0, 1, 1949, 1990, 2000, 2008, 2023, 2024 })
void test_PlusYearsAndMinusYears(int year) {
for (int yearToAdd = -100; yearToAdd <= 100; yearToAdd++) {
YearQuarter q1 = YearQuarter.of(year, Quarter.Q1);
YearQuarter plus = q1.plusYears(yearToAdd);
assertEquals(year + yearToAdd, plus.getYear());
assertEquals(Quarter.Q1, plus.getQuarter());
YearQuarter minus = q1.minusYears(yearToAdd);
assertEquals(Quarter.Q1, minus.getQuarter());
assertEquals(year - yearToAdd, minus.getYear());
assertEquals(q1.plusYears(yearToAdd), q1.minusYears(-yearToAdd));
}
}
@ParameterizedTest
@ValueSource(ints = { Year.MIN_VALUE + 1, Year.MAX_VALUE - 1, -1, 0, 1, 1900, 1990, 2000, 2023, 2024 })
void test_nextYear_And_lastYear(int year) {
int quarter;
YearQuarter yq;
YearQuarter next;
YearQuarter last;
quarter = 1;
yq = YearQuarter.of(year, quarter);
next = yq.nextYear();
assertSame(Quarter.Q1, yq.getQuarter());
assertEquals(year + 1, next.getYear());
assertSame(Quarter.Q1, next.getQuarter());
last = yq.lastYear();
assertEquals(year - 1, last.getYear());
assertSame(Quarter.Q1, last.getQuarter());
quarter = 2;
yq = YearQuarter.of(year, quarter);
next = yq.nextYear();
assertSame(Quarter.Q2, yq.getQuarter());
assertEquals(year + 1, next.getYear());
assertSame(Quarter.Q2, next.getQuarter());
last = yq.lastYear();
assertEquals(year - 1, last.getYear());
assertSame(Quarter.Q2, last.getQuarter());
quarter = 3;
yq = YearQuarter.of(year, quarter);
next = yq.nextYear();
assertSame(Quarter.Q3, yq.getQuarter());
assertEquals(year + 1, next.getYear());
assertSame(Quarter.Q3, next.getQuarter());
last = yq.lastYear();
assertEquals(year - 1, last.getYear());
assertSame(Quarter.Q3, last.getQuarter());
quarter = 4;
yq = YearQuarter.of(year, quarter);
next = yq.nextYear();
assertSame(Quarter.Q4, yq.getQuarter());
assertEquals(year + 1, next.getYear());
assertSame(Quarter.Q4, next.getQuarter());
last = yq.lastYear();
assertEquals(year - 1, last.getYear());
assertSame(Quarter.Q4, last.getQuarter());
}
@ParameterizedTest
@ValueSource(ints = { -1, 0, 1, 1900, 2000, 2023, 2024, Year.MAX_VALUE, Year.MIN_VALUE })
void test_compareTo_sameYear(int year) {
YearQuarter yq1 = YearQuarter.of(year, 1);
YearQuarter yq2 = YearQuarter.of(year, 2);
YearQuarter yq3 = YearQuarter.of(year, 3);
YearQuarter yq4 = YearQuarter.of(year, 4);
assertTrue(yq1.equals(YearQuarter.of(year, Quarter.Q1))); // NOSONAR
assertTrue(yq1.compareTo(yq1) == 0); // NOSONAR
assertTrue(yq1.compareTo(yq2) < 0);
assertTrue(yq1.compareTo(yq3) < 0);
assertTrue(yq1.compareTo(yq4) < 0);
assertTrue(yq2.equals(YearQuarter.of(year, Quarter.Q2))); // NOSONAR
assertTrue(yq2.compareTo(yq1) > 0);
assertTrue(yq2.compareTo(yq2) == 0); // NOSONAR
assertTrue(yq2.compareTo(yq3) < 0);
assertTrue(yq2.compareTo(yq4) < 0);
assertTrue(yq3.equals(YearQuarter.of(year, Quarter.Q3))); // NOSONAR
assertTrue(yq3.compareTo(yq1) > 0);
assertTrue(yq3.compareTo(yq2) > 0);
assertTrue(yq3.compareTo(yq3) == 0); // NOSONAR
assertTrue(yq3.compareTo(yq4) < 0);
assertTrue(yq4.equals(YearQuarter.of(year, Quarter.Q4))); // NOSONAR
assertTrue(yq4.compareTo(yq1) > 0);
assertTrue(yq4.compareTo(yq2) > 0);
assertTrue(yq4.compareTo(yq3) > 0);
assertTrue(yq4.compareTo(yq4) == 0); // NOSONAR
}
@ParameterizedTest
@ValueSource(ints = { -1, 0, 1, 1900, 2000, 2023, 2024, Year.MAX_VALUE, Year.MIN_VALUE })
void test_isBefore_sameYear(int year) {
YearQuarter yq1 = YearQuarter.of(year, 1);
YearQuarter yq2 = YearQuarter.of(year, 2);
YearQuarter yq3 = YearQuarter.of(year, 3);
YearQuarter yq4 = YearQuarter.of(year, 4);
assertFalse(yq1.isBefore(YearQuarter.of(year, Quarter.Q1)));
assertTrue(yq1.isBefore(yq2));
assertTrue(yq1.isBefore(yq3));
assertTrue(yq1.isBefore(yq4));
assertFalse(yq2.isBefore(yq1));
assertFalse(yq2.isBefore(YearQuarter.of(year, Quarter.Q2)));
assertTrue(yq2.isBefore(yq3));
assertTrue(yq2.isBefore(yq4));
assertFalse(yq3.isBefore(yq1));
assertFalse(yq3.isBefore(yq2));
assertFalse(yq3.isBefore(YearQuarter.of(year, Quarter.Q3)));
assertTrue(yq3.isBefore(yq4));
assertFalse(yq4.isBefore(yq1));
assertFalse(yq4.isBefore(yq2));
assertFalse(yq4.isBefore(yq3));
assertFalse(yq4.isBefore(YearQuarter.of(year, Quarter.Q4)));
}
@ParameterizedTest
@ValueSource(ints = { -1, 0, 1, 1900, 2000, 2023, 2024, Year.MAX_VALUE, Year.MIN_VALUE })
void test_isAfter_sameYear(int year) {
YearQuarter yq1 = YearQuarter.of(year, 1);
YearQuarter yq2 = YearQuarter.of(year, 2);
YearQuarter yq3 = YearQuarter.of(year, 3);
YearQuarter yq4 = YearQuarter.of(year, 4);
assertFalse(yq1.isAfter(YearQuarter.of(year, Quarter.Q1)));
assertFalse(yq1.isAfter(yq2));
assertFalse(yq1.isAfter(yq3));
assertFalse(yq1.isAfter(yq4));
assertTrue(yq2.isAfter(yq1));
assertFalse(yq2.isAfter(YearQuarter.of(year, Quarter.Q2)));
assertFalse(yq2.isAfter(yq3));
assertFalse(yq2.isAfter(yq4));
assertTrue(yq3.isAfter(yq1));
assertTrue(yq3.isAfter(yq2));
assertFalse(yq3.isAfter(YearQuarter.of(year, Quarter.Q3)));
assertFalse(yq3.isAfter(yq4));
assertTrue(yq4.isAfter(yq1));
assertTrue(yq4.isAfter(yq2));
assertTrue(yq4.isAfter(yq3));
assertFalse(yq4.isAfter(YearQuarter.of(year, Quarter.Q4)));
}
@Test
void test_compareTo_null() {
YearQuarter yq = YearQuarter.of(2024, 4);
assertThrows(NullPointerException.class,
() -> yq.compareTo(null));
assertThrows(NullPointerException.class,
() -> yq.isBefore(null));
assertThrows(NullPointerException.class,
() -> yq.isAfter(null));
assertNotEquals(null, yq);
}
@ParameterizedTest
@ValueSource(ints = { -1, 0, 1, 1900, 2000, 2023, 2024, Year.MAX_VALUE - 1, Year.MIN_VALUE + 1 })
void test_compareTo_differentYear(int year) {
for (int quarter1 = 1; quarter1 <= 4; quarter1++) {
YearQuarter yq = YearQuarter.of(year, quarter1);
for (int quarter2 = 1; quarter2 <= 4; quarter2++) {
// gt
assertTrue(yq.compareTo(YearQuarter.of(year + 1, quarter2)) < 0);
assertTrue(yq.isBefore(YearQuarter.of(year + 1, quarter2)));
assertTrue(YearQuarter.of(year + 1, quarter2).compareTo(yq) > 0);
assertTrue(YearQuarter.of(year + 1, quarter2).isAfter(yq));
// lt
assertTrue(yq.compareTo(YearQuarter.of(year - 1, quarter2)) > 0);
assertTrue(yq.isAfter(YearQuarter.of(year - 1, quarter2)));
assertTrue(YearQuarter.of(year - 1, quarter2).compareTo(yq) < 0);
assertTrue(YearQuarter.of(year - 1, quarter2).isBefore(yq));
}
}
}
}