/*
 * 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.commons.csv.issues;

import static org.junit.jupiter.api.Assertions.assertEquals;

import java.io.IOException;
import java.io.StringReader;

import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVParser;
import org.apache.commons.csv.CSVRecord;
import org.junit.jupiter.api.Test;

public class JiraCsv211Test {

    @Test
    public void testJiraCsv211Format() throws IOException {
        final String[] values = {"1", "Jane Doe", "USA", ""};

        // @formatter:off
        final CSVFormat printFormat = CSVFormat.DEFAULT.builder()
            .setDelimiter('\t')
            .setHeader("ID", "Name", "Country", "Age")
            .build();
        // @formatter:on
        final String formatted = printFormat.format(values);
        assertEquals("ID\tName\tCountry\tAge\r\n1\tJane Doe\tUSA\t", formatted);

        final CSVFormat parseFormat = CSVFormat.DEFAULT.builder().setDelimiter('\t').setHeader().setSkipHeaderRecord(true).build();
        try (final CSVParser parser = parseFormat.parse(new StringReader(formatted))) {
            parser.forEach(record -> {
                assertEquals("1", record.get(0));
                assertEquals("Jane Doe", record.get(1));
                assertEquals("USA", record.get(2));
                assertEquals("", record.get(3));
            });
        }
    }
}
