| package org.unicode.cldr.unittest; |
| |
| import java.util.LinkedHashMap; |
| import java.util.LinkedHashSet; |
| import java.util.Set; |
| import java.util.regex.Matcher; |
| import java.util.regex.Pattern; |
| |
| import org.unicode.cldr.util.CLDRFile; |
| import org.unicode.cldr.util.CLDRPaths; |
| import org.unicode.cldr.util.ChainedMap; |
| import org.unicode.cldr.util.ChainedMap.M3; |
| import org.unicode.cldr.util.Factory; |
| import org.unicode.cldr.util.PatternCache; |
| |
| import com.ibm.icu.dev.test.TestFmwk; |
| import com.ibm.icu.text.RuleBasedCollator; |
| |
| public class TestCollators extends TestFmwk { |
| public static void main(String[] args) { |
| new TestCollators().run(args); |
| } |
| |
| public void TestBuildable() { |
| for (String locale : CollatorSource.getAvailableLocales()) { |
| logln(locale); |
| for (String type : CollatorSource.getAvailableTypes(locale)) { |
| logln("\t" + type); |
| try { |
| RuleBasedCollator collator = CollatorSource.build(locale, type); |
| collator.compare("a", "b"); |
| } catch (Exception e) { |
| errln(e.toString()); |
| } |
| } |
| } |
| } |
| |
| static class CollatorSource { |
| static Factory cldrFactory = Factory.make(CLDRPaths.COMMON_DIRECTORY + "collation/", ".*"); |
| |
| static M3<String, String, String> localeToTypeToPath = ChainedMap.of( |
| new LinkedHashMap<String, Object>(), |
| new LinkedHashMap<String, Object>(), |
| String.class); |
| |
| static RuleBasedCollator build(String locale, String type) { |
| CLDRFile cldrFile = cldrFactory.make(locale, false); // don't need resolved |
| String path = localeToTypeToPath.get(locale, type); |
| String rules = cldrFile.getStringValue(path); |
| try { |
| return new RuleBasedCollator(rules); |
| } catch (Exception e) { |
| throw new IllegalArgumentException(locale + ", " + type + ", " + e); |
| } |
| } |
| |
| static Set<String> getAvailableLocales() { |
| return cldrFactory.getAvailable(); |
| } |
| |
| static final Pattern TYPE = PatternCache.get("//ldml/collations/collation\\[@type=\"([^\"]+)\"\\].*/cr"); |
| |
| static public Set<String> getAvailableTypes(String locale) { |
| CLDRFile cldrFile = cldrFactory.make(locale, false); // don't need resolved |
| Set<String> results = new LinkedHashSet<>(); |
| Matcher m = TYPE.matcher(""); |
| for (String path : cldrFile) { |
| if (m.reset(path).matches()) { |
| String type = m.group(1); |
| boolean newOne = results.add(type); |
| if (newOne) { |
| localeToTypeToPath.put(locale, type, path); // hack to get around the fact that some attributes should be nondistinguishing |
| } |
| } |
| } |
| return results; |
| } |
| } |
| } |