blob: 2f0281013fa60bf7f054c9cd0dd9ddf0f42d999e [file] [log] [blame]
/*
* Copyright (c) 1999, 2016, 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.
*
* 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 javax.xml.datatype.ptests;
import static java.util.Calendar.HOUR;
import static java.util.Calendar.MINUTE;
import static java.util.Calendar.YEAR;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertTrue;
import java.util.GregorianCalendar;
import java.util.Locale;
import java.util.TimeZone;
import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeConstants;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.Duration;
import javax.xml.datatype.XMLGregorianCalendar;
import org.testng.Assert;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Listeners;
import org.testng.annotations.Test;
/*
* @test
* @bug 5049592 5041845 5048932 5064587 5040542 5049531 5049528
* @library /javax/xml/jaxp/libs
* @run testng/othervm -DrunSecMngr=true javax.xml.datatype.ptests.XMLGregorianCalendarTest
* @run testng/othervm javax.xml.datatype.ptests.XMLGregorianCalendarTest
* @summary Class containing the test cases for XMLGregorianCalendar
*/
@Listeners({jaxp.library.BasePolicy.class})
public class XMLGregorianCalendarTest {
private DatatypeFactory datatypeFactory;
@BeforeClass
public void setup() throws DatatypeConfigurationException {
datatypeFactory = DatatypeFactory.newInstance();
}
@DataProvider(name = "valid-milliseconds")
public Object[][] getValidMilliSeconds() {
return new Object[][] { { 0 }, { 1 }, { 2 }, { 16 }, { 1000 } };
}
/*
* Test DatatypeFactory.newXMLGregorianCalendar(..) with milliseconds > 1.
*
* Bug # 5049592
*
*/
@Test(dataProvider = "valid-milliseconds")
public void checkNewCalendar(int ms) {
// valid milliseconds
XMLGregorianCalendar calendar = datatypeFactory.newXMLGregorianCalendar(2004, // year
6, // month
2, // day
19, // hour
20, // minute
59, // second
ms, // milliseconds
840 // timezone
);
// expected success
assertEquals(calendar.getMillisecond(), ms);
}
/*
* Test DatatypeFactory.newXMLGregorianCalendarTime(..).
*
* Bug # 5049592
*/
@Test(dataProvider = "valid-milliseconds")
public void checkNewTime(int ms) {
// valid milliseconds
XMLGregorianCalendar calendar2 = datatypeFactory.newXMLGregorianCalendarTime(19, // hour
20, // minute
59, // second
ms, // milliseconds
840 // timezone
);
// expected success
assertEquals(calendar2.getMillisecond(), ms);
}
@DataProvider(name = "invalid-milliseconds")
public Object[][] getInvalidMilliSeconds() {
return new Object[][] { { -1 }, { 1001 } };
}
/*
* Test DatatypeFactory.newXMLGregorianCalendar(..).
*
* Bug # 5049592 IllegalArgumentException is thrown if milliseconds < 0 or >
* 1001.
*
*/
@Test(expectedExceptions = IllegalArgumentException.class, dataProvider = "invalid-milliseconds")
public void checkNewCalendarNeg(int milliseconds) {
// invalid milliseconds
datatypeFactory.newXMLGregorianCalendar(2004, // year
6, // month
2, // day
19, // hour
20, // minute
59, // second
milliseconds, // milliseconds
840 // timezone
);
}
/*
* Test DatatypeFactory.newXMLGregorianCalendarTime(..).
*
* Bug # 5049592 IllegalArgumentException is thrown if milliseconds < 0 or >
* 1001.
*
*/
@Test(expectedExceptions = IllegalArgumentException.class, dataProvider = "invalid-milliseconds")
public void checkNewTimeNeg(int milliseconds) {
// invalid milliseconds
datatypeFactory.newXMLGregorianCalendarTime(19, // hour
20, // minute
59, // second
milliseconds, // milliseconds
840 // timezone
);
}
@DataProvider(name = "data-for-add")
public Object[][] getDataForAdd() {
return new Object[][] {
//calendar1, calendar2, duration
{ "1999-12-31T00:00:00Z", "2000-01-01T00:00:00Z", "P1D" },
{ "2000-12-31T00:00:00Z", "2001-01-01T00:00:00Z", "P1D" },
{ "1998-12-31T00:00:00Z", "1999-01-01T00:00:00Z", "P1D" },
{ "2001-12-31T00:00:00Z", "2002-01-01T00:00:00Z", "P1D" },
{ "2003-04-11T00:00:00Z", "2003-04-12T00:00:00Z", "P1D" },
{ "2003-04-11T00:00:00Z", "2003-04-14T00:00:00Z", "P3D" },
{ "2003-04-30T00:00:00Z", "2003-05-01T00:00:00Z", "P1D" },
{ "2003-02-28T00:00:00Z", "2003-03-01T00:00:00Z", "P1D" },
{ "2000-02-29T00:00:00Z", "2000-03-01T00:00:00Z", "P1D" },
{ "2000-02-28T00:00:00Z", "2000-02-29T00:00:00Z", "P1D" },
{ "1998-01-11T00:00:00Z", "1998-04-11T00:00:00Z", "P90D" },
{ "1999-05-11T00:00:00Z", "2002-05-11T00:00:00Z", "P1096D" }};
}
/*
* Test XMLGregorianCalendar.add(Duration).
*
*/
@Test(dataProvider = "data-for-add")
public void checkAddDays(String cal1, String cal2, String dur) {
XMLGregorianCalendar calendar1 = datatypeFactory.newXMLGregorianCalendar(cal1);
XMLGregorianCalendar calendar2 = datatypeFactory.newXMLGregorianCalendar(cal2);
Duration duration = datatypeFactory.newDuration(dur);
XMLGregorianCalendar calendar1Clone = (XMLGregorianCalendar)calendar1.clone();
calendar1Clone.add(duration);
assertEquals(calendar1Clone, calendar2);
calendar2.add(duration.negate());
assertEquals(calendar2, calendar1);
}
@DataProvider(name = "gMonth")
public Object[][] getGMonth() {
return new Object[][] {
{ "2000-02" },
{ "2000-03" },
{ "2018-02" }};
}
/*
* Test XMLGregorianCalendar#isValid(). for gMonth
*
* Bug # 5041845
*
*/
@Test(dataProvider = "gMonth")
public void checkIsValid(String month) {
XMLGregorianCalendar gMonth = datatypeFactory.newXMLGregorianCalendar(month);
gMonth.setYear(null);
Assert.assertTrue(gMonth.isValid(), gMonth.toString() + " should isValid");
}
@DataProvider(name = "lexical01")
public Object[][] getLexicalRepresentForNormalize01() {
return new Object[][] { { "2000-01-16T12:00:00Z" }, { "2000-01-16T12:00:00" } };
}
/*
* Test XMLGregorianCalendar#normalize(...).
*
* Bug # 5048932 XMLGregorianCalendar.normalize works
*
*/
@Test(dataProvider = "lexical01")
public void checkNormalize01(String lexical) {
XMLGregorianCalendar lhs = datatypeFactory.newXMLGregorianCalendar(lexical);
lhs.normalize();
}
@DataProvider(name = "lexical02")
public Object[][] getLexicalRepresentForNormalize02() {
return new Object[][] { { "2000-01-16T00:00:00.01Z" }, { "2000-01-16T00:00:00.01" }, { "13:20:00" } };
}
/*
* Test XMLGregorianCalendar#normalize(...).
*
* Bug # 5064587 XMLGregorianCalendar.normalize shall not change timezone
*
*/
@Test(dataProvider = "lexical02")
public void checkNormalize02(String lexical) {
XMLGregorianCalendar orig = datatypeFactory.newXMLGregorianCalendar(lexical);
XMLGregorianCalendar normalized = datatypeFactory.newXMLGregorianCalendar(lexical).normalize();
assertEquals(normalized.getTimezone(), orig.getTimezone());
assertEquals(normalized.getMillisecond(), orig.getMillisecond());
}
/*
* Test XMLGregorianCalendar#toGregorianCalendar( TimeZone timezone, Locale
* aLocale, XMLGregorianCalendar defaults)
*
* Bug # 5040542 the defaults XMLGregorianCalendar parameter shall take
* effect
*
*/
@Test
public void checkToGregorianCalendar01() {
XMLGregorianCalendar time_16_17_18 = datatypeFactory.newXMLGregorianCalendar("16:17:18");
XMLGregorianCalendar date_2001_02_03 = datatypeFactory.newXMLGregorianCalendar("2001-02-03");
GregorianCalendar calendar = date_2001_02_03.toGregorianCalendar(null, null, time_16_17_18);
int year = calendar.get(YEAR);
int minute = calendar.get(MINUTE);
assertTrue((year == 2001 && minute == 17), " expecting year == 2001, minute == 17" + ", result is year == " + year + ", minute == " + minute);
calendar = time_16_17_18.toGregorianCalendar(null, null, date_2001_02_03);
year = calendar.get(YEAR);
minute = calendar.get(MINUTE);
assertTrue((year == 2001 && minute == 17), " expecting year == 2001, minute == 17" + ", result is year == " + year + ", minute == " + minute);
date_2001_02_03.setMinute(3);
date_2001_02_03.setYear(null);
XMLGregorianCalendar date_time = datatypeFactory.newXMLGregorianCalendar("2003-04-11T02:13:01Z");
calendar = date_2001_02_03.toGregorianCalendar(null, null, date_time);
year = calendar.get(YEAR);
minute = calendar.get(MINUTE);
int hour = calendar.get(HOUR);
assertTrue((year == 2003 && hour == 2 && minute == 3), " expecting year == 2003, hour == 2, minute == 3" + ", result is year == " + year + ", hour == " + hour + ", minute == " + minute);
}
/*
* Test XMLGregorianCalendar#toGregorianCalendar( TimeZone timezone, Locale
* aLocale, XMLGregorianCalendar defaults) with the 'defaults' parameter
* being null.
*
* Bug # 5049531 XMLGregorianCalendar.toGregorianCalendar(..) can accept
* 'defaults' is null
*
*/
@Test
public void checkToGregorianCalendar02() {
XMLGregorianCalendar calendar = datatypeFactory.newXMLGregorianCalendar("2004-05-19T12:00:00+06:00");
calendar.toGregorianCalendar(TimeZone.getDefault(), Locale.getDefault(), null);
}
@DataProvider(name = "calendar")
public Object[][] getXMLGregorianCalendarData() {
return new Object[][] {
// year, month, day, hour, minute, second
{ 1970, 1, 1, 0, 0, 0 }, // DATETIME
{ 1970, 1, 1, undef, undef, undef }, // DATE
{ undef, undef, undef, 1, 0, 0 }, // TIME
{ 1970, 1, undef, undef, undef, undef }, // GYEARMONTH
{ undef, 1, 1, undef, undef, undef }, // GMONTHDAY
{ 1970, undef, undef, undef, undef, undef }, // GYEAR
{ undef, 1, undef, undef, undef, undef }, // GMONTH
{ undef, undef, 1, undef, undef, undef } // GDAY
};
}
/*
* Test XMLGregorianCalendar#toString()
*
* Bug # 5049528
*
*/
@Test(dataProvider = "calendar")
public void checkToStringPos(final int year, final int month, final int day, final int hour, final int minute, final int second) {
XMLGregorianCalendar calendar = datatypeFactory.newXMLGregorianCalendar(year, month, day, hour, minute, second, undef, undef);
calendar.toString();
}
/*
* Negative Test XMLGregorianCalendar#toString()
*
* Bug # 5049528 XMLGregorianCalendar.toString throws IllegalStateException
* if all parameters are undef
*
*/
@Test(expectedExceptions = IllegalStateException.class)
public void checkToStringNeg() {
XMLGregorianCalendar calendar = datatypeFactory.newXMLGregorianCalendar(undef, undef, undef, undef, undef, undef, undef, undef);
// expected to fail
calendar.toString();
}
private final int undef = DatatypeConstants.FIELD_UNDEFINED;
}