Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8352503

GregorianCalendar Fails to Validate February 29 When Year Changes in Non-Lenient

XMLWordPrintable

      A DESCRIPTION OF THE PROBLEM :
      A bug exists in the Calendar class (specifically in GregorianCalendar) where it fails to properly validate date field combinations in non-lenient mode after individual fields are modified.

      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      junit

      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      all testcase passed
      ACTUAL -
      "bug" failed

      ---------- BEGIN SOURCE ----------
      import java.util.Calendar;
      import java.util.GregorianCalendar;

      import static java.util.GregorianCalendar.DATE;
      import static java.util.GregorianCalendar.FEBRUARY;
      import static java.util.GregorianCalendar.MONTH;
      import static java.util.GregorianCalendar.YEAR;

      import org.junit.jupiter.api.Test;
      import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
      import static org.junit.jupiter.api.Assertions.assertThrows;

      public class TestCase {

          @Test
          public void bug() {
              GregorianCalendar gc = new GregorianCalendar();
              gc.setLenient(false);
              gc.set(YEAR, 2000);
              gc.set(MONTH, FEBRUARY);
              gc.set(DATE, 29);
              assertDoesNotThrow(()->{
                  gc.get(Calendar.DAY_OF_MONTH);
              }, "Should not throw IllegalArgumentException when accessing fields after setting a valid date");
              gc.set(YEAR, 2001);
              assertThrows(IllegalArgumentException.class, () -> {
                  gc.get(Calendar.DAY_OF_MONTH);
              }, "Should throw IllegalArgumentException when accessing fields after setting an invalid date");
          }

          @Test
          public void rightBehaviour() {
              GregorianCalendar gc = new GregorianCalendar();
              gc.setLenient(false);
              gc.set(YEAR, 2001);
              gc.set(MONTH, FEBRUARY);
              gc.set(DATE, 29);
             assertThrows(IllegalArgumentException.class, () -> {
                 gc.get(Calendar.DAY_OF_MONTH);
              }, "Should throw IllegalArgumentException when accessing fields after setting an invalid date");
          }
      }
      ---------- END SOURCE ----------

            tongwan Andrew Wang
            webbuggrp Webbug Group
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

              Created:
              Updated:
              Resolved: