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-2012, International Business Machines 7 * Corporation and others. All Rights Reserved. 8 **/ 9 10/** 11 * Port From: JDK 1.4b1 : java.text.Format.IntlTestDecimalFormatAPI 12 * Source File: java/text/format/IntlTestDecimalFormatAPI.java 13 **/ 14 15/* 16 @test 1.4 98/03/06 17 @summary test International Decimal Format API 18*/ 19 20package android.icu.dev.test.format; 21 22import java.text.FieldPosition; 23import java.text.Format; 24import java.text.ParseException; 25import java.text.ParsePosition; 26import java.util.Locale; 27 28import org.junit.Test; 29import org.junit.runner.RunWith; 30import org.junit.runners.JUnit4; 31 32import android.icu.dev.test.TestFmwk; 33import android.icu.math.BigDecimal; 34import android.icu.math.MathContext; 35import android.icu.text.DecimalFormat; 36import android.icu.text.DecimalFormatSymbols; 37import android.icu.text.NumberFormat; 38import android.icu.testsharding.MainTestShard; 39 40@MainTestShard 41@RunWith(JUnit4.class) 42public class IntlTestDecimalFormatAPI extends TestFmwk 43{ 44 /** 45 * Problem 1: simply running 46 * decF4.setRoundingMode(java.math.BigDecimal.ROUND_HALF_UP) does not work 47 * as decF4.setRoundingIncrement(.0001) must also be run. 48 * Problem 2: decF4.format(8.88885) does not return 8.8889 as expected. 49 * You must run decF4.format(new BigDecimal(Double.valueOf(8.88885))) in 50 * order for this to work as expected. 51 * Problem 3: There seems to be no way to set half up to be the default 52 * rounding mode. 53 * We solved the problem with the code at the bottom of this page however 54 * this is not quite general purpose enough to include in icu4j. A static 55 * setDefaultRoundingMode function would solve the problem nicely. Also 56 * decimal places past 20 are not handled properly. A small ammount of work 57 * would make bring this up to snuff. 58 */ 59 @Test 60 public void testJB1871() 61 { 62 // problem 2 63 double number = 8.88885; 64 String expected = "8.8889"; 65 66 String pat = ",##0.0000"; 67 DecimalFormat dec = new DecimalFormat(pat); 68 dec.setRoundingMode(BigDecimal.ROUND_HALF_UP); 69 dec.setRoundingIncrement(new java.math.BigDecimal("0.0001")); 70 String str = dec.format(number); 71 if (!str.equals(expected)) { 72 errln("Fail: " + number + " x \"" + pat + "\" = \"" + 73 str + "\", expected \"" + expected + "\""); 74 } 75 76 pat = ",##0.0001"; 77 dec = new DecimalFormat(pat); 78 dec.setRoundingMode(BigDecimal.ROUND_HALF_UP); 79 str = dec.format(number); 80 if (!str.equals(expected)) { 81 errln("Fail: " + number + " x \"" + pat + "\" = \"" + 82 str + "\", expected \"" + expected + "\""); 83 } 84 85 // testing 20 decimal places 86 pat = ",##0.00000000000000000001"; 87 dec = new DecimalFormat(pat); 88 BigDecimal bignumber = new BigDecimal("8.888888888888888888885"); 89 expected = "8.88888888888888888889"; 90 91 dec.setRoundingMode(BigDecimal.ROUND_HALF_UP); 92 str = dec.format(bignumber); 93 if (!str.equals(expected)) { 94 errln("Fail: " + bignumber + " x \"" + pat + "\" = \"" + 95 str + "\", expected \"" + expected + "\""); 96 } 97 98 } 99 100 /** 101 * This test checks various generic API methods in DecimalFormat to achieve 102 * 100% API coverage. 103 */ 104 @Test 105 public void TestAPI() 106 { 107 logln("DecimalFormat API test---"); logln(""); 108 Locale.setDefault(Locale.ENGLISH); 109 110 // ======= Test constructors 111 112 logln("Testing DecimalFormat constructors"); 113 114 DecimalFormat def = new DecimalFormat(); 115 116 final String pattern = new String("#,##0.# FF"); 117 DecimalFormat pat = null; 118 try { 119 pat = new DecimalFormat(pattern); 120 } 121 catch (IllegalArgumentException e) { 122 errln("ERROR: Could not create DecimalFormat (pattern)"); 123 } 124 125 DecimalFormatSymbols symbols = new DecimalFormatSymbols(Locale.FRENCH); 126 127 DecimalFormat cust1 = new DecimalFormat(pattern, symbols); 128 129 // ======= Test clone(), assignment, and equality 130 131 logln("Testing clone() and equality operators"); 132 133 Format clone = (Format) def.clone(); 134 if( ! def.equals(clone)) { 135 errln("ERROR: Clone() failed"); 136 } 137 138 // ======= Test various format() methods 139 140 logln("Testing various format() methods"); 141 142// final double d = -10456.0037; // this appears as -10456.003700000001 on NT 143// final double d = -1.04560037e-4; // this appears as -1.0456003700000002E-4 on NT 144 final double d = -10456.00370000000000; // this works! 145 final long l = 100000000; 146 logln("" + d + " is the double value"); 147 148 StringBuffer res1 = new StringBuffer(); 149 StringBuffer res2 = new StringBuffer(); 150 StringBuffer res3 = new StringBuffer(); 151 StringBuffer res4 = new StringBuffer(); 152 FieldPosition pos1 = new FieldPosition(0); 153 FieldPosition pos2 = new FieldPosition(0); 154 FieldPosition pos3 = new FieldPosition(0); 155 FieldPosition pos4 = new FieldPosition(0); 156 157 res1 = def.format(d, res1, pos1); 158 logln("" + d + " formatted to " + res1); 159 160 res2 = pat.format(l, res2, pos2); 161 logln("" + l + " formatted to " + res2); 162 163 res3 = cust1.format(d, res3, pos3); 164 logln("" + d + " formatted to " + res3); 165 166 res4 = cust1.format(l, res4, pos4); 167 logln("" + l + " formatted to " + res4); 168 169 // ======= Test parse() 170 171 logln("Testing parse()"); 172 173 String text = new String("-10,456.0037"); 174 ParsePosition pos = new ParsePosition(0); 175 String patt = new String("#,##0.#"); 176 pat.applyPattern(patt); 177 double d2 = pat.parse(text, pos).doubleValue(); 178 if(d2 != d) { 179 errln("ERROR: Roundtrip failed (via parse(" + d2 + " != " + d + ")) for " + text); 180 } 181 logln(text + " parsed into " + (long) d2); 182 183 // ======= Test getters and setters 184 185 logln("Testing getters and setters"); 186 187 final DecimalFormatSymbols syms = pat.getDecimalFormatSymbols(); 188 def.setDecimalFormatSymbols(syms); 189 if( ! pat.getDecimalFormatSymbols().equals(def.getDecimalFormatSymbols())) { 190 errln("ERROR: set DecimalFormatSymbols() failed"); 191 } 192 193 String posPrefix; 194 pat.setPositivePrefix("+"); 195 posPrefix = pat.getPositivePrefix(); 196 logln("Positive prefix (should be +): " + posPrefix); 197 assertEquals("ERROR: setPositivePrefix() failed", "+", posPrefix); 198 199 String negPrefix; 200 pat.setNegativePrefix("-"); 201 negPrefix = pat.getNegativePrefix(); 202 logln("Negative prefix (should be -): " + negPrefix); 203 assertEquals("ERROR: setNegativePrefix() failed", "-", negPrefix); 204 205 String posSuffix; 206 pat.setPositiveSuffix("_"); 207 posSuffix = pat.getPositiveSuffix(); 208 logln("Positive suffix (should be _): " + posSuffix); 209 assertEquals("ERROR: setPositiveSuffix() failed", "_", posSuffix); 210 211 String negSuffix; 212 pat.setNegativeSuffix("~"); 213 negSuffix = pat.getNegativeSuffix(); 214 logln("Negative suffix (should be ~): " + negSuffix); 215 assertEquals("ERROR: setNegativeSuffix() failed", "~", negSuffix); 216 217 long multiplier = 0; 218 pat.setMultiplier(8); 219 multiplier = pat.getMultiplier(); 220 logln("Multiplier (should be 8): " + multiplier); 221 if(multiplier != 8) { 222 errln("ERROR: setMultiplier() failed"); 223 } 224 225 int groupingSize = 0; 226 pat.setGroupingSize(2); 227 groupingSize = pat.getGroupingSize(); 228 logln("Grouping size (should be 2): " + (long) groupingSize); 229 if(groupingSize != 2) { 230 errln("ERROR: setGroupingSize() failed"); 231 } 232 233 pat.setDecimalSeparatorAlwaysShown(true); 234 boolean tf = pat.isDecimalSeparatorAlwaysShown(); 235 logln("DecimalSeparatorIsAlwaysShown (should be true) is " + (tf ? "true" : "false")); 236 if(tf != true) { 237 errln("ERROR: setDecimalSeparatorAlwaysShown() failed"); 238 } 239 240 String funkyPat; 241 funkyPat = pat.toPattern(); 242 logln("Pattern is " + funkyPat); 243 244 String locPat; 245 locPat = pat.toLocalizedPattern(); 246 logln("Localized pattern is " + locPat); 247 248 // ======= Test applyPattern() 249 250 logln("Testing applyPattern()"); 251 252 String p1 = new String("#,##0.0#;(#,##0.0#)"); 253 logln("Applying pattern " + p1); 254 pat.applyPattern(p1); 255 String s2; 256 s2 = pat.toPattern(); 257 logln("Extracted pattern is " + s2); 258 if( ! s2.equals(p1) ) { 259 errln("ERROR: toPattern() result did not match pattern applied"); 260 } 261 262 String p2 = new String("#,##0.0# FF;(#,##0.0# FF)"); 263 logln("Applying pattern " + p2); 264 pat.applyLocalizedPattern(p2); 265 String s3; 266 s3 = pat.toLocalizedPattern(); 267 logln("Extracted pattern is " + s3); 268 if( ! s3.equals(p2) ) { 269 errln("ERROR: toLocalizedPattern() result did not match pattern applied"); 270 } 271 } 272 273 @Test 274 public void testJB6134() 275 { 276 DecimalFormat decfmt = new DecimalFormat(); 277 StringBuffer buf = new StringBuffer(); 278 279 FieldPosition fposByInt = new FieldPosition(NumberFormat.INTEGER_FIELD); 280 decfmt.format(123, buf, fposByInt); 281 282 buf.setLength(0); 283 FieldPosition fposByField = new FieldPosition(NumberFormat.Field.INTEGER); 284 decfmt.format(123, buf, fposByField); 285 286 if (fposByInt.getEndIndex() != fposByField.getEndIndex()) 287 { 288 errln("ERROR: End index for integer field - fposByInt:" + fposByInt.getEndIndex() + 289 " / fposByField: " + fposByField.getEndIndex()); 290 } 291 } 292 293 @Test 294 public void testJB4971() 295 { 296 DecimalFormat decfmt = new DecimalFormat(); 297 MathContext resultICU; 298 299 MathContext comp1 = new MathContext(0, MathContext.PLAIN, false, MathContext.ROUND_HALF_EVEN); 300 resultICU = decfmt.getMathContextICU(); 301 if ((comp1.getDigits() != resultICU.getDigits()) || 302 (comp1.getForm() != resultICU.getForm()) || 303 (comp1.getLostDigits() != resultICU.getLostDigits()) || 304 (comp1.getRoundingMode() != resultICU.getRoundingMode())) 305 { 306 errln("ERROR: Math context 1 not equal - result: " + resultICU.toString() + 307 " / expected: " + comp1.toString()); 308 } 309 310 MathContext comp2 = new MathContext(5, MathContext.ENGINEERING, false, MathContext.ROUND_HALF_EVEN); 311 decfmt.setMathContextICU(comp2); 312 resultICU = decfmt.getMathContextICU(); 313 if ((comp2.getDigits() != resultICU.getDigits()) || 314 (comp2.getForm() != resultICU.getForm()) || 315 (comp2.getLostDigits() != resultICU.getLostDigits()) || 316 (comp2.getRoundingMode() != resultICU.getRoundingMode())) 317 { 318 errln("ERROR: Math context 2 not equal - result: " + resultICU.toString() + 319 " / expected: " + comp2.toString()); 320 } 321 322 java.math.MathContext result; 323 324 java.math.MathContext comp3 = new java.math.MathContext(3, java.math.RoundingMode.DOWN); 325 decfmt.setMathContext(comp3); 326 result = decfmt.getMathContext(); 327 if ((comp3.getPrecision() != result.getPrecision()) || 328 (comp3.getRoundingMode() != result.getRoundingMode())) 329 { 330 errln("ERROR: Math context 3 not equal - result: " + result.toString() + 331 " / expected: " + comp3.toString()); 332 } 333 334 } 335 336 @Test 337 public void testJB6354() 338 { 339 DecimalFormat pat = new DecimalFormat("#,##0.00"); 340 java.math.BigDecimal r1, r2; 341 342 // get default rounding increment 343 r1 = pat.getRoundingIncrement(); 344 345 // set rounding mode with zero increment. Rounding 346 // increment should be set by this operation 347 pat.setRoundingMode(BigDecimal.ROUND_UP); 348 r2 = pat.getRoundingIncrement(); 349 350 // check for different values 351 if ((r1 != null) && (r2 != null)) 352 { 353 if (r1.compareTo(r2) == 0) 354 { 355 errln("ERROR: Rounding increment did not change"); 356 } 357 } 358 } 359 360 @Test 361 public void testJB6648() 362 { 363 DecimalFormat df = new DecimalFormat(); 364 df.setParseStrict(true); 365 366 String numstr = new String(); 367 368 String[] patterns = { 369 "0", 370 "00", 371 "000", 372 "0,000", 373 "0.0", 374 "#000.0" 375 }; 376 377 for(int i=0; i < patterns.length; i++) { 378 df.applyPattern(patterns[i]); 379 numstr = df.format(5); 380 try { 381 Number n = df.parse(numstr); 382 logln("INFO: Parsed " + numstr + " -> " + n); 383 } catch (ParseException pe) { 384 errln("ERROR: Failed round trip with strict parsing."); 385 } 386 } 387 388 df.applyPattern(patterns[1]); 389 numstr = "005"; 390 try { 391 Number n = df.parse(numstr); 392 logln("INFO: Successful parse for " + numstr + " with strict parse enabled. Number is " + n); 393 } catch (ParseException pe) { 394 errln("ERROR: Parse Exception encountered in strict mode: numstr -> " + numstr); 395 } 396 397 } 398} 399