blob: 71916c1762e12f0f52492f2d2841db4129b2e86f [file] [log] [blame]
/*
* Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package test.java.time.temporal;
import static java.time.temporal.ChronoField.DAY_OF_WEEK;
import static org.testng.Assert.assertEquals;
import java.time.LocalDate;
import java.time.LocalTime;
import java.time.MonthDay;
import java.time.OffsetDateTime;
import java.time.Year;
import java.time.chrono.ThaiBuddhistDate;
import java.time.temporal.ChronoUnit;
import java.time.temporal.IsoFields;
import java.time.temporal.TemporalField;
import java.time.temporal.ValueRange;
import java.time.temporal.WeekFields;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
/**
* Test.
*/
@Test
public class TestIsoWeekFields {
@DataProvider(name = "fields")
Object[][] data_Fields() {
return new Object[][] {
{IsoFields.WEEK_OF_WEEK_BASED_YEAR, IsoFields.WEEK_BASED_YEAR},
{WeekFields.ISO.weekOfWeekBasedYear(), WeekFields.ISO.weekBasedYear()},
};
}
//-----------------------------------------------------------------------
// WEEK_OF_WEEK_BASED_YEAR
//-----------------------------------------------------------------------
@Test(dataProvider = "fields")
public void test_WOWBY_basics(TemporalField weekField, TemporalField yearField) {
assertEquals(weekField.isDateBased(), true);
assertEquals(weekField.isTimeBased(), false);
assertEquals(weekField.getBaseUnit(), ChronoUnit.WEEKS);
assertEquals(weekField.getRangeUnit(), IsoFields.WEEK_BASED_YEARS);
}
@Test(dataProvider = "fields")
public void test_WOWBY_isSupportedBy(TemporalField weekField, TemporalField yearField) {
assertEquals(weekField.isSupportedBy(LocalTime.NOON), false);
assertEquals(weekField.isSupportedBy(MonthDay.of(2, 1)), false);
assertEquals(weekField.isSupportedBy(LocalDate.MIN), true);
assertEquals(weekField.isSupportedBy(OffsetDateTime.MAX), true);
}
@Test
public void test_WOWBY_isSupportedBy_fieldsDiffer() {
assertEquals(IsoFields.WEEK_OF_WEEK_BASED_YEAR.isSupportedBy(ThaiBuddhistDate.now()), false);
assertEquals(WeekFields.ISO.weekOfWeekBasedYear().isSupportedBy(ThaiBuddhistDate.now()), true);
}
@Test(dataProvider = "fields")
public void test_WOWBY_range(TemporalField weekField, TemporalField yearField) {
assertEquals(weekField.range(), ValueRange.of(1, 52, 53));
}
@Test(dataProvider = "fields")
public void test_WOWBY_rangeRefinedBy(TemporalField weekField, TemporalField yearField) {
assertEquals(weekField.rangeRefinedBy(LocalDate.of(2012, 12, 31)), ValueRange.of(1, 52));
assertEquals(weekField.rangeRefinedBy(LocalDate.of(2013, 12, 29)), ValueRange.of(1, 52));
assertEquals(weekField.rangeRefinedBy(LocalDate.of(2013, 12, 30)), ValueRange.of(1, 52));
assertEquals(weekField.rangeRefinedBy(LocalDate.of(2014, 12, 28)), ValueRange.of(1, 52));
assertEquals(weekField.rangeRefinedBy(LocalDate.of(2014, 12, 29)), ValueRange.of(1, 53));
assertEquals(weekField.rangeRefinedBy(LocalDate.of(2016, 1, 3)), ValueRange.of(1, 53));
assertEquals(weekField.rangeRefinedBy(LocalDate.of(2016, 1, 4)), ValueRange.of(1, 52));
}
//-----------------------------------------------------------------------
// WEEK_BASED_YEAR
//-----------------------------------------------------------------------
@Test(dataProvider = "fields")
public void test_WBY_basics(TemporalField weekField, TemporalField yearField) {
assertEquals(yearField.isDateBased(), true);
assertEquals(yearField.isTimeBased(), false);
assertEquals(yearField.getBaseUnit(), IsoFields.WEEK_BASED_YEARS);
assertEquals(yearField.getRangeUnit(), ChronoUnit.FOREVER);
}
@Test(dataProvider = "fields")
public void test_WBY_isSupportedBy(TemporalField weekField, TemporalField yearField) {
assertEquals(yearField.isSupportedBy(LocalTime.NOON), false);
assertEquals(yearField.isSupportedBy(MonthDay.of(2, 1)), false);
assertEquals(yearField.isSupportedBy(LocalDate.MIN), true);
assertEquals(yearField.isSupportedBy(OffsetDateTime.MAX), true);
}
@Test
public void test_WBY_isSupportedBy_ISO() {
assertEquals(IsoFields.WEEK_BASED_YEAR.isSupportedBy(ThaiBuddhistDate.now()), false);
}
@Test
public void test_Unit_isSupportedBy_ISO() {
assertEquals(IsoFields.WEEK_BASED_YEARS.isSupportedBy(LocalDate.now()),true);
assertEquals(IsoFields.WEEK_BASED_YEARS.isSupportedBy(ThaiBuddhistDate.now()),false);
assertEquals(IsoFields.QUARTER_YEARS.isSupportedBy(LocalDate.now()),true);
assertEquals(IsoFields.QUARTER_YEARS.isSupportedBy(ThaiBuddhistDate.now()),false);
}
@Test(dataProvider = "fields")
public void test_WBY_range(TemporalField weekField, TemporalField yearField) {
assertEquals(yearField.range(), ValueRange.of(Year.MIN_VALUE, Year.MAX_VALUE));
}
@Test(dataProvider = "fields")
public void test_WBY_rangeRefinedBy(TemporalField weekField, TemporalField yearField) {
assertEquals(yearField.rangeRefinedBy(LocalDate.of(2012, 12, 31)), ValueRange.of(Year.MIN_VALUE, Year.MAX_VALUE));
}
//-----------------------------------------------------------------------
@Test(dataProvider = "fields")
public void test_getFrom(TemporalField weekField, TemporalField yearField) {
// tests every day from 2011 to 2016 inclusive
LocalDate date = LocalDate.of(2011, 1, 3);
int wby = 2011;
int week = 1;
int dow = 1;
for (int i = 1; i <= ((52 + 52 + 52 + 52 + 53 + 52) * 7); i++) {
assertEquals(yearField.getFrom(date), wby);
assertEquals(weekField.getFrom(date), week);
assertEquals(DAY_OF_WEEK.getFrom(date), dow);
if (dow == 7) {
dow = 1;
week++;
} else {
dow++;
}
if (week > wbyLen(wby)) {
week = 1;
wby++;
}
date = date.plusDays(1);
}
assertEquals(yearField.getFrom(date), 2017);
assertEquals(weekField.getFrom(date), 1);
assertEquals(DAY_OF_WEEK.getFrom(date), 1);
}
@Test(dataProvider = "fields")
public void test_adjustInto_dow(TemporalField weekField, TemporalField yearField) {
// tests every day from 2012 to 2016 inclusive
LocalDate date = LocalDate.of(2012, 1, 2);
int wby = 2012;
int week = 1;
int dow = 1;
for (int i = 1; i <= ((52 + 52 + 52 + 53 + 52) * 7); i++) {
for (int j = 1; j <= 7; j++) {
LocalDate adjusted = DAY_OF_WEEK.adjustInto(date, j);
assertEquals(adjusted.get(DAY_OF_WEEK), j);
assertEquals(adjusted.get(weekField), week);
assertEquals(adjusted.get(yearField), wby);
}
if (dow == 7) {
dow = 1;
week++;
} else {
dow++;
}
if (week > wbyLen(wby)) {
week = 1;
wby++;
}
date = date.plusDays(1);
}
}
@Test(dataProvider = "fields")
public void test_adjustInto_week(TemporalField weekField, TemporalField yearField) {
// tests every day from 2012 to 2016 inclusive
LocalDate date = LocalDate.of(2012, 1, 2);
int wby = 2012;
int week = 1;
int dow = 1;
for (int i = 1; i <= ((52 + 52 + 52 + 53 + 52) * 7); i++) {
int weeksInYear = (wby == 2015 ? 53 : 52);
for (int j = 1; j <= weeksInYear; j++) {
LocalDate adjusted = weekField.adjustInto(date, j);
assertEquals(adjusted.get(weekField), j);
assertEquals(adjusted.get(DAY_OF_WEEK), dow);
assertEquals(adjusted.get(yearField), wby);
}
if (dow == 7) {
dow = 1;
week++;
} else {
dow++;
}
if (week > wbyLen(wby)) {
week = 1;
wby++;
}
date = date.plusDays(1);
}
}
@Test(dataProvider = "fields")
public void test_adjustInto_wby(TemporalField weekField, TemporalField yearField) {
// tests every day from 2012 to 2016 inclusive
LocalDate date = LocalDate.of(2012, 1, 2);
int wby = 2012;
int week = 1;
int dow = 1;
for (int i = 1; i <= ((52 + 52 + 52 + 53 + 52) * 7); i++) {
for (int j = 2004; j <= 2015; j++) {
LocalDate adjusted = yearField.adjustInto(date, j);
assertEquals(adjusted.get(yearField), j);
assertEquals(adjusted.get(DAY_OF_WEEK), dow);
assertEquals(adjusted.get(weekField), (week == 53 && wbyLen(j) == 52 ? 52 : week), "" + date + " " + adjusted);
}
if (dow == 7) {
dow = 1;
week++;
} else {
dow++;
}
if (week > wbyLen(wby)) {
week = 1;
wby++;
}
date = date.plusDays(1);
}
}
@Test(dataProvider = "fields")
public void test_addTo_weekBasedYears(TemporalField weekField, TemporalField yearField) {
// tests every day from 2012 to 2016 inclusive
LocalDate date = LocalDate.of(2012, 1, 2);
int wby = 2012;
int week = 1;
int dow = 1;
for (int i = 1; i <= ((52 + 52 + 52 + 53 + 52) * 7); i++) {
for (int j = -5; j <= 5; j++) {
LocalDate adjusted = IsoFields.WEEK_BASED_YEARS.addTo(date, j);
assertEquals(adjusted.get(yearField), wby + j);
assertEquals(adjusted.get(DAY_OF_WEEK), dow);
assertEquals(adjusted.get(weekField), (week == 53 && wbyLen(wby + j) == 52 ? 52 : week), "" + date + " " + adjusted);
}
if (dow == 7) {
dow = 1;
week++;
} else {
dow++;
}
if (week > wbyLen(wby)) {
week = 1;
wby++;
}
date = date.plusDays(1);
}
}
private int wbyLen(int wby) {
return (wby == 2004 || wby == 2009 || wby == 2015 || wby == 2020 ? 53 : 52);
}
}