诸暨麻将添加redis
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

262 rivejä
9.2 KiB

  1. // Protocol Buffers - Google's data interchange format
  2. // Copyright 2008 Google Inc. All rights reserved.
  3. // https://developers.google.com/protocol-buffers/
  4. //
  5. // Redistribution and use in source and binary forms, with or without
  6. // modification, are permitted provided that the following conditions are
  7. // met:
  8. //
  9. // * Redistributions of source code must retain the above copyright
  10. // notice, this list of conditions and the following disclaimer.
  11. // * Redistributions in binary form must reproduce the above
  12. // copyright notice, this list of conditions and the following disclaimer
  13. // in the documentation and/or other materials provided with the
  14. // distribution.
  15. // * Neither the name of Google Inc. nor the names of its
  16. // contributors may be used to endorse or promote products derived from
  17. // this software without specific prior written permission.
  18. //
  19. // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  20. // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  21. // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  22. // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  23. // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  24. // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  25. // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  26. // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  27. // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  28. // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  29. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  30. #include <google/protobuf/stubs/time.h>
  31. #include <google/protobuf/testing/googletest.h>
  32. #include <gtest/gtest.h>
  33. namespace google {
  34. namespace protobuf {
  35. namespace internal {
  36. namespace {
  37. static const int64 kSecondsPerDay = 3600 * 24;
  38. // For DateTime, tests will mostly focuse on the date part because that's
  39. // the tricky one.
  40. int64 CreateTimestamp(int year, int month, int day) {
  41. DateTime time;
  42. time.year = year;
  43. time.month = month;
  44. time.day = day;
  45. time.hour = time.minute = time.second = 0;
  46. int64 result;
  47. GOOGLE_CHECK(DateTimeToSeconds(time, &result));
  48. // Check that a roundtrip produces the same result.
  49. GOOGLE_CHECK(SecondsToDateTime(result, &time));
  50. GOOGLE_CHECK(time.year == year);
  51. GOOGLE_CHECK(time.month == month);
  52. GOOGLE_CHECK(time.day == day);
  53. return result;
  54. }
  55. TEST(DateTimeTest, SimpleTime) {
  56. DateTime time;
  57. ASSERT_TRUE(SecondsToDateTime(1, &time));
  58. EXPECT_EQ(1970, time.year);
  59. EXPECT_EQ(1, time.month);
  60. EXPECT_EQ(1, time.day);
  61. EXPECT_EQ(0, time.hour);
  62. EXPECT_EQ(0, time.minute);
  63. EXPECT_EQ(1, time.second);
  64. int64 seconds;
  65. ASSERT_TRUE(DateTimeToSeconds(time, &seconds));
  66. EXPECT_EQ(1, seconds);
  67. ASSERT_TRUE(SecondsToDateTime(-1, &time));
  68. EXPECT_EQ(1969, time.year);
  69. EXPECT_EQ(12, time.month);
  70. EXPECT_EQ(31, time.day);
  71. EXPECT_EQ(23, time.hour);
  72. EXPECT_EQ(59, time.minute);
  73. EXPECT_EQ(59, time.second);
  74. ASSERT_TRUE(DateTimeToSeconds(time, &seconds));
  75. EXPECT_EQ(-1, seconds);
  76. DateTime start, end;
  77. start.year = 1;
  78. start.month = 1;
  79. start.day = 1;
  80. start.hour = 0;
  81. start.minute = 0;
  82. start.second = 0;
  83. end.year = 9999;
  84. end.month = 12;
  85. end.day = 31;
  86. end.hour = 23;
  87. end.minute = 59;
  88. end.second = 59;
  89. int64 start_time, end_time;
  90. ASSERT_TRUE(DateTimeToSeconds(start, &start_time));
  91. ASSERT_TRUE(DateTimeToSeconds(end, &end_time));
  92. EXPECT_EQ(315537897599LL, end_time - start_time);
  93. ASSERT_TRUE(SecondsToDateTime(start_time, &time));
  94. ASSERT_TRUE(DateTimeToSeconds(time, &seconds));
  95. EXPECT_EQ(start_time, seconds);
  96. ASSERT_TRUE(SecondsToDateTime(end_time, &time));
  97. ASSERT_TRUE(DateTimeToSeconds(time, &seconds));
  98. EXPECT_EQ(end_time, seconds);
  99. }
  100. TEST(DateTimeTest, DayInMonths) {
  101. // Check that month boundaries are handled correctly.
  102. EXPECT_EQ(kSecondsPerDay,
  103. CreateTimestamp(2015, 1, 1) - CreateTimestamp(2014, 12, 31));
  104. EXPECT_EQ(kSecondsPerDay,
  105. CreateTimestamp(2015, 2, 1) - CreateTimestamp(2015, 1, 31));
  106. EXPECT_EQ(kSecondsPerDay,
  107. CreateTimestamp(2015, 3, 1) - CreateTimestamp(2015, 2, 28));
  108. EXPECT_EQ(kSecondsPerDay,
  109. CreateTimestamp(2015, 4, 1) - CreateTimestamp(2015, 3, 31));
  110. EXPECT_EQ(kSecondsPerDay,
  111. CreateTimestamp(2015, 5, 1) - CreateTimestamp(2015, 4, 30));
  112. EXPECT_EQ(kSecondsPerDay,
  113. CreateTimestamp(2015, 6, 1) - CreateTimestamp(2015, 5, 31));
  114. EXPECT_EQ(kSecondsPerDay,
  115. CreateTimestamp(2015, 7, 1) - CreateTimestamp(2015, 6, 30));
  116. EXPECT_EQ(kSecondsPerDay,
  117. CreateTimestamp(2015, 8, 1) - CreateTimestamp(2015, 7, 31));
  118. EXPECT_EQ(kSecondsPerDay,
  119. CreateTimestamp(2015, 9, 1) - CreateTimestamp(2015, 8, 31));
  120. EXPECT_EQ(kSecondsPerDay,
  121. CreateTimestamp(2015, 10, 1) - CreateTimestamp(2015, 9, 30));
  122. EXPECT_EQ(kSecondsPerDay,
  123. CreateTimestamp(2015, 11, 1) - CreateTimestamp(2015, 10, 31));
  124. EXPECT_EQ(kSecondsPerDay,
  125. CreateTimestamp(2015, 12, 1) - CreateTimestamp(2015, 11, 30));
  126. EXPECT_EQ(kSecondsPerDay,
  127. CreateTimestamp(2016, 1, 1) - CreateTimestamp(2015, 12, 31));
  128. }
  129. TEST(DateTimeTest, LeapYear) {
  130. // Non-leap year.
  131. EXPECT_EQ(kSecondsPerDay,
  132. CreateTimestamp(2015, 3, 1) - CreateTimestamp(2015, 2, 28));
  133. // Leap year.
  134. EXPECT_EQ(kSecondsPerDay,
  135. CreateTimestamp(2016, 3, 1) - CreateTimestamp(2016, 2, 29));
  136. // Non-leap year.
  137. EXPECT_EQ(kSecondsPerDay,
  138. CreateTimestamp(2100, 3, 1) - CreateTimestamp(2100, 2, 28));
  139. // Leap year.
  140. EXPECT_EQ(kSecondsPerDay,
  141. CreateTimestamp(2400, 3, 1) - CreateTimestamp(2400, 2, 29));
  142. }
  143. TEST(DateTimeTest, WrongDays) {
  144. int64 seconds;
  145. DateTime time;
  146. time.hour = 0;
  147. time.minute = 0;
  148. time.second = 0;
  149. time.month = 2;
  150. // Non-leap year.
  151. time.year = 2015;
  152. time.day = 29;
  153. ASSERT_FALSE(DateTimeToSeconds(time, &seconds));
  154. // Leap year.
  155. time.year = 2016;
  156. time.day = 29;
  157. ASSERT_TRUE(DateTimeToSeconds(time, &seconds));
  158. time.day = 30;
  159. ASSERT_FALSE(DateTimeToSeconds(time, &seconds));
  160. // Non-leap year.
  161. time.year = 2100;
  162. time.day = 29;
  163. ASSERT_FALSE(DateTimeToSeconds(time, &seconds));
  164. // Leap year.
  165. time.year = 2400;
  166. time.day = 29;
  167. ASSERT_TRUE(DateTimeToSeconds(time, &seconds));
  168. time.day = 30;
  169. ASSERT_FALSE(DateTimeToSeconds(time, &seconds));
  170. // Non-february
  171. time.year = 2015;
  172. time.month = 1;
  173. time.day = 0;
  174. ASSERT_FALSE(DateTimeToSeconds(time, &seconds));
  175. time.day = 1;
  176. ASSERT_TRUE(DateTimeToSeconds(time, &seconds));
  177. time.day = 31;
  178. ASSERT_TRUE(DateTimeToSeconds(time, &seconds));
  179. time.day = 32;
  180. ASSERT_FALSE(DateTimeToSeconds(time, &seconds));
  181. // Bad month
  182. time.year = 2015;
  183. time.month = 0;
  184. time.day = 1;
  185. ASSERT_FALSE(DateTimeToSeconds(time, &seconds));
  186. time.month = 13;
  187. ASSERT_FALSE(DateTimeToSeconds(time, &seconds));
  188. }
  189. TEST(DateTimeTest, StringFormat) {
  190. DateTime start, end;
  191. start.year = 1;
  192. start.month = 1;
  193. start.day = 1;
  194. start.hour = 0;
  195. start.minute = 0;
  196. start.second = 0;
  197. end.year = 9999;
  198. end.month = 12;
  199. end.day = 31;
  200. end.hour = 23;
  201. end.minute = 59;
  202. end.second = 59;
  203. int64 start_time, end_time;
  204. ASSERT_TRUE(DateTimeToSeconds(start, &start_time));
  205. ASSERT_TRUE(DateTimeToSeconds(end, &end_time));
  206. EXPECT_EQ("0001-01-01T00:00:00Z", FormatTime(start_time, 0));
  207. EXPECT_EQ("9999-12-31T23:59:59Z", FormatTime(end_time, 0));
  208. // Make sure the nanoseconds part is formated correctly.
  209. EXPECT_EQ("1970-01-01T00:00:00.010Z", FormatTime(0, 10000000));
  210. EXPECT_EQ("1970-01-01T00:00:00.000010Z", FormatTime(0, 10000));
  211. EXPECT_EQ("1970-01-01T00:00:00.000000010Z", FormatTime(0, 10));
  212. }
  213. TEST(DateTimeTest, ParseString) {
  214. int64 seconds;
  215. int32 nanos;
  216. ASSERT_TRUE(ParseTime("0001-01-01T00:00:00Z", &seconds, &nanos));
  217. EXPECT_EQ("0001-01-01T00:00:00Z", FormatTime(seconds, nanos));
  218. ASSERT_TRUE(ParseTime("9999-12-31T23:59:59.999999999Z", &seconds, &nanos));
  219. EXPECT_EQ("9999-12-31T23:59:59.999999999Z", FormatTime(seconds, nanos));
  220. // Test time zone offsets.
  221. ASSERT_TRUE(ParseTime("1970-01-01T00:00:00-08:00", &seconds, &nanos));
  222. EXPECT_EQ("1970-01-01T08:00:00Z", FormatTime(seconds, nanos));
  223. ASSERT_TRUE(ParseTime("1970-01-01T00:00:00+08:00", &seconds, &nanos));
  224. EXPECT_EQ("1969-12-31T16:00:00Z", FormatTime(seconds, nanos));
  225. // Test nanoseconds.
  226. ASSERT_TRUE(ParseTime("1970-01-01T00:00:00.01Z", &seconds, &nanos));
  227. EXPECT_EQ("1970-01-01T00:00:00.010Z", FormatTime(seconds, nanos));
  228. ASSERT_TRUE(ParseTime("1970-01-01T00:00:00.00001-08:00", &seconds, &nanos));
  229. EXPECT_EQ("1970-01-01T08:00:00.000010Z", FormatTime(seconds, nanos));
  230. ASSERT_TRUE(ParseTime("1970-01-01T00:00:00.00000001+08:00", &seconds, &nanos));
  231. EXPECT_EQ("1969-12-31T16:00:00.000000010Z", FormatTime(seconds, nanos));
  232. // Fractional parts less than 1 nanosecond will be ignored.
  233. ASSERT_TRUE(ParseTime("1970-01-01T00:00:00.0123456789Z", &seconds, &nanos));
  234. EXPECT_EQ("1970-01-01T00:00:00.012345678Z", FormatTime(seconds, nanos));
  235. }
  236. } // namespace
  237. } // namespace internal
  238. } // namespace protobuf
  239. } // namespace google