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