/* * Copyright (c) 2016, 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 8159420 * @summary Checks the proper execution of LanguageRange.parse() and * other LocaleMatcher methods when used in the locales like * Turkish, because the toLowerCase() method is invoked in the * parse() and other LocaleMatcher methods. * e.g. "HI-Deva".toLowerCase() in the Turkish locale returns * "hı-deva", where 'ı' is the LATIN SMALL LETTER DOTLESS I character * which is not allowed in the language ranges/tags. * @compile -encoding utf-8 TurkishLangRangeTest.java * @run junit/othervm -Duser.language=tr -Duser.country=TR TurkishLangRangeTest */ import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.Locale.LanguageRange; import java.util.Locale.FilteringMode; import java.util.LinkedHashMap; import java.util.stream.Stream; import static java.util.Locale.FilteringMode.EXTENDED_FILTERING; import static java.util.Locale.FilteringMode.AUTOSELECT_FILTERING; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertThrows; public class TurkishLangRangeTest { /* * Ensure parse() does not throw IllegalArgumentException for the Turkish Locale * with the given input. */ @Test public void parseTest() { String ranges = "HI-Deva, ja-hIrA-JP, RKI"; assertDoesNotThrow(() -> LanguageRange.parse(ranges)); } /* * Ensure filter() does not return empty list for the Turkish Locale * with the given input. */ @ParameterizedTest @MethodSource("modes") public void filterTest(FilteringMode mode) { String ranges = "hi-IN, itc-Ital"; String tags = "hi-IN, itc-Ital"; List priorityList = LanguageRange.parse(ranges); List tagList = generateLocales(tags); String actualLocales = showLocales(Locale.filter(priorityList, tagList, mode)); String expectedLocales = "hi-IN, itc-Ital"; assertEquals(expectedLocales, actualLocales); } private static Stream modes() { return Stream.of( EXTENDED_FILTERING, AUTOSELECT_FILTERING ); } /* * Ensure lookup() does not return null for the Turkish Locale with * the given input. */ @Test public void lookupTest() { String ranges = "hi-IN, itc-Ital"; String tags = "hi-IN, itc-Ital"; List priorityList = LanguageRange.parse(ranges); List localeList = generateLocales(tags); Locale actualLocale = Locale.lookup(priorityList, localeList); assertNotNull(actualLocale); String actualLocaleString = actualLocale.toLanguageTag(); String expectedLocale = "hi-IN"; assertEquals(expectedLocale, actualLocaleString); } /* * Ensure mapEquivalents() does not only return "hi-in" for the Turkish * Locale with the given input. */ @Test public void mapEquivalentsTest() { String ranges = "HI-IN"; List priorityList = LanguageRange.parse(ranges); HashMap> map = new LinkedHashMap<>(); List equivalentList = new ArrayList<>(); equivalentList.add("HI"); equivalentList.add("HI-Deva"); map.put("HI", equivalentList); List expected = new ArrayList<>(); expected.add(new LanguageRange("hi-in")); expected.add(new LanguageRange("hi-deva-in")); List got = LanguageRange.mapEquivalents(priorityList, map); assertEquals(expected, got, getDifferences(expected, got)); } private static String getDifferences(List expected, List got) { StringBuilder diffs = new StringBuilder(); List cloneExpected = new ArrayList<>(expected); cloneExpected.removeAll(got); if (!cloneExpected.isEmpty()) { diffs.append("Found missing range(s): ") .append(cloneExpected) .append(System.lineSeparator()); } List cloneGot = new ArrayList<>(got); cloneGot.removeAll(expected); if (!got.isEmpty()) { diffs.append("Got extra range(s): ") .append(cloneGot) .append(System.lineSeparator()); } return diffs.toString(); } private static List generateLocales(String tags) { if (tags == null) { return null; } List localeList = new ArrayList<>(); if (tags.equals("")) { return localeList; } String[] t = tags.split(", "); for (String tag : t) { localeList.add(Locale.forLanguageTag(tag)); } return localeList; } private static String showLocales(List locales) { StringBuilder sb = new StringBuilder(); Iterator itr = locales.iterator(); if (itr.hasNext()) { sb.append(itr.next().toLanguageTag()); } while (itr.hasNext()) { sb.append(", "); sb.append(itr.next().toLanguageTag()); } return sb.toString().trim(); } }