4040#include " arrow/array/util.h"
4141#include " arrow/c/abi.h"
4242#include " arrow/chunked_array.h"
43+ #include " arrow/compare.h"
4344#include " arrow/config.h"
4445#include " arrow/status.h"
4546#include " arrow/table.h"
@@ -64,44 +65,100 @@ class TestRecordBatch : public ::testing::Test {};
6465TEST_F (TestRecordBatch, Equals) {
6566 const int length = 10 ;
6667
68+ auto f0 = field (" f0" , int32 ());
69+ auto f1 = field (" f1" , uint8 ());
70+ auto f2 = field (" f2" , int16 ());
71+
72+ auto schema = ::arrow::schema ({f0, f1, f2});
73+ auto schema_same = ::arrow::schema ({f0, f1, f2});
74+ auto schema_fewer_fields = ::arrow::schema ({f0, f1});
75+
76+ random::RandomArrayGenerator gen (42 );
77+
78+ auto a_f0 = gen.ArrayOf (int32 (), length);
79+ auto a_f1 = gen.ArrayOf (uint8 (), length);
80+ auto a_f2 = gen.ArrayOf (int16 (), length);
81+ auto a_f0_half = a_f0->Slice (0 , length / 2 );
82+ auto a_f1_half = a_f1->Slice (0 , length / 2 );
83+ auto a_f0_different = gen.ArrayOf (int32 (), length);
84+ auto a_f1_different = gen.ArrayOf (uint8 (), length);
85+
86+ auto b = RecordBatch::Make (schema, length, {a_f0, a_f1, a_f2});
87+ auto b_same = RecordBatch::Make (schema_same, length, {a_f0, a_f1, a_f2});
88+ auto b_fewer_fields = RecordBatch::Make (schema_fewer_fields, length, {a_f0, a_f1});
89+ auto b_fewer_fields_half =
90+ RecordBatch::Make (schema_fewer_fields, length / 2 , {a_f0_half, a_f1_half});
91+ auto b_fewer_fields_different =
92+ RecordBatch::Make (schema_fewer_fields, length, {a_f0_different, a_f1_different});
93+
94+ // Same Values
95+ ASSERT_TRUE (b->Equals (*b_same));
96+
97+ // Different number of columns
98+ ASSERT_FALSE (b->Equals (*b_fewer_fields));
99+
100+ // Different number of rows
101+ ASSERT_FALSE (b_fewer_fields->Equals (*b_fewer_fields_half));
102+
103+ // Different values
104+ ASSERT_FALSE (b_fewer_fields->Equals (*b_fewer_fields_different));
105+ }
106+
107+ class TestRecordBatchEqualOptions : public TestRecordBatch {};
108+
109+ TEST_F (TestRecordBatchEqualOptions, MetadataAndSchema) {
110+ int length = 10 ;
111+
67112 auto f0 = field (" f0" , int32 ());
68113 auto f1 = field (" f1" , uint8 ());
69114 auto f2 = field (" f2" , int16 ());
70115 auto f2b = field (" f2b" , int16 ());
71116
72117 auto metadata = key_value_metadata ({" foo" }, {" bar" });
73118
74- std::vector<std::shared_ptr<Field>> fields = {f0, f1, f2};
75119 auto schema = ::arrow::schema ({f0, f1, f2});
76- auto schema2 = ::arrow::schema ({f0, f1});
77- auto schema3 = ::arrow::schema ({f0, f1, f2}, metadata);
78- auto schema4 = ::arrow::schema ({f0, f1, f2b});
120+ auto schema_with_metadata = ::arrow::schema ({f0, f1, f2}, metadata);
121+ auto schema_renamed_field = ::arrow::schema ({f0, f1, f2b});
79122
80123 random::RandomArrayGenerator gen (42 );
81124
82- auto a0 = gen.ArrayOf (int32 (), length);
83- auto a1 = gen.ArrayOf (uint8 (), length);
84- auto a2 = gen.ArrayOf (int16 (), length);
125+ auto a_f0 = gen.ArrayOf (int32 (), length);
126+ auto a_f1 = gen.ArrayOf (uint8 (), length);
127+ auto a_f2 = gen.ArrayOf (int16 (), length);
128+ auto a_f2b = a_f2;
85129
86- auto b1 = RecordBatch::Make (schema, length, {a0, a1, a2});
87- auto b2 = RecordBatch::Make (schema3, length, {a0, a1, a2});
88- auto b3 = RecordBatch::Make (schema2, length, {a0, a1});
89- auto b4 = RecordBatch::Make (schema, length, {a0, a1, a1});
90- auto b5 = RecordBatch::Make (schema4, length, {a0, a1, a2});
130+ // All RecordBatches have the same values but different schemas.
131+ auto b = RecordBatch::Make (schema, length, {a_f0, a_f1, a_f2});
132+ auto b_with_metadata =
133+ RecordBatch::Make (schema_with_metadata, length, {a_f0, a_f1, a_f2});
134+ auto b_renamed_field =
135+ RecordBatch::Make (schema_renamed_field, length, {a_f0, a_f1, a_f2b});
91136
92- ASSERT_TRUE (b1->Equals (*b1));
93- ASSERT_FALSE (b1->Equals (*b3));
94- ASSERT_FALSE (b1->Equals (*b4));
137+ auto options = EqualOptions::Defaults ();
95138
96139 // Same values and types, but different field names
97- ASSERT_FALSE (b1->Equals (*b5));
140+ ASSERT_FALSE (b->Equals (*b_renamed_field));
141+ ASSERT_TRUE (b->Equals (*b_renamed_field, options.use_schema (false )));
142+ ASSERT_TRUE (b->ApproxEquals (*b_renamed_field));
143+ ASSERT_TRUE (b->ApproxEquals (*b_renamed_field, options.use_schema (true )));
98144
99145 // Different metadata
100- ASSERT_TRUE (b1->Equals (*b2));
101- ASSERT_FALSE (b1->Equals (*b2, /* check_metadata=*/ true ));
146+ ASSERT_TRUE (b->Equals (*b_with_metadata));
147+ ASSERT_TRUE (b->Equals (*b_with_metadata, options));
148+ ASSERT_FALSE (b->Equals (*b_with_metadata,
149+ /* check_metadata=*/ true ));
150+ ASSERT_FALSE (b->Equals (*b_with_metadata,
151+ /* check_metadata=*/ true , options.use_schema (true )));
152+ ASSERT_TRUE (b->Equals (*b_with_metadata,
153+ /* check_metadata=*/ true , options.use_schema (false )));
154+ ASSERT_TRUE (b->Equals (*b_with_metadata, options.use_schema (true ).use_metadata (false )));
155+ ASSERT_FALSE (b->Equals (*b_with_metadata, options.use_schema (true ).use_metadata (true )));
156+ ASSERT_TRUE (b->Equals (*b_with_metadata, options.use_schema (false ).use_metadata (true )));
157+ ASSERT_TRUE (
158+ b->ApproxEquals (*b_with_metadata, options.use_schema (true ).use_metadata (true )));
102159}
103160
104- TEST_F (TestRecordBatch, EqualOptions ) {
161+ TEST_F (TestRecordBatchEqualOptions, NaN ) {
105162 int length = 2 ;
106163 auto f = field (" f" , float64 ());
107164
@@ -114,13 +171,27 @@ TEST_F(TestRecordBatch, EqualOptions) {
114171 auto b1 = RecordBatch::Make (schema, length, {array1});
115172 auto b2 = RecordBatch::Make (schema, length, {array2});
116173
117- EXPECT_FALSE (b1->Equals (*b2, /* check_metadata=*/ false ,
118- EqualOptions::Defaults ().nans_equal (false )));
119- EXPECT_TRUE (b1->Equals (*b2, /* check_metadata=*/ false ,
120- EqualOptions::Defaults ().nans_equal (true )));
174+ EXPECT_FALSE (b1->Equals (*b2, EqualOptions::Defaults ().nans_equal (false )));
175+ EXPECT_TRUE (b1->Equals (*b2, EqualOptions::Defaults ().nans_equal (true )));
176+ }
177+
178+ TEST_F (TestRecordBatchEqualOptions, SignedZero) {
179+ int length = 2 ;
180+ auto f = field (" f" , float64 ());
181+
182+ auto schema = ::arrow::schema ({f});
183+
184+ std::shared_ptr<Array> array1, array2;
185+ ArrayFromVector<DoubleType>(float64 (), {true , true }, {0.5 , +0.0 }, &array1);
186+ ArrayFromVector<DoubleType>(float64 (), {true , true }, {0.5 , -0.0 }, &array2);
187+ auto b1 = RecordBatch::Make (schema, length, {array1});
188+ auto b2 = RecordBatch::Make (schema, length, {array2});
189+
190+ ASSERT_FALSE (b1->Equals (*b2, EqualOptions::Defaults ().signed_zeros_equal (false )));
191+ ASSERT_TRUE (b1->Equals (*b2, EqualOptions::Defaults ().signed_zeros_equal (true )));
121192}
122193
123- TEST_F (TestRecordBatch, ApproxEqualOptions ) {
194+ TEST_F (TestRecordBatchEqualOptions, Approx ) {
124195 int length = 2 ;
125196 auto f = field (" f" , float64 ());
126197
@@ -137,8 +208,8 @@ TEST_F(TestRecordBatch, ApproxEqualOptions) {
137208 EXPECT_FALSE (b1->ApproxEquals (*b2, EqualOptions::Defaults ().nans_equal (true )));
138209
139210 auto options = EqualOptions::Defaults ().nans_equal (true ).atol (0.1 );
140- EXPECT_FALSE (b1->Equals (*b2, false , options));
141- EXPECT_TRUE (b1->Equals (*b2, false , options.use_atol (true )));
211+ EXPECT_FALSE (b1->Equals (*b2, options));
212+ EXPECT_TRUE (b1->Equals (*b2, options.use_atol (true )));
142213 EXPECT_TRUE (b1->ApproxEquals (*b2, options));
143214}
144215
@@ -158,8 +229,8 @@ TEST_F(TestRecordBatchEqualsSameAddress, NonFloatType) {
158229
159230 auto options = EqualOptions::Defaults ();
160231
161- ASSERT_TRUE (b0->Equals (*b1, true , options));
162- ASSERT_TRUE (b0->Equals (*b1, true , options.nans_equal (true )));
232+ ASSERT_TRUE (b0->Equals (*b1, options));
233+ ASSERT_TRUE (b0->Equals (*b1, options.nans_equal (true )));
163234
164235 ASSERT_TRUE (b0->ApproxEquals (*b1, options));
165236 ASSERT_TRUE (b0->ApproxEquals (*b1, options.nans_equal (true )));
@@ -180,8 +251,8 @@ TEST_F(TestRecordBatchEqualsSameAddress, NestedTypesWithoutFloatType) {
180251
181252 auto options = EqualOptions::Defaults ();
182253
183- ASSERT_TRUE (b0->Equals (*b1, true , options));
184- ASSERT_TRUE (b0->Equals (*b1, true , options.nans_equal (true )));
254+ ASSERT_TRUE (b0->Equals (*b1, options));
255+ ASSERT_TRUE (b0->Equals (*b1, options.nans_equal (true )));
185256
186257 ASSERT_TRUE (b0->ApproxEquals (*b1, options));
187258 ASSERT_TRUE (b0->ApproxEquals (*b1, options.nans_equal (true )));
@@ -201,8 +272,8 @@ TEST_F(TestRecordBatchEqualsSameAddress, FloatType) {
201272
202273 auto options = EqualOptions::Defaults ();
203274
204- ASSERT_FALSE (b0->Equals (*b1, true , options));
205- ASSERT_TRUE (b0->Equals (*b1, true , options.nans_equal (true )));
275+ ASSERT_FALSE (b0->Equals (*b1, options));
276+ ASSERT_TRUE (b0->Equals (*b1, options.nans_equal (true )));
206277
207278 ASSERT_FALSE (b0->ApproxEquals (*b1, options));
208279 ASSERT_TRUE (b0->ApproxEquals (*b1, options.nans_equal (true )));
@@ -223,8 +294,8 @@ TEST_F(TestRecordBatchEqualsSameAddress, NestedTypesWithFloatType) {
223294
224295 auto options = EqualOptions::Defaults ();
225296
226- ASSERT_FALSE (b0->Equals (*b1, true , options));
227- ASSERT_TRUE (b0->Equals (*b1, true , options.nans_equal (true )));
297+ ASSERT_FALSE (b0->Equals (*b1, options));
298+ ASSERT_TRUE (b0->Equals (*b1, options.nans_equal (true )));
228299
229300 ASSERT_FALSE (b0->ApproxEquals (*b1, options));
230301 ASSERT_TRUE (b0->ApproxEquals (*b1, options.nans_equal (true )));
0 commit comments