/*
 * 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.
 */

package org.apache.datafusion;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNull;

import org.junit.jupiter.api.Test;

class ParquetWriteOptionsTest {

  @Test
  void defaultsAreAllNull() {
    ParquetWriteOptions opts = new ParquetWriteOptions();
    assertNull(opts.compression());
    assertNull(opts.singleFileOutput());
  }

  @Test
  void fluentSettersChainAndMutate() {
    ParquetWriteOptions opts =
        new ParquetWriteOptions().compression("zstd(3)").singleFileOutput(true);

    assertEquals("zstd(3)", opts.compression());
    assertEquals(Boolean.TRUE, opts.singleFileOutput());
  }
}
