Clarify handling of unspecified year in two QCalendar methods

[ChangeLog][QtCore] QCalendar::monthsInYear(QCalendar::Unspecified)
now returns maximumMonthsInYear(). QCalendar::daysInYear() now makes
clear that its handling of unspecified year is undefined.

Change-Id: Ifef8723193868c666f6afeb7f190af4929d30dea
Reviewed-by: Paul Wicking <paul.wicking@qt.io>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
This commit is contained in:
Edward Welbourne 2020-01-30 17:24:01 +01:00
parent a5be18cc7d
commit b4b3b5c694
2 changed files with 33 additions and 3 deletions

View File

@ -1,6 +1,6 @@
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2019 The Qt Company Ltd. ** Copyright (C) 2020 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/ ** Contact: https://www.qt.io/licensing/
** **
** This file is part of the QtCore module of the Qt Toolkit. ** This file is part of the QtCore module of the Qt Toolkit.
@ -750,6 +750,8 @@ int QCalendar::daysInMonth(int month, int year) const
/*! /*!
Returns the number of days in the given \a year. Returns the number of days in the given \a year.
Handling of \c Unspecified as \a year is undefined.
*/ */
int QCalendar::daysInYear(int year) const int QCalendar::daysInYear(int year) const
{ {
@ -758,10 +760,15 @@ int QCalendar::daysInYear(int year) const
/*! /*!
Returns the number of months in the given \a year. Returns the number of months in the given \a year.
If \a year is \c Unspecified, returns the maximum number of months in a
year.
\sa maximumMonthsInYear()
*/ */
int QCalendar::monthsInYear(int year) const int QCalendar::monthsInYear(int year) const
{ {
return d ? d->monthsInYear(year) : 0; return d ? year == Unspecified ? d->maximumMonthsInYear() : d->monthsInYear(year) : 0;
} }
/*! /*!

View File

@ -1,6 +1,6 @@
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2018 The Qt Company Ltd. ** Copyright (C) 2020 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/ ** Contact: https://www.qt.io/licensing/
** **
** This file is part of the test suite of the Qt Toolkit. ** This file is part of the test suite of the Qt Toolkit.
@ -40,6 +40,8 @@ private:
private slots: private slots:
void basic_data(); void basic_data();
void basic(); void basic();
void unspecified_data() { basic_data(); }
void unspecified();
void nameCase(); void nameCase();
void specific_data(); void specific_data();
void specific(); void specific();
@ -145,6 +147,27 @@ void tst_QCalendar::basic()
NORMALYEAR(cal, year); NORMALYEAR(cal, year);
} }
void tst_QCalendar::unspecified()
{
QFETCH(QCalendar::System, system);
QCalendar cal(system);
const QDate today = QDate::currentDate();
const int thisYear = today.year();
QCOMPARE(cal.monthsInYear(QCalendar::Unspecified), cal.maximumMonthsInYear());
for (int month = cal.maximumMonthsInYear(); month > 0; month--) {
const int days = cal.daysInMonth(month);
int count = 0;
// 19 years = one Metonic cycle (used by some lunar calendars)
for (int i = 19; i > 0; --i) {
if (cal.daysInMonth(month, thisYear - i) == days)
count++;
}
// Require a majority of the years tested:
QVERIFY2(count > 9, "Default daysInMonth() should be for a normal year");
}
}
void tst_QCalendar::nameCase() void tst_QCalendar::nameCase()
{ {
QVERIFY(QCalendar::availableCalendars().contains(QStringLiteral("Gregorian"))); QVERIFY(QCalendar::availableCalendars().contains(QStringLiteral("Gregorian")));