1// © 2016 and later: Unicode, Inc. and others. 2// License & terms of use: http://www.unicode.org/copyright.html#License 3/***************************************************************************************** 4 * 5 * Copyright (C) 1996-2016, International Business Machines 6 * Corporation and others. All Rights Reserved. 7 **/ 8 9/** 10 * Port From: JDK 1.4b1 : java.text.Format.IntlTestDecimalFormatSymbols 11 * Source File: java/text/format/IntlTestDecimalFormatSymbols.java 12 **/ 13 14/* 15 @test 1.4 98/03/06 16 @summary test International Decimal Format Symbols 17*/ 18 19 20package com.ibm.icu.dev.test.format; 21 22import java.util.Arrays; 23import java.util.Locale; 24 25import org.junit.Test; 26import org.junit.runner.RunWith; 27import org.junit.runners.JUnit4; 28 29import com.ibm.icu.dev.test.TestFmwk; 30import com.ibm.icu.text.DecimalFormat; 31import com.ibm.icu.text.DecimalFormatSymbols; 32import com.ibm.icu.text.NumberingSystem; 33import com.ibm.icu.util.Currency; 34import com.ibm.icu.util.ULocale; 35 36@RunWith(JUnit4.class) 37public class IntlTestDecimalFormatSymbols extends TestFmwk 38{ 39 // Test the API of DecimalFormatSymbols; primarily a simple get/set set. 40 @Test 41 public void TestSymbols() 42 { 43 DecimalFormatSymbols fr = new DecimalFormatSymbols(Locale.FRENCH); 44 45 DecimalFormatSymbols en = new DecimalFormatSymbols(Locale.ENGLISH); 46 47 if(en.equals(fr)) { 48 errln("ERROR: English DecimalFormatSymbols equal to French"); 49 } 50 51 // just do some VERY basic tests to make sure that get/set work 52 53 if(!en.getLocale().equals(Locale.ENGLISH)) { 54 errln("ERROR: getLocale failed"); 55 } 56 if(!en.getULocale().equals(ULocale.ENGLISH)) { 57 errln("ERROR: getULocale failed"); 58 } 59 60 if(!en.getLocale().equals(Locale.ENGLISH)) { 61 errln("ERROR: getLocale failed"); 62 } 63 if(!en.getULocale().equals(ULocale.ENGLISH)) { 64 errln("ERROR: getULocale failed"); 65 } 66 67 char zero = en.getZeroDigit(); 68 fr.setZeroDigit(zero); 69 if(fr.getZeroDigit() != en.getZeroDigit()) { 70 errln("ERROR: get/set ZeroDigit failed"); 71 } 72 73 String[] digits = en.getDigitStrings(); 74 fr.setDigitStrings(digits); 75 if (!Arrays.equals(fr.getDigitStrings(), en.getDigitStrings())) { 76 errln("ERROR: get/set DigitStrings failed"); 77 } 78 79 char sigDigit = en.getSignificantDigit(); 80 fr.setSignificantDigit(sigDigit); 81 if(fr.getSignificantDigit() != en.getSignificantDigit()) { 82 errln("ERROR: get/set SignificantDigit failed"); 83 } 84 85 Currency currency = Currency.getInstance("USD"); 86 fr.setCurrency(currency); 87 if (!fr.getCurrency().equals(currency)){ 88 errln("ERROR: get/set Currency failed"); 89 } 90 91 char group = en.getGroupingSeparator(); 92 fr.setGroupingSeparator(group); 93 if(fr.getGroupingSeparator() != en.getGroupingSeparator()) { 94 errln("ERROR: get/set GroupingSeparator failed"); 95 } 96 97 String groupStr = en.getGroupingSeparatorString(); 98 fr.setGroupingSeparatorString(groupStr); 99 if (!fr.getGroupingSeparatorString().equals(en.getGroupingSeparatorString())) { 100 errln("ERROR: get/set GroupingSeparatorString failed"); 101 } 102 103 char decimal = en.getDecimalSeparator(); 104 fr.setDecimalSeparator(decimal); 105 if(fr.getDecimalSeparator() != en.getDecimalSeparator()) { 106 errln("ERROR: get/set DecimalSeparator failed"); 107 } 108 109 String decimalStr = en.getDecimalSeparatorString(); 110 fr.setDecimalSeparatorString(decimalStr); 111 if (!fr.getDecimalSeparatorString().equals(en.getDecimalSeparatorString())) { 112 errln("ERROR: get/set DecimalSeparatorString failed"); 113 } 114 115 char monetaryGroup = en.getMonetaryGroupingSeparator(); 116 fr.setMonetaryGroupingSeparator(monetaryGroup); 117 if(fr.getMonetaryGroupingSeparator() != en.getMonetaryGroupingSeparator()) { 118 errln("ERROR: get/set MonetaryGroupingSeparator failed"); 119 } 120 121 String monetaryGroupStr = en.getMonetaryGroupingSeparatorString(); 122 fr.setMonetaryGroupingSeparatorString(monetaryGroupStr); 123 if (!fr.getMonetaryGroupingSeparatorString().equals(en.getMonetaryGroupingSeparatorString())){ 124 errln("ERROR: get/set MonetaryGroupingSeparatorString failed"); 125 } 126 127 char monetaryDecimal = en.getMonetaryDecimalSeparator(); 128 fr.setMonetaryDecimalSeparator(monetaryDecimal); 129 if(fr.getMonetaryDecimalSeparator() != en.getMonetaryDecimalSeparator()) { 130 errln("ERROR: get/set MonetaryDecimalSeparator failed"); 131 } 132 133 String monetaryDecimalStr = en.getMonetaryDecimalSeparatorString(); 134 fr.setMonetaryDecimalSeparatorString(monetaryDecimalStr); 135 if (!fr.getMonetaryDecimalSeparatorString().equals(en.getMonetaryDecimalSeparatorString())) { 136 errln("ERROR: get/set MonetaryDecimalSeparatorString failed"); 137 } 138 139 char perMill = en.getPerMill(); 140 fr.setPerMill(perMill); 141 if(fr.getPerMill() != en.getPerMill()) { 142 errln("ERROR: get/set PerMill failed"); 143 } 144 145 String perMillStr = en.getPerMillString(); 146 fr.setPerMillString(perMillStr); 147 if (!fr.getPerMillString().equals(en.getPerMillString())) { 148 errln("ERROR: get/set PerMillString failed"); 149 } 150 151 char percent = en.getPercent(); 152 fr.setPercent(percent); 153 if(fr.getPercent() != en.getPercent()) { 154 errln("ERROR: get/set Percent failed"); 155 } 156 157 String percentStr = en.getPercentString(); 158 fr.setPercentString(percentStr); 159 if (!fr.getPercentString().equals(en.getPercentString())) { 160 errln("ERROR: get/set PercentString failed"); 161 } 162 163 char digit = en.getDigit(); 164 fr.setDigit(digit); 165 if(fr.getDigit() != en.getDigit()) { 166 errln("ERROR: get/set Digit failed"); 167 } 168 169 char patternSeparator = en.getPatternSeparator(); 170 fr.setPatternSeparator(patternSeparator); 171 if(fr.getPatternSeparator() != en.getPatternSeparator()) { 172 errln("ERROR: get/set PatternSeparator failed"); 173 } 174 175 String infinity = en.getInfinity(); 176 fr.setInfinity(infinity); 177 String infinity2 = fr.getInfinity(); 178 if(! infinity.equals(infinity2)) { 179 errln("ERROR: get/set Infinity failed"); 180 } 181 182 String nan = en.getNaN(); 183 fr.setNaN(nan); 184 String nan2 = fr.getNaN(); 185 if(! nan.equals(nan2)) { 186 errln("ERROR: get/set NaN failed"); 187 } 188 189 char minusSign = en.getMinusSign(); 190 fr.setMinusSign(minusSign); 191 if(fr.getMinusSign() != en.getMinusSign()) { 192 errln("ERROR: get/set MinusSign failed"); 193 } 194 195 String minusSignStr = en.getMinusSignString(); 196 fr.setMinusSignString(minusSignStr); 197 if (!fr.getMinusSignString().equals(en.getMinusSignString())) { 198 errln("ERROR: get/set MinusSignString failed"); 199 } 200 201 char plusSign = en.getPlusSign(); 202 fr.setPlusSign(plusSign); 203 if(fr.getPlusSign() != en.getPlusSign()) { 204 errln("ERROR: get/set PlusSign failed"); 205 } 206 207 String plusSignStr = en.getPlusSignString(); 208 fr.setPlusSignString(plusSignStr); 209 if (!fr.getPlusSignString().equals(en.getPlusSignString())) { 210 errln("ERROR: get/set PlusSignString failed"); 211 } 212 213 char padEscape = en.getPadEscape(); 214 fr.setPadEscape(padEscape); 215 if(fr.getPadEscape() != en.getPadEscape()) { 216 errln("ERROR: get/set PadEscape failed"); 217 } 218 219 String exponential = en.getExponentSeparator(); 220 fr.setExponentSeparator(exponential); 221 if(fr.getExponentSeparator() != en.getExponentSeparator()) { 222 errln("ERROR: get/set Exponential failed"); 223 } 224 225 String exponentMultiplicationSign = en.getExponentMultiplicationSign(); 226 fr.setExponentMultiplicationSign(exponentMultiplicationSign); 227 if(fr.getExponentMultiplicationSign() != en.getExponentMultiplicationSign()) { 228 errln("ERROR: get/set ExponentMultiplicationSign failed"); 229 } 230 231 // Test CurrencySpacing. 232 // In CLDR 1.7, only root.txt has CurrencySpacing data. This data might 233 // be different between en and fr in the future. 234 for (int i = DecimalFormatSymbols.CURRENCY_SPC_CURRENCY_MATCH; i <= DecimalFormatSymbols.CURRENCY_SPC_INSERT; i++) { 235 if (en.getPatternForCurrencySpacing(i, true) != 236 fr.getPatternForCurrencySpacing(i, true)) { 237 errln("ERROR: get currency spacing item:"+ i+" before the currency"); 238 if (en.getPatternForCurrencySpacing(i, false) != 239 fr.getPatternForCurrencySpacing(i, false)) { 240 errln("ERROR: get currency spacing item:" + i + " after currency"); 241 } 242 } 243 } 244 245 String dash = "-"; 246 en.setPatternForCurrencySpacing(DecimalFormatSymbols.CURRENCY_SPC_INSERT, true, dash); 247 if (dash != en.getPatternForCurrencySpacing(DecimalFormatSymbols.CURRENCY_SPC_INSERT, true)) { 248 errln("ERROR: set currency spacing pattern for before currency."); 249 } 250 251 //DecimalFormatSymbols foo = new DecimalFormatSymbols(); //The variable is never used 252 253 en = (DecimalFormatSymbols) fr.clone(); 254 255 if(! en.equals(fr)) { 256 errln("ERROR: Clone failed"); 257 } 258 } 259 260 @Test 261 public void testCoverage() { 262 DecimalFormatSymbols df = new DecimalFormatSymbols(); 263 DecimalFormatSymbols df2 = (DecimalFormatSymbols)df.clone(); 264 if (!df.equals(df2) || df.hashCode() != df2.hashCode()) { 265 errln("decimal format symbols clone, equals, or hashCode failed"); 266 } 267 } 268 269 @Test 270 public void testPropagateZeroDigit() { 271 DecimalFormatSymbols dfs = new DecimalFormatSymbols(); 272 dfs.setZeroDigit('\u1040'); 273 DecimalFormat df = new DecimalFormat("0"); 274 df.setDecimalFormatSymbols(dfs); 275 assertEquals("Should propagate char with number property zero", 276 '\u1041', dfs.getDigits()[1]); 277 assertEquals("Should propagate char with number property zero", 278 "\u1044\u1040\u1041\u1042\u1043", df.format(40123)); 279 dfs.setZeroDigit('a'); 280 df.setDecimalFormatSymbols(dfs); 281 assertEquals("Should propagate char WITHOUT number property zero", 282 'b', dfs.getDigits()[1]); 283 assertEquals("Should propagate char WITHOUT number property zero", 284 "eabcd", df.format(40123)); 285 } 286 287 @Test 288 public void testDigitSymbols() { 289 final char defZero = '0'; 290 final char[] defDigits = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}; 291 final String[] defDigitStrings = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"}; 292 final String[] osmanyaDigitStrings = { 293 "\uD801\uDCA0", "\uD801\uDCA1", "\uD801\uDCA2", "\uD801\uDCA3", "\uD801\uDCA4", 294 "\uD801\uDCA5", "\uD801\uDCA6", "\uD801\uDCA7", "\uD801\uDCA8", "\uD801\uDCA9" 295 }; 296 final String[] differentDigitStrings = {"0", "b", "3", "d", "5", "ff", "7", "h", "9", "j"}; 297 298 DecimalFormatSymbols symbols = new DecimalFormatSymbols(Locale.ENGLISH); 299 300 symbols.setDigitStrings(osmanyaDigitStrings); 301 if (!Arrays.equals(symbols.getDigitStrings(), osmanyaDigitStrings)) { 302 errln("ERROR: Osmanya digits (supplementary) should be set"); 303 } 304 if (Character.codePointAt(osmanyaDigitStrings[0], 0) != symbols.getCodePointZero()) { 305 errln("ERROR: Code point zero be Osmanya code point zero"); 306 } 307 if (defZero != symbols.getZeroDigit()) { 308 errln("ERROR: Zero digit should be 0"); 309 } 310 if (!Arrays.equals(symbols.getDigits(), defDigits)) { 311 errln("ERROR: Char digits should be Latin digits"); 312 } 313 314 symbols.setDigitStrings(differentDigitStrings); 315 if (!Arrays.equals(symbols.getDigitStrings(), differentDigitStrings)) { 316 errln("ERROR: Different digits should be set"); 317 } 318 if (-1 != symbols.getCodePointZero()) { 319 errln("ERROR: Code point zero should be invalid"); 320 } 321 322 // Reset digits to Latin 323 symbols.setZeroDigit(defZero); 324 if (!Arrays.equals(symbols.getDigitStrings(), defDigitStrings)) { 325 errln("ERROR: Latin digits should be set" + symbols.getDigitStrings()[0]); 326 } 327 if (defZero != symbols.getCodePointZero()) { 328 errln("ERROR: Code point zero be ASCII 0"); 329 } 330 } 331 332 @Test 333 public void testNumberingSystem() { 334 Object[][] cases = { 335 {"en", "latn", "1,234.56", ';'}, 336 {"en", "arab", "١٬٢٣٤٫٥٦", '؛'}, 337 {"en", "mathsanb", ",.", ';'}, 338 {"en", "mymr", "၁,၂၃၄.၅၆", ';'}, 339 {"my", "latn", "1,234.56", ';'}, 340 {"my", "arab", "١٬٢٣٤٫٥٦", '؛'}, 341 {"my", "mathsanb", ",.", ';'}, 342 {"my", "mymr", "၁,၂၃၄.၅၆", '၊'}, 343 {"en@numbers=thai", "mymr", "၁,၂၃၄.၅၆", ';'}, // conflicting numbering system 344 }; 345 346 for (Object[] cas : cases) { 347 ULocale loc = new ULocale((String) cas[0]); 348 NumberingSystem ns = NumberingSystem.getInstanceByName((String) cas[1]); 349 String expectedFormattedNumberString = (String) cas[2]; 350 char expectedPatternSeparator = (Character) cas[3]; 351 352 DecimalFormatSymbols dfs = DecimalFormatSymbols.forNumberingSystem(loc, ns); 353 DecimalFormat df = new DecimalFormat("#,##0.##", dfs); 354 String actual1 = df.format(1234.56); 355 assertEquals("1234.56 with " + loc + " and " + ns.getName(), 356 expectedFormattedNumberString, actual1); 357 // The pattern separator is something that differs by numbering system in my@numbers=mymr. 358 char actual2 = dfs.getPatternSeparator(); 359 assertEquals("Pattern separator with " + loc + " and " + ns.getName(), 360 expectedPatternSeparator, actual2); 361 362 // Coverage for JDK Locale overload 363 DecimalFormatSymbols dfs2 = DecimalFormatSymbols.forNumberingSystem(loc.toLocale(), ns); 364 assertEquals("JDK Locale and ICU Locale should produce the same object", dfs, dfs2); 365 } 366 } 367} 368