1 /* 2 * Copyright 2017, Haiku, Inc. All Rights Reserved. 3 * Distributed under the terms of the MIT License. 4 * 5 * Authors: 6 * Akshay Agarwal <agarwal.akshay.akshay8@gmail.com> 7 */ 8 9 #include "RelativeDateTimeFormatTest.h" 10 11 #include <time.h> 12 13 #include <Locale.h> 14 #include <RelativeDateTimeFormat.h> 15 16 #include <cppunit/TestCaller.h> 17 #include <cppunit/TestSuite.h> 18 19 20 const int kMonthsPerYear = 12; 21 const int kMaxDaysPerMonth = 31; 22 const int kDaysPerWeek = 7; 23 const int kHoursPerDay = 24; 24 const int kMinutesPerHour = 60; 25 const int kSecondsPerMinute = 60; 26 27 28 RelativeDateTimeFormatTest::RelativeDateTimeFormatTest() 29 { 30 } 31 32 33 RelativeDateTimeFormatTest::~RelativeDateTimeFormatTest() 34 { 35 } 36 37 38 void 39 RelativeDateTimeFormatTest::TestDefault() 40 { 41 BRelativeDateTimeFormat format; 42 BString buffer; 43 BString expected; 44 45 status_t result = format.Format(buffer, time(NULL)); 46 CPPUNIT_ASSERT_EQUAL(B_OK, result); 47 // The exact format and language used depends on the locale settings, but 48 // we can assume that whatever they are, it should put something in the 49 // string. 50 CPPUNIT_ASSERT(buffer.Length() > 0); 51 } 52 53 54 void 55 RelativeDateTimeFormatTest::TestFormat() 56 { 57 struct Value { 58 const char* language; 59 const char* convention; 60 time_t timeDelta; 61 const char* relativeDate; 62 }; 63 64 static const Value values[] = { 65 {"en", "en_US", 0, "in 0 seconds"}, 66 {"en", "en_US", 20, "in 20 seconds"}, 67 {"en", "en_US", -20, "20 seconds ago"}, 68 {"en", "en_US", 5 * kSecondsPerMinute, "in 5 minutes"}, 69 {"en", "en_US", -5 * kSecondsPerMinute, "5 minutes ago"}, 70 {"en", "en_US", 2 * kMinutesPerHour * kSecondsPerMinute, "in 2 hours"}, 71 {"en", "en_US", -2 * kMinutesPerHour * kSecondsPerMinute, "2 hours ago"}, 72 {"fr", "fr_FR", 2 * kMinutesPerHour * kSecondsPerMinute, "dans 2 heures"}, 73 {"fr", "fr_FR", -2 * kMinutesPerHour * kSecondsPerMinute, "il y a 2 heures"}, 74 {"en", "en_US", 5 * kHoursPerDay * kMinutesPerHour * kSecondsPerMinute, 75 "in 5 days"}, 76 {"en", "en_US", -5 * kHoursPerDay * kMinutesPerHour * kSecondsPerMinute, 77 "5 days ago"}, 78 {"de", "de_DE", 5 * kHoursPerDay * kMinutesPerHour * kSecondsPerMinute, 79 "in 5 Tagen"}, 80 {"de", "de_DE", -5 * kHoursPerDay * kMinutesPerHour * kSecondsPerMinute, 81 "vor 5 Tagen"}, 82 {"en", "en_US", 3 * kDaysPerWeek * kHoursPerDay * kMinutesPerHour 83 * kSecondsPerMinute, "in 3 weeks"}, 84 {"en", "en_US", -3 * kDaysPerWeek * kHoursPerDay * kMinutesPerHour 85 * kSecondsPerMinute, "3 weeks ago"}, 86 {"en", "en_US", 4 * kMaxDaysPerMonth * kHoursPerDay * kMinutesPerHour 87 * kSecondsPerMinute, "in 4 months"}, 88 {"en", "en_US", -4 * kMaxDaysPerMonth * kHoursPerDay * kMinutesPerHour 89 * kSecondsPerMinute, "4 months ago"}, 90 {"en", "en_US", 2 * kMonthsPerYear * kMaxDaysPerMonth * kHoursPerDay 91 * kMinutesPerHour * kSecondsPerMinute, "in 2 years"}, 92 {"en", "en_US", -2 * kMonthsPerYear * kMaxDaysPerMonth * kHoursPerDay 93 * kMinutesPerHour * kSecondsPerMinute, "2 years ago"}, 94 {NULL} 95 }; 96 97 status_t result; 98 99 for (int i = 0; values[i].language != NULL; i++) { 100 NextSubTest(); 101 102 BString output; 103 BLanguage language(values[i].language); 104 BFormattingConventions formatting(values[i].convention); 105 BRelativeDateTimeFormat format(language, formatting); 106 107 result = format.Format(output, time(NULL) + values[i].timeDelta); 108 CPPUNIT_ASSERT_EQUAL(B_OK, result); 109 CPPUNIT_ASSERT_EQUAL(BString(values[i].relativeDate), output); 110 } 111 } 112 113 114 /*static*/ void 115 RelativeDateTimeFormatTest::AddTests(BTestSuite& parent) 116 { 117 CppUnit::TestSuite& suite = *new CppUnit::TestSuite("RelativeDateTimeFormatTest"); 118 119 suite.addTest(new CppUnit::TestCaller<RelativeDateTimeFormatTest>( 120 "RelativeDateTimeFormatTest::TestDefault", &RelativeDateTimeFormatTest::TestDefault)); 121 suite.addTest(new CppUnit::TestCaller<RelativeDateTimeFormatTest>( 122 "RelativeDateTimeFormatTest::TestFormat", &RelativeDateTimeFormatTest::TestFormat)); 123 parent.addTest("RelativeDateTimeFormatTest", &suite); 124 } 125