1 /* 2 * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 package test.java.time.temporal; 26 27 import static java.time.temporal.ChronoField.DAY_OF_WEEK; 28 import static org.testng.Assert.assertEquals; 29 30 import java.time.LocalDate; 31 import java.time.LocalTime; 32 import java.time.MonthDay; 33 import java.time.OffsetDateTime; 34 import java.time.Year; 35 import java.time.chrono.ThaiBuddhistDate; 36 import java.time.temporal.ChronoUnit; 37 import java.time.temporal.IsoFields; 38 import java.time.temporal.TemporalField; 39 import java.time.temporal.ValueRange; 40 import java.time.temporal.WeekFields; 41 42 import org.testng.annotations.DataProvider; 43 import org.testng.annotations.Test; 44 45 /** 46 * Test. 47 */ 48 @Test 49 public class TestIsoWeekFields { 50 51 @DataProvider(name = "fields") data_Fields()52 Object[][] data_Fields() { 53 return new Object[][] { 54 {IsoFields.WEEK_OF_WEEK_BASED_YEAR, IsoFields.WEEK_BASED_YEAR}, 55 {WeekFields.ISO.weekOfWeekBasedYear(), WeekFields.ISO.weekBasedYear()}, 56 }; 57 } 58 59 //----------------------------------------------------------------------- 60 // WEEK_OF_WEEK_BASED_YEAR 61 //----------------------------------------------------------------------- 62 @Test(dataProvider = "fields") test_WOWBY_basics(TemporalField weekField, TemporalField yearField)63 public void test_WOWBY_basics(TemporalField weekField, TemporalField yearField) { 64 assertEquals(weekField.isDateBased(), true); 65 assertEquals(weekField.isTimeBased(), false); 66 assertEquals(weekField.getBaseUnit(), ChronoUnit.WEEKS); 67 assertEquals(weekField.getRangeUnit(), IsoFields.WEEK_BASED_YEARS); 68 } 69 70 @Test(dataProvider = "fields") test_WOWBY_isSupportedBy(TemporalField weekField, TemporalField yearField)71 public void test_WOWBY_isSupportedBy(TemporalField weekField, TemporalField yearField) { 72 assertEquals(weekField.isSupportedBy(LocalTime.NOON), false); 73 assertEquals(weekField.isSupportedBy(MonthDay.of(2, 1)), false); 74 assertEquals(weekField.isSupportedBy(LocalDate.MIN), true); 75 assertEquals(weekField.isSupportedBy(OffsetDateTime.MAX), true); 76 } 77 78 @Test test_WOWBY_isSupportedBy_fieldsDiffer()79 public void test_WOWBY_isSupportedBy_fieldsDiffer() { 80 assertEquals(IsoFields.WEEK_OF_WEEK_BASED_YEAR.isSupportedBy(ThaiBuddhistDate.now()), false); 81 assertEquals(WeekFields.ISO.weekOfWeekBasedYear().isSupportedBy(ThaiBuddhistDate.now()), true); 82 } 83 84 @Test(dataProvider = "fields") test_WOWBY_range(TemporalField weekField, TemporalField yearField)85 public void test_WOWBY_range(TemporalField weekField, TemporalField yearField) { 86 assertEquals(weekField.range(), ValueRange.of(1, 52, 53)); 87 } 88 89 @Test(dataProvider = "fields") test_WOWBY_rangeRefinedBy(TemporalField weekField, TemporalField yearField)90 public void test_WOWBY_rangeRefinedBy(TemporalField weekField, TemporalField yearField) { 91 assertEquals(weekField.rangeRefinedBy(LocalDate.of(2012, 12, 31)), ValueRange.of(1, 52)); 92 assertEquals(weekField.rangeRefinedBy(LocalDate.of(2013, 12, 29)), ValueRange.of(1, 52)); 93 assertEquals(weekField.rangeRefinedBy(LocalDate.of(2013, 12, 30)), ValueRange.of(1, 52)); 94 assertEquals(weekField.rangeRefinedBy(LocalDate.of(2014, 12, 28)), ValueRange.of(1, 52)); 95 assertEquals(weekField.rangeRefinedBy(LocalDate.of(2014, 12, 29)), ValueRange.of(1, 53)); 96 assertEquals(weekField.rangeRefinedBy(LocalDate.of(2016, 1, 3)), ValueRange.of(1, 53)); 97 assertEquals(weekField.rangeRefinedBy(LocalDate.of(2016, 1, 4)), ValueRange.of(1, 52)); 98 } 99 100 //----------------------------------------------------------------------- 101 // WEEK_BASED_YEAR 102 //----------------------------------------------------------------------- 103 @Test(dataProvider = "fields") test_WBY_basics(TemporalField weekField, TemporalField yearField)104 public void test_WBY_basics(TemporalField weekField, TemporalField yearField) { 105 assertEquals(yearField.isDateBased(), true); 106 assertEquals(yearField.isTimeBased(), false); 107 assertEquals(yearField.getBaseUnit(), IsoFields.WEEK_BASED_YEARS); 108 assertEquals(yearField.getRangeUnit(), ChronoUnit.FOREVER); 109 } 110 111 @Test(dataProvider = "fields") test_WBY_isSupportedBy(TemporalField weekField, TemporalField yearField)112 public void test_WBY_isSupportedBy(TemporalField weekField, TemporalField yearField) { 113 assertEquals(yearField.isSupportedBy(LocalTime.NOON), false); 114 assertEquals(yearField.isSupportedBy(MonthDay.of(2, 1)), false); 115 assertEquals(yearField.isSupportedBy(LocalDate.MIN), true); 116 assertEquals(yearField.isSupportedBy(OffsetDateTime.MAX), true); 117 } 118 119 @Test test_WBY_isSupportedBy_ISO()120 public void test_WBY_isSupportedBy_ISO() { 121 assertEquals(IsoFields.WEEK_BASED_YEAR.isSupportedBy(ThaiBuddhistDate.now()), false); 122 } 123 124 @Test test_Unit_isSupportedBy_ISO()125 public void test_Unit_isSupportedBy_ISO() { 126 assertEquals(IsoFields.WEEK_BASED_YEARS.isSupportedBy(LocalDate.now()),true); 127 assertEquals(IsoFields.WEEK_BASED_YEARS.isSupportedBy(ThaiBuddhistDate.now()),false); 128 assertEquals(IsoFields.QUARTER_YEARS.isSupportedBy(LocalDate.now()),true); 129 assertEquals(IsoFields.QUARTER_YEARS.isSupportedBy(ThaiBuddhistDate.now()),false); 130 } 131 132 @Test(dataProvider = "fields") test_WBY_range(TemporalField weekField, TemporalField yearField)133 public void test_WBY_range(TemporalField weekField, TemporalField yearField) { 134 assertEquals(yearField.range(), ValueRange.of(Year.MIN_VALUE, Year.MAX_VALUE)); 135 } 136 137 @Test(dataProvider = "fields") test_WBY_rangeRefinedBy(TemporalField weekField, TemporalField yearField)138 public void test_WBY_rangeRefinedBy(TemporalField weekField, TemporalField yearField) { 139 assertEquals(yearField.rangeRefinedBy(LocalDate.of(2012, 12, 31)), ValueRange.of(Year.MIN_VALUE, Year.MAX_VALUE)); 140 } 141 142 //----------------------------------------------------------------------- 143 @Test(dataProvider = "fields") test_getFrom(TemporalField weekField, TemporalField yearField)144 public void test_getFrom(TemporalField weekField, TemporalField yearField) { 145 // tests every day from 2011 to 2016 inclusive 146 LocalDate date = LocalDate.of(2011, 1, 3); 147 int wby = 2011; 148 int week = 1; 149 int dow = 1; 150 for (int i = 1; i <= ((52 + 52 + 52 + 52 + 53 + 52) * 7); i++) { 151 assertEquals(yearField.getFrom(date), wby); 152 assertEquals(weekField.getFrom(date), week); 153 assertEquals(DAY_OF_WEEK.getFrom(date), dow); 154 if (dow == 7) { 155 dow = 1; 156 week++; 157 } else { 158 dow++; 159 } 160 if (week > wbyLen(wby)) { 161 week = 1; 162 wby++; 163 } 164 date = date.plusDays(1); 165 } 166 assertEquals(yearField.getFrom(date), 2017); 167 assertEquals(weekField.getFrom(date), 1); 168 assertEquals(DAY_OF_WEEK.getFrom(date), 1); 169 } 170 171 @Test(dataProvider = "fields") test_adjustInto_dow(TemporalField weekField, TemporalField yearField)172 public void test_adjustInto_dow(TemporalField weekField, TemporalField yearField) { 173 // tests every day from 2012 to 2016 inclusive 174 LocalDate date = LocalDate.of(2012, 1, 2); 175 int wby = 2012; 176 int week = 1; 177 int dow = 1; 178 for (int i = 1; i <= ((52 + 52 + 52 + 53 + 52) * 7); i++) { 179 for (int j = 1; j <= 7; j++) { 180 LocalDate adjusted = DAY_OF_WEEK.adjustInto(date, j); 181 assertEquals(adjusted.get(DAY_OF_WEEK), j); 182 assertEquals(adjusted.get(weekField), week); 183 assertEquals(adjusted.get(yearField), wby); 184 } 185 if (dow == 7) { 186 dow = 1; 187 week++; 188 } else { 189 dow++; 190 } 191 if (week > wbyLen(wby)) { 192 week = 1; 193 wby++; 194 } 195 date = date.plusDays(1); 196 } 197 } 198 199 @Test(dataProvider = "fields") test_adjustInto_week(TemporalField weekField, TemporalField yearField)200 public void test_adjustInto_week(TemporalField weekField, TemporalField yearField) { 201 // tests every day from 2012 to 2016 inclusive 202 LocalDate date = LocalDate.of(2012, 1, 2); 203 int wby = 2012; 204 int week = 1; 205 int dow = 1; 206 for (int i = 1; i <= ((52 + 52 + 52 + 53 + 52) * 7); i++) { 207 int weeksInYear = (wby == 2015 ? 53 : 52); 208 for (int j = 1; j <= weeksInYear; j++) { 209 LocalDate adjusted = weekField.adjustInto(date, j); 210 assertEquals(adjusted.get(weekField), j); 211 assertEquals(adjusted.get(DAY_OF_WEEK), dow); 212 assertEquals(adjusted.get(yearField), wby); 213 } 214 if (dow == 7) { 215 dow = 1; 216 week++; 217 } else { 218 dow++; 219 } 220 if (week > wbyLen(wby)) { 221 week = 1; 222 wby++; 223 } 224 date = date.plusDays(1); 225 } 226 } 227 228 @Test(dataProvider = "fields") test_adjustInto_wby(TemporalField weekField, TemporalField yearField)229 public void test_adjustInto_wby(TemporalField weekField, TemporalField yearField) { 230 // tests every day from 2012 to 2016 inclusive 231 LocalDate date = LocalDate.of(2012, 1, 2); 232 int wby = 2012; 233 int week = 1; 234 int dow = 1; 235 for (int i = 1; i <= ((52 + 52 + 52 + 53 + 52) * 7); i++) { 236 for (int j = 2004; j <= 2015; j++) { 237 LocalDate adjusted = yearField.adjustInto(date, j); 238 assertEquals(adjusted.get(yearField), j); 239 assertEquals(adjusted.get(DAY_OF_WEEK), dow); 240 assertEquals(adjusted.get(weekField), (week == 53 && wbyLen(j) == 52 ? 52 : week), "" + date + " " + adjusted); 241 } 242 if (dow == 7) { 243 dow = 1; 244 week++; 245 } else { 246 dow++; 247 } 248 if (week > wbyLen(wby)) { 249 week = 1; 250 wby++; 251 } 252 date = date.plusDays(1); 253 } 254 } 255 256 @Test(dataProvider = "fields") test_addTo_weekBasedYears(TemporalField weekField, TemporalField yearField)257 public void test_addTo_weekBasedYears(TemporalField weekField, TemporalField yearField) { 258 // tests every day from 2012 to 2016 inclusive 259 LocalDate date = LocalDate.of(2012, 1, 2); 260 int wby = 2012; 261 int week = 1; 262 int dow = 1; 263 for (int i = 1; i <= ((52 + 52 + 52 + 53 + 52) * 7); i++) { 264 for (int j = -5; j <= 5; j++) { 265 LocalDate adjusted = IsoFields.WEEK_BASED_YEARS.addTo(date, j); 266 assertEquals(adjusted.get(yearField), wby + j); 267 assertEquals(adjusted.get(DAY_OF_WEEK), dow); 268 assertEquals(adjusted.get(weekField), (week == 53 && wbyLen(wby + j) == 52 ? 52 : week), "" + date + " " + adjusted); 269 } 270 if (dow == 7) { 271 dow = 1; 272 week++; 273 } else { 274 dow++; 275 } 276 if (week > wbyLen(wby)) { 277 week = 1; 278 wby++; 279 } 280 date = date.plusDays(1); 281 } 282 } 283 wbyLen(int wby)284 private int wbyLen(int wby) { 285 return (wby == 2004 || wby == 2009 || wby == 2015 || wby == 2020 ? 53 : 52); 286 } 287 288 } 289