/*
 *
 * Derby - Class org.apache.derbyTesting.functionTests.tests.i18n.JapanCodeConversionTest
 *
 * 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.derbyTesting.functionTests.tests.i18n;

import java.nio.charset.Charset;
import java.sql.CallableStatement;
import java.sql.SQLException;
import java.sql.Statement;
import junit.framework.Test;
import org.apache.derbyTesting.junit.BaseJDBCTestCase;
import org.apache.derbyTesting.junit.BaseTestSuite;
import org.apache.derbyTesting.junit.JDBC;
import org.apache.derbyTesting.junit.SupportFilesSetup;
import org.apache.derbyTesting.junit.TestConfiguration;

/**
 * Test that files encoded in EUC-JP and SJIS can be imported from and
 * exported to.
 */
public class JapanCodeConversionTest extends BaseJDBCTestCase {
    public JapanCodeConversionTest(String name) {
        super(name);
    }

    public static Test suite() {
        // This test requires support for specific encodings which are
        // not guaranteed to be supported by all JVMs. Run the test only
        // if the encodings are supported.
        if (Charset.isSupported("EUC_JP") && Charset.isSupported("SJIS")) {
            return new SupportFilesSetup(
                TestConfiguration.embeddedSuite(JapanCodeConversionTest.class),
                new String[] { "functionTests/tests/i18n/data/jap_EUC_JP.dat" },
                (String[]) null);
        }

        return new BaseTestSuite(
            "JapanCodeConversionTest - skipped because of " +
            "missing support for EUC_JP and SJIS");
    }

    protected void tearDown() throws Exception {
        dropTable("T1_EUC_JP");
        dropTable("T1_EUC_JP_IMPORT_AS_EUC_JP");
        dropTable("T1_EUC_JP_IMPORT_AS_SJIS");
        super.tearDown();
    }

    /**
     * The expected test data. Should match the rows in the jap_EUC_JP.dat
     * file, from which we import data into the test tables.
     */
    private static final String[][] TABLE = {
        {"1", "15:32:06", "\u30a4\u30d9\u30f3\u30c8\u30a2\u30e9\u30fc\u30e0\u304c\u6709\u52b9\u3067\u3059\u3002"},
        {"2", "15:32:10", "DR:DRAUTO\u306f0 (Off)\u3067\u3059\u3002"},
        {"3", "15:32:28", "INFORMIX-OnLine\u304c\u521d\u671f\u5316\u3055\u308c\u3001\u30c7\u30a3\u30b9\u30af\u306e\u521d\u671f\u5316\u304c\u5b8c\u4e86\u3057\u307e\u3057\u305f\u3002"},
        {"4", "15:32:29", "\u30c1\u30a7\u30c3\u30af\u30dd\u30a4\u30f3\u30c8\u304c\u5b8c\u4e86\u3057\u307e\u3057\u305f:\u7d99\u7d9a\u6642\u9593\u306f 0\u79d2\u3067\u3057\u305f"},
        {"5", "15:32:29", "\u3059\u3079\u3066\u306eDB\u9818\u57df\u306e\u30c7\u30fc\u30bf\u30b9\u30ad\u30c3\u30d7\u306f\u73fe\u5728\u30aa\u30d5\u306b\u306a\u3063\u3066\u3044\u307e\u3059\u3002"},
        {"6", "15:32:30", "On-Line\u30e2\u30fc\u30c9"},
        {"7", "15:32:31", "sysmaster\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u4f5c\u6210\u4e2d\u3067\u3059..."},
        {"8", "15:33:22", "\u8ad6\u7406\u30ed\u30b0 1\u304c\u5b8c\u4e86\u3057\u307e\u3057\u305f\u3002"},
        {"9", "15:33:23", "\u30ea\u30bf\u30fc\u30f3\u30b3\u30fc\u30c9 1\u3092\u623b\u3057\u3066\u30d7\u30ed\u30bb\u30b9\u304c\u7d42\u4e86\u3057\u307e\u3057\u305f:/bin/sh /bin/sh -c /work1/MOSES_7.22.UC1A5_27/sqldist/etc/log_full.sh 2 23 \u8ad6\u7406\u30ed\u30b0 1\u304c\u5b8c\u4e86\u3057\u307e\u3057\u305f\u3002 \u8ad6\u7406"},
        {"10", "15:33:40", "\u8ad6\u7406\u30ed\u30b0 2\u304c\u5b8c\u4e86\u3057\u307e\u3057\u305f\u3002"},
        {"11", "15:33:41", "\u30ea\u30bf\u30fc\u30f3\u30b3\u30fc\u30c9 1\u3092\u623b\u3057\u3066\u30d7\u30ed\u30bb\u30b9\u304c\u7d42\u4e86\u3057\u307e\u3057\u305f:/bin/sh /bin/sh -c /work1/MOSES_7.22.UC1A5_27/sqldist/etc/log_full.sh 2 23 \u8ad6\u7406\u30ed\u30b0 2\u304c\u5b8c\u4e86\u3057\u307e\u3057\u305f\u3002 \u8ad6\u7406"},
        {"12", "15:33:43", "\u30c1\u30a7\u30c3\u30af\u30dd\u30a4\u30f3\u30c8\u304c\u5b8c\u4e86\u3057\u307e\u3057\u305f:\u7d99\u7d9a\u6642\u9593\u306f 2\u79d2\u3067\u3057\u305f"},
        {"13", "15:34:29", "\u8ad6\u7406\u30ed\u30b0 3\u304c\u5b8c\u4e86\u3057\u307e\u3057\u305f\u3002"},
        {"14", "15:34:30", "\u30ea\u30bf\u30fc\u30f3\u30b3\u30fc\u30c9 1\u3092\u623b\u3057\u3066\u30d7\u30ed\u30bb\u30b9\u304c\u7d42\u4e86\u3057\u307e\u3057\u305f:/bin/sh /bin/sh -c /work1/MOSES_7.22.UC1A5_27/sqldist/etc/log_full.sh 2 23 \u8ad6\u7406\u30ed\u30b0 3\u304c\u5b8c\u4e86\u3057\u307e\u3057\u305f\u3002 \u8ad6\u7406"},
        {"15", "15:35:35", "sysmaster\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u4f5c\u6210\u306f\u5b8c\u4e86\u3057\u307e\u3057\u305f\u3002"},
        {"16", "15:39:10", "\u30c1\u30a7\u30c3\u30af\u30dd\u30a4\u30f3\u30c8\u304c\u5b8c\u4e86\u3057\u307e\u3057\u305f:\u7d99\u7d9a\u6642\u9593\u306f 8\u79d2\u3067\u3057\u305f"},
    };

