summaryrefslogtreecommitdiff
path: root/Build/source/libs/icu/icu-src/source/test/intltest/caltztst.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/libs/icu/icu-src/source/test/intltest/caltztst.cpp')
-rw-r--r--Build/source/libs/icu/icu-src/source/test/intltest/caltztst.cpp244
1 files changed, 244 insertions, 0 deletions
diff --git a/Build/source/libs/icu/icu-src/source/test/intltest/caltztst.cpp b/Build/source/libs/icu/icu-src/source/test/intltest/caltztst.cpp
new file mode 100644
index 00000000000..9b5b4a0d98a
--- /dev/null
+++ b/Build/source/libs/icu/icu-src/source/test/intltest/caltztst.cpp
@@ -0,0 +1,244 @@
+/********************************************************************
+ * COPYRIGHT:
+ * Copyright (c) 1997-2010, International Business Machines Corporation and
+ * others. All Rights Reserved.
+ ********************************************************************/
+/*
+* File CALTZTST.H
+*
+* Modification History:
+*
+* Date Name Description
+* 08/06/97 aliu Creation.
+********************************************************************************
+*/
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_FORMATTING
+
+#include "caltztst.h"
+#include "unicode/smpdtfmt.h"
+#include "mutex.h"
+
+DateFormat* CalendarTimeZoneTest::fgDateFormat = 0;
+Calendar* CalendarTimeZoneTest::fgCalendar = 0;
+
+UBool CalendarTimeZoneTest::failure(UErrorCode status, const char* msg, UBool possibleDataError)
+{
+ if (U_FAILURE(status))
+ {
+ if (possibleDataError) {
+ dataerrln(UnicodeString("FAIL: ") + msg + " failed, error " + u_errorName(status));
+ } else {
+ errcheckln(status, UnicodeString("FAIL: ") + msg + " failed, error " + u_errorName(status));
+ }
+ return TRUE;
+ }
+ return FALSE;
+}
+
+DateFormat* CalendarTimeZoneTest::getDateFormat()
+{
+ DateFormat *theFormat = 0;
+
+ if (fgDateFormat != 0) // if there's something in the cache
+ {
+ Mutex lock;
+
+ if (fgDateFormat != 0) // Someone might have grabbed it.
+ {
+ theFormat = fgDateFormat;
+ fgDateFormat = 0; // We have exclusive right to this formatter.
+ }
+ }
+
+ if(theFormat == 0) // If we weren't able to pull it out of the cache, then we have to create it.
+ {
+ UErrorCode status = U_ZERO_ERROR;
+ theFormat = new SimpleDateFormat(UnicodeString("EEE MMM dd HH:mm:ss zzz yyyy"), status);
+ if (U_FAILURE(status))
+ {
+ delete theFormat;
+ theFormat = 0;
+ dataerrln("FAIL: Could not create SimpleDateFormat - %s", u_errorName(status));
+ }
+ }
+
+ return theFormat;
+}
+
+void CalendarTimeZoneTest::releaseDateFormat(DateFormat *adopt)
+{
+ if(fgDateFormat == 0) // If the cache is empty we must add it back.
+ {
+ Mutex lock;
+
+ if(fgDateFormat == 0)
+ {
+ fgDateFormat = adopt;
+ adopt = 0;
+ }
+ }
+ else {
+ delete adopt;
+ }
+}
+
+Calendar* CalendarTimeZoneTest::getCalendar()
+{
+ Calendar *theCalendar = 0;
+
+ if (fgCalendar != 0) // if there's something in the cache
+ {
+ Mutex lock;
+
+ if (fgCalendar != 0) // Someone might have grabbed it.
+ {
+ theCalendar = fgCalendar;
+ fgCalendar = 0; // We have exclusive right to this calendar.
+ }
+ }
+
+ if(theCalendar == 0) // If we weren't able to pull it out of the cache, then we have to create it.
+ {
+ UErrorCode status = U_ZERO_ERROR;
+ theCalendar = Calendar::createInstance(status);
+ if (U_FAILURE(status))
+ {
+ delete theCalendar;
+ theCalendar = 0;
+ dataerrln("FAIL: Calendar::createInstance failed: %s", u_errorName(status));
+ }
+ }
+ return theCalendar;
+}
+
+void CalendarTimeZoneTest::releaseCalendar(Calendar* adopt)
+{
+ if(fgCalendar == 0) // If the cache is empty we must add it back.
+ {
+ Mutex lock;
+
+ if(fgCalendar == 0)
+ {
+ fgCalendar = adopt;
+ adopt = 0;
+ }
+ }
+ else
+ {
+ delete adopt;
+ }
+}
+
+// Utility method for formatting dates for printing; useful for Java->C++ conversion.
+// Tries to mimic the Java Date.toString() format.
+UnicodeString
+CalendarTimeZoneTest::dateToString(UDate d)
+{
+ UnicodeString str;
+ return dateToString(d, str);
+}
+
+UnicodeString&
+CalendarTimeZoneTest::dateToString(UDate d, UnicodeString& str)
+{
+ str.remove();
+ DateFormat* format = getDateFormat();
+ if (format == 0)
+ {
+ str += "DATE_FORMAT_FAILURE";
+ return str;
+ }
+ format->format(d, str);
+ releaseDateFormat(format);
+ return str;
+}
+
+UnicodeString&
+CalendarTimeZoneTest::dateToString(UDate d, UnicodeString& str,
+ const TimeZone& tz)
+{
+ str.remove();
+ DateFormat* format = getDateFormat();
+ if (format == 0)
+ {
+ str += "DATE_FORMAT_FAILURE";
+ return str;
+ }
+ TimeZone* save = format->getTimeZone().clone();
+ format->setTimeZone(tz);
+ format->format(d, str);
+ format->adoptTimeZone(save);
+ releaseDateFormat(format);
+ return str;
+}
+
+// Utility methods to create a date. This is useful for converting Java constructs
+// which create a Date object.
+UDate
+CalendarTimeZoneTest::date(int32_t y, int32_t m, int32_t d, int32_t hr, int32_t min, int32_t sec)
+{
+ Calendar* cal = getCalendar();
+ if (cal == 0) return 0.0;
+ cal->clear();
+ cal->set(1900 + y, m, d, hr, min, sec); // Add 1900 to follow java.util.Date protocol
+ UErrorCode status = U_ZERO_ERROR;
+ UDate dt = cal->getTime(status);
+ releaseCalendar(cal);
+ if (U_FAILURE(status))
+ {
+ errln("FAIL: Calendar::getTime failed: %s", u_errorName(status));
+ return 0.0;
+ }
+ return dt;
+}
+
+// Utility methods to create a date. The returned Date is UTC rather than local.
+/*Date
+CalendarTimeZoneTest::utcDate(int32_t y, int32_t m, int32_t d, int32_t hr, int32_t min, int32_t sec)
+{
+ Calendar* cal = getCalendar();
+ if (cal == 0) return 0.0;
+ UErrorCode status = U_ZERO_ERROR;
+ Date dt = date(y, m, d, hr, min, sec) +
+ cal->get(Calendar::ZONE_OFFSET, status) -
+ cal->get(Calendar::DST_OFFSET, status);
+ releaseCalendar(cal);
+ if (U_FAILURE(status))
+ {
+ errln("FAIL: Calendar::get failed");
+ return 0.0;
+ }
+ return dt;
+}*/
+
+// Mimics Date.getYear() etc.
+void
+CalendarTimeZoneTest::dateToFields(UDate date, int32_t& y, int32_t& m, int32_t& d, int32_t& hr, int32_t& min, int32_t& sec)
+{
+ Calendar* cal = getCalendar();
+ if (cal == 0) return;
+ UErrorCode status = U_ZERO_ERROR;
+ cal->setTime(date, status);
+ y = cal->get(UCAL_YEAR, status) - 1900;
+ m = cal->get(UCAL_MONTH, status);
+ d = cal->get(UCAL_DATE, status);
+ hr = cal->get(UCAL_HOUR_OF_DAY, status);
+ min = cal->get(UCAL_MINUTE, status);
+ sec = cal->get(UCAL_SECOND, status);
+ releaseCalendar(cal);
+}
+
+void CalendarTimeZoneTest::cleanup()
+{
+ delete fgDateFormat;
+ fgDateFormat = 0;
+ delete fgCalendar;
+ fgCalendar = 0;
+}
+
+#endif /* #if !UCONFIG_NO_FORMATTING */
+
+//eof