@@ -149,5 +149,145 @@ TEST(TestReaderProperties, GetStreamInsufficientData) {
149149 }
150150}
151151
152+ struct WriterPropertiesTestCase {
153+ WriterPropertiesTestCase (std::shared_ptr<WriterProperties> props, std::string label)
154+ : properties(std::move(props)), label(std::move(label)) {}
155+
156+ std::shared_ptr<WriterProperties> properties;
157+ std::string label;
158+ };
159+
160+ void PrintTo (const WriterPropertiesTestCase& p, std::ostream* os) { *os << p.label ; }
161+
162+ class WriterPropertiesTest : public testing ::TestWithParam<WriterPropertiesTestCase> {};
163+
164+ TEST_P (WriterPropertiesTest, RoundTripThroughBuilder) {
165+ const std::shared_ptr<WriterProperties>& properties = GetParam ().properties ;
166+ const std::vector<std::shared_ptr<ColumnPath>> columns{
167+ ColumnPath::FromDotString (" a" ),
168+ ColumnPath::FromDotString (" b" ),
169+ };
170+
171+ const auto round_tripped = WriterProperties::Builder (*properties).build ();
172+
173+ ASSERT_EQ (round_tripped->content_defined_chunking_enabled (),
174+ properties->content_defined_chunking_enabled ());
175+ ASSERT_EQ (round_tripped->created_by (), properties->created_by ());
176+ ASSERT_EQ (round_tripped->data_pagesize (), properties->data_pagesize ());
177+ ASSERT_EQ (round_tripped->data_page_version (), properties->data_page_version ());
178+ ASSERT_EQ (round_tripped->dictionary_index_encoding (),
179+ properties->dictionary_index_encoding ());
180+ ASSERT_EQ (round_tripped->dictionary_pagesize_limit (),
181+ properties->dictionary_pagesize_limit ());
182+ ASSERT_EQ (round_tripped->file_encryption_properties (),
183+ properties->file_encryption_properties ());
184+ ASSERT_EQ (round_tripped->max_rows_per_page (), properties->max_rows_per_page ());
185+ ASSERT_EQ (round_tripped->max_row_group_length (), properties->max_row_group_length ());
186+ ASSERT_EQ (round_tripped->memory_pool (), properties->memory_pool ());
187+ ASSERT_EQ (round_tripped->page_checksum_enabled (), properties->page_checksum_enabled ());
188+ ASSERT_EQ (round_tripped->size_statistics_level (), properties->size_statistics_level ());
189+ ASSERT_EQ (round_tripped->sorting_columns (), properties->sorting_columns ());
190+ ASSERT_EQ (round_tripped->store_decimal_as_integer (),
191+ properties->store_decimal_as_integer ());
192+ ASSERT_EQ (round_tripped->write_batch_size (), properties->write_batch_size ());
193+ ASSERT_EQ (round_tripped->version (), properties->version ());
194+
195+ const auto cdc_options = properties->content_defined_chunking_options ();
196+ const auto round_tripped_cdc_options =
197+ round_tripped->content_defined_chunking_options ();
198+ ASSERT_EQ (round_tripped_cdc_options.min_chunk_size , cdc_options.min_chunk_size );
199+ ASSERT_EQ (round_tripped_cdc_options.max_chunk_size , cdc_options.max_chunk_size );
200+ ASSERT_EQ (round_tripped_cdc_options.norm_level , cdc_options.norm_level );
201+
202+ for (const auto & column : columns) {
203+ const auto & column_properties = properties->column_properties (column);
204+ const auto & round_tripped_col = round_tripped->column_properties (column);
205+
206+ ASSERT_EQ (round_tripped_col.compression (), column_properties.compression ());
207+ ASSERT_EQ (round_tripped_col.compression_level (),
208+ column_properties.compression_level ());
209+ ASSERT_EQ (round_tripped_col.dictionary_enabled (),
210+ column_properties.dictionary_enabled ());
211+ ASSERT_EQ (round_tripped_col.encoding (), column_properties.encoding ());
212+ ASSERT_EQ (round_tripped_col.max_statistics_size (),
213+ column_properties.max_statistics_size ());
214+ ASSERT_EQ (round_tripped_col.page_index_enabled (),
215+ column_properties.page_index_enabled ());
216+ ASSERT_EQ (round_tripped_col.statistics_enabled (),
217+ column_properties.statistics_enabled ());
218+ }
219+ }
220+
221+ std::vector<WriterPropertiesTestCase> writer_properties_test_cases () {
222+ std::vector<WriterPropertiesTestCase> test_cases;
223+
224+ test_cases.emplace_back (default_writer_properties (), " default_properties" );
225+
226+ {
227+ WriterProperties::Builder builder;
228+ const auto column_a = ColumnPath::FromDotString (" a" );
229+
230+ builder.created_by (" parquet-cpp-properties-test" );
231+ builder.encoding (Encoding::BYTE_STREAM_SPLIT);
232+ builder.compression (Compression::ZSTD);
233+ builder.compression_level (2 );
234+ builder.disable_dictionary ();
235+ builder.disable_statistics ();
236+ builder.enable_content_defined_chunking ();
237+ builder.dictionary_pagesize_limit (DEFAULT_DICTIONARY_PAGE_SIZE_LIMIT - 1 );
238+ builder.write_batch_size (DEFAULT_WRITE_BATCH_SIZE - 1 );
239+ builder.max_row_group_length (DEFAULT_MAX_ROW_GROUP_LENGTH - 1 );
240+ builder.data_pagesize (kDefaultDataPageSize - 1 );
241+ builder.max_rows_per_page (kDefaultMaxRowsPerPage - 1 );
242+ builder.data_page_version (ParquetDataPageVersion::V2);
243+ builder.version (ParquetVersion::type::PARQUET_2_4);
244+ builder.enable_store_decimal_as_integer ();
245+ builder.disable_write_page_index ();
246+ builder.set_size_statistics_level (SizeStatisticsLevel::ColumnChunk);
247+ builder.set_sorting_columns (
248+ std::vector<SortingColumn>{SortingColumn{1 , true , false }});
249+
250+ test_cases.emplace_back (builder.build (), " override_defaults" );
251+ }
252+
253+ const auto column_a = ColumnPath::FromDotString (" a" );
254+ {
255+ WriterProperties::Builder builder;
256+ builder.disable_dictionary ();
257+ builder.enable_dictionary (column_a);
258+ test_cases.emplace_back (builder.build (), " dictionary_column_override" );
259+ }
260+ {
261+ WriterProperties::Builder builder;
262+ builder.disable_statistics ();
263+ builder.enable_statistics (column_a);
264+ test_cases.emplace_back (builder.build (), " statistics_column_override" );
265+ }
266+ {
267+ WriterProperties::Builder builder;
268+ builder.compression (Compression::SNAPPY);
269+ builder.compression (column_a, Compression::UNCOMPRESSED);
270+ builder.compression_level (column_a, 2 );
271+ test_cases.emplace_back (builder.build (), " compression_column_override" );
272+ }
273+ {
274+ WriterProperties::Builder builder;
275+ builder.encoding (Encoding::UNDEFINED);
276+ builder.encoding (column_a, Encoding::BYTE_STREAM_SPLIT);
277+ test_cases.emplace_back (builder.build (), " encoding_column_override" );
278+ }
279+ {
280+ WriterProperties::Builder builder;
281+ builder.disable_write_page_index ();
282+ builder.enable_write_page_index (column_a);
283+ test_cases.emplace_back (builder.build (), " page_index_column_override" );
284+ }
285+
286+ return test_cases;
287+ }
288+
289+ INSTANTIATE_TEST_SUITE_P (WriterPropertiesTest, WriterPropertiesTest,
290+ ::testing::ValuesIn (writer_properties_test_cases()));
291+
152292} // namespace test
153293} // namespace parquet
0 commit comments