|
1 | 1 | #include <clickhouse/types/types.h>
|
| 2 | +#include <clickhouse/columns/factory.h> |
| 3 | + |
2 | 4 | #include <gtest/gtest.h>
|
3 | 5 |
|
4 | 6 | using namespace clickhouse;
|
@@ -70,3 +72,57 @@ TEST(TypesCase, EnumTypesEmpty) {
|
70 | 72 | TEST(TypesCase, DecimalTypes) {
|
71 | 73 | // TODO: implement this test.
|
72 | 74 | }
|
| 75 | + |
| 76 | +TEST(TypesCase, IsEqual) { |
| 77 | + const std::string type_names[] = { |
| 78 | + "UInt8", |
| 79 | + "Int8", |
| 80 | + "UInt128", |
| 81 | + "String", |
| 82 | + "FixedString(0)", |
| 83 | + "FixedString(10000)", |
| 84 | + "DateTime('UTC')", |
| 85 | + "DateTime64(3, 'UTC')", |
| 86 | + "Decimal(9,3)", |
| 87 | + "Decimal(18,3)", |
| 88 | + "Enum8()", |
| 89 | + "Enum16()", |
| 90 | + "Enum8('ONE' = 1)", |
| 91 | + "Enum8('ONE' = 1, 'TWO' = 2)", |
| 92 | + "Enum16('ONE' = 1, 'TWO' = 2, 'THREE' = 3, 'FOUR' = 4)", |
| 93 | + "Nullable(FixedString(10000))", |
| 94 | + "Nullable(LowCardinality(FixedString(10000)))", |
| 95 | + "Array(Int8)", |
| 96 | + "Array(UInt8)", |
| 97 | + "Array(String)", |
| 98 | + "Array(Nullable(LowCardinality(FixedString(10000))))", |
| 99 | + "Array(Enum8('ONE' = 1, 'TWO' = 2))" |
| 100 | + "Tuple(String, Int8, Date, DateTime)", |
| 101 | + "Nullable(Tuple(String, Int8, Date, DateTime))", |
| 102 | + "Array(Nullable(Tuple(String, Int8, Date, DateTime)))", |
| 103 | + "Array(Array(Nullable(Tuple(String, Int8, Date, DateTime))))", |
| 104 | + "Array(Array(Array(Nullable(Tuple(String, Int8, Date, DateTime)))))", |
| 105 | + "Array(Array(Array(Array(Nullable(Tuple(String, Int8, Date, DateTime('UTC')))))))" |
| 106 | + "Array(Array(Array(Array(Nullable(Tuple(String, Int8, Date, DateTime('UTC'), Tuple(LowCardinality(String), Enum8('READ'=1, 'WRITE'=0))))))))", |
| 107 | + }; |
| 108 | + |
| 109 | + // Check that Type::IsEqual returns true only if: |
| 110 | + // - same Type instance |
| 111 | + // - same Type layout (matching outer type with all nested types and/or parameters) |
| 112 | + for (const auto & type_name : type_names) { |
| 113 | + SCOPED_TRACE(type_name); |
| 114 | + const auto type = clickhouse::CreateColumnByType(type_name)->Type(); |
| 115 | + |
| 116 | + // Should be equal to itself |
| 117 | + EXPECT_TRUE(type->IsEqual(type)); |
| 118 | + EXPECT_TRUE(type->IsEqual(*type)); |
| 119 | + |
| 120 | + for (const auto & other_type_name : type_names) { |
| 121 | + const auto other_type = clickhouse::CreateColumnByType(other_type_name)->Type(); |
| 122 | + |
| 123 | + const auto should_be_equal = type_name == other_type_name; |
| 124 | + EXPECT_EQ(should_be_equal, type->IsEqual(other_type)) |
| 125 | + << "For types: " << type_name << " and " << other_type_name; |
| 126 | + } |
| 127 | + } |
| 128 | +} |
0 commit comments