package org.unicode.cldr.unittest;

import java.util.Arrays;
import java.util.BitSet;
import java.util.Set;

import org.unicode.cldr.draft.IdentifierInfo;
import org.unicode.cldr.draft.IdentifierInfo.IdentifierStatus;

import com.ibm.icu.dev.test.TestFmwk;
import com.ibm.icu.text.UnicodeSet;

public class TestIdentifierInfo extends TestFmwk {

    public static void main(String[] args) {
        new TestIdentifierInfo().run(args);
    }

    public void TestMain() {
        String[][] testCases = {
            // Format is testString, expected scripts, expected alternates, expected numerics (if any)
            { "ab c", "ASCII", "Latn Common" },
            { "a12", "ASCII", "Common Latn", "", "[0]" },
            { "ー", "HIGHLY_RESTRICTIVE", "", "Kana Hira" },
            { "カー", "HIGHLY_RESTRICTIVE", "Kana" },
            { "ーカ", "HIGHLY_RESTRICTIVE", "Kana" },
            { "かー", "HIGHLY_RESTRICTIVE", "Hira" },
            { "ーか", "HIGHLY_RESTRICTIVE", "Hira" },
            { "かーカa", "HIGHLY_RESTRICTIVE", "Kana Hira Latn" },
            { "a、 〃", "HIGHLY_RESTRICTIVE", "Zyyy Latn", "Bopo Hani Hang Hira Kana" },
            { "a、 〃カ一", "HIGHLY_RESTRICTIVE", "Zyyy Latn Kana Hani" },
            { "a가一", "HIGHLY_RESTRICTIVE", "Hani Hang Latn" },
            { "aㄅ一", "HIGHLY_RESTRICTIVE", "Bopo Hani Latn" },
            { "٢", "HIGHLY_RESTRICTIVE", "", "Arab Thaa", "[٠]" },
            { "٢\u0670", "HIGHLY_RESTRICTIVE", "", "Arab Thaa; Arab Syrc", "[٠]" },
            { "٢\u0670ـ", "HIGHLY_RESTRICTIVE", "", "Arab Thaa; Arab Syrc", "[٠]" },
            { "٢\u0670ـ،", "HIGHLY_RESTRICTIVE", "", "Arab Thaa; Arab Syrc", "[٠]" },
            { "AᎪ", "MINIMALLY_RESTRICTIVE", "Cher Latn" },
            { "aА가一", "MINIMALLY_RESTRICTIVE", "Cyrl Hani Hang Latn" },
            { "AᎪА♥", "MINIMALLY_RESTRICTIVE", "Zyyy Cher Cyrl Latn" },
            { "a1२", "UNRESTRICTIVE", "Zyyy Latn Deva", "", "[0०]" },
            { "a1٢", "UNRESTRICTIVE", "Zyyy Latn", "Arab Thaa", "[0٠]" },
        };
        IdentifierInfo actualInfo = new IdentifierInfo();

        int item = 0;
        for (String[] testCase : testCases) {
            ++item;
            final String identifier = testCase[0];
            final String actualStatusString = testCase[1];
            final String scriptsString = testCase[2];
            final String multiscriptsString = testCase.length < 4 ? "" : testCase[3];
            final String numericString = testCase.length < 5 ? "[]" : testCase[4];

            actualInfo.setIdentifier(identifier);
            IdentifierStatus actualStatus = actualInfo.getRestrictionLevel();
            IdentifierStatus expectedStatus = IdentifierStatus.valueOf(actualStatusString);

            BitSet expectedScripts = IdentifierInfo.parseScripts(scriptsString);
            Set<BitSet> expectedMultiscripts = IdentifierInfo.parseAlternates(multiscriptsString);
            UnicodeSet expectedNumerics = new UnicodeSet(numericString);

            if (!actualInfo.getScripts().equals(expectedScripts)
                || !actualStatus.equals(expectedStatus)
                || !actualInfo.getAlternates().equals(expectedMultiscripts)
                || !actualInfo.getNumerics().equals(expectedNumerics)) {
                errln("(" + item + ") " + Arrays.asList(testCase) + " !=\t" + actualInfo);
            }
        }
    }

}
