--- /dev/null 2016-05-17 12:01:17.473251102 +0900 +++ new/test/java/text/Format/NumberFormat/CurrencyFormat.java 2016-05-23 13:57:56.607668947 +0900 @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2001, 2016, 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 4290801 4942982 5102005 8008577 8021121 + * @summary Basic tests for currency formatting. + * @run main/othervm -Djava.locale.providers=JRE,SPI CurrencyFormat + */ + +import java.io.File; +import java.io.FileInputStream; +import java.util.Currency; +import java.util.Locale; +import java.util.Properties; +import java.util.StringTokenizer; +import java.util.TimeZone; +import java.text.DecimalFormatSymbols; +import java.text.NumberFormat; +import java.text.SimpleDateFormat; + +public class CurrencyFormat { + + public static void main(String[] args) throws Exception { + testFormatting(); + testSymbols(); + } + + static void testFormatting() { + boolean failed = false; + Locale[] locales = { + Locale.US, + Locale.JAPAN, + Locale.GERMANY, + Locale.ITALY, + new Locale("it", "IT", "EURO") }; + Currency[] currencies = { + null, + Currency.getInstance("USD"), + Currency.getInstance("JPY"), + Currency.getInstance("DEM"), + Currency.getInstance("EUR"), + }; + String[][] expecteds = { + {"$1,234.56", "$1,234.56", "JPY1,235", "DEM1,234.56", "EUR1,234.56"}, + {"\uFFE51,235", "USD1,234.56", "\uFFE51,235", "DEM1,234.56", "EUR1,234.56"}, + {"1.234,56 \u20AC", "1.234,56 USD", "1.235 JPY", "1.234,56 DM", "1.234,56 \u20AC"}, + {"\u20AC 1.234,56", "USD 1.234,56", "JPY 1.235", "DEM 1.234,56", "\u20AC 1.234,56"}, + {"\u20AC 1.234,56", "USD 1.234,56", "JPY 1.235", "DEM 1.234,56", "\u20AC 1.234,56"}, + }; + + for (int i = 0; i < locales.length; i++) { + Locale locale = locales[i]; + NumberFormat format = NumberFormat.getCurrencyInstance(locale); + for (int j = 0; j < currencies.length; j++) { + Currency currency = currencies[j]; + String expected = expecteds[i][j]; + if (currency != null) { + format.setCurrency(currency); + int digits = currency.getDefaultFractionDigits(); + format.setMinimumFractionDigits(digits); + format.setMaximumFractionDigits(digits); + } + String result = format.format(1234.56); + if (!result.equals(expected)) { + failed = true; + System.out.println("FAIL: Locale " + locale + + (currency == null ? ", default currency" : (", currency: " + currency)) + + ", expected: " + expected + + ", actual: " + result); + } + } + } + + if (failed) { + throw new RuntimeException(); + } + } + + static void testSymbols() throws Exception { + FileInputStream stream = new FileInputStream(new File(System.getProperty("test.src", "."), "CurrencySymbols.properties")); + Properties props = new Properties(); + props.load(stream); + SimpleDateFormat format = null; + + Locale[] locales = NumberFormat.getAvailableLocales(); + for (int i = 0; i < locales.length; i++) { + Locale locale = locales[i]; + DecimalFormatSymbols symbols = DecimalFormatSymbols.getInstance(locale); + String result = symbols.getCurrencySymbol(); + String expected = (String) props.get(locale.toString()); + + if (expected == null) { + System.out.println("Warning: No expected currency symbol defined for locale " + locale); + } else { + if (expected.contains(";")) { + StringTokenizer tokens = new StringTokenizer(expected, ";"); + int tokensCount = tokens.countTokens(); + + if (tokensCount == 3) { + expected = tokens.nextToken(); + if (format == null) { + format = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss", Locale.US); + format.setTimeZone(TimeZone.getTimeZone("GMT")); + format.setLenient(false); + } + + if (format.parse(tokens.nextToken()).getTime() < System.currentTimeMillis()) { + expected = tokens.nextToken(); + } + } + } + + if (!expected.equals(result)) { + throw new RuntimeException("Wrong currency symbol for locale " + + locale + ", expected: " + expected + ", got: " + result); + } + } + } + } +}