| // © 2016 and later: Unicode, Inc. and others. |
| // License & terms of use: http://www.unicode.org/copyright.html |
| /***************************************************************************************** |
| * |
| * Copyright (C) 1996-2016, International Business Machines |
| * Corporation and others. All Rights Reserved. |
| **/ |
| |
| /** |
| * Port From: JDK 1.4b1 : java.text.Format.IntlTestDecimalFormatSymbols |
| * Source File: java/text/format/IntlTestDecimalFormatSymbols.java |
| **/ |
| |
| /* |
| @test 1.4 98/03/06 |
| @summary test International Decimal Format Symbols |
| */ |
| |
| |
| package com.ibm.icu.dev.test.format; |
| |
| import java.util.Arrays; |
| import java.util.Locale; |
| |
| import org.junit.Test; |
| import org.junit.runner.RunWith; |
| import org.junit.runners.JUnit4; |
| |
| import com.ibm.icu.dev.test.TestFmwk; |
| import com.ibm.icu.text.DecimalFormat; |
| import com.ibm.icu.text.DecimalFormatSymbols; |
| import com.ibm.icu.text.NumberingSystem; |
| import com.ibm.icu.util.Currency; |
| import com.ibm.icu.util.ULocale; |
| |
| @RunWith(JUnit4.class) |
| public class IntlTestDecimalFormatSymbols extends TestFmwk |
| { |
| // Test the API of DecimalFormatSymbols; primarily a simple get/set set. |
| @Test |
| public void TestSymbols() |
| { |
| DecimalFormatSymbols fr = new DecimalFormatSymbols(Locale.FRENCH); |
| |
| DecimalFormatSymbols en = new DecimalFormatSymbols(Locale.ENGLISH); |
| |
| if(en.equals(fr)) { |
| errln("ERROR: English DecimalFormatSymbols equal to French"); |
| } |
| |
| // just do some VERY basic tests to make sure that get/set work |
| |
| if(!en.getLocale().equals(Locale.ENGLISH)) { |
| errln("ERROR: getLocale failed"); |
| } |
| if(!en.getULocale().equals(ULocale.ENGLISH)) { |
| errln("ERROR: getULocale failed"); |
| } |
| |
| if(!en.getLocale().equals(Locale.ENGLISH)) { |
| errln("ERROR: getLocale failed"); |
| } |
| if(!en.getULocale().equals(ULocale.ENGLISH)) { |
| errln("ERROR: getULocale failed"); |
| } |
| |
| char zero = en.getZeroDigit(); |
| fr.setZeroDigit(zero); |
| if(fr.getZeroDigit() != en.getZeroDigit()) { |
| errln("ERROR: get/set ZeroDigit failed"); |
| } |
| |
| String[] digits = en.getDigitStrings(); |
| fr.setDigitStrings(digits); |
| if (!Arrays.equals(fr.getDigitStrings(), en.getDigitStrings())) { |
| errln("ERROR: get/set DigitStrings failed"); |
| } |
| |
| char sigDigit = en.getSignificantDigit(); |
| fr.setSignificantDigit(sigDigit); |
| if(fr.getSignificantDigit() != en.getSignificantDigit()) { |
| errln("ERROR: get/set SignificantDigit failed"); |
| } |
| |
| Currency currency = Currency.getInstance("USD"); |
| fr.setCurrency(currency); |
| if (!fr.getCurrency().equals(currency)){ |
| errln("ERROR: get/set Currency failed"); |
| } |
| |
| char group = en.getGroupingSeparator(); |
| fr.setGroupingSeparator(group); |
| if(fr.getGroupingSeparator() != en.getGroupingSeparator()) { |
| errln("ERROR: get/set GroupingSeparator failed"); |
| } |
| |
| String groupStr = en.getGroupingSeparatorString(); |
| fr.setGroupingSeparatorString(groupStr); |
| if (!fr.getGroupingSeparatorString().equals(en.getGroupingSeparatorString())) { |
| errln("ERROR: get/set GroupingSeparatorString failed"); |
| } |
| |
| char decimal = en.getDecimalSeparator(); |
| fr.setDecimalSeparator(decimal); |
| if(fr.getDecimalSeparator() != en.getDecimalSeparator()) { |
| errln("ERROR: get/set DecimalSeparator failed"); |
| } |
| |
| String decimalStr = en.getDecimalSeparatorString(); |
| fr.setDecimalSeparatorString(decimalStr); |
| if (!fr.getDecimalSeparatorString().equals(en.getDecimalSeparatorString())) { |
| errln("ERROR: get/set DecimalSeparatorString failed"); |
| } |
| |
| char monetaryGroup = en.getMonetaryGroupingSeparator(); |
| fr.setMonetaryGroupingSeparator(monetaryGroup); |
| if(fr.getMonetaryGroupingSeparator() != en.getMonetaryGroupingSeparator()) { |
| errln("ERROR: get/set MonetaryGroupingSeparator failed"); |
| } |
| |
| String monetaryGroupStr = en.getMonetaryGroupingSeparatorString(); |
| fr.setMonetaryGroupingSeparatorString(monetaryGroupStr); |
| if (!fr.getMonetaryGroupingSeparatorString().equals(en.getMonetaryGroupingSeparatorString())){ |
| errln("ERROR: get/set MonetaryGroupingSeparatorString failed"); |
| } |
| |
| char monetaryDecimal = en.getMonetaryDecimalSeparator(); |
| fr.setMonetaryDecimalSeparator(monetaryDecimal); |
| if(fr.getMonetaryDecimalSeparator() != en.getMonetaryDecimalSeparator()) { |
| errln("ERROR: get/set MonetaryDecimalSeparator failed"); |
| } |
| |
| String monetaryDecimalStr = en.getMonetaryDecimalSeparatorString(); |
| fr.setMonetaryDecimalSeparatorString(monetaryDecimalStr); |
| if (!fr.getMonetaryDecimalSeparatorString().equals(en.getMonetaryDecimalSeparatorString())) { |
| errln("ERROR: get/set MonetaryDecimalSeparatorString failed"); |
| } |
| |
| char perMill = en.getPerMill(); |
| fr.setPerMill(perMill); |
| if(fr.getPerMill() != en.getPerMill()) { |
| errln("ERROR: get/set PerMill failed"); |
| } |
| |
| String perMillStr = en.getPerMillString(); |
| fr.setPerMillString(perMillStr); |
| if (!fr.getPerMillString().equals(en.getPerMillString())) { |
| errln("ERROR: get/set PerMillString failed"); |
| } |
| |
| char percent = en.getPercent(); |
| fr.setPercent(percent); |
| if(fr.getPercent() != en.getPercent()) { |
| errln("ERROR: get/set Percent failed"); |
| } |
| |
| String percentStr = en.getPercentString(); |
| fr.setPercentString(percentStr); |
| if (!fr.getPercentString().equals(en.getPercentString())) { |
| errln("ERROR: get/set PercentString failed"); |
| } |
| |
| char digit = en.getDigit(); |
| fr.setDigit(digit); |
| if(fr.getDigit() != en.getDigit()) { |
| errln("ERROR: get/set Digit failed"); |
| } |
| |
| char patternSeparator = en.getPatternSeparator(); |
| fr.setPatternSeparator(patternSeparator); |
| if(fr.getPatternSeparator() != en.getPatternSeparator()) { |
| errln("ERROR: get/set PatternSeparator failed"); |
| } |
| |
| String infinity = en.getInfinity(); |
| fr.setInfinity(infinity); |
| String infinity2 = fr.getInfinity(); |
| if(! infinity.equals(infinity2)) { |
| errln("ERROR: get/set Infinity failed"); |
| } |
| |
| String nan = en.getNaN(); |
| fr.setNaN(nan); |
| String nan2 = fr.getNaN(); |
| if(! nan.equals(nan2)) { |
| errln("ERROR: get/set NaN failed"); |
| } |
| |
| char minusSign = en.getMinusSign(); |
| fr.setMinusSign(minusSign); |
| if(fr.getMinusSign() != en.getMinusSign()) { |
| errln("ERROR: get/set MinusSign failed"); |
| } |
| |
| String minusSignStr = en.getMinusSignString(); |
| fr.setMinusSignString(minusSignStr); |
| if (!fr.getMinusSignString().equals(en.getMinusSignString())) { |
| errln("ERROR: get/set MinusSignString failed"); |
| } |
| |
| char plusSign = en.getPlusSign(); |
| fr.setPlusSign(plusSign); |
| if(fr.getPlusSign() != en.getPlusSign()) { |
| errln("ERROR: get/set PlusSign failed"); |
| } |
| |
| String plusSignStr = en.getPlusSignString(); |
| fr.setPlusSignString(plusSignStr); |
| if (!fr.getPlusSignString().equals(en.getPlusSignString())) { |
| errln("ERROR: get/set PlusSignString failed"); |
| } |
| |
| char padEscape = en.getPadEscape(); |
| fr.setPadEscape(padEscape); |
| if(fr.getPadEscape() != en.getPadEscape()) { |
| errln("ERROR: get/set PadEscape failed"); |
| } |
| |
| String exponential = en.getExponentSeparator(); |
| fr.setExponentSeparator(exponential); |
| if(fr.getExponentSeparator() != en.getExponentSeparator()) { |
| errln("ERROR: get/set Exponential failed"); |
| } |
| |
| String exponentMultiplicationSign = en.getExponentMultiplicationSign(); |
| fr.setExponentMultiplicationSign(exponentMultiplicationSign); |
| if(fr.getExponentMultiplicationSign() != en.getExponentMultiplicationSign()) { |
| errln("ERROR: get/set ExponentMultiplicationSign failed"); |
| } |
| |
| // Test CurrencySpacing. |
| // In CLDR 1.7, only root.txt has CurrencySpacing data. This data might |
| // be different between en and fr in the future. |
| for (int i = DecimalFormatSymbols.CURRENCY_SPC_CURRENCY_MATCH; i <= DecimalFormatSymbols.CURRENCY_SPC_INSERT; i++) { |
| if (en.getPatternForCurrencySpacing(i, true) != |
| fr.getPatternForCurrencySpacing(i, true)) { |
| errln("ERROR: get currency spacing item:"+ i+" before the currency"); |
| if (en.getPatternForCurrencySpacing(i, false) != |
| fr.getPatternForCurrencySpacing(i, false)) { |
| errln("ERROR: get currency spacing item:" + i + " after currency"); |
| } |
| } |
| } |
| |
| String dash = "-"; |
| en.setPatternForCurrencySpacing(DecimalFormatSymbols.CURRENCY_SPC_INSERT, true, dash); |
| if (dash != en.getPatternForCurrencySpacing(DecimalFormatSymbols.CURRENCY_SPC_INSERT, true)) { |
| errln("ERROR: set currency spacing pattern for before currency."); |
| } |
| |
| //DecimalFormatSymbols foo = new DecimalFormatSymbols(); //The variable is never used |
| |
| en = (DecimalFormatSymbols) fr.clone(); |
| |
| if(! en.equals(fr)) { |
| errln("ERROR: Clone failed"); |
| } |
| } |
| |
| @Test |
| public void testCoverage() { |
| DecimalFormatSymbols df = new DecimalFormatSymbols(); |
| DecimalFormatSymbols df2 = (DecimalFormatSymbols)df.clone(); |
| if (!df.equals(df2) || df.hashCode() != df2.hashCode()) { |
| errln("decimal format symbols clone, equals, or hashCode failed"); |
| } |
| } |
| |
| @Test |
| public void testPropagateZeroDigit() { |
| DecimalFormatSymbols dfs = new DecimalFormatSymbols(); |
| dfs.setZeroDigit('\u1040'); |
| DecimalFormat df = new DecimalFormat("0"); |
| df.setDecimalFormatSymbols(dfs); |
| assertEquals("Should propagate char with number property zero", |
| '\u1041', dfs.getDigits()[1]); |
| assertEquals("Should propagate char with number property zero", |
| "\u1044\u1040\u1041\u1042\u1043", df.format(40123)); |
| dfs.setZeroDigit('a'); |
| df.setDecimalFormatSymbols(dfs); |
| assertEquals("Should propagate char WITHOUT number property zero", |
| 'b', dfs.getDigits()[1]); |
| assertEquals("Should propagate char WITHOUT number property zero", |
| "eabcd", df.format(40123)); |
| } |
| |
| @Test |
| public void testDigitSymbols() { |
| final char defZero = '0'; |
| final char[] defDigits = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}; |
| final String[] defDigitStrings = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"}; |
| final String[] osmanyaDigitStrings = { |
| "\uD801\uDCA0", "\uD801\uDCA1", "\uD801\uDCA2", "\uD801\uDCA3", "\uD801\uDCA4", |
| "\uD801\uDCA5", "\uD801\uDCA6", "\uD801\uDCA7", "\uD801\uDCA8", "\uD801\uDCA9" |
| }; |
| final String[] differentDigitStrings = {"0", "b", "3", "d", "5", "ff", "7", "h", "9", "j"}; |
| |
| DecimalFormatSymbols symbols = new DecimalFormatSymbols(Locale.ENGLISH); |
| if (defZero != symbols.getCodePointZero()) { |
| errln("ERROR: Code point zero initialize to ASCII 0"); |
| } |
| |
| symbols.setDigitStrings(osmanyaDigitStrings); |
| if (!Arrays.equals(symbols.getDigitStrings(), osmanyaDigitStrings)) { |
| errln("ERROR: Osmanya digits (supplementary) should be set"); |
| } |
| if (Character.codePointAt(osmanyaDigitStrings[0], 0) != symbols.getCodePointZero()) { |
| errln("ERROR: Code point zero be Osmanya code point zero"); |
| } |
| if (defZero != symbols.getZeroDigit()) { |
| errln("ERROR: Zero digit should be 0"); |
| } |
| if (!Arrays.equals(symbols.getDigits(), defDigits)) { |
| errln("ERROR: Char digits should be Latin digits"); |
| } |
| |
| // Check on copy |
| DecimalFormatSymbols copy = (DecimalFormatSymbols) symbols.clone(); |
| if (!Arrays.equals(copy.getDigitStrings(), osmanyaDigitStrings)) { |
| errln("ERROR: Osmanya digits (supplementary) should be set"); |
| } |
| if (Character.codePointAt(osmanyaDigitStrings[0], 0) != copy.getCodePointZero()) { |
| errln("ERROR: Code point zero be Osmanya code point zero"); |
| } |
| if (defZero != copy.getZeroDigit()) { |
| errln("ERROR: Zero digit should be 0"); |
| } |
| if (!Arrays.equals(copy.getDigits(), defDigits)) { |
| errln("ERROR: Char digits should be Latin digits"); |
| } |
| |
| // Check on resource bundle |
| DecimalFormatSymbols fromData = DecimalFormatSymbols.getInstance(new ULocale("en@numbers=osma")); |
| if (!Arrays.equals(fromData.getDigitStrings(), osmanyaDigitStrings)) { |
| errln("ERROR: Osmanya digits (supplementary) should be set"); |
| } |
| if (Character.codePointAt(osmanyaDigitStrings[0], 0) != fromData.getCodePointZero()) { |
| errln("ERROR: Code point zero be Osmanya code point zero"); |
| } |
| if (defZero != fromData.getZeroDigit()) { |
| errln("ERROR: Zero digit should be 0"); |
| } |
| if (!Arrays.equals(fromData.getDigits(), defDigits)) { |
| errln("ERROR: Char digits should be Latin digits"); |
| } |
| |
| symbols.setDigitStrings(differentDigitStrings); |
| if (!Arrays.equals(symbols.getDigitStrings(), differentDigitStrings)) { |
| errln("ERROR: Different digits should be set"); |
| } |
| if (-1 != symbols.getCodePointZero()) { |
| errln("ERROR: Code point zero should be invalid"); |
| } |
| |
| // Reset digits to Latin |
| symbols.setZeroDigit(defZero); |
| if (!Arrays.equals(symbols.getDigitStrings(), defDigitStrings)) { |
| errln("ERROR: Latin digits should be set" + symbols.getDigitStrings()[0]); |
| } |
| if (defZero != symbols.getCodePointZero()) { |
| errln("ERROR: Code point zero be ASCII 0"); |
| } |
| } |
| |
| @Test |
| public void testNumberingSystem() { |
| Object[][] cases = { |
| {"en", "latn", "1,234.56", '%'}, |
| {"en", "arab", "١٬٢٣٤٫٥٦", "٪\u061C"}, |
| {"en", "mathsanb", "𝟭,𝟮𝟯𝟰.𝟱𝟲", '%'}, |
| {"en", "mymr", "၁,၂၃၄.၅၆", '%'}, |
| {"my", "latn", "1,234.56", '%'}, |
| {"my", "arab", "١٬٢٣٤٫٥٦", "٪\u061C"}, |
| {"my", "mathsanb", "𝟭,𝟮𝟯𝟰.𝟱𝟲", '%'}, |
| {"my", "mymr", "၁,၂၃၄.၅၆", '%'}, |
| {"ar", "latn", "1,234.56", "\u200E%\u200E"}, |
| {"ar", "arab", "١٬٢٣٤٫٥٦", "٪\u061C"}, |
| {"en@numbers=thai", "mymr", "၁,၂၃၄.၅၆", '%'}, // conflicting numbering system |
| }; |
| |
| for (Object[] cas : cases) { |
| ULocale loc = new ULocale((String) cas[0]); |
| NumberingSystem ns = NumberingSystem.getInstanceByName((String) cas[1]); |
| String expectedFormattedNumberString = (String) cas[2]; |
| String expectedPercentSign = String.valueOf(cas[3]); |
| |
| DecimalFormatSymbols dfs = DecimalFormatSymbols.forNumberingSystem(loc, ns); |
| DecimalFormat df = new DecimalFormat("#,##0.##", dfs); |
| String actual1 = df.format(1234.56); |
| assertEquals("1234.56 with " + loc + " and " + ns.getName(), |
| expectedFormattedNumberString, actual1); |
| |
| // The percent sign differs by numbering system. |
| String actual2 = dfs.getPercentString(); |
| assertEquals("Percent sign with " + loc + " and " + ns.getName(), |
| expectedPercentSign, actual2); |
| |
| // Coverage for JDK Locale overload |
| DecimalFormatSymbols dfs2 = DecimalFormatSymbols.forNumberingSystem(loc.toLocale(), ns); |
| assertEquals("JDK Locale and ICU Locale should produce the same object", dfs, dfs2); |
| } |
| } |
| |
| @Test |
| public void testSetPatternForCurrencySpacing_notSharedByInstances() { |
| for (int type = DecimalFormatSymbols.CURRENCY_SPC_CURRENCY_MATCH; type <= DecimalFormatSymbols.CURRENCY_SPC_INSERT; type++) { |
| DecimalFormatSymbols dfs1 = DecimalFormatSymbols.getInstance(Locale.US); |
| DecimalFormatSymbols dfs2 = DecimalFormatSymbols.getInstance(Locale.US); |
| final String pattern = "foobar"; |
| // before |
| dfs1.setPatternForCurrencySpacing(type, false, pattern); |
| assertEquals("setPatternForCurrencySpacing() must set the pattern", pattern, |
| dfs1.getPatternForCurrencySpacing(type, false)); |
| assertNotEquals("DFS instances must not share same pattern", pattern, |
| dfs2.getPatternForCurrencySpacing(type, false)); |
| // after |
| dfs1.setPatternForCurrencySpacing(type, true, pattern); |
| assertEquals("setPatternForCurrencySpacing() must set the pattern", pattern, |
| dfs1.getPatternForCurrencySpacing(type, true)); |
| assertNotEquals("DFS instances must not share same pattern", pattern, |
| dfs2.getPatternForCurrencySpacing(type, true)); |
| } |
| } |
| } |