1// © 2017 and later: Unicode, Inc. and others. 2// License & terms of use: http://www.unicode.org/copyright.html#License 3package com.ibm.icu.dev.test.number; 4 5import static org.junit.Assert.assertEquals; 6import static org.junit.Assert.assertFalse; 7import static org.junit.Assert.assertTrue; 8 9import org.junit.Test; 10 11import com.ibm.icu.impl.number.DecimalQuantity; 12import com.ibm.icu.impl.number.DecimalQuantity_DualStorageBCD; 13import com.ibm.icu.impl.number.MicroProps; 14import com.ibm.icu.impl.number.MutablePatternModifier; 15import com.ibm.icu.impl.number.NumberStringBuilder; 16import com.ibm.icu.impl.number.PatternStringParser; 17import com.ibm.icu.number.NumberFormatter.SignDisplay; 18import com.ibm.icu.number.NumberFormatter.UnitWidth; 19import com.ibm.icu.text.DecimalFormatSymbols; 20import com.ibm.icu.util.Currency; 21import com.ibm.icu.util.ULocale; 22 23public class MutablePatternModifierTest { 24 25 @Test 26 public void basic() { 27 MutablePatternModifier mod = new MutablePatternModifier(false); 28 mod.setPatternInfo(PatternStringParser.parseToPatternInfo("a0b")); 29 mod.setPatternAttributes(SignDisplay.AUTO, false); 30 mod.setSymbols( 31 DecimalFormatSymbols.getInstance(ULocale.ENGLISH), 32 Currency.getInstance("USD"), 33 UnitWidth.SHORT, 34 null); 35 36 mod.setNumberProperties(false, null); 37 assertEquals("a", getPrefix(mod)); 38 assertEquals("b", getSuffix(mod)); 39 mod.setPatternAttributes(SignDisplay.ALWAYS, false); 40 assertEquals("+a", getPrefix(mod)); 41 assertEquals("b", getSuffix(mod)); 42 mod.setNumberProperties(true, null); 43 assertEquals("-a", getPrefix(mod)); 44 assertEquals("b", getSuffix(mod)); 45 mod.setPatternAttributes(SignDisplay.NEVER, false); 46 assertEquals("a", getPrefix(mod)); 47 assertEquals("b", getSuffix(mod)); 48 49 mod.setPatternInfo(PatternStringParser.parseToPatternInfo("a0b;c-0d")); 50 mod.setPatternAttributes(SignDisplay.AUTO, false); 51 mod.setNumberProperties(false, null); 52 assertEquals("a", getPrefix(mod)); 53 assertEquals("b", getSuffix(mod)); 54 mod.setPatternAttributes(SignDisplay.ALWAYS, false); 55 assertEquals("c+", getPrefix(mod)); 56 assertEquals("d", getSuffix(mod)); 57 mod.setNumberProperties(true, null); 58 assertEquals("c-", getPrefix(mod)); 59 assertEquals("d", getSuffix(mod)); 60 mod.setPatternAttributes(SignDisplay.NEVER, false); 61 assertEquals("c-", getPrefix(mod)); // TODO: What should this behavior be? 62 assertEquals("d", getSuffix(mod)); 63 } 64 65 @Test 66 public void mutableEqualsImmutable() { 67 MutablePatternModifier mod = new MutablePatternModifier(false); 68 mod.setPatternInfo(PatternStringParser.parseToPatternInfo("a0b;c-0d")); 69 mod.setPatternAttributes(SignDisplay.AUTO, false); 70 mod.setSymbols(DecimalFormatSymbols.getInstance(ULocale.ENGLISH), null, UnitWidth.SHORT, null); 71 DecimalQuantity fq = new DecimalQuantity_DualStorageBCD(1); 72 73 NumberStringBuilder nsb1 = new NumberStringBuilder(); 74 MicroProps micros1 = new MicroProps(false); 75 mod.addToChain(micros1); 76 mod.processQuantity(fq); 77 micros1.modMiddle.apply(nsb1, 0, 0); 78 79 NumberStringBuilder nsb2 = new NumberStringBuilder(); 80 MicroProps micros2 = new MicroProps(true); 81 mod.createImmutable().applyToMicros(micros2, fq); 82 micros2.modMiddle.apply(nsb2, 0, 0); 83 84 NumberStringBuilder nsb3 = new NumberStringBuilder(); 85 MicroProps micros3 = new MicroProps(false); 86 mod.addToChain(micros3); 87 mod.setPatternAttributes(SignDisplay.ALWAYS, false); 88 mod.processQuantity(fq); 89 micros3.modMiddle.apply(nsb3, 0, 0); 90 91 assertTrue(nsb1 + " vs. " + nsb2, nsb1.contentEquals(nsb2)); 92 assertFalse(nsb1 + " vs. " + nsb3, nsb1.contentEquals(nsb3)); 93 } 94 95 private static String getPrefix(MutablePatternModifier mod) { 96 NumberStringBuilder nsb = new NumberStringBuilder(); 97 mod.apply(nsb, 0, 0); 98 return nsb.subSequence(0, mod.getPrefixLength()).toString(); 99 } 100 101 private static String getSuffix(MutablePatternModifier mod) { 102 NumberStringBuilder nsb = new NumberStringBuilder(); 103 mod.apply(nsb, 0, 0); 104 return nsb.subSequence(mod.getPrefixLength(), nsb.length()).toString(); 105 } 106} 107