Index: icu46/source/test/intltest/caltztst.cpp |
=================================================================== |
--- icu46/source/test/intltest/caltztst.cpp (revision 0) |
+++ icu46/source/test/intltest/caltztst.cpp (revision 0) |
@@ -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 |
Property changes on: icu46/source/test/intltest/caltztst.cpp |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |