// for pull request 89
  public void testColumnReordering() throws IOException {
    CsvFactory factory = new CsvFactory();
    String CSV = "b,a,c\nvb,va,vc\n";

    /* Test first column reordering, by setting the
      columns in a different order to the ones
      found in the CSV example
    */
    CsvSchema schemaWithReordering =
        CsvSchema.builder()
            .addColumn("a")
            .addColumn("b")
            .addColumn("c")
            .setLineSeparator('\n')
            .setUseHeader(true) // must be set for column reordering
            .setReorderColumns(true) // set column reordering
            .build();

    // Create a parser and ensure data is processed in the
    // right order, as per header
    CsvParser parser = factory.createParser(CSV);
    parser.setSchema(schemaWithReordering);
    assertEquals(JsonToken.START_OBJECT, parser.nextToken());
    assertEquals(JsonToken.FIELD_NAME, parser.nextToken());
    assertEquals("b", parser.getCurrentName());
    assertEquals(JsonToken.VALUE_STRING, parser.nextToken());
    assertEquals("vb", parser.getValueAsString());
    assertEquals(JsonToken.FIELD_NAME, parser.nextToken());
    assertEquals("a", parser.getCurrentName());
    assertEquals(JsonToken.VALUE_STRING, parser.nextToken());
    assertEquals("va", parser.getValueAsString());
    assertEquals(JsonToken.FIELD_NAME, parser.nextToken());
    assertEquals("c", parser.getCurrentName());
    assertEquals(JsonToken.VALUE_STRING, parser.nextToken());
    assertEquals("vc", parser.getValueAsString());
    assertEquals(JsonToken.END_OBJECT, parser.nextToken());

    /*
       Now make a copy of the schema but set the reordering
       flag to false.  In this case the columns values are
       reported as per the schema order, not the header.
    */
    CsvSchema schemaWithoutReordering = schemaWithReordering.withColumnReordering(false);
    parser = factory.createParser(CSV);
    parser.setSchema(schemaWithoutReordering);
    assertEquals(JsonToken.START_OBJECT, parser.nextToken());
    assertEquals(JsonToken.FIELD_NAME, parser.nextToken());
    assertEquals("a", parser.getCurrentName());
    assertEquals(JsonToken.VALUE_STRING, parser.nextToken());
    assertEquals("vb", parser.getValueAsString());
    assertEquals(JsonToken.FIELD_NAME, parser.nextToken());
    assertEquals("b", parser.getCurrentName());
    assertEquals(JsonToken.VALUE_STRING, parser.nextToken());
    assertEquals("va", parser.getValueAsString());
    assertEquals(JsonToken.FIELD_NAME, parser.nextToken());
    assertEquals("c", parser.getCurrentName());
    assertEquals(JsonToken.VALUE_STRING, parser.nextToken());
    assertEquals("vc", parser.getValueAsString());
    assertEquals(JsonToken.END_OBJECT, parser.nextToken());

    /*
       From the schema with reordering, disabling use header flag
       causes the same effect as the previous test.
    */
    CsvSchema schemaWithoutHeader =
        schemaWithReordering.withUseHeader(false).withSkipFirstDataRow(true);

    parser = factory.createParser(CSV);
    parser.setSchema(schemaWithoutHeader);
    assertEquals(JsonToken.START_OBJECT, parser.nextToken());
    assertEquals(JsonToken.FIELD_NAME, parser.nextToken());
    assertEquals("a", parser.getCurrentName());
    assertEquals(JsonToken.VALUE_STRING, parser.nextToken());
    assertEquals("vb", parser.getValueAsString());
    assertEquals(JsonToken.FIELD_NAME, parser.nextToken());
    assertEquals("b", parser.getCurrentName());
    assertEquals(JsonToken.VALUE_STRING, parser.nextToken());
    assertEquals("va", parser.getValueAsString());
    assertEquals(JsonToken.FIELD_NAME, parser.nextToken());
    assertEquals("c", parser.getCurrentName());
    assertEquals(JsonToken.VALUE_STRING, parser.nextToken());
    assertEquals("vc", parser.getValueAsString());
    assertEquals(JsonToken.END_OBJECT, parser.nextToken());

    /*
        Finally, test an empty schema, where the header is use to set
        the columns, independently of the reordering flag.
    */
    CsvSchema emptySchema = CsvSchema.builder().setLineSeparator('\n').setUseHeader(true).build();

    parser = factory.createParser(CSV);
    parser.setSchema(emptySchema);
    assertEquals(JsonToken.START_OBJECT, parser.nextToken());
    assertEquals(JsonToken.FIELD_NAME, parser.nextToken());
    assertEquals("b", parser.getCurrentName());
    assertEquals(JsonToken.VALUE_STRING, parser.nextToken());
    assertEquals("vb", parser.getValueAsString());
    assertEquals(JsonToken.FIELD_NAME, parser.nextToken());
    assertEquals("a", parser.getCurrentName());
    assertEquals(JsonToken.VALUE_STRING, parser.nextToken());
    assertEquals("va", parser.getValueAsString());
    assertEquals(JsonToken.FIELD_NAME, parser.nextToken());
    assertEquals("c", parser.getCurrentName());
    assertEquals(JsonToken.VALUE_STRING, parser.nextToken());
    assertEquals("vc", parser.getValueAsString());
    assertEquals(JsonToken.END_OBJECT, parser.nextToken());
  }