/**
 * 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.sqoop.lib;

import org.apache.sqoop.testcategories.sqooptest.UnitTest;
import org.junit.Test;
import org.junit.experimental.categories.Category;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;


/**
 * Test that the field formatter works in a variety of configurations.
 */
@Category(UnitTest.class)
public class TestFieldFormatter {

  @Test
  public void testAllEmpty() {
    String result = FieldFormatter.escapeAndEnclose("",
        new DelimiterSet(DelimiterSet.NULL_CHAR, DelimiterSet.NULL_CHAR,
        DelimiterSet.NULL_CHAR, DelimiterSet.NULL_CHAR, false));
    assertEquals("", result);
  }

  @Test
  public void testNullArgs() {
    assertNull(FieldFormatter.escapeAndEnclose(null,
      new DelimiterSet('\"', DelimiterSet.NULL_CHAR, '\"', '\\', false)));
  }

  @Test
  public void testBasicStr() {
    String result = FieldFormatter.escapeAndEnclose("foo",
        DelimiterSet.DEFAULT_DELIMITERS);
    assertEquals("foo", result);
  }

  @Test
  public void testEscapeSlash() {
    String result = FieldFormatter.escapeAndEnclose("foo\\bar",
        new DelimiterSet(',', '\n', '\"', '\\', false));
    assertEquals("foo\\\\bar", result);
  }

  @Test
  public void testMustEnclose() {
    String result = FieldFormatter.escapeAndEnclose("foo",
        new DelimiterSet(',', '\n', '\"', DelimiterSet.NULL_CHAR, true));
    assertEquals("\"foo\"", result);
  }

  @Test
  public void testEncloseComma1() {
    String result = FieldFormatter.escapeAndEnclose("foo,bar",
        new DelimiterSet(',', '\n', '\"', '\\', false));
    assertEquals("\"foo,bar\"", result);
  }

  @Test
  public void testEncloseComma2() {
    String result = FieldFormatter.escapeAndEnclose("foo,bar",
        new DelimiterSet(',', ',', '\"', '\\', false));
    assertEquals("\"foo,bar\"", result);
  }

  @Test
  public void testNoNeedToEnclose() {
    String result = FieldFormatter.escapeAndEnclose(
        "just another string",
        new DelimiterSet(',', '\n', '\"', '\\', false));
    assertEquals("just another string", result);
  }

  @Test
  public void testCannotEnclose() {
    // Can't enclose because encloser is nul.
    // This should escape the comma instead.
    String result = FieldFormatter.escapeAndEnclose("foo,bar",
        new DelimiterSet(',', '\n', DelimiterSet.NULL_CHAR, '\\', false));

    assertEquals("foo\\,bar", result);
  }

  @Test
  public void testEmptyCharToEscapeString() {
    // test what happens when the escape char is null. It should encode the
    // null char.

    char nul = DelimiterSet.NULL_CHAR;
    String s = "" + nul;
    assertEquals("\000", s);
  }

  @Test
  public void testEscapeCentralQuote() {
    String result = FieldFormatter.escapeAndEnclose("foo\"bar",
        new DelimiterSet(',', '\n', '\"', '\\', false));
    assertEquals("foo\\\"bar", result);
  }

  @Test
  public void testEscapeMultiCentralQuote() {
    String result = FieldFormatter.escapeAndEnclose("foo\"\"bar",
        new DelimiterSet(',', '\n', '\"', '\\', false));
    assertEquals("foo\\\"\\\"bar", result);
  }

  @Test
  public void testDoubleEscape() {
    String result = FieldFormatter.escapeAndEnclose("foo\\\"bar",
        new DelimiterSet(',', '\n', '\"', '\\', false));
    assertEquals("foo\\\\\\\"bar", result);
  }

  @Test
  public void testReverseEscape() {
    String result = FieldFormatter.escapeAndEnclose("foo\"\\bar",
        new DelimiterSet(',', '\n', '\"', '\\', false));
    assertEquals("foo\\\"\\\\bar", result);
  }

  @Test
  public void testQuotedEncloser() {
    String result = FieldFormatter.escapeAndEnclose("foo\",bar",
        new DelimiterSet(',', '\n', '\"', '\\', false));
    assertEquals("\"foo\\\",bar\"", result);
  }

  @Test
  public void testQuotedEscape() {
    String result = FieldFormatter.escapeAndEnclose("foo\\,bar",
        new DelimiterSet(',', '\n', '\"', '\\', false));
    assertEquals("\"foo\\\\,bar\"", result);
  }
}
