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