/* * Copyright (c) 2007, 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 4122700 8282319 * @summary Verify implementation of getAvailableLocales() and availableLocales() * @run junit AvailableLocalesTest */ import java.util.Arrays; import java.util.Locale; import java.util.stream.Stream; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; import org.junit.jupiter.params.provider.Arguments; import static org.junit.jupiter.api.Assertions.assertNotEquals; public class AvailableLocalesTest { /** * Test that Locale.getAvailableLocales() is non-empty and prints out * the returned locales - 4122700. */ @Test public void nonEmptyLocalesTest() { Locale[] systemLocales = Locale.getAvailableLocales(); assertNotEquals(systemLocales.length, 0, "Available locale list is empty!"); System.out.println("Found " + systemLocales.length + " locales:"); printLocales(systemLocales); } /** * Test to validate that the methods: Locale.getAvailableLocales() * and Locale.availableLocales() contain the same underlying elements */ @Test public void streamEqualsArrayTest() { Locale[] arrayLocales = Locale.getAvailableLocales(); Stream streamedLocales = Locale.availableLocales(); Locale[] convertedLocales = streamedLocales.toArray(Locale[]::new); if (Arrays.equals(arrayLocales, convertedLocales)) { System.out.println("$$$ Passed: The underlying elements" + " of getAvailableLocales() and availableLocales() are the same!"); } else { throw new RuntimeException("$$$ Error: The underlying elements" + " of getAvailableLocales() and availableLocales()" + " are not the same."); } } /** * Test to validate that the stream has the required * Locale.ROOT and Locale.US. */ @ParameterizedTest @MethodSource("requiredLocaleProvider") public void requiredLocalesTest(Locale requiredLocale, String localeName) { if (Locale.availableLocales().anyMatch(loc -> (loc.equals(requiredLocale)))) { System.out.printf("$$$ Passed: Stream has %s!%n", localeName); } else { throw new RuntimeException(String.format("$$$ Error:" + " Stream is missing %s!", localeName)); } } // Helper method to print out all the system locales private void printLocales(Locale[] systemLocales) { Locale[] locales = new Locale[systemLocales.length]; for (int i = 0; i < locales.length; i++) { Locale lowest = null; for (Locale systemLocale : systemLocales) { if (i > 0 && locales[i - 1].toString().compareTo(systemLocale.toString()) >= 0) continue; if (lowest == null || systemLocale.toString().compareTo(lowest.toString()) < 0) lowest = systemLocale; } locales[i] = lowest; } for (Locale locale : locales) { if (locale.getCountry().length() == 0) System.out.println(" " + locale.getDisplayLanguage() + ":"); else { if (locale.getVariant().length() == 0) System.out.println(" " + locale.getDisplayCountry()); else System.out.println(" " + locale.getDisplayCountry() + ", " + locale.getDisplayVariant()); } } } // Data provider for testStreamRequirements private static Stream requiredLocaleProvider() { return Stream.of( Arguments.of(Locale.ROOT, "Root locale"), Arguments.of(Locale.US, "US locale") ); } }