Home | History | Annotate | Download | only in temporal
      1 /*
      2  * Copyright (c) 2014, 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")
     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")
     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")
     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
     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")
     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")
     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")
    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")
    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
    120     public void test_WBY_isSupportedBy_ISO() {
    121         assertEquals(IsoFields.WEEK_BASED_YEAR.isSupportedBy(ThaiBuddhistDate.now()), false);
    122     }
    123 
    124     @Test(dataProvider = "fields")
    125     public void test_WBY_range(TemporalField weekField, TemporalField yearField) {
    126         assertEquals(yearField.range(), ValueRange.of(Year.MIN_VALUE, Year.MAX_VALUE));
    127     }
    128 
    129     @Test(dataProvider = "fields")
    130     public void test_WBY_rangeRefinedBy(TemporalField weekField, TemporalField yearField) {
    131         assertEquals(yearField.rangeRefinedBy(LocalDate.of(2012, 12, 31)), ValueRange.of(Year.MIN_VALUE, Year.MAX_VALUE));
    132     }
    133 
    134     //-----------------------------------------------------------------------
    135     @Test(dataProvider = "fields")
    136     public void test_getFrom(TemporalField weekField, TemporalField yearField) {
    137         // tests every day from 2011 to 2016 inclusive
    138         LocalDate date = LocalDate.of(2011, 1, 3);
    139         int wby = 2011;
    140         int week = 1;
    141         int dow = 1;
    142         for (int i = 1; i <= ((52 + 52 + 52 + 52 + 53 + 52) * 7); i++) {
    143             assertEquals(yearField.getFrom(date), wby);
    144             assertEquals(weekField.getFrom(date), week);
    145             assertEquals(DAY_OF_WEEK.getFrom(date), dow);
    146             if (dow == 7) {
    147                 dow = 1;
    148                 week++;
    149             } else {
    150                 dow++;
    151             }
    152             if (week > wbyLen(wby)) {
    153                 week = 1;
    154                 wby++;
    155             }
    156             date = date.plusDays(1);
    157         }
    158         assertEquals(yearField.getFrom(date), 2017);
    159         assertEquals(weekField.getFrom(date), 1);
    160         assertEquals(DAY_OF_WEEK.getFrom(date), 1);
    161     }
    162 
    163     @Test(dataProvider = "fields")
    164     public void test_adjustInto_dow(TemporalField weekField, TemporalField yearField) {
    165         // tests every day from 2012 to 2016 inclusive
    166         LocalDate date = LocalDate.of(2012, 1, 2);
    167         int wby = 2012;
    168         int week = 1;
    169         int dow = 1;
    170         for (int i = 1; i <= ((52 + 52 + 52 + 53 + 52) * 7); i++) {
    171             for (int j = 1; j <= 7; j++) {
    172                 LocalDate adjusted = DAY_OF_WEEK.adjustInto(date, j);
    173                 assertEquals(adjusted.get(DAY_OF_WEEK), j);
    174                 assertEquals(adjusted.get(weekField), week);
    175                 assertEquals(adjusted.get(yearField), wby);
    176             }
    177             if (dow == 7) {
    178                 dow = 1;
    179                 week++;
    180             } else {
    181                 dow++;
    182             }
    183             if (week > wbyLen(wby)) {
    184                 week = 1;
    185                 wby++;
    186             }
    187             date = date.plusDays(1);
    188         }
    189     }
    190 
    191     @Test(dataProvider = "fields")
    192     public void test_adjustInto_week(TemporalField weekField, TemporalField yearField) {
    193         // tests every day from 2012 to 2016 inclusive
    194         LocalDate date = LocalDate.of(2012, 1, 2);
    195         int wby = 2012;
    196         int week = 1;
    197         int dow = 1;
    198         for (int i = 1; i <= ((52 + 52 + 52 + 53 + 52) * 7); i++) {
    199             int weeksInYear = (wby == 2015 ? 53 : 52);
    200             for (int j = 1; j <= weeksInYear; j++) {
    201                 LocalDate adjusted = weekField.adjustInto(date, j);
    202                 assertEquals(adjusted.get(weekField), j);
    203                 assertEquals(adjusted.get(DAY_OF_WEEK), dow);
    204                 assertEquals(adjusted.get(yearField), wby);
    205             }
    206             if (dow == 7) {
    207                 dow = 1;
    208                 week++;
    209             } else {
    210                 dow++;
    211             }
    212             if (week > wbyLen(wby)) {
    213                 week = 1;
    214                 wby++;
    215             }
    216             date = date.plusDays(1);
    217         }
    218     }
    219 
    220     @Test(dataProvider = "fields")
    221     public void test_adjustInto_wby(TemporalField weekField, TemporalField yearField) {
    222         // tests every day from 2012 to 2016 inclusive
    223         LocalDate date = LocalDate.of(2012, 1, 2);
    224         int wby = 2012;
    225         int week = 1;
    226         int dow = 1;
    227         for (int i = 1; i <= ((52 + 52 + 52 + 53 + 52) * 7); i++) {
    228             for (int j = 2004; j <= 2015; j++) {
    229                 LocalDate adjusted = yearField.adjustInto(date, j);
    230                 assertEquals(adjusted.get(yearField), j);
    231                 assertEquals(adjusted.get(DAY_OF_WEEK), dow);
    232                 assertEquals(adjusted.get(weekField), (week == 53 && wbyLen(j) == 52 ? 52 : week), "" + date + " " + adjusted);
    233             }
    234             if (dow == 7) {
    235                 dow = 1;
    236                 week++;
    237             } else {
    238                 dow++;
    239             }
    240             if (week > wbyLen(wby)) {
    241                 week = 1;
    242                 wby++;
    243             }
    244             date = date.plusDays(1);
    245         }
    246     }
    247 
    248     @Test(dataProvider = "fields")
    249     public void test_addTo_weekBasedYears(TemporalField weekField, TemporalField yearField) {
    250         // tests every day from 2012 to 2016 inclusive
    251         LocalDate date = LocalDate.of(2012, 1, 2);
    252         int wby = 2012;
    253         int week = 1;
    254         int dow = 1;
    255         for (int i = 1; i <= ((52 + 52 + 52 + 53 + 52) * 7); i++) {
    256             for (int j = -5; j <= 5; j++) {
    257                 LocalDate adjusted = IsoFields.WEEK_BASED_YEARS.addTo(date, j);
    258                 assertEquals(adjusted.get(yearField), wby + j);
    259                 assertEquals(adjusted.get(DAY_OF_WEEK), dow);
    260                 assertEquals(adjusted.get(weekField), (week == 53 && wbyLen(wby + j) == 52 ? 52 : week), "" + date + " " + adjusted);
    261             }
    262             if (dow == 7) {
    263                 dow = 1;
    264                 week++;
    265             } else {
    266                 dow++;
    267             }
    268             if (week > wbyLen(wby)) {
    269                 week = 1;
    270                 wby++;
    271             }
    272             date = date.plusDays(1);
    273         }
    274     }
    275 
    276     private int wbyLen(int wby) {
    277         return (wby == 2004 || wby == 2009 || wby == 2015 || wby == 2020 ? 53 : 52);
    278     }
    279 
    280 }
    281