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

import java.io.BufferedWriter;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

import org.apache.sqoop.testutil.CommonArgs;
import org.apache.sqoop.testutil.ExportJobTestCase;
import org.junit.Test;

import static java.util.Collections.emptyList;
import static org.junit.Assert.assertEquals;

/**
 * Test exporting lines that are created via both options of
 * sqoop.bigdecimal.format.string parameter.
 */
public class TestBigDecimalExport extends ExportJobTestCase {

  private void runBigDecimalExport(String line)
      throws IOException, SQLException {
    FileSystem fs = FileSystem.get(getConf());
    Path tablePath = getTablePath();
    fs.mkdirs(tablePath);
    Path filePath = getDataFilePath();
    DataOutputStream stream = fs.create(filePath);
    BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(stream));
    writer.write(line);
    writer.close();
    String[] types =
      { "DECIMAL", "NUMERIC" };
    createTableWithColTypes(types, emptyList());

    List<String> args = new ArrayList<String>();

    CommonArgs.addHadoopFlags(args);

    args.add("--table");
    args.add(getTableName());
    args.add("--export-dir");
    args.add(tablePath.toString());
    args.add("--connect");
    args.add(getConnectString());
    args.add("-m");
    args.add("1");

    runExport(args.toArray(new String[args.size()]));

    BigDecimal actual1 = null;
    BigDecimal actual2 = null;

    Connection conn = getConnection();
    try {
      PreparedStatement stmt = conn.prepareStatement("SELECT * FROM "
          + getTableName());
      try {
        ResultSet rs = stmt.executeQuery();
        try {
          rs.next();
          actual1 = rs.getBigDecimal(1);
          actual2 = rs.getBigDecimal(2);
        } finally {
          rs.close();
        }
      } finally {
        stmt.close();
      }
    } finally {
      conn.close();
    }

    BigDecimal expected1 = new BigDecimal("0.000001");
    BigDecimal expected2 = new BigDecimal("0.0000001");

    assertEquals(expected1, actual1);
    assertEquals(expected2, actual2);
  }

  @Test
  public void testBigDecimalDefault() throws IOException, SQLException {
    runBigDecimalExport("0.000001,0.0000001");
  }

  @Test
  public void testBigDecimalNoFormat() throws IOException, SQLException {
    runBigDecimalExport("0.000001,1E-7");
  }

}