    /**
     * Import data from the EUC-JP-encoded file jap_EUC_JP.dat, and verify
     * that the data is as expected. Then export the data to files encoded
     * in EUC-JP and SJIS, and verify that these files can be imported from.
     */
    public void testImportExport() throws SQLException {
        CallableStatement imp = prepareCall(
            "call SYSCS_UTIL.SYSCS_IMPORT_TABLE(null, ?, ?, null, null, ?, 0)");

        CallableStatement exp = prepareCall(
            "call SYSCS_UTIL.SYSCS_EXPORT_TABLE(null, ?, ?, null, null, ?)");

        Statement s = createStatement();

        // table for data in EUC_JP encoding
        s.execute("create table T1_EUC_JP"
                + "(jnum int, jtime time, jstring char(200))");

        // import data in EUC_JP encoding
        imp.setString(1, "T1_EUC_JP");
        imp.setString(2, "extin/jap_EUC_JP.dat");
        imp.setString(3, "EUC_JP");
        assertUpdateCount(imp, 0);

        // verify imported data
        JDBC.assertFullResultSet(
            s.executeQuery("SELECT * FROM T1_EUC_JP ORDER BY jnum"),
            TABLE);

        // export to file with EUC_JP encoding
        exp.setString(1, "T1_EUC_JP");
        exp.setString(2, "extout/jap_EUC_JP.dump");
        exp.setString(3, "EUC_JP");
        assertUpdateCount(exp, 0);

        // export to file with SJIS encoding
        exp.setString(1, "T1_EUC_JP");
        exp.setString(2, "extout/jap_SJIS.dump");
        exp.setString(3, "SJIS");
        assertUpdateCount(exp, 0);

        // import as EUC_JP and compare to original
        s.execute("create table T1_EUC_JP_IMPORT_AS_EUC_JP"
                + "(jnum int, jtime time, jstring char(200))");
        imp.setString(1, "T1_EUC_JP_IMPORT_AS_EUC_JP");
        imp.setString(2, "extout/jap_EUC_JP.dump");
        imp.setString(3, "EUC_JP");
        assertUpdateCount(imp, 0);

        // verify imported data
        JDBC.assertFullResultSet(
            s.executeQuery(
                "SELECT * FROM T1_EUC_JP_IMPORT_AS_EUC_JP ORDER BY jnum"),
            TABLE);

        // import as SJIS and compare to original
        s.execute("create table T1_EUC_JP_IMPORT_AS_SJIS"
                + "(jnum int, jtime time, jstring char(200))");
        imp.setString(1, "T1_EUC_JP_IMPORT_AS_SJIS");
        imp.setString(2, "extout/jap_SJIS.dump");
        imp.setString(3, "SJIS");
        assertUpdateCount(imp, 0);

        // verify imported data
        JDBC.assertFullResultSet(
            s.executeQuery(
                "SELECT * FROM T1_EUC_JP_IMPORT_AS_SJIS ORDER BY jnum"),
            TABLE);
    }
}
