1 /*
   2  * Copyright (c) 2014, 2016, 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.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 
  24 package datatype;
  25 
  26 import javax.xml.datatype.DatatypeConfigurationException;
  27 import javax.xml.datatype.DatatypeConstants;
  28 import javax.xml.datatype.DatatypeFactory;
  29 import javax.xml.datatype.XMLGregorianCalendar;
  30 
  31 import org.testng.Assert;
  32 import org.testng.annotations.BeforeMethod;
  33 import org.testng.annotations.Listeners;
  34 import org.testng.annotations.Test;
  35 
  36 /*
  37  * @test
  38  * @library /javax/xml/jaxp/libs /javax/xml/jaxp/unittest
  39  * @run testng/othervm -DrunSecMngr=true datatype.XMLGregorianCalendarTest
  40  * @run testng/othervm datatype.XMLGregorianCalendarTest
  41  * @summary Test XMLGregorianCalendar.
  42  */
  43 @Listeners({jaxp.library.BasePolicy.class})
  44 public class XMLGregorianCalendarTest {
  45 
  46     private static final boolean DEBUG = false;
  47 
  48     private static final int TEST_VALUE_FAIL = 0;
  49 
  50     private static final int TEST_VALUE_PASS = 1;
  51 
  52     private XMLGregorianCalendar calendar;
  53 
  54     @BeforeMethod
  55     public void setUp() {
  56         try {
  57             calendar = DatatypeFactory.newInstance().newXMLGregorianCalendar();
  58         } catch (DatatypeConfigurationException dce) {
  59             dce.printStackTrace();
  60             Assert.fail("Failed to create instance of DatatypeFactory " + dce.getMessage());
  61         }
  62     }
  63 
  64     @Test
  65     public final void testSetTime() {
  66 
  67         /**
  68          * Hour, minute, second values to test and expected result.
  69          */
  70         final int[] TEST_VALUES = { 24, 0, 0, TEST_VALUE_PASS, 24, 1, 0, TEST_VALUE_FAIL, 24, 0, 1, TEST_VALUE_FAIL, 24, DatatypeConstants.FIELD_UNDEFINED, 0,
  71                 TEST_VALUE_FAIL, 24, 0, DatatypeConstants.FIELD_UNDEFINED, TEST_VALUE_FAIL };
  72 
  73         // create DatatypeFactory
  74         DatatypeFactory datatypeFactory = null;
  75         try {
  76             datatypeFactory = DatatypeFactory.newInstance();
  77         } catch (DatatypeConfigurationException datatypeConfigurationException) {
  78             Assert.fail(datatypeConfigurationException.toString());
  79         }
  80 
  81         if (DEBUG) {
  82             System.err.println("DatatypeFactory created: " + datatypeFactory.toString());
  83         }
  84 
  85         // create XMLGregorianCalendar
  86         XMLGregorianCalendar xmlGregorianCalendar = datatypeFactory.newXMLGregorianCalendar();
  87 
  88         // test each value
  89         for (int onTestValue = 0; onTestValue < TEST_VALUES.length; onTestValue = onTestValue + 4) {
  90 
  91             if (DEBUG) {
  92                 System.err.println("testing values: (" + TEST_VALUES[onTestValue] + ", " + TEST_VALUES[onTestValue + 1] + ", " + TEST_VALUES[onTestValue + 2]
  93                         + ") expected (0=fail, 1=pass): " + TEST_VALUES[onTestValue + 3]);
  94             }
  95 
  96             try {
  97                 // set time
  98                 xmlGregorianCalendar.setTime(TEST_VALUES[onTestValue], TEST_VALUES[onTestValue + 1], TEST_VALUES[onTestValue + 2]);
  99 
 100                 if (DEBUG) {
 101                     System.err.println("XMLGregorianCalendar created: \"" + xmlGregorianCalendar.toString() + "\"");
 102                 }
 103 
 104                 // was this expected to fail?
 105                 if (TEST_VALUES[onTestValue + 3] == TEST_VALUE_FAIL) {
 106                     Assert.fail("the values: (" + TEST_VALUES[onTestValue] + ", " + TEST_VALUES[onTestValue + 1] + ", " + TEST_VALUES[onTestValue + 2]
 107                             + ") are invalid, " + "yet it created the XMLGregorianCalendar \"" + xmlGregorianCalendar.toString() + "\"");
 108                 }
 109             } catch (Exception exception) {
 110 
 111                 if (DEBUG) {
 112                     System.err.println("Exception in creating XMLGregorianCalendar: \"" + exception.toString() + "\"");
 113                 }
 114 
 115                 // was this expected to succed?
 116                 if (TEST_VALUES[onTestValue + 3] == TEST_VALUE_PASS) {
 117                     Assert.fail("the values: (" + TEST_VALUES[onTestValue] + ", " + TEST_VALUES[onTestValue + 1] + ", " + TEST_VALUES[onTestValue + 2]
 118                             + ") are valid yet it failed with \"" + exception.toString() + "\"");
 119                 }
 120                 // expected failure
 121             }
 122         }
 123     }
 124 
 125     @Test
 126     public final void testSetHour() {
 127 
 128         /**
 129          * Hour values to test and expected result.
 130          */
 131         final int[] TEST_VALUES = {
 132                 // setTime(H, M, S), hour override, expected result
 133                 0, 0, 0, 0, TEST_VALUE_PASS, 0, 0, 0, 23, TEST_VALUE_PASS, 0, 0, 0, 24, TEST_VALUE_PASS,
 134                 // creates invalid state
 135                 0, 0, 0, DatatypeConstants.FIELD_UNDEFINED, TEST_VALUE_FAIL,
 136                 // violates Schema Errata
 137                 0, 0, 1, 24, TEST_VALUE_FAIL };
 138 
 139         // create DatatypeFactory
 140         DatatypeFactory datatypeFactory = null;
 141         try {
 142             datatypeFactory = DatatypeFactory.newInstance();
 143         } catch (DatatypeConfigurationException datatypeConfigurationException) {
 144             Assert.fail(datatypeConfigurationException.toString());
 145         }
 146 
 147         if (DEBUG) {
 148             System.err.println("DatatypeFactory created: " + datatypeFactory.toString());
 149         }
 150 
 151         // create XMLGregorianCalendar
 152         XMLGregorianCalendar xmlGregorianCalendar = datatypeFactory.newXMLGregorianCalendar();
 153 
 154         // test each value
 155         for (int onTestValue = 0; onTestValue < TEST_VALUES.length; onTestValue = onTestValue + 5) {
 156 
 157             if (DEBUG) {
 158                 System.err.println("testing values: (" + TEST_VALUES[onTestValue] + ", " + TEST_VALUES[onTestValue + 1] + ", " + TEST_VALUES[onTestValue + 2]
 159                         + ", " + TEST_VALUES[onTestValue + 3] + ") expected (0=fail, 1=pass): " + TEST_VALUES[onTestValue + 4]);
 160             }
 161 
 162             try {
 163                 // set time to known valid value
 164                 xmlGregorianCalendar.setTime(TEST_VALUES[onTestValue], TEST_VALUES[onTestValue + 1], TEST_VALUES[onTestValue + 2]);
 165                 // now explicitly set hour
 166                 xmlGregorianCalendar.setHour(TEST_VALUES[onTestValue + 3]);
 167 
 168                 if (DEBUG) {
 169                     System.err.println("XMLGregorianCalendar created: \"" + xmlGregorianCalendar.toString() + "\"");
 170                 }
 171 
 172                 // was this expected to fail?
 173                 if (TEST_VALUES[onTestValue + 4] == TEST_VALUE_FAIL) {
 174                     Assert.fail("the values: (" + TEST_VALUES[onTestValue] + ", " + TEST_VALUES[onTestValue + 1] + ", " + TEST_VALUES[onTestValue + 2] + ", "
 175                             + TEST_VALUES[onTestValue + 3] + ") are invalid, " + "yet it created the XMLGregorianCalendar \"" + xmlGregorianCalendar.toString()
 176                             + "\"");
 177                 }
 178             } catch (Exception exception) {
 179 
 180                 if (DEBUG) {
 181                     System.err.println("Exception in creating XMLGregorianCalendar: \"" + exception.toString() + "\"");
 182                 }
 183 
 184                 // was this expected to succed?
 185                 if (TEST_VALUES[onTestValue + 4] == TEST_VALUE_PASS) {
 186                     Assert.fail("the values: (" + TEST_VALUES[onTestValue] + ", " + TEST_VALUES[onTestValue + 1] + ", " + TEST_VALUES[onTestValue + 2] + ", "
 187                             + TEST_VALUES[onTestValue + 3] + ") are valid yet it failed with \"" + exception.toString() + "\"");
 188                 }
 189                 // expected failure
 190             }
 191         }
 192     }
 193 
 194     @Test
 195     public void testEqualsWithDifferentObjectParam() {
 196 
 197         Assert.assertFalse(calendar.equals(new Integer(0)), "equals method should return false for any object other" + " than XMLGregorianCalendar");
 198     }
 199 
 200     @Test
 201     public void testEqualsWithNullObjectParam() {
 202 
 203         Assert.assertFalse(calendar.equals(null), "equals method should return false for null parameter");
 204     }
 205 
 206     @Test
 207     public void testEqualsWithEqualObjectParam() {
 208 
 209         try {
 210             Assert.assertTrue(calendar.equals(DatatypeFactory.newInstance().newXMLGregorianCalendar()), "equals method is expected to return true");
 211         } catch (DatatypeConfigurationException dce) {
 212             dce.printStackTrace();
 213             Assert.fail("Failed to create instance of DatatypeFactory " + dce.getMessage());
 214         }
 215     }
 216 
 217     @Test
 218     public void testToString() {
 219         try {
 220             String inputDateTime = "2006-10-23T22:15:01.000000135+08:00";
 221             DatatypeFactory factory = DatatypeFactory.newInstance();
 222             XMLGregorianCalendar calendar = factory.newXMLGregorianCalendar(inputDateTime);
 223             String toStr = calendar.toString();
 224             Assert.assertTrue(toStr.indexOf("E") == -1, "String value cannot contain exponent");
 225         } catch (DatatypeConfigurationException dce) {
 226             dce.printStackTrace();
 227             Assert.fail("Failed to create instance of DatatypeFactory " + dce.getMessage());
 228         }
 229     }
 230 }
 231