@Test(dataProvider = "blanksProvider")
  public void testWriteBlanks(boolean quoteAllFields, String nullValue, String expectedResult) {
    CsvWriterSettings s = new CsvWriterSettings();
    s.setQuoteAllFields(quoteAllFields);
    s.getFormat().setLineSeparator("\n");
    s.setNullValue(nullValue);
    s.setEmptyValue("//");
    CsvWriter w = new CsvWriter(s);

    CsvParserSettings ps = new CsvParserSettings();
    ps.setNullValue(nullValue);
    ps.setEmptyValue("//");
    CsvParser p = new CsvParser(ps);

    String result = w.writeRowToString("   ", " ", "", "\"\"", null);

    assertEquals(result, expectedResult);

    String[] row = p.parseLine(result);
    if (quoteAllFields) {
      assertEquals(row[0], "//");
      assertEquals(row[1], "//");
    } else {
      assertEquals(row[0], nullValue);
      assertEquals(row[1], nullValue);
    }

    assertEquals(row[2], "//");
    assertEquals(row[3], "\"\"");
    assertEquals(row[4], nullValue);
  }
  @Test(enabled = true, dataProvider = "lineSeparatorProvider")
  public void writeTest(boolean quoteAllFields, char[] lineSeparator) throws Exception {
    CsvWriterSettings settings = new CsvWriterSettings();

    String[] expectedHeaders = new String[] {"Year", "Make", "Model", "Description", "Price"};
    settings.setQuoteAllFields(quoteAllFields);
    settings.getFormat().setLineSeparator(lineSeparator);
    settings.setIgnoreLeadingWhitespaces(false);
    settings.setIgnoreTrailingWhitespaces(false);
    settings.setHeaders(expectedHeaders);

    ByteArrayOutputStream csvResult = new ByteArrayOutputStream();

    CsvWriter writer = new CsvWriter(new OutputStreamWriter(csvResult, "UTF-8"), settings);

    Object[][] expectedResult =
        new Object[][] {
          {"1997", "Ford", "E350", "ac, abs, moon", "3000.00"},
          {"1999", "Chevy", "Venture \"Extended Edition\"", null, "4900.00"},
          {"1996", "Jeep", "Grand Cherokee", "MUST SELL!\nair, moon roof, loaded", "4799.00"},
          {"1999", "Chevy", "Venture \"Extended Edition, Very Large\"", null, "5000.00"},
          {null, null, "Venture \"Extended Edition\"", null, "4900.00"},
          {null, null, null, null, null},
          {null, null, null, null, null},
          {null, null, "5", null, null},
          {"1997", "Ford", "E350", "ac, abs, moon", "3000.00"},
          {"1997", "Ford", "E350", " ac, abs, moon ", "3000.00"},
          {"1997", "Ford", "E350", " ac, abs, moon ", "3000.00"},
          {"19 97", "Fo rd", "E350", " ac, abs, moon ", "3000.00"},
          {null, " ", null, "  ", "30 00.00"},
          {"1997", "Ford", "E350", " \" ac, abs, moon \" ", "3000.00"},
          {"1997", "Ford", "E350", "\" ac, abs, moon \" ", "3000.00"},
        };

    writer.writeHeaders();

    for (int i = 0; i < 4; i++) {
      writer.writeRow(expectedResult[i]);
    }
    writer.writeRow("-->skipping this line (10) as well");
    for (int i = 4; i < expectedResult.length; i++) {
      writer.writeRow(expectedResult[i]);
    }
    writer.close();

    String result = csvResult.toString();
    result =
        "This line and the following should be skipped. The third is ignored automatically because it is blank\n\n\n"
                .replaceAll("\n", new String(lineSeparator))
            + result;

    CsvParserSettings parserSettings = new CsvParserSettings();
    parserSettings.setRowProcessor(processor);
    parserSettings.getFormat().setLineSeparator(lineSeparator);
    parserSettings.setHeaderExtractionEnabled(true);
    parserSettings.setIgnoreLeadingWhitespaces(false);
    parserSettings.setIgnoreTrailingWhitespaces(false);

    CsvParser parser = new CsvParser(parserSettings);
    parser.parse(new StringReader(result));

    try {
      assertHeadersAndValuesMatch(expectedHeaders, expectedResult);
    } catch (Error e) {
      System.out.println("FAILED:\n===\n" + result + "\n===");
      throw e;
    }
  }
  @Test(enabled = true, dataProvider = "lineSeparatorProvider")
  public void writeSelectedColumnOnly(boolean quoteAllFields, char[] lineSeparator)
      throws Exception {
    CsvWriterSettings settings = new CsvWriterSettings();

    String[] expectedHeaders = new String[] {"Year", "Make", "Model", "Description", "Price"};
    settings.setQuoteAllFields(quoteAllFields);
    settings.getFormat().setLineSeparator(lineSeparator);
    settings.setIgnoreLeadingWhitespaces(false);
    settings.setIgnoreTrailingWhitespaces(false);
    settings.setHeaders(expectedHeaders);
    settings.selectFields("Model", "Price");

    ByteArrayOutputStream csvResult = new ByteArrayOutputStream();

    CsvWriter writer = new CsvWriter(new OutputStreamWriter(csvResult, "UTF-8"), settings);

    Object[][] input =
        new Object[][] {
          {"E350", "3000.00"},
          {"Venture \"Extended Edition\"", "4900.00"},
          {"Grand Cherokee", "4799.00"},
          {"Venture \"Extended Edition, Very Large\"", "5000.00"},
          {"Venture \"Extended Edition\"", "4900.00"},
          {null, null},
          {"5", null},
          {"E350", "3000.00"},
        };
    writer.writeHeaders();
    writer.writeRowsAndClose(input);

    Object[][] expectedResult =
        new Object[][] {
          {null, null, "E350", null, "3000.00"},
          {null, null, "Venture \"Extended Edition\"", null, "4900.00"},
          {null, null, "Grand Cherokee", null, "4799.00"},
          {null, null, "Venture \"Extended Edition, Very Large\"", null, "5000.00"},
          {null, null, "Venture \"Extended Edition\"", null, "4900.00"},
          {null, null, null, null, null},
          {null, null, "5", null, null},
          {null, null, "E350", null, "3000.00"},
        };

    String result = csvResult.toString();

    RowListProcessor rowList = new RowListProcessor();
    CsvParserSettings parserSettings = new CsvParserSettings();
    parserSettings.setRowProcessor(rowList);
    parserSettings.getFormat().setLineSeparator(lineSeparator);
    parserSettings.setHeaderExtractionEnabled(true);
    parserSettings.setIgnoreLeadingWhitespaces(false);
    parserSettings.setIgnoreTrailingWhitespaces(false);

    CsvParser parser = new CsvParser(parserSettings);
    parser.parse(new StringReader(result));

    try {
      assertHeadersAndValuesMatch(rowList, expectedHeaders, expectedResult);
    } catch (Error e) {
      System.out.println("FAILED:\n===\n" + result + "\n===");
      throw e;
    }
  }