| // Licensed to the Apache Software Foundation (ASF) under one |
| // or more contributor license agreements. See the NOTICE file |
| // distributed with this work for additional information |
| // regarding copyright ownership. The ASF licenses this file |
| // to you under the Apache License, Version 2.0 (the |
| // "License"); you may not use this file except in compliance |
| // with the License. You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, |
| // software distributed under the License is distributed on an |
| // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| // KIND, either express or implied. See the License for the |
| // specific language governing permissions and limitations |
| // under the License. |
| |
| #include "runtime/datetime_value.h" |
| |
| #include <gtest/gtest.h> |
| |
| #include <string> |
| |
| #include "common/logging.h" |
| #include "util/logging.h" |
| #include "util/timezone_utils.h" |
| |
| namespace doris { |
| |
| class DateTimeValueTest : public testing::Test { |
| public: |
| DateTimeValueTest() {} |
| |
| protected: |
| virtual void SetUp() {} |
| virtual void TearDown() {} |
| }; |
| |
| // Assert size |
| TEST_F(DateTimeValueTest, struct_size) { |
| ASSERT_EQ(16, sizeof(DateTimeValue)); |
| } |
| |
| TEST_F(DateTimeValueTest, equal) { |
| DateTimeValue value1; |
| value1.from_date_int64(19880201); |
| DateTimeValue value2; |
| |
| value2.from_date_int64(19880201); |
| ASSERT_TRUE(value1 == value2); |
| ASSERT_TRUE(value1 <= value2); |
| ASSERT_TRUE(value1 >= value2); |
| ASSERT_FALSE(value1 < value2); |
| ASSERT_FALSE(value1 > value2); |
| |
| value2.from_date_int64(19880201000000); |
| ASSERT_TRUE(value1 == value2); |
| ASSERT_TRUE(value1 <= value2); |
| ASSERT_TRUE(value1 >= value2); |
| ASSERT_FALSE(value1 < value2); |
| ASSERT_FALSE(value1 > value2); |
| |
| value2.from_date_int64(19880202); |
| ASSERT_TRUE(value1 != value2); |
| ASSERT_TRUE(value1 <= value2); |
| ASSERT_TRUE(value1 < value2); |
| ASSERT_FALSE(value1 >= value2); |
| ASSERT_FALSE(value1 > value2); |
| |
| value2.from_date_int64(19880131); |
| ASSERT_TRUE(value1 != value2); |
| ASSERT_TRUE(value1 > value2); |
| ASSERT_TRUE(value1 >= value2); |
| ASSERT_FALSE(value1 < value2); |
| ASSERT_FALSE(value1 <= value2); |
| |
| std::string test_str = "1988-02-01 00:00:00.12345"; |
| value2.from_date_str(test_str.c_str(), test_str.size()); |
| ASSERT_TRUE(value1 != value2); |
| ASSERT_TRUE(value1 < value2); |
| ASSERT_TRUE(value1 <= value2); |
| ASSERT_FALSE(value1 > value2); |
| ASSERT_FALSE(value1 >= value2); |
| } |
| |
| // Test check range |
| TEST_F(DateTimeValueTest, day_of_year) { |
| DateTimeValue value; |
| value.from_date_int64(20070101); |
| ASSERT_EQ(1, value.day_of_year()); |
| value.from_date_int64(20070203); |
| ASSERT_EQ(34, value.day_of_year()); |
| } |
| |
| // Test check range |
| TEST_F(DateTimeValueTest, random_convert) { |
| char buf[64]; |
| |
| for (int i = 0; i < 64; ++i) { |
| buf[i] = '0' + i % 10; |
| } |
| |
| DateTimeValue value_check; |
| |
| DateTimeValue* value = (DateTimeValue*)buf; |
| value->from_date_daynr(366); |
| value_check.from_date_daynr(366); |
| ASSERT_STREQ("0001-01-01", value->debug_string().c_str()); |
| ASSERT_FALSE(memcmp(value, &value_check, sizeof(value_check))); |
| |
| value = (DateTimeValue*)&buf[5]; |
| value->from_date_str("19880201", 8); |
| value_check.from_date_str("19880201", 8); |
| ASSERT_STREQ("1988-02-01", value->debug_string().c_str()); |
| ASSERT_FALSE(memcmp(value, &value_check, sizeof(value_check))); |
| |
| value = (DateTimeValue*)&buf[10]; |
| value->from_date_format_str("%Y%m%d", 6, "19880201", 8); |
| value_check.from_date_format_str("%Y%m%d", 6, "19880201", 8); |
| ASSERT_STREQ("1988-02-01", value->debug_string().c_str()); |
| ASSERT_FALSE(memcmp(value, &value_check, sizeof(value_check))); |
| |
| value = (DateTimeValue*)&buf[15]; |
| value->from_date_int64(19880201); |
| value_check.from_date_int64(19880201); |
| ASSERT_STREQ("1988-02-01", value->debug_string().c_str()); |
| ASSERT_FALSE(memcmp(value, &value_check, sizeof(value_check))); |
| |
| value = (DateTimeValue*)&buf[20]; |
| value->from_olap_datetime(19880201235959); |
| value_check.from_date_int64(19880201235959); |
| ASSERT_STREQ("1988-02-01 23:59:59", value->debug_string().c_str()); |
| ASSERT_FALSE(memcmp(value, &value_check, sizeof(value_check))); |
| |
| value = (DateTimeValue*)&buf[30]; |
| uint64_t date = 0; |
| date = 1988; |
| date <<= 4; |
| date |= 2; |
| date <<= 5; |
| date |= 1; |
| value->from_olap_date(date); |
| value_check.from_date_int64(19880201); |
| ASSERT_STREQ("1988-02-01", value->debug_string().c_str()); |
| ASSERT_FALSE(memcmp(value, &value_check, sizeof(value_check))); |
| } |
| |
| // Test check range |
| TEST_F(DateTimeValueTest, construct_int64) { |
| char buf[64]; |
| |
| DateTimeValue value; |
| value.from_date_int64(19880201); |
| |
| DateTimeValue value1(19880201); |
| value1.to_string(buf); |
| ASSERT_STREQ("1988-02-01", buf); |
| ASSERT_TRUE(value == value1); |
| |
| value.from_date_int64(19880201123456); |
| DateTimeValue value2(19880201123456); |
| value2.to_string(buf); |
| ASSERT_STREQ("1988-02-01 12:34:56", buf); |
| ASSERT_TRUE(value == value2); |
| } |
| |
| // Test check range |
| TEST_F(DateTimeValueTest, acc) { |
| DateTimeValue value; |
| char buf[64]; |
| |
| value.from_date_int64(19880201); |
| ++value; |
| value.to_string(buf); |
| ASSERT_STREQ("1988-02-02", buf); |
| |
| value.from_date_int64(19880131235959); |
| value.to_string(buf); |
| ASSERT_STREQ("1988-01-31 23:59:59", buf); |
| ++value; |
| value.to_string(buf); |
| ASSERT_STREQ("1988-02-01 00:00:00", buf); |
| } |
| |
| // Test check range |
| TEST_F(DateTimeValueTest, local_time) { |
| DateTimeValue value = DateTimeValue::local_time(); |
| LOG(INFO) << value.debug_string(); |
| } |
| |
| // Test check range |
| TEST_F(DateTimeValueTest, check_range) { |
| DateTimeValue value; |
| value.from_date_int64(19880201123456); |
| ASSERT_FALSE(value.check_range()); |
| |
| value._year = 10000; |
| ASSERT_TRUE(value.check_range()); |
| value._year = 1988; |
| |
| value._month = 13; |
| ASSERT_TRUE(value.check_range()); |
| value._month = 2; |
| |
| value._day = 32; |
| ASSERT_TRUE(value.check_range()); |
| value._day = 1; |
| |
| value._hour = TIME_MAX_HOUR; |
| ASSERT_TRUE(value.check_range()); |
| value._type = TIME_TIME; |
| ASSERT_FALSE(value.check_range()); |
| value._hour = TIME_MAX_HOUR + 1; |
| ASSERT_TRUE(value.check_range()); |
| value._type = TIME_DATETIME; |
| value._hour = 12; |
| |
| value._minute = 60; |
| ASSERT_TRUE(value.check_range()); |
| value._minute = 34; |
| |
| value._second = 60; |
| ASSERT_TRUE(value.check_range()); |
| value._second = 56; |
| |
| value._microsecond = 1000000; |
| ASSERT_TRUE(value.check_range()); |
| value._month = 0; |
| } |
| |
| TEST_F(DateTimeValueTest, check_date) { |
| DateTimeValue value; |
| ASSERT_TRUE(value.from_date_int64(19880201)); |
| |
| value._month = 0; |
| ASSERT_FALSE(value.check_date()); |
| value._month = 2; |
| |
| value._day = 0; |
| ASSERT_FALSE(value.check_date()); |
| value._year = 1987; |
| value._day = 29; |
| ASSERT_TRUE(value.check_date()); |
| value._year = 2000; |
| ASSERT_FALSE(value.check_date()); |
| } |
| |
| // Calculate format |
| TEST_F(DateTimeValueTest, week) { |
| std::string date_str; |
| DateTimeValue value; |
| |
| // 0000-01-01 |
| date_str = "0000-01-01"; |
| value.from_date_str(date_str.c_str(), date_str.size()); |
| ASSERT_EQ(1, value.week(mysql_week_mode(0))); |
| ASSERT_EQ(0, value.week(mysql_week_mode(1))); |
| ASSERT_EQ(1, value.week(mysql_week_mode(2))); |
| ASSERT_EQ(52, value.week(mysql_week_mode(3))); |
| ASSERT_EQ(1, value.week(mysql_week_mode(4))); |
| ASSERT_EQ(0, value.week(mysql_week_mode(5))); |
| ASSERT_EQ(1, value.week(mysql_week_mode(6))); |
| ASSERT_EQ(52, value.week(mysql_week_mode(7))); |
| |
| // 2013-12-31 |
| date_str = "2013-12-31"; |
| value.from_date_str(date_str.c_str(), date_str.size()); |
| ASSERT_EQ(52, value.week(mysql_week_mode(0))); |
| ASSERT_EQ(53, value.week(mysql_week_mode(1))); |
| ASSERT_EQ(52, value.week(mysql_week_mode(2))); |
| ASSERT_EQ(1, value.week(mysql_week_mode(3))); |
| ASSERT_EQ(53, value.week(mysql_week_mode(4))); |
| ASSERT_EQ(52, value.week(mysql_week_mode(5))); |
| ASSERT_EQ(1, value.week(mysql_week_mode(6))); |
| ASSERT_EQ(52, value.week(mysql_week_mode(7))); |
| |
| // 1988-02-01 |
| date_str = "1988-02-01"; |
| value.from_date_str(date_str.c_str(), date_str.size()); |
| ASSERT_EQ(5, value.week(mysql_week_mode(0))); |
| ASSERT_EQ(5, value.week(mysql_week_mode(1))); |
| ASSERT_EQ(5, value.week(mysql_week_mode(2))); |
| ASSERT_EQ(5, value.week(mysql_week_mode(3))); |
| ASSERT_EQ(5, value.week(mysql_week_mode(4))); |
| ASSERT_EQ(5, value.week(mysql_week_mode(5))); |
| ASSERT_EQ(5, value.week(mysql_week_mode(6))); |
| ASSERT_EQ(5, value.week(mysql_week_mode(7))); |
| } |
| |
| // Calculate format |
| TEST_F(DateTimeValueTest, from_unixtime) { |
| char str[MAX_DTVALUE_STR_LEN]; |
| DateTimeValue value; |
| |
| value.from_unixtime(570672000, TimezoneUtils::default_time_zone); |
| value.to_string(str); |
| ASSERT_STREQ("1988-02-01 08:00:00", str); |
| |
| value.from_unixtime(253402271999, TimezoneUtils::default_time_zone); |
| value.to_string(str); |
| ASSERT_STREQ("9999-12-31 23:59:59", str); |
| |
| value.from_unixtime(0, TimezoneUtils::default_time_zone); |
| value.to_string(str); |
| ASSERT_STREQ("1970-01-01 08:00:00", str); |
| |
| ASSERT_FALSE(value.from_unixtime(1586098092, "+20:00")); |
| ASSERT_FALSE(value.from_unixtime(1586098092, "foo")); |
| } |
| |
| // Calculate format |
| TEST_F(DateTimeValueTest, unix_timestamp) { |
| DateTimeValue value; |
| int64_t timestamp; |
| value.from_date_int64(19691231); |
| value.unix_timestamp(×tamp, TimezoneUtils::default_time_zone); |
| ASSERT_EQ(-115200, timestamp); |
| value.from_date_int64(19700101); |
| value.unix_timestamp(×tamp, TimezoneUtils::default_time_zone); |
| ASSERT_EQ(0 - 28800, timestamp); |
| value.from_date_int64(19700102); |
| value.unix_timestamp(×tamp, TimezoneUtils::default_time_zone); |
| ASSERT_EQ(86400 - 28800, timestamp); |
| value.from_date_int64(19880201000000); |
| value.unix_timestamp(×tamp, TimezoneUtils::default_time_zone); |
| ASSERT_EQ(570672000 - 28800, timestamp); |
| value.from_date_int64(20380119); |
| value.unix_timestamp(×tamp, TimezoneUtils::default_time_zone); |
| ASSERT_EQ(2147472000 - 28800, timestamp); |
| value.from_date_int64(20380120); |
| value.unix_timestamp(×tamp, TimezoneUtils::default_time_zone); |
| ASSERT_EQ(2147529600, timestamp); |
| |
| value.from_date_int64(10000101); |
| value.unix_timestamp(×tamp, TimezoneUtils::default_time_zone); |
| ASSERT_EQ(-30610252800, timestamp); |
| } |
| |
| // Calculate format |
| TEST_F(DateTimeValueTest, add_interval) { |
| // Used to check |
| char str[MAX_DTVALUE_STR_LEN]; |
| |
| TimeInterval interval; |
| |
| DateTimeValue value; |
| |
| value.from_date_int64(19880201); |
| interval.microsecond = 1; |
| ASSERT_TRUE(value.date_add_interval(interval, MICROSECOND)); |
| interval.microsecond = 0; |
| value.to_string(str); |
| ASSERT_STREQ("1988-02-01 00:00:00.000001", str); |
| |
| value.from_date_int64(19880201); |
| interval.second = 1; |
| ASSERT_TRUE(value.date_add_interval(interval, SECOND)); |
| interval.second = 0; |
| value.to_string(str); |
| ASSERT_STREQ("1988-02-01 00:00:01", str); |
| |
| value.from_date_int64(19880201); |
| interval.minute = 1; |
| ASSERT_TRUE(value.date_add_interval(interval, MINUTE)); |
| interval.minute = 0; |
| value.to_string(str); |
| ASSERT_STREQ("1988-02-01 00:01:00", str); |
| |
| value.from_date_int64(19880201); |
| interval.hour = 1; |
| ASSERT_TRUE(value.date_add_interval(interval, HOUR)); |
| interval.hour = 0; |
| value.to_string(str); |
| ASSERT_STREQ("1988-02-01 01:00:00", str); |
| |
| value.from_date_int64(19880201); |
| interval.microsecond = 1; |
| interval.second = 1; |
| ASSERT_TRUE(value.date_add_interval(interval, SECOND_MICROSECOND)); |
| interval.microsecond = 0; |
| interval.second = 0; |
| value.to_string(str); |
| ASSERT_STREQ("1988-02-01 00:00:01.000001", str); |
| |
| value.from_date_int64(19880201); |
| interval.day = 100; |
| ASSERT_TRUE(value.date_add_interval(interval, DAY)); |
| interval.day = 0; |
| value.to_string(str); |
| ASSERT_STREQ("1988-05-11", str); |
| |
| value.from_date_int64(19880131); |
| interval.month = 97; |
| ASSERT_TRUE(value.date_add_interval(interval, MONTH)); |
| interval.month = 0; |
| value.to_string(str); |
| ASSERT_STREQ("1996-02-29", str); |
| |
| value.from_date_int64(19880229); |
| interval.year = 1; |
| ASSERT_TRUE(value.date_add_interval(interval, YEAR)); |
| interval.year = 0; |
| value.to_string(str); |
| ASSERT_STREQ("1989-02-28", str); |
| } |
| |
| // Calculate format |
| TEST_F(DateTimeValueTest, from_date_format_str) { |
| // Used to check |
| char str[MAX_DTVALUE_STR_LEN]; |
| std::string format_str; |
| std::string value_str; |
| DateTimeValue value; |
| |
| // %Y-%m-%d |
| format_str = "%Y-%m-%d"; |
| value_str = "1988-02-01"; |
| ASSERT_TRUE(value.from_date_format_str(format_str.c_str(), format_str.size(), value_str.c_str(), |
| value_str.size())); |
| value.to_string(str); |
| ASSERT_STREQ("1988-02-01", str); |
| |
| format_str = "%Y-%M-%d"; |
| value_str = "1988-feb-01"; |
| ASSERT_TRUE(value.from_date_format_str(format_str.c_str(), format_str.size(), value_str.c_str(), |
| value_str.size())); |
| value.to_string(str); |
| ASSERT_STREQ("1988-02-01", str); |
| |
| format_str = "%Y-%b-%d"; |
| value_str = "1988-feb-01"; |
| ASSERT_TRUE(value.from_date_format_str(format_str.c_str(), format_str.size(), value_str.c_str(), |
| value_str.size())); |
| value.to_string(str); |
| ASSERT_STREQ("1988-02-01", str); |
| |
| format_str = "%Y%b%d"; |
| value_str = "1988f01"; |
| ASSERT_TRUE(value.from_date_format_str(format_str.c_str(), format_str.size(), value_str.c_str(), |
| value_str.size())); |
| value.to_string(str); |
| ASSERT_STREQ("1988-02-01", str); |
| |
| format_str = "%y%m%d"; |
| value_str = "880201"; |
| ASSERT_TRUE(value.from_date_format_str(format_str.c_str(), format_str.size(), value_str.c_str(), |
| value_str.size())); |
| value.to_string(str); |
| ASSERT_STREQ("1988-02-01", str); |
| |
| format_str = "%y%c%d"; |
| value_str = "880201"; |
| ASSERT_TRUE(value.from_date_format_str(format_str.c_str(), format_str.size(), value_str.c_str(), |
| value_str.size())); |
| value.to_string(str); |
| ASSERT_STREQ("1988-02-01", str); |
| |
| format_str = "%y%c-%e"; |
| value_str = "882-1"; |
| ASSERT_TRUE(value.from_date_format_str(format_str.c_str(), format_str.size(), value_str.c_str(), |
| value_str.size())); |
| value.to_string(str); |
| ASSERT_STREQ("1988-02-01", str); |
| |
| // %j |
| format_str = "%Y%j %H"; |
| value_str = "198832 03"; |
| ASSERT_TRUE(value.from_date_format_str(format_str.c_str(), format_str.size(), value_str.c_str(), |
| value_str.size())); |
| value.to_string(str); |
| ASSERT_STREQ("1988-02-01 03:00:00", str); |
| |
| // %x |
| format_str = "%X %V %w"; |
| value_str = "2015 1 1"; |
| ASSERT_TRUE(value.from_date_format_str(format_str.c_str(), format_str.size(), value_str.c_str(), |
| value_str.size())); |
| value.to_string(str); |
| ASSERT_STREQ("2015-01-05", str); |
| |
| // %x |
| format_str = "%x %v %w"; |
| value_str = "2015 1 1"; |
| ASSERT_TRUE(value.from_date_format_str(format_str.c_str(), format_str.size(), value_str.c_str(), |
| value_str.size())); |
| value.to_string(str); |
| ASSERT_STREQ("2014-12-29", str); |
| |
| // %x |
| format_str = "%x %v %W"; |
| value_str = "2015 1 Monday"; |
| ASSERT_TRUE(value.from_date_format_str(format_str.c_str(), format_str.size(), value_str.c_str(), |
| value_str.size())); |
| value.to_string(str); |
| ASSERT_STREQ("2014-12-29", str); |
| |
| // %x |
| format_str = "%X %V %a"; |
| value_str = "2015 1 Mon"; |
| ASSERT_TRUE(value.from_date_format_str(format_str.c_str(), format_str.size(), value_str.c_str(), |
| value_str.size())); |
| value.to_string(str); |
| ASSERT_STREQ("2015-01-05", str); |
| |
| // %T |
| format_str = "%X %V %a %r"; |
| value_str = "2015 1 Mon 2:34:56 AM"; |
| ASSERT_TRUE(value.from_date_format_str(format_str.c_str(), format_str.size(), value_str.c_str(), |
| value_str.size())); |
| value.to_string(str); |
| ASSERT_STREQ("2015-01-05 02:34:56", str); |
| |
| // %T |
| format_str = "%X %V %a %T"; |
| value_str = "2015 1 Mon 12:34:56"; |
| ASSERT_TRUE(value.from_date_format_str(format_str.c_str(), format_str.size(), value_str.c_str(), |
| value_str.size())); |
| value.to_string(str); |
| ASSERT_STREQ("2015-01-05 12:34:56", str); |
| |
| // hour |
| format_str = "%Y-%m-%d %H %i %s"; |
| value_str = "88-2-1 03 4 5"; |
| ASSERT_TRUE(value.from_date_format_str(format_str.c_str(), format_str.size(), value_str.c_str(), |
| value_str.size())); |
| value.to_string(str); |
| ASSERT_STREQ("1988-02-01 03:04:05", str); |
| |
| // escape % |
| format_str = "%Y-%m-%d %H%%3A%i%%3A%s"; |
| value_str = "2020-02-26 00%3A00%3A00"; |
| ASSERT_TRUE(value.from_date_format_str(format_str.c_str(), format_str.size(), value_str.c_str(), |
| value_str.size())); |
| value.to_string(str); |
| ASSERT_STREQ("2020-02-26 00:00:00", str); |
| |
| // escape % |
| format_str = "%Y-%m-%d%%%% %H%%3A%i%%3A%s"; |
| value_str = "2020-02-26%% 00%3A00%3A00"; |
| ASSERT_TRUE(value.from_date_format_str(format_str.c_str(), format_str.size(), value_str.c_str(), |
| value_str.size())); |
| value.to_string(str); |
| ASSERT_STREQ("2020-02-26 00:00:00", str); |
| } |
| |
| // Calculate format |
| TEST_F(DateTimeValueTest, from_date_format_str_invalid) { |
| // Used to check |
| std::string format_str; |
| std::string value_str; |
| DateTimeValue value; |
| |
| format_str = "%y%c%e"; |
| value_str = "8821"; |
| ASSERT_FALSE(value.from_date_format_str(format_str.c_str(), format_str.size(), |
| value_str.c_str(), value_str.size())); |
| format_str = "%y-%c-%e"; |
| value_str = "8821"; |
| ASSERT_FALSE(value.from_date_format_str(format_str.c_str(), format_str.size(), |
| value_str.c_str(), value_str.size())); |
| format_str = "%y%c-%e"; |
| value_str = "882-30"; |
| ASSERT_FALSE(value.from_date_format_str(format_str.c_str(), format_str.size(), |
| value_str.c_str(), value_str.size())); |
| // %x |
| format_str = "%X %v %w"; |
| value_str = "2015 1 1"; |
| ASSERT_FALSE(value.from_date_format_str(format_str.c_str(), format_str.size(), |
| value_str.c_str(), value_str.size())); |
| |
| format_str = "%x %V %w"; |
| value_str = "2015 1 1"; |
| ASSERT_FALSE(value.from_date_format_str(format_str.c_str(), format_str.size(), |
| value_str.c_str(), value_str.size())); |
| |
| format_str = "%Y-%m-%d %H%3A%i%3A%s"; |
| value_str = "2020-02-26 00%3A00%3A00"; |
| ASSERT_FALSE(value.from_date_format_str(format_str.c_str(), format_str.size(), |
| value_str.c_str(), value_str.size())); |
| } |
| // Calculate format |
| TEST_F(DateTimeValueTest, format_str) { |
| // Used to check |
| char str[MAX_DTVALUE_STR_LEN]; |
| |
| std::string format_str; |
| DateTimeValue value; |
| |
| // %a |
| format_str = "%a"; |
| value.from_date_int64(20150215); |
| ASSERT_TRUE(value.to_format_string(format_str.c_str(), format_str.size(), str)); |
| ASSERT_STREQ("Sun", str); |
| |
| // %b |
| format_str = "%b"; |
| value.from_date_int64(20150215); |
| ASSERT_TRUE(value.to_format_string(format_str.c_str(), format_str.size(), str)); |
| ASSERT_STREQ("Feb", str); |
| |
| // %c |
| format_str = "%c"; |
| value.from_date_int64(20150215); |
| ASSERT_TRUE(value.to_format_string(format_str.c_str(), format_str.size(), str)); |
| ASSERT_STREQ("2", str); |
| value.from_date_int64(20151215); |
| ASSERT_TRUE(value.to_format_string(format_str.c_str(), format_str.size(), str)); |
| ASSERT_STREQ("12", str); |
| |
| // %d |
| format_str = "%d"; |
| value.from_date_int64(20150215); |
| ASSERT_TRUE(value.to_format_string(format_str.c_str(), format_str.size(), str)); |
| ASSERT_STREQ("15", str); |
| value.from_date_int64(20150205); |
| ASSERT_TRUE(value.to_format_string(format_str.c_str(), format_str.size(), str)); |
| ASSERT_STREQ("05", str); |
| |
| // %D |
| format_str = "%D"; |
| value.from_date_int64(20150201); |
| ASSERT_TRUE(value.to_format_string(format_str.c_str(), format_str.size(), str)); |
| ASSERT_STREQ("1st", str); |
| value.from_date_int64(20150202); |
| ASSERT_TRUE(value.to_format_string(format_str.c_str(), format_str.size(), str)); |
| ASSERT_STREQ("2nd", str); |
| value.from_date_int64(20150203); |
| ASSERT_TRUE(value.to_format_string(format_str.c_str(), format_str.size(), str)); |
| ASSERT_STREQ("3rd", str); |
| value.from_date_int64(20150204); |
| ASSERT_TRUE(value.to_format_string(format_str.c_str(), format_str.size(), str)); |
| ASSERT_STREQ("4th", str); |
| |
| // %e |
| format_str = "%e"; |
| value.from_date_int64(20150201); |
| ASSERT_TRUE(value.to_format_string(format_str.c_str(), format_str.size(), str)); |
| ASSERT_STREQ("1", str); |
| value.from_date_int64(20150211); |
| ASSERT_TRUE(value.to_format_string(format_str.c_str(), format_str.size(), str)); |
| ASSERT_STREQ("11", str); |
| |
| // %f |
| format_str = "%f"; |
| value.from_date_str("20150201000000.1", 16); |
| ASSERT_TRUE(value.to_format_string(format_str.c_str(), format_str.size(), str)); |
| ASSERT_STREQ("100000", str); |
| value.from_date_str("20150211000000.123456", 21); |
| ASSERT_TRUE(value.to_format_string(format_str.c_str(), format_str.size(), str)); |
| ASSERT_STREQ("123456", str); |
| |
| // %h %I |
| format_str = "%h"; |
| value.from_date_int64(20150201010000L); |
| ASSERT_TRUE(value.to_format_string(format_str.c_str(), format_str.size(), str)); |
| ASSERT_STREQ("01", str); |
| value.from_date_int64(20150201230000L); |
| ASSERT_TRUE(value.to_format_string(format_str.c_str(), format_str.size(), str)); |
| ASSERT_STREQ("11", str); |
| format_str = "%I"; |
| value.from_date_int64(20150201010000L); |
| ASSERT_TRUE(value.to_format_string(format_str.c_str(), format_str.size(), str)); |
| ASSERT_STREQ("01", str); |
| value.from_date_int64(20150201230000L); |
| ASSERT_TRUE(value.to_format_string(format_str.c_str(), format_str.size(), str)); |
| ASSERT_STREQ("11", str); |
| |
| // %H |
| format_str = "%H"; |
| value.from_date_int64(20150201010000L); |
| ASSERT_TRUE(value.to_format_string(format_str.c_str(), format_str.size(), str)); |
| ASSERT_STREQ("01", str); |
| value.from_date_int64(20150201230000L); |
| ASSERT_TRUE(value.to_format_string(format_str.c_str(), format_str.size(), str)); |
| ASSERT_STREQ("23", str); |
| |
| // %i |
| format_str = "%i"; |
| value.from_date_int64(20150201010000L); |
| ASSERT_TRUE(value.to_format_string(format_str.c_str(), format_str.size(), str)); |
| ASSERT_STREQ("00", str); |
| value.from_date_int64(20150201235900L); |
| ASSERT_TRUE(value.to_format_string(format_str.c_str(), format_str.size(), str)); |
| ASSERT_STREQ("59", str); |
| |
| // %j |
| format_str = "%j"; |
| value.from_date_int64(20150201L); |
| ASSERT_TRUE(value.to_format_string(format_str.c_str(), format_str.size(), str)); |
| ASSERT_STREQ("032", str); |
| value.from_date_int64(20151231L); |
| ASSERT_TRUE(value.to_format_string(format_str.c_str(), format_str.size(), str)); |
| ASSERT_STREQ("365", str); |
| |
| // %k |
| format_str = "%k"; |
| value.from_date_int64(20150201000000L); |
| ASSERT_TRUE(value.to_format_string(format_str.c_str(), format_str.size(), str)); |
| ASSERT_STREQ("0", str); |
| value.from_date_int64(20150201230000L); |
| ASSERT_TRUE(value.to_format_string(format_str.c_str(), format_str.size(), str)); |
| ASSERT_STREQ("23", str); |
| |
| // %l |
| format_str = "%l"; |
| value.from_date_int64(20150201010000L); |
| ASSERT_TRUE(value.to_format_string(format_str.c_str(), format_str.size(), str)); |
| ASSERT_STREQ("1", str); |
| value.from_date_int64(20150201230000L); |
| ASSERT_TRUE(value.to_format_string(format_str.c_str(), format_str.size(), str)); |
| ASSERT_STREQ("11", str); |
| |
| // %m |
| format_str = "%m"; |
| value.from_date_int64(20150201); |
| ASSERT_TRUE(value.to_format_string(format_str.c_str(), format_str.size(), str)); |
| ASSERT_STREQ("02", str); |
| |
| // %M |
| format_str = "%M"; |
| value.from_date_int64(20150201); |
| ASSERT_TRUE(value.to_format_string(format_str.c_str(), format_str.size(), str)); |
| ASSERT_STREQ("February", str); |
| |
| // %p |
| format_str = "%p"; |
| value.from_date_int64(20150201000000L); |
| ASSERT_TRUE(value.to_format_string(format_str.c_str(), format_str.size(), str)); |
| ASSERT_STREQ("AM", str); |
| value.from_date_int64(20150201120000L); |
| ASSERT_TRUE(value.to_format_string(format_str.c_str(), format_str.size(), str)); |
| ASSERT_STREQ("PM", str); |
| |
| // %r |
| format_str = "%r"; |
| value.from_date_int64(20150201023456L); |
| ASSERT_TRUE(value.to_format_string(format_str.c_str(), format_str.size(), str)); |
| ASSERT_STREQ("02:34:56 AM", str); |
| value.from_date_int64(20150201003456L); |
| ASSERT_TRUE(value.to_format_string(format_str.c_str(), format_str.size(), str)); |
| ASSERT_STREQ("12:34:56 AM", str); |
| value.from_date_int64(20150201123456L); |
| ASSERT_TRUE(value.to_format_string(format_str.c_str(), format_str.size(), str)); |
| ASSERT_STREQ("12:34:56 PM", str); |
| |
| // %s & %S |
| format_str = "%s"; |
| value.from_date_int64(20150201023456L); |
| ASSERT_TRUE(value.to_format_string(format_str.c_str(), format_str.size(), str)); |
| ASSERT_STREQ("56", str); |
| value.from_date_int64(20150201023406L); |
| ASSERT_TRUE(value.to_format_string(format_str.c_str(), format_str.size(), str)); |
| ASSERT_STREQ("06", str); |
| format_str = "%S"; |
| value.from_date_int64(20150201023456L); |
| ASSERT_TRUE(value.to_format_string(format_str.c_str(), format_str.size(), str)); |
| ASSERT_STREQ("56", str); |
| value.from_date_int64(20150201023406L); |
| ASSERT_TRUE(value.to_format_string(format_str.c_str(), format_str.size(), str)); |
| ASSERT_STREQ("06", str); |
| |
| // %T |
| format_str = "%T"; |
| value.from_date_int64(20150201023456L); |
| ASSERT_TRUE(value.to_format_string(format_str.c_str(), format_str.size(), str)); |
| ASSERT_STREQ("02:34:56", str); |
| value.from_date_int64(20150201003456L); |
| ASSERT_TRUE(value.to_format_string(format_str.c_str(), format_str.size(), str)); |
| ASSERT_STREQ("00:34:56", str); |
| value.from_date_int64(20150201123456L); |
| ASSERT_TRUE(value.to_format_string(format_str.c_str(), format_str.size(), str)); |
| ASSERT_STREQ("12:34:56", str); |
| |
| // %u |
| format_str = "%u"; |
| value.from_date_int64(20131231L); |
| ASSERT_TRUE(value.to_format_string(format_str.c_str(), format_str.size(), str)); |
| ASSERT_STREQ("53", str); |
| value.from_date_int64(20150101); |
| ASSERT_TRUE(value.to_format_string(format_str.c_str(), format_str.size(), str)); |
| ASSERT_STREQ("01", str); |
| |
| // %U |
| format_str = "%U"; |
| value.from_date_int64(20131231L); |
| ASSERT_TRUE(value.to_format_string(format_str.c_str(), format_str.size(), str)); |
| ASSERT_STREQ("52", str); |
| value.from_date_int64(20150101); |
| ASSERT_TRUE(value.to_format_string(format_str.c_str(), format_str.size(), str)); |
| ASSERT_STREQ("00", str); |
| |
| // %v |
| format_str = "%v"; |
| value.from_date_int64(20131231L); |
| ASSERT_TRUE(value.to_format_string(format_str.c_str(), format_str.size(), str)); |
| ASSERT_STREQ("01", str); |
| value.from_date_int64(20150101); |
| ASSERT_TRUE(value.to_format_string(format_str.c_str(), format_str.size(), str)); |
| ASSERT_STREQ("01", str); |
| |
| // %V |
| format_str = "%V"; |
| value.from_date_int64(20131231L); |
| ASSERT_TRUE(value.to_format_string(format_str.c_str(), format_str.size(), str)); |
| ASSERT_STREQ("52", str); |
| value.from_date_int64(20150101); |
| ASSERT_TRUE(value.to_format_string(format_str.c_str(), format_str.size(), str)); |
| ASSERT_STREQ("52", str); |
| |
| // %w |
| format_str = "%w"; |
| value.from_date_int64(20131231L); |
| ASSERT_TRUE(value.to_format_string(format_str.c_str(), format_str.size(), str)); |
| ASSERT_STREQ("2", str); |
| value.from_date_int64(20150101); |
| ASSERT_TRUE(value.to_format_string(format_str.c_str(), format_str.size(), str)); |
| ASSERT_STREQ("4", str); |
| |
| // %W |
| format_str = "%W"; |
| value.from_date_int64(20131231L); |
| ASSERT_TRUE(value.to_format_string(format_str.c_str(), format_str.size(), str)); |
| ASSERT_STREQ("Tuesday", str); |
| value.from_date_int64(20150101); |
| ASSERT_TRUE(value.to_format_string(format_str.c_str(), format_str.size(), str)); |
| ASSERT_STREQ("Thursday", str); |
| |
| // %x |
| format_str = "%x"; |
| value.from_date_str("0000-01-01", 10); |
| ASSERT_TRUE(value.to_format_string(format_str.c_str(), format_str.size(), str)); |
| ASSERT_STREQ("4294967295", str); |
| value.from_date_int64(20131231L); |
| ASSERT_TRUE(value.to_format_string(format_str.c_str(), format_str.size(), str)); |
| ASSERT_STREQ("2014", str); |
| value.from_date_int64(20150101); |
| ASSERT_TRUE(value.to_format_string(format_str.c_str(), format_str.size(), str)); |
| ASSERT_STREQ("2015", str); |
| |
| // %X |
| format_str = "%X"; |
| value.from_date_str("0000-01-01", 10); |
| ASSERT_TRUE(value.to_format_string(format_str.c_str(), format_str.size(), str)); |
| ASSERT_STREQ("0000", str); |
| value.from_date_int64(20131231L); |
| ASSERT_TRUE(value.to_format_string(format_str.c_str(), format_str.size(), str)); |
| ASSERT_STREQ("2013", str); |
| value.from_date_int64(20150101); |
| ASSERT_TRUE(value.to_format_string(format_str.c_str(), format_str.size(), str)); |
| ASSERT_STREQ("2014", str); |
| |
| // %y |
| format_str = "%y"; |
| value.from_date_int64(20150201000000L); |
| ASSERT_TRUE(value.to_format_string(format_str.c_str(), format_str.size(), str)); |
| ASSERT_STREQ("15", str); |
| value.from_date_str("0005.0201120000", 17); |
| ASSERT_TRUE(value.to_format_string(format_str.c_str(), format_str.size(), str)); |
| ASSERT_STREQ("05", str); |
| |
| // %Y |
| format_str = "%Y"; |
| value.from_date_int64(20150201000000L); |
| ASSERT_TRUE(value.to_format_string(format_str.c_str(), format_str.size(), str)); |
| ASSERT_STREQ("2015", str); |
| value.from_date_str("0015.0201120000", 17); |
| ASSERT_TRUE(value.to_format_string(format_str.c_str(), format_str.size(), str)); |
| ASSERT_STREQ("0015", str); |
| |
| // %Y%m%a |
| format_str = "this is %Y-%m-%d"; |
| value.from_date_int64(19880201); |
| ASSERT_TRUE(value.to_format_string(format_str.c_str(), format_str.size(), str)); |
| ASSERT_STREQ("this is 1988-02-01", str); |
| } |
| |
| // Calculate weekday |
| TEST_F(DateTimeValueTest, weekday) { |
| DateTimeValue value; |
| // NORMAL CASE |
| ASSERT_TRUE(value.from_date_int64(101)); |
| ASSERT_TRUE(value.from_date_daynr(6)); |
| // NORMAL CASE |
| ASSERT_TRUE(value.from_date_int64(20150215)); |
| ASSERT_TRUE(value.from_date_daynr(6)); |
| } |
| |
| // Calculate from daynr |
| TEST_F(DateTimeValueTest, calc_form_daynr) { |
| // Used to check |
| char str[MAX_DTVALUE_STR_LEN]; |
| |
| DateTimeValue value; |
| // NORMAL CASE |
| ASSERT_TRUE(value.from_date_daynr(1)); |
| value.to_string(str); |
| ASSERT_STREQ("0000-01-01", str); |
| ASSERT_TRUE(value.from_date_daynr(59)); |
| value.to_string(str); |
| ASSERT_STREQ("0000-02-28", str); |
| ASSERT_TRUE(value.from_date_daynr(60)); |
| value.to_string(str); |
| ASSERT_STREQ("0000-03-01", str); |
| ASSERT_TRUE(value.from_date_daynr(365)); |
| value.to_string(str); |
| ASSERT_STREQ("0000-12-31", str); |
| ASSERT_TRUE(value.from_date_daynr(366)); |
| value.to_string(str); |
| ASSERT_STREQ("0001-01-01", str); |
| ASSERT_TRUE(value.from_date_daynr(1520)); |
| value.to_string(str); |
| ASSERT_STREQ("0004-02-29", str); |
| ASSERT_TRUE(value.from_date_daynr(1519)); |
| value.to_string(str); |
| ASSERT_STREQ("0004-02-28", str); |
| ASSERT_TRUE(value.from_date_daynr(1521)); |
| value.to_string(str); |
| ASSERT_STREQ("0004-03-01", str); |
| ASSERT_TRUE(value.from_date_daynr(726133)); |
| value.to_string(str); |
| ASSERT_STREQ("1988-02-01", str); |
| ASSERT_TRUE(value.from_date_daynr(3652424)); |
| value.to_string(str); |
| ASSERT_STREQ("9999-12-31", str); |
| |
| // BAD CASE |
| ASSERT_FALSE(value.from_date_daynr(0)); |
| ASSERT_FALSE(value.from_date_daynr(3652425)); |
| ASSERT_FALSE(value.from_date_daynr(36524251)); |
| } |
| |
| // Calculate daynr |
| TEST_F(DateTimeValueTest, calc_daynr) { |
| ASSERT_EQ(0, DateTimeValue::calc_daynr(0, 0, 1)); |
| ASSERT_EQ(1, DateTimeValue::calc_daynr(0, 1, 1)); |
| ASSERT_EQ(365, DateTimeValue::calc_daynr(0, 12, 31)); |
| ASSERT_EQ(366, DateTimeValue::calc_daynr(1, 1, 1)); |
| ASSERT_EQ(726133, DateTimeValue::calc_daynr(1988, 2, 1)); |
| DateTimeValue value; |
| value.from_date_int64(880201); |
| ASSERT_EQ(726133, value.daynr()); |
| ASSERT_EQ(726161, DateTimeValue::calc_daynr(1988, 2, 29)); |
| } |
| |
| // Construct from int value |
| TEST_F(DateTimeValueTest, from_time_str) { |
| // Used to check |
| char str[MAX_DTVALUE_STR_LEN]; |
| std::string test_str; |
| |
| DateTimeValue value; |
| // INTERNAL MODE WITH OUT |
| test_str = " 880201"; |
| ASSERT_TRUE(value.from_date_str(test_str.c_str(), test_str.size())); |
| value.to_string(str); |
| ASSERT_STREQ("1988-02-01", str); |
| |
| test_str = "88020112"; |
| ASSERT_TRUE(value.from_date_str(test_str.c_str(), test_str.size())); |
| value.to_string(str); |
| ASSERT_STREQ("8802-01-12", str); |
| |
| test_str = "8802011223"; |
| ASSERT_TRUE(value.from_date_str(test_str.c_str(), test_str.size())); |
| value.to_string(str); |
| ASSERT_STREQ("1988-02-01 12:23:00", str); |
| |
| test_str = "880201122334"; |
| ASSERT_TRUE(value.from_date_str(test_str.c_str(), test_str.size())); |
| value.to_string(str); |
| ASSERT_STREQ("1988-02-01 12:23:34", str); |
| |
| test_str = "19880201"; |
| ASSERT_TRUE(value.from_date_str(test_str.c_str(), test_str.size())); |
| value.to_string(str); |
| ASSERT_STREQ("1988-02-01", str); |
| |
| test_str = "1988.020112"; |
| ASSERT_TRUE(value.from_date_str(test_str.c_str(), test_str.size())); |
| value.to_string(str); |
| ASSERT_STREQ("1988-02-01 12:00:00", str); |
| |
| test_str = "1988.0201123"; |
| ASSERT_TRUE(value.from_date_str(test_str.c_str(), test_str.size())); |
| value.to_string(str); |
| ASSERT_STREQ("1988-02-01 12:03:00", str); |
| |
| test_str = "1988.020112345"; |
| ASSERT_TRUE(value.from_date_str(test_str.c_str(), test_str.size())); |
| value.to_string(str); |
| ASSERT_STREQ("1988-02-01 12:34:05", str); |
| |
| test_str = "19880201000000.1234567"; |
| ASSERT_TRUE(value.from_date_str(test_str.c_str(), test_str.size())); |
| value.to_string(str); |
| ASSERT_STREQ("1988-02-01 00:00:00.123456", str); |
| |
| test_str = "19880201T000000.1234567"; |
| ASSERT_TRUE(value.from_date_str(test_str.c_str(), test_str.size())); |
| value.to_string(str); |
| ASSERT_STREQ("1988-02-01 00:00:00.123456", str); |
| |
| // normal-2 |
| |
| // Delim MODE |
| test_str = "88-02-01"; |
| ASSERT_TRUE(value.from_date_str(test_str.c_str(), test_str.size())); |
| value.to_string(str); |
| ASSERT_STREQ("1988-02-01", str); |
| |
| test_str = "1988-02-01"; |
| ASSERT_TRUE(value.from_date_str(test_str.c_str(), test_str.size())); |
| value.to_string(str); |
| ASSERT_STREQ("1988-02-01", str); |
| |
| test_str = "1988-02-01 12"; |
| ASSERT_TRUE(value.from_date_str(test_str.c_str(), test_str.size())); |
| value.to_string(str); |
| ASSERT_STREQ("1988-02-01 12:00:00", str); |
| |
| test_str = "1988-02-01 12:34"; |
| ASSERT_TRUE(value.from_date_str(test_str.c_str(), test_str.size())); |
| value.to_string(str); |
| ASSERT_STREQ("1988-02-01 12:34:00", str); |
| |
| test_str = "1988-02-01 12:34:56"; |
| ASSERT_TRUE(value.from_date_str(test_str.c_str(), test_str.size())); |
| value.to_string(str); |
| ASSERT_STREQ("1988-02-01 12:34:56", str); |
| |
| test_str = "1988-02-01 12:34:56.123"; |
| ASSERT_TRUE(value.from_date_str(test_str.c_str(), test_str.size())); |
| value.to_string(str); |
| ASSERT_STREQ("1988-02-01 12:34:56.123000", str); |
| } |
| |
| TEST_F(DateTimeValueTest, from_time_str_invalid) { |
| std::string test_str; |
| |
| DateTimeValue value; |
| test_str = " "; |
| ASSERT_FALSE(value.from_date_str(test_str.c_str(), test_str.size())); |
| test_str = " a"; |
| ASSERT_FALSE(value.from_date_str(test_str.c_str(), test_str.size())); |
| // normal-1 |
| test_str = "1988-02-31 00:00:00"; |
| ASSERT_FALSE(value.from_date_str(test_str.c_str(), test_str.size())); |
| |
| test_str = "1988-02 01 12:34:56"; |
| ASSERT_FALSE(value.from_date_str(test_str.c_str(), test_str.size())); |
| // excede 9999999 |
| test_str = "1988999-02-31 00:00:00"; |
| ASSERT_FALSE(value.from_date_str(test_str.c_str(), test_str.size())); |
| |
| test_str = "1988-02-31 100"; |
| ASSERT_FALSE(value.from_date_str(test_str.c_str(), test_str.size())); |
| |
| test_str = "1988.02-31 10"; |
| ASSERT_FALSE(value.from_date_str(test_str.c_str(), test_str.size())); |
| } |
| |
| // Construct from int value |
| TEST_F(DateTimeValueTest, from_time_int) { |
| // Used to check |
| char str[MAX_DTVALUE_STR_LEN]; |
| |
| DateTimeValue value; |
| // 59 -> 00:00:59 |
| ASSERT_TRUE(value.from_time_int64(59)); |
| value.to_string(str); |
| ASSERT_STREQ("00:00:59", str); |
| // 5959 -> 00:59:59 |
| ASSERT_TRUE(value.from_time_int64(5959)); |
| value.to_string(str); |
| ASSERT_STREQ("00:59:59", str); |
| // 8385959 -> 838:59:59 |
| ASSERT_TRUE(value.from_time_int64(8385959)); |
| value.to_string(str); |
| ASSERT_STREQ("838:59:59", str); |
| // 880201000000 |
| ASSERT_TRUE(value.from_time_int64(880201000000)); |
| value.to_string(str); |
| ASSERT_STREQ("1988-02-01 00:00:00", str); |
| } |
| |
| // Construct from int value |
| TEST_F(DateTimeValueTest, from_time_int_invalid) { |
| DateTimeValue value; |
| // 69 |
| ASSERT_FALSE(value.from_time_int64(69)); |
| // 6959 |
| ASSERT_FALSE(value.from_time_int64(6959)); |
| // 9006969 |
| ASSERT_FALSE(value.from_time_int64(8396969)); |
| // 1000132000000 |
| ASSERT_FALSE(value.from_time_int64(1000132000000)); |
| } |
| |
| // Construct from int value |
| TEST_F(DateTimeValueTest, from_int_value) { |
| // Used to check |
| char str[MAX_DTVALUE_STR_LEN]; |
| |
| DateTimeValue value; |
| // 101 -> 2000-01-01 |
| ASSERT_TRUE(value.from_date_int64(101)); |
| value.to_string(str); |
| ASSERT_STREQ("2000-01-01", str); |
| // 150201 -> 2015-02-01 |
| ASSERT_TRUE(value.from_date_int64(150201)); |
| value.to_string(str); |
| ASSERT_STREQ("2015-02-01", str); |
| // 691231 -> 2069-12-31 |
| ASSERT_TRUE(value.from_date_int64(691231)); |
| value.to_string(str); |
| ASSERT_STREQ("2069-12-31", str); |
| // 700101 -> 1970-01-01 |
| ASSERT_TRUE(value.from_date_int64(700101)); |
| value.to_string(str); |
| ASSERT_STREQ("1970-01-01", str); |
| // 880201 -> 1988-02-01 |
| ASSERT_TRUE(value.from_date_int64(880201)); |
| value.to_string(str); |
| ASSERT_STREQ("1988-02-01", str); |
| // 991231 -> 1999-12-31 |
| ASSERT_TRUE(value.from_date_int64(991231)); |
| value.to_string(str); |
| ASSERT_STREQ("1999-12-31", str); |
| // 10000101 -> 1000-01-01 |
| ASSERT_TRUE(value.from_date_int64(10000101)); |
| value.to_string(str); |
| ASSERT_STREQ("1000-01-01", str); |
| // 12340531 -> 1234-05-31 |
| ASSERT_TRUE(value.from_date_int64(12340531)); |
| value.to_string(str); |
| ASSERT_STREQ("1234-05-31", str); |
| // 99991231 -> 9999-12-31 |
| ASSERT_TRUE(value.from_date_int64(99991231)); |
| value.to_string(str); |
| ASSERT_STREQ("9999-12-31", str); |
| |
| // BELOW IS DATETIME VALUE CHECK |
| |
| // 101000000 -> 2000-01-01 00:00:00 |
| ASSERT_TRUE(value.from_date_int64(101000000)); |
| value.to_string(str); |
| ASSERT_STREQ("2000-01-01 00:00:00", str); |
| // 150201123456 -> 2015-02-01 12:34:56 |
| ASSERT_TRUE(value.from_date_int64(150201123456)); |
| value.to_string(str); |
| ASSERT_STREQ("2015-02-01 12:34:56", str); |
| // 691231235959 -> 2069-12-31 23:59:59 |
| ASSERT_TRUE(value.from_date_int64(691231235959)); |
| value.to_string(str); |
| ASSERT_STREQ("2069-12-31 23:59:59", str); |
| |
| // 700101000000 -> 1970-01-01 00:00:00 |
| ASSERT_TRUE(value.from_date_int64(700101000000)); |
| value.to_string(str); |
| ASSERT_STREQ("1970-01-01 00:00:00", str); |
| // 880201123456 -> 1988-02-01 12:34:56 |
| ASSERT_TRUE(value.from_date_int64(880201123456)); |
| value.to_string(str); |
| ASSERT_STREQ("1988-02-01 12:34:56", str); |
| // 991231235959 -> 1999-12-31 23:59:59 |
| ASSERT_TRUE(value.from_date_int64(991231235959)); |
| value.to_string(str); |
| ASSERT_STREQ("1999-12-31 23:59:59", str); |
| |
| // four digits year |
| // 1231231235959 -> 0123-12-31 23:59:59 |
| ASSERT_TRUE(value.from_date_int64(1231231235959)); |
| value.to_string(str); |
| ASSERT_STREQ("0123-12-31 23:59:59", str); |
| |
| // 99991231235959 -> 9999-12-31 23:59:59 |
| ASSERT_TRUE(value.from_date_int64(99991231235959)); |
| value.to_string(str); |
| ASSERT_STREQ("9999-12-31 23:59:59", str); |
| } |
| |
| // Construct from int value invalid |
| TEST_F(DateTimeValueTest, from_int_value_invalid) { |
| DateTimeValue value; |
| char str[MAX_DTVALUE_STR_LEN]; |
| // minus value |
| ASSERT_FALSE(value.from_date_int64(-1231)); |
| // [0, 101) |
| ASSERT_FALSE(value.from_date_int64(100)); |
| // 691323 |
| ASSERT_FALSE(value.from_date_int64(691323)); |
| // three digits year 8980101 |
| ASSERT_FALSE(value.from_date_int64(8980101)); |
| // 100-12-31 |
| ASSERT_FALSE(value.from_date_int64(1000101L)); |
| // 100-12-31 |
| ASSERT_FALSE(value.from_date_int64(1232)); |
| // 99 00:00:00 |
| ASSERT_TRUE(value.from_date_int64(99000000)); |
| value.to_string(str); |
| ASSERT_STREQ("9900-00-00", str); |
| |
| // 9999-99-99 99:99:99 + 1 |
| ASSERT_FALSE(value.from_date_int64(99999999999999L + 1)); |
| } |
| |
| // Convert to datetime string |
| TEST_F(DateTimeValueTest, to_string) { |
| char str[MAX_DTVALUE_STR_LEN]; |
| |
| // 0000-00-00 00:00:00 |
| { |
| DateTimeValue value; |
| // datetime |
| value.to_string(str); |
| ASSERT_STREQ("0000-00-00 00:00:00", str); |
| |
| // date |
| value._type = TIME_DATE; |
| value.to_string(str); |
| ASSERT_STREQ("0000-00-00", str); |
| |
| // time |
| value._type = TIME_TIME; |
| value.to_string(str); |
| ASSERT_STREQ("00:00:00", str); |
| } |
| |
| // 8765-12-23 12:34:56.987654 |
| { |
| DateTimeValue value; |
| value._year = 8765; |
| value._month = 12; |
| value._day = 23; |
| value._hour = 12; |
| value._minute = 34; |
| value._second = 56; |
| value._microsecond = 987654; |
| // datetime |
| value.to_string(str); |
| ASSERT_STREQ("8765-12-23 12:34:56.987654", str); |
| |
| // time |
| value._type = TIME_TIME; |
| value.to_string(str); |
| ASSERT_STREQ("12:34:56.987654", str); |
| |
| // date |
| value._type = TIME_DATE; |
| value.to_string(str); |
| ASSERT_STREQ("8765-12-23", str); |
| } |
| |
| // 0001-02-03 04:05:06.000007 |
| { |
| DateTimeValue value; |
| value._year = 1; |
| value._month = 2; |
| value._day = 3; |
| value._hour = 4; |
| value._minute = 5; |
| value._second = 6; |
| value._microsecond = 7; |
| value.to_string(str); |
| ASSERT_STREQ("0001-02-03 04:05:06.000007", str); |
| |
| // date |
| value._type = TIME_DATE; |
| value.to_string(str); |
| ASSERT_STREQ("0001-02-03", str); |
| |
| // time |
| value._type = TIME_TIME; |
| value.to_string(str); |
| ASSERT_STREQ("04:05:06.000007", str); |
| } |
| |
| // time minus -100:05:06 |
| { |
| DateTimeValue value; |
| value._hour = 100; |
| value._minute = 5; |
| value._second = 6; |
| value._microsecond = 7; |
| value._type = TIME_TIME; |
| value._neg = 1; |
| value.to_string(str); |
| ASSERT_STREQ("-100:05:06.000007", str); |
| } |
| } |
| |
| TEST_F(DateTimeValueTest, to_int64) { |
| // 0000-00-00 00:00:00 |
| { |
| DateTimeValue value; |
| // datetime |
| ASSERT_EQ(0L, value.to_int64()); |
| |
| // date |
| value._type = TIME_DATE; |
| ASSERT_EQ(0L, value.to_int64()); |
| |
| // time |
| value._type = TIME_TIME; |
| ASSERT_EQ(0L, value.to_int64()); |
| } |
| |
| // 8765-12-23 12:34:56.987654 |
| { |
| DateTimeValue value; |
| value._year = 8765; |
| value._month = 12; |
| value._day = 23; |
| value._hour = 12; |
| value._minute = 34; |
| value._second = 56; |
| value._microsecond = 987654; |
| // datetime |
| ASSERT_EQ(87651223123456L, value.to_int64()); |
| |
| // time |
| value._type = TIME_TIME; |
| ASSERT_EQ(123456L, value.to_int64()); |
| |
| // date |
| value._type = TIME_DATE; |
| ASSERT_EQ(87651223L, value.to_int64()); |
| } |
| |
| // 0001-02-03 04:05:06.000007 |
| { |
| DateTimeValue value; |
| value._year = 1; |
| value._month = 2; |
| value._day = 3; |
| value._hour = 4; |
| value._minute = 5; |
| value._second = 6; |
| value._microsecond = 7; |
| ASSERT_EQ(10203040506L, value.to_int64()); |
| |
| // date |
| value._type = TIME_DATE; |
| ASSERT_EQ(10203L, value.to_int64()); |
| |
| // time |
| value._type = TIME_TIME; |
| ASSERT_EQ(40506L, value.to_int64()); |
| } |
| |
| // time minus -100:05:06 |
| { |
| DateTimeValue value; |
| value._hour = 100; |
| value._minute = 5; |
| value._second = 6; |
| value._microsecond = 7; |
| value._type = TIME_TIME; |
| value._neg = 1; |
| ASSERT_EQ(-1000506L, value.to_int64()); |
| } |
| } |
| |
| TEST_F(DateTimeValueTest, operator_minus) { |
| { |
| DateTimeValue v1; |
| ASSERT_TRUE(v1.from_date_int64(19880201)); |
| DateTimeValue v2; |
| ASSERT_TRUE(v2.from_date_int64(19870201)); |
| int value = v1 - v2; |
| ASSERT_EQ(365, value); |
| value = v2 - v1; |
| ASSERT_EQ(-365, value); |
| value = v1 - v1; |
| ASSERT_EQ(0, value); |
| } |
| |
| { |
| DateTimeValue v1; |
| ASSERT_TRUE(v1.from_date_int64(19880201)); |
| DateTimeValue v2; |
| ASSERT_TRUE(v2.from_date_int64(19870201123456)); |
| int value = v1 - v2; |
| ASSERT_EQ(365, value); |
| value = v2 - v1; |
| ASSERT_EQ(-365, value); |
| value = v1 - v1; |
| ASSERT_EQ(0, value); |
| } |
| } |
| |
| TEST_F(DateTimeValueTest, min_max) { |
| char buf[64]; |
| { |
| DateTimeValue v1 = DateTimeValue::datetime_min_value(); |
| v1.to_string(buf); |
| ASSERT_STREQ("0000-01-01 00:00:00", buf); |
| } |
| |
| { |
| DateTimeValue v1 = DateTimeValue::datetime_max_value(); |
| v1.to_string(buf); |
| ASSERT_STREQ("9999-12-31 23:59:59", buf); |
| } |
| } |
| |
| TEST_F(DateTimeValueTest, packed_time) { |
| char buf[64]; |
| { |
| DateTimeValue v1; |
| v1.from_date_int64(20010203123456L); |
| v1.to_string(buf); |
| ASSERT_STREQ("2001-02-03 12:34:56", buf); |
| |
| int64_t packed_time = v1.to_int64_date_packed(); |
| ASSERT_EQ(1830649476851695616L, packed_time); |
| packed_time = v1.to_int64_datetime_packed(); |
| ASSERT_EQ(1830650338932162560L, packed_time); |
| } |
| |
| { |
| doris_udf::DateTimeVal tv; |
| tv.packed_time = 1830650338932162560L; |
| tv.type = TIME_DATETIME; |
| DateTimeValue v1 = DateTimeValue::from_datetime_val(tv); |
| v1.to_string(buf); |
| ASSERT_STREQ("2001-02-03 12:34:56", buf); |
| |
| doris_udf::DateTimeVal tv2; |
| v1.to_datetime_val(&tv2); |
| |
| ASSERT_TRUE(tv == tv2); |
| } |
| } |
| |
| } // namespace doris |
| |
| int main(int argc, char** argv) { |
| // std::string conffile = std::string(getenv("DORIS_HOME")) + "/conf/be.conf"; |
| // if (!doris::config::init(conffile.c_str(), false)) { |
| // fprintf(stderr, "error read config file. \n"); |
| // return -1; |
| // } |
| // doris::init_glog("be-test"); |
| ::testing::InitGoogleTest(&argc, argv); |
| return RUN_ALL_TESTS(); |
| } |