/* * Copyright (c) 2011, 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 4884238 8310047 * @summary Test standard charset name constants and class qualities. * @author Mike Duigou * @run junit Standard */ import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.List; import java.util.stream.Stream; 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.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; public class Standard { // These are the charsets StandardCharsets.java is expected to contain. private static final String[] expectedCharsets = { "US-ASCII", "ISO-8859-1", "UTF-8", "UTF-16BE", "UTF-16LE", "UTF-16", "UTF-32BE", "UTF-32LE", "UTF-32" }; private static final Field[] standardCharsetFields = StandardCharsets.class.getFields(); /** * Validates that the Charset constants from the data provider * are of type Charset. */ @ParameterizedTest @MethodSource("charsetProvider") public void typeTest(Charset charset) { // Doubly checked, as it is validated when passed as a param assertTrue(charset instanceof Charset); } /** * Validates that calling .name() on a Charset constant is equal * to the matching String value from the data provider. */ @ParameterizedTest @MethodSource("charsetProvider") public void nameMethodTest(Charset charset, String charString) { assertEquals(charset.name(), charString); } /** * Validates that calling Charset.forName() on a String is equal * to the matching Charset constant from the data provider. */ @ParameterizedTest @MethodSource("charsetProvider") public void forNameMethodTest(Charset charset, String charString) { assertEquals(Charset.forName(charString), charset); } /** * Validates the qualities of a StandardCharsets field are as expected: * The field is final, static, public, and one can access * the underlying value of the field. */ @ParameterizedTest @MethodSource("charsetFields") public void charsetModifiersTest(Field charsetField) throws IllegalAccessException { // Check modifiers assertEquals(StandardCharsets.class, charsetField.getDeclaringClass()); assertTrue(Modifier.isFinal(charsetField.getModifiers())); assertTrue(Modifier.isStatic(charsetField.getModifiers())); assertTrue(Modifier.isPublic(charsetField.getModifiers())); // Check that the value can be accessed, and it is a Charset Object valueOfField = charsetField.get(null); assertTrue(valueOfField instanceof Charset); } /** * Validates that the Charsets contained in StandardCharsets are equal * to the expected Charsets list defined in the test. This test should fail if * either the actual or expected (standard) Charsets are modified, and * the others are not. */ @Test public void correctCharsetsTest() { // Grab the value from each Standard Charset field List actualCharsets = charsetFields().map(field -> { try { return ((Charset) field.get(null)).name(); } catch (IllegalAccessException e) { throw new RuntimeException("Can not test correctCharsetsTest() due to %s", e); } }).toList(); assertEquals(actualCharsets, Arrays.asList(expectedCharsets)); } /** * Provides the constant Charset and associated String value of * the standard charsets. */ private static Stream charsetProvider() { return Stream.of( Arguments.of(StandardCharsets.US_ASCII, "US-ASCII"), Arguments.of(StandardCharsets.ISO_8859_1, "ISO-8859-1"), Arguments.of(StandardCharsets.UTF_8, "UTF-8"), Arguments.of(StandardCharsets.UTF_16BE, "UTF-16BE"), Arguments.of(StandardCharsets.UTF_16LE, "UTF-16LE"), Arguments.of(StandardCharsets.UTF_16, "UTF-16"), Arguments.of(StandardCharsets.UTF_32BE, "UTF-32BE"), Arguments.of(StandardCharsets.UTF_32LE, "UTF-32LE"), Arguments.of(StandardCharsets.UTF_32, "UTF-32") ); } private static Stream charsetFields() { return Arrays.stream(standardCharsetFields); } }