/*
 * Copyright (c) 2003, 2023, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */

/*
 * @test
 * @bug 4932968 5015215
 * @library /java/text/testlib
 * @summary test Vietnamese Collation
 * @modules jdk.localedata
 * @run junit VietnameseTest
 */

/*
 *******************************************************************************
 * (C) Copyright IBM Corp. 1996-2003 - All Rights Reserved                     *
 *                                                                             *
 * The original version of this source code and documentation is copyrighted   *
 * and owned by IBM, These materials are provided under terms of a License     *
 * Agreement between IBM and Sun. This technology is protected by multiple     *
 * US and International patents. This notice and attribution to IBM may not    *
 * to removed.                                                                 *
 *******************************************************************************
 */

import java.util.Locale;
import java.text.Collator;

import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.fail;

// Quick dummy program for printing out test results
public class VietnameseTest {

    private final static String testPS[] = {
        "a",
        "a",
        "\u00c2",
        "Cz",
        "d",
        "e",
        "e",
        "\u1ec7",
        "gz",
        "i",
        "kz",
        "nz",
        "nh",
        "o",
        "o",
        "\u01a0",
        "pz",
        "tz",
        "tr",
        "u",
        "u",
        "y"
    };

    private final static String testPT[] = {
        "\u00e0",
        "\u0102",
        "\u0102",
        "Ch",
        "\u0110",
        "\u0111",
        "\u1eb9",
        "\u1eb9",
        "gi",
        "\u0128",
        "kh",
        "ng",
        "ng",
        "\u00f2",
        "\u00f4",
        "\u00f4",
        "ph",
        "th",
        "th",
        "\u1ee5",
        "\u01b0",
        "\u1ef4"
    };

    private final static int testPR[] = {
        0,
        -1,
        1,
        1,
        -1,
        1,
        0,
        1,
        1,
        0,
        1,
        1,
        1,
        0,
        -1,
        1,
        1,
        1,
        1,
        0,
        -1,
        0
    };

    private final static String testT[] = {
        "a",
        "A",
        "\u00e0",
        "\u00c0",
        "\u1ea3",
        "\u1ea2",
        "\u00e3",
        "\u00c3",
        "\u00e1",
        "\u00c1",
        "\u1ea1",
        "\u1ea0",
        "\u0103",
        "\u0102",
        "\u1eb1",
        "\u1eb0",
        "\u1eb3",
        "\u1eb2",
        "\u1eb5",
        "\u1eb4",
        "\u1eaf",
        "\u1eae",
        "\u1eb7",
        "\u1eb6",
        "\u00e2",
        "\u00c2",
        "\u1ea7",
        "\u1ea6",
        "\u1ea9",
        "\u1ea8",
        "\u1eab",
        "\u1eaa",
        "\u1ea5",
        "\u1ea4",
        "\u1ead",
        "\u1eac",
        "b",
        "B",
        "c",
        "C",
        "ch",
        "Ch",
        "CH",
        "d",
        "D",
        "\u0111",
        "\u0110",
        "e",
        "E",
        "\u00e8",
        "\u00c8",
        "\u1ebb",
        "\u1eba",
        "\u1ebd",
        "\u1ebc",
        "\u00e9",
        "\u00c9",
        "\u1eb9",
        "\u1eb8",
        "\u00ea",
        "\u00ca",
        "\u1ec1",
        "\u1ec0",
        "\u1ec3",
        "\u1ec2",
        "\u1ec5",
        "\u1ec4",
        "\u1ebf",
        "\u1ebe",
        "\u1ec7",
        "\u1ec6",
        "f",
        "F",
        "g",
        "G",
        "gi",
        "Gi",
        "GI",
        "gz",
        "h",
        "H",
        "i",
        "I",
        "\u00ec",
        "\u00cc",
        "\u1ec9",
        "\u1ec8",
        "\u0129",
        "\u0128",
        "\u00ed",
        "\u00cd",
        "\u1ecb",
        "\u1eca",
        "j",
        "J",
        "k",
        "K",
        "kh",
        "Kh",
        "KH",
        "kz",
        "l",
        "L",
        "m",
        "M",
        "n",
        "N",
        "ng",
        "Ng",
        "NG",
        "ngz",
        "nh",
        "Nh",
        "NH",
        "nz",
        "o",
        "O",
        "\u00f2",
        "\u00d2",
        "\u1ecf",
        "\u1ece",
        "\u00f5",
        "\u00d5",
        "\u00f3",
        "\u00d3",
        "\u1ecd",
        "\u1ecc",
        "\u00f4",
        "\u00d4",
        "\u1ed3",
        "\u1ed2",
        "\u1ed5",
        "\u1ed4",
        "\u1ed7",
        "\u1ed6",
        "\u1ed1",
        "\u1ed0",
        "\u1ed9",
        "\u1ed8",
        "\u01a1",
        "\u01a0",
        "\u1edd",
        "\u1edc",
        "\u1edf",
        "\u1ede",
        "\u1ee1",
        "\u1ee0",
        "\u1edb",
        "\u1eda",
        "\u1ee3",
        "\u1ee2",
        "p",
        "P",
        "ph",
        "Ph",
        "PH",
        "pz",
        "q",
        "Q",
        "r",
        "R",
        "s",
        "S",
        "t",
        "T",
        "th",
        "Th",
        "TH",
        "thz",
        "tr",
        "Tr",
        "TR",
        "tz",
        "u",
        "U",
        "\u00f9",
        "\u00d9",
        "\u1ee7",
        "\u1ee6",
        "\u0169",
        "\u0168",
        "\u00fa",
        "\u00da",
        "\u1ee5",
        "\u1ee4",
        "\u01b0",
        "\u01af",
        "\u1eeb",
        "\u1eea",
        "\u1eed",
        "\u1eec",
        "\u1eef",
        "\u1eee",
        "\u1ee9",
        "\u1ee8",
        "\u1ef1",
        "\u1ef0",
        "v",
        "V",
        "w",
        "W",
        "x",
        "X",
        "y",
        "Y",
        "\u1ef3",
        "\u1ef2",
        "\u1ef7",
        "\u1ef6",
        "\u1ef9",
        "\u1ef8",
        "\u00fd",
        "\u00dd",
        "\u1ef5",
        "\u1ef4",
        "z",
        "Z"
    };

    @Test
    public void TestPrimary() {
        TestUtils.doCollatorTest(myCollation, Collator.PRIMARY, testPS, testPT, testPR);
    }

    @Test
    public void TestTertiary() {
        int testLength = testT.length;

        myCollation.setStrength(Collator.TERTIARY);
        for (int i = 0; i < testLength - 1; i++) {
            for (int j = i+1; j < testLength; j++) {
                TestUtils.doCollatorTest(myCollation, testT[i], testT[j], -1);
            }
        }
    }

    private final Collator myCollation = Collator.getInstance(Locale.of("vi", "VN"));
}
