ClickHouse
142 строки · 5.9 Кб
1#include <gtest/gtest.h>
2
3#include <Core/SettingsFields.h>
4#include <Core/SettingsEnums.h>
5#include <Core/Field.h>
6
7namespace
8{
9using namespace DB;
10using SettingMySQLDataTypesSupport = SettingFieldMultiEnum<MySQLDataTypesSupport, SettingFieldMySQLDataTypesSupportTraits>;
11}
12
13namespace DB
14{
15
16template <typename Enum, typename Traits>
17bool operator== (const SettingFieldMultiEnum<Enum, Traits> & setting, const Field & f)
18{
19return Field(setting) == f;
20}
21
22template <typename Enum, typename Traits>
23bool operator== (const Field & f, const SettingFieldMultiEnum<Enum, Traits> & setting)
24{
25return f == Field(setting);
26}
27
28}
29
30GTEST_TEST(SettingMySQLDataTypesSupport, WithDefault)
31{
32// Setting can be default-initialized and that means all values are unset.
33const SettingMySQLDataTypesSupport setting;
34ASSERT_EQ(std::vector<MySQLDataTypesSupport>{}, setting.value);
35ASSERT_EQ("", setting.toString());
36ASSERT_EQ(setting, Field(""));
37
38ASSERT_FALSE(MultiEnum<MySQLDataTypesSupport>(setting).isSet(MySQLDataTypesSupport::DECIMAL));
39ASSERT_FALSE(MultiEnum<MySQLDataTypesSupport>(setting).isSet(MySQLDataTypesSupport::DATETIME64));
40}
41
42GTEST_TEST(SettingMySQLDataTypesSupport, WithDECIMAL)
43{
44// Setting can be initialized with MySQLDataTypesSupport::DECIMAL
45// and this value can be obtained in varios forms with getters.
46const SettingMySQLDataTypesSupport setting(MySQLDataTypesSupport::DECIMAL);
47ASSERT_EQ(std::vector<MySQLDataTypesSupport>{MySQLDataTypesSupport::DECIMAL}, setting.value);
48
49ASSERT_TRUE(MultiEnum<MySQLDataTypesSupport>(setting).isSet(MySQLDataTypesSupport::DECIMAL));
50ASSERT_FALSE(MultiEnum<MySQLDataTypesSupport>(setting).isSet(MySQLDataTypesSupport::DATETIME64));
51
52ASSERT_EQ("decimal", setting.toString());
53ASSERT_EQ(Field("decimal"), setting);
54}
55
56GTEST_TEST(SettingMySQLDataTypesSupport, WithDATE)
57{
58SettingMySQLDataTypesSupport setting;
59setting = String("date2Date32");
60ASSERT_EQ(std::vector<MySQLDataTypesSupport>{MySQLDataTypesSupport::DATE2DATE32}, setting.value);
61
62ASSERT_TRUE(MultiEnum<MySQLDataTypesSupport>(setting).isSet(MySQLDataTypesSupport::DATE2DATE32));
63ASSERT_FALSE(MultiEnum<MySQLDataTypesSupport>(setting).isSet(MySQLDataTypesSupport::DECIMAL));
64ASSERT_FALSE(MultiEnum<MySQLDataTypesSupport>(setting).isSet(MySQLDataTypesSupport::DATETIME64));
65
66ASSERT_EQ("date2Date32", setting.toString());
67ASSERT_EQ(Field("date2Date32"), setting);
68
69setting = String("date2String");
70ASSERT_EQ(std::vector<MySQLDataTypesSupport>{MySQLDataTypesSupport::DATE2STRING}, setting.value);
71
72ASSERT_TRUE(MultiEnum<MySQLDataTypesSupport>(setting).isSet(MySQLDataTypesSupport::DATE2STRING));
73ASSERT_FALSE(MultiEnum<MySQLDataTypesSupport>(setting).isSet(MySQLDataTypesSupport::DATE2DATE32));
74
75ASSERT_EQ("date2String", setting.toString());
76ASSERT_EQ(Field("date2String"), setting);
77}
78
79GTEST_TEST(SettingMySQLDataTypesSupport, SetString)
80{
81SettingMySQLDataTypesSupport setting;
82setting = String("decimal");
83ASSERT_TRUE(setting.changed);
84
85ASSERT_TRUE(MultiEnum<MySQLDataTypesSupport>(setting).isSet(MySQLDataTypesSupport::DECIMAL));
86ASSERT_FALSE(MultiEnum<MySQLDataTypesSupport>(setting).isSet(MySQLDataTypesSupport::DATETIME64));
87ASSERT_EQ("decimal", setting.toString());
88ASSERT_EQ(Field("decimal"), setting);
89
90setting = "datetime64,decimal";
91ASSERT_TRUE(setting.changed);
92ASSERT_TRUE(MultiEnum<MySQLDataTypesSupport>(setting).isSet(MySQLDataTypesSupport::DECIMAL));
93ASSERT_TRUE(MultiEnum<MySQLDataTypesSupport>(setting).isSet(MySQLDataTypesSupport::DATETIME64));
94ASSERT_EQ("datetime64,decimal", setting.toString());
95ASSERT_EQ(Field("datetime64,decimal"), setting);
96
97// comma with spaces
98setting = " datetime64 , decimal "; /// bad punctuation is ok here
99ASSERT_TRUE(setting.changed);
100ASSERT_TRUE(MultiEnum<MySQLDataTypesSupport>(setting).isSet(MySQLDataTypesSupport::DECIMAL));
101ASSERT_TRUE(MultiEnum<MySQLDataTypesSupport>(setting).isSet(MySQLDataTypesSupport::DATETIME64));
102ASSERT_EQ("datetime64,decimal", setting.toString());
103ASSERT_EQ(Field("datetime64,decimal"), setting);
104
105setting = String(",,,,,,,, ,decimal");
106ASSERT_TRUE(setting.changed);
107ASSERT_TRUE(MultiEnum<MySQLDataTypesSupport>(setting).isSet(MySQLDataTypesSupport::DECIMAL));
108ASSERT_FALSE(MultiEnum<MySQLDataTypesSupport>(setting).isSet(MySQLDataTypesSupport::DATETIME64));
109ASSERT_EQ("decimal", setting.toString());
110ASSERT_EQ(Field("decimal"), setting);
111
112setting = String(",decimal,decimal,decimal,decimal,decimal,decimal,decimal,decimal,decimal,");
113ASSERT_TRUE(setting.changed); //since previous value was DECIMAL
114ASSERT_TRUE(MultiEnum<MySQLDataTypesSupport>(setting).isSet(MySQLDataTypesSupport::DECIMAL));
115ASSERT_FALSE(MultiEnum<MySQLDataTypesSupport>(setting).isSet(MySQLDataTypesSupport::DATETIME64));
116ASSERT_EQ("decimal", setting.toString());
117ASSERT_EQ(Field("decimal"), setting);
118
119setting = String("");
120ASSERT_TRUE(setting.changed);
121ASSERT_FALSE(MultiEnum<MySQLDataTypesSupport>(setting).isSet(MySQLDataTypesSupport::DECIMAL));
122ASSERT_FALSE(MultiEnum<MySQLDataTypesSupport>(setting).isSet(MySQLDataTypesSupport::DATETIME64));
123ASSERT_EQ("", setting.toString());
124ASSERT_EQ(Field(""), setting);
125}
126
127GTEST_TEST(SettingMySQLDataTypesSupport, SetInvalidString)
128{
129// Setting can be initialized with int value corresponding to (DECIMAL | DATETIME64)
130SettingMySQLDataTypesSupport setting;
131EXPECT_THROW(setting = String("FOOBAR"), Exception);
132ASSERT_FALSE(setting.changed);
133ASSERT_EQ(std::vector<MySQLDataTypesSupport>{}, setting.value);
134
135EXPECT_THROW(setting = String("decimal,datetime64,123"), Exception);
136ASSERT_FALSE(setting.changed);
137ASSERT_EQ(std::vector<MySQLDataTypesSupport>{}, setting.value);
138
139EXPECT_NO_THROW(setting = String(", "));
140ASSERT_TRUE(setting.changed);
141ASSERT_EQ(std::vector<MySQLDataTypesSupport>{}, setting.value);
142}
143