001    /*
002     *  Copyright 2001-2006 Stephen Colebourne
003     *
004     *  Licensed under the Apache License, Version 2.0 (the "License");
005     *  you may not use this file except in compliance with the License.
006     *  You may obtain a copy of the License at
007     *
008     *      http://www.apache.org/licenses/LICENSE-2.0
009     *
010     *  Unless required by applicable law or agreed to in writing, software
011     *  distributed under the License is distributed on an "AS IS" BASIS,
012     *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     *  See the License for the specific language governing permissions and
014     *  limitations under the License.
015     */
016    package org.joda.time.format;
017    
018    import java.util.Locale;
019    import java.util.TimeZone;
020    
021    import junit.framework.TestCase;
022    import junit.framework.TestSuite;
023    
024    import org.joda.time.DateTimeConstants;
025    import org.joda.time.DateTimeUtils;
026    import org.joda.time.DateTimeZone;
027    import org.joda.time.Period;
028    import org.joda.time.PeriodType;
029    
030    /**
031     * This class is a Junit unit test for PeriodFormatterBuilder.
032     *
033     * @author Stephen Colebourne
034     */
035    public class TestPeriodFormatterBuilder extends TestCase {
036        
037        private static final Period PERIOD = new Period(1, 2, 3, 4, 5, 6, 7, 8);
038        private static final Period EMPTY_PERIOD = new Period(0, 0, 0, 0, 0, 0, 0, 0);
039        private static final Period YEAR_DAY_PERIOD = new Period(1, 0, 0, 4, 5, 6, 7, 8, PeriodType.yearDayTime());
040        private static final Period EMPTY_YEAR_DAY_PERIOD = new Period(0, 0, 0, 0, 0, 0, 0, 0, PeriodType.yearDayTime());
041        private static final Period TIME_PERIOD = new Period(0, 0, 0, 0, 5, 6, 7, 8);
042        private static final Period DATE_PERIOD = new Period(1, 2, 3, 4, 0, 0, 0, 0);
043    
044        //private static final DateTimeZone PARIS = DateTimeZone.forID("Europe/Paris");
045        private static final DateTimeZone LONDON = DateTimeZone.forID("Europe/London");
046        //private static final DateTimeZone TOKYO = DateTimeZone.forID("Asia/Tokyo");
047    
048        long y2002days = 365 + 365 + 366 + 365 + 365 + 365 + 366 + 365 + 365 + 365 + 
049                         366 + 365 + 365 + 365 + 366 + 365 + 365 + 365 + 366 + 365 + 
050                         365 + 365 + 366 + 365 + 365 + 365 + 366 + 365 + 365 + 365 +
051                         366 + 365;
052        // 2002-06-09
053        private long TEST_TIME_NOW =
054                (y2002days + 31L + 28L + 31L + 30L + 31L + 9L -1L) * DateTimeConstants.MILLIS_PER_DAY;
055    
056        private DateTimeZone originalDateTimeZone = null;
057        private TimeZone originalTimeZone = null;
058        private Locale originalLocale = null;
059        
060        private PeriodFormatterBuilder builder;
061    
062        public static void main(String[] args) {
063            junit.textui.TestRunner.run(suite());
064        }
065    
066        public static TestSuite suite() {
067            return new TestSuite(TestPeriodFormatterBuilder.class);
068        }
069    
070        public TestPeriodFormatterBuilder(String name) {
071            super(name);
072        }
073    
074        protected void setUp() throws Exception {
075            DateTimeUtils.setCurrentMillisFixed(TEST_TIME_NOW);
076            originalDateTimeZone = DateTimeZone.getDefault();
077            originalTimeZone = TimeZone.getDefault();
078            originalLocale = Locale.getDefault();
079            DateTimeZone.setDefault(LONDON);
080            TimeZone.setDefault(TimeZone.getTimeZone("Europe/London"));
081            Locale.setDefault(Locale.UK);
082            
083            builder = new PeriodFormatterBuilder();
084        }
085    
086        protected void tearDown() throws Exception {
087            DateTimeUtils.setCurrentMillisSystem();
088            DateTimeZone.setDefault(originalDateTimeZone);
089            TimeZone.setDefault(originalTimeZone);
090            Locale.setDefault(originalLocale);
091            originalDateTimeZone = null;
092            originalTimeZone = null;
093            originalLocale = null;
094        }
095    
096        //-----------------------------------------------------------------------
097        public void testToFormatterPrinterParser() {
098            builder.appendYears();
099            assertNotNull(builder.toFormatter());
100            assertNotNull(builder.toPrinter());
101            assertNotNull(builder.toParser());
102        }
103    
104        //-----------------------------------------------------------------------
105        public void testFormatYears() {
106            PeriodFormatter f = builder.appendYears().toFormatter();
107            assertEquals("1", f.print(PERIOD));
108            assertEquals(1, f.getPrinter().calculatePrintedLength(PERIOD, null));
109            assertEquals(1, f.getPrinter().countFieldsToPrint(PERIOD, Integer.MAX_VALUE, null));
110            
111            Period p = new Period(0, 0, 0, 0, 0, 0, 0, 0);
112            assertEquals("0", f.print(p));
113            assertEquals(1, f.getPrinter().calculatePrintedLength(p, null));
114            assertEquals(1, f.getPrinter().countFieldsToPrint(p, Integer.MAX_VALUE, null));
115        }
116    
117        public void testFormatMonths() {
118            PeriodFormatter f = builder.appendMonths().toFormatter();
119            assertEquals("2", f.print(PERIOD));
120            assertEquals(1, f.getPrinter().calculatePrintedLength(PERIOD, null));
121            assertEquals(1, f.getPrinter().countFieldsToPrint(PERIOD, Integer.MAX_VALUE, null));
122            
123            Period p = new Period(0, 0, 0, 0, 0, 0, 0, 0);
124            assertEquals("0", f.print(p));
125            assertEquals(1, f.getPrinter().calculatePrintedLength(p, null));
126            assertEquals(1, f.getPrinter().countFieldsToPrint(p, Integer.MAX_VALUE, null));
127        }
128    
129        public void testFormatWeeks() {
130            PeriodFormatter f = builder.appendWeeks().toFormatter();
131            assertEquals("3", f.print(PERIOD));
132            assertEquals(1, f.getPrinter().calculatePrintedLength(PERIOD, null));
133            assertEquals(1, f.getPrinter().countFieldsToPrint(PERIOD, Integer.MAX_VALUE, null));
134            
135            Period p = new Period(0, 0, 0, 0, 0, 0, 0, 0);
136            assertEquals("0", f.print(p));
137            assertEquals(1, f.getPrinter().calculatePrintedLength(p, null));
138            assertEquals(1, f.getPrinter().countFieldsToPrint(p, Integer.MAX_VALUE, null));
139        }
140    
141        public void testFormatDays() {
142            PeriodFormatter f = builder.appendDays().toFormatter();
143            assertEquals("4", f.print(PERIOD));
144            assertEquals(1, f.getPrinter().calculatePrintedLength(PERIOD, null));
145            assertEquals(1, f.getPrinter().countFieldsToPrint(PERIOD, Integer.MAX_VALUE, null));
146            
147            Period p = new Period(0, 0, 0, 0, 0, 0, 0, 0);
148            assertEquals("0", f.print(p));
149            assertEquals(1, f.getPrinter().calculatePrintedLength(p, null));
150            assertEquals(1, f.getPrinter().countFieldsToPrint(p, Integer.MAX_VALUE, null));
151        }
152    
153        public void testFormatHours() {
154            PeriodFormatter f = builder.appendHours().toFormatter();
155            assertEquals("5", f.print(PERIOD));
156            assertEquals(1, f.getPrinter().calculatePrintedLength(PERIOD, null));
157            assertEquals(1, f.getPrinter().countFieldsToPrint(PERIOD, Integer.MAX_VALUE, null));
158            
159            Period p = new Period(0, 0, 0, 0, 0, 0, 0, 0);
160            assertEquals("0", f.print(p));
161            assertEquals(1, f.getPrinter().calculatePrintedLength(p, null));
162            assertEquals(1, f.getPrinter().countFieldsToPrint(p, Integer.MAX_VALUE, null));
163        }
164    
165        public void testFormatMinutes() {
166            PeriodFormatter f = builder.appendMinutes().toFormatter();
167            assertEquals("6", f.print(PERIOD));
168            assertEquals(1, f.getPrinter().calculatePrintedLength(PERIOD, null));
169            assertEquals(1, f.getPrinter().countFieldsToPrint(PERIOD, Integer.MAX_VALUE, null));
170            
171            Period p = new Period(0, 0, 0, 0, 0, 0, 0, 0);
172            assertEquals("0", f.print(p));
173            assertEquals(1, f.getPrinter().calculatePrintedLength(p, null));
174            assertEquals(1, f.getPrinter().countFieldsToPrint(p, Integer.MAX_VALUE, null));
175        }
176    
177        public void testFormatSeconds() {
178            PeriodFormatter f = builder.appendSeconds().toFormatter();
179            assertEquals("7", f.print(PERIOD));
180            assertEquals(1, f.getPrinter().calculatePrintedLength(PERIOD, null));
181            assertEquals(1, f.getPrinter().countFieldsToPrint(PERIOD, Integer.MAX_VALUE, null));
182            
183            Period p = new Period(0, 0, 0, 0, 0, 0, 0, 0);
184            assertEquals("0", f.print(p));
185            assertEquals(1, f.getPrinter().calculatePrintedLength(p, null));
186            assertEquals(1, f.getPrinter().countFieldsToPrint(p, Integer.MAX_VALUE, null));
187        }
188    
189        public void testFormatSecondsWithMillis() {
190            PeriodFormatter f = builder.appendSecondsWithMillis().toFormatter();
191            Period p = new Period(0, 0, 0, 0, 0, 0, 7, 0);
192            assertEquals("7.000", f.print(p));
193            assertEquals(5, f.getPrinter().calculatePrintedLength(p, null));
194            assertEquals(1, f.getPrinter().countFieldsToPrint(p, Integer.MAX_VALUE, null));
195            
196            p = new Period(0, 0, 0, 0, 0, 0, 7, 1);
197            assertEquals("7.001", f.print(p));
198            assertEquals(5, f.getPrinter().calculatePrintedLength(p, null));
199            assertEquals(1, f.getPrinter().countFieldsToPrint(p, Integer.MAX_VALUE, null));
200            
201            p = new Period(0, 0, 0, 0, 0, 0, 7, 999);
202            assertEquals("7.999", f.print(p));
203            assertEquals(5, f.getPrinter().calculatePrintedLength(p, null));
204            assertEquals(1, f.getPrinter().countFieldsToPrint(p, Integer.MAX_VALUE, null));
205            
206            p = new Period(0, 0, 0, 0, 0, 0, 7, 1000);
207            assertEquals("8.000", f.print(p));
208            assertEquals(5, f.getPrinter().calculatePrintedLength(p, null));
209            assertEquals(1, f.getPrinter().countFieldsToPrint(p, Integer.MAX_VALUE, null));
210            
211            p = new Period(0, 0, 0, 0, 0, 0, 7, 1001);
212            assertEquals("8.001", f.print(p));
213            assertEquals(5, f.getPrinter().calculatePrintedLength(p, null));
214            assertEquals(1, f.getPrinter().countFieldsToPrint(p, Integer.MAX_VALUE, null));
215            
216            p = new Period(0, 0, 0, 0, 0, 0, 7, -1);
217            assertEquals("6.999", f.print(p));
218            assertEquals(5, f.getPrinter().calculatePrintedLength(p, null));
219            assertEquals(1, f.getPrinter().countFieldsToPrint(p, Integer.MAX_VALUE, null));
220            
221            p = new Period(0, 0, 0, 0, 0, 0, -7, 1);
222            assertEquals("-6.999", f.print(p));
223            assertEquals(6, f.getPrinter().calculatePrintedLength(p, null));
224            assertEquals(1, f.getPrinter().countFieldsToPrint(p, Integer.MAX_VALUE, null));
225            
226            p = new Period(0, 0, 0, 0, 0, 0, -7, -1);
227            assertEquals("-7.001", f.print(p));
228            assertEquals(6, f.getPrinter().calculatePrintedLength(p, null));
229            assertEquals(1, f.getPrinter().countFieldsToPrint(p, Integer.MAX_VALUE, null));
230            
231            p = new Period(0, 0, 0, 0, 0, 0, 0, 0);
232            assertEquals("0.000", f.print(p));
233            assertEquals(5, f.getPrinter().calculatePrintedLength(p, null));
234            assertEquals(1, f.getPrinter().countFieldsToPrint(p, Integer.MAX_VALUE, null));
235        }
236    
237        public void testFormatSecondsWithOptionalMillis() {
238            PeriodFormatter f = builder.appendSecondsWithOptionalMillis().toFormatter();
239            Period p = new Period(0, 0, 0, 0, 0, 0, 7, 0);
240            assertEquals("7", f.print(p));
241            assertEquals(1, f.getPrinter().calculatePrintedLength(p, null));
242            assertEquals(1, f.getPrinter().countFieldsToPrint(p, Integer.MAX_VALUE, null));
243            
244            p = new Period(0, 0, 0, 0, 0, 0, 7, 1);
245            assertEquals("7.001", f.print(p));
246            assertEquals(5, f.getPrinter().calculatePrintedLength(p, null));
247            assertEquals(1, f.getPrinter().countFieldsToPrint(p, Integer.MAX_VALUE, null));
248            
249            p = new Period(0, 0, 0, 0, 0, 0, 7, 999);
250            assertEquals("7.999", f.print(p));
251            assertEquals(5, f.getPrinter().calculatePrintedLength(p, null));
252            assertEquals(1, f.getPrinter().countFieldsToPrint(p, Integer.MAX_VALUE, null));
253            
254            p = new Period(0, 0, 0, 0, 0, 0, 7, 1000);
255            assertEquals("8", f.print(p));
256            assertEquals(1, f.getPrinter().calculatePrintedLength(p, null));
257            assertEquals(1, f.getPrinter().countFieldsToPrint(p, Integer.MAX_VALUE, null));
258            
259            p = new Period(0, 0, 0, 0, 0, 0, 7, 1001);
260            assertEquals("8.001", f.print(p));
261            assertEquals(5, f.getPrinter().calculatePrintedLength(p, null));
262            assertEquals(1, f.getPrinter().countFieldsToPrint(p, Integer.MAX_VALUE, null));
263            
264            p = new Period(0, 0, 0, 0, 0, 0, 7, -1);
265            assertEquals("6.999", f.print(p));
266            assertEquals(5, f.getPrinter().calculatePrintedLength(p, null));
267            assertEquals(1, f.getPrinter().countFieldsToPrint(p, Integer.MAX_VALUE, null));
268            
269            p = new Period(0, 0, 0, 0, 0, 0, -7, 1);
270            assertEquals("-6.999", f.print(p));
271            assertEquals(6, f.getPrinter().calculatePrintedLength(p, null));
272            assertEquals(1, f.getPrinter().countFieldsToPrint(p, Integer.MAX_VALUE, null));
273            
274            p = new Period(0, 0, 0, 0, 0, 0, -7, -1);
275            assertEquals("-7.001", f.print(p));
276            assertEquals(6, f.getPrinter().calculatePrintedLength(p, null));
277            assertEquals(1, f.getPrinter().countFieldsToPrint(p, Integer.MAX_VALUE, null));
278            
279            p = new Period(0, 0, 0, 0, 0, 0, 0, 0);
280            assertEquals("0", f.print(p));
281            assertEquals(1, f.getPrinter().calculatePrintedLength(p, null));
282            assertEquals(1, f.getPrinter().countFieldsToPrint(p, Integer.MAX_VALUE, null));
283        }
284    
285        public void testFormatMillis() {
286            PeriodFormatter f = builder.appendMillis().toFormatter();
287            assertEquals("8", f.print(PERIOD));
288            assertEquals(1, f.getPrinter().calculatePrintedLength(PERIOD, null));
289            assertEquals(1, f.getPrinter().countFieldsToPrint(PERIOD, Integer.MAX_VALUE, null));
290            
291            Period p = new Period(0, 0, 0, 0, 0, 0, 0, 0);
292            assertEquals("0", f.print(p));
293            assertEquals(1, f.getPrinter().calculatePrintedLength(p, null));
294            assertEquals(1, f.getPrinter().countFieldsToPrint(p, Integer.MAX_VALUE, null));
295        }
296    
297        public void testFormatMillis3Digit() {
298            PeriodFormatter f = builder.appendMillis3Digit().toFormatter();
299            assertEquals("008", f.print(PERIOD));
300            assertEquals(3, f.getPrinter().calculatePrintedLength(PERIOD, null));
301            assertEquals(1, f.getPrinter().countFieldsToPrint(PERIOD, Integer.MAX_VALUE, null));
302            
303            Period p = new Period(0, 0, 0, 0, 0, 0, 0, 0);
304            assertEquals("000", f.print(p));
305            assertEquals(3, f.getPrinter().calculatePrintedLength(p, null));
306            assertEquals(1, f.getPrinter().countFieldsToPrint(p, Integer.MAX_VALUE, null));
307        }
308    
309        //-----------------------------------------------------------------------
310        public void testFormatPrefixSimple1() {
311            PeriodFormatter f = builder.appendPrefix("Years:").appendYears().toFormatter();
312            assertEquals("Years:1", f.print(PERIOD));
313            assertEquals(7, f.getPrinter().calculatePrintedLength(PERIOD, null));
314            assertEquals(1, f.getPrinter().countFieldsToPrint(PERIOD, Integer.MAX_VALUE, null));
315            
316            Period p = new Period(0, 0, 0, 0, 0, 0, 0, 0);
317            assertEquals("Years:0", f.print(p));
318            assertEquals(7, f.getPrinter().calculatePrintedLength(p, null));
319            assertEquals(1, f.getPrinter().countFieldsToPrint(p, Integer.MAX_VALUE, null));
320        }
321    
322        public void testFormatPrefixSimple2() {
323            PeriodFormatter f = builder.appendPrefix("Hours:").appendHours().toFormatter();
324            assertEquals("Hours:5", f.print(PERIOD));
325            assertEquals(7, f.getPrinter().calculatePrintedLength(PERIOD, null));
326            assertEquals(1, f.getPrinter().countFieldsToPrint(PERIOD, Integer.MAX_VALUE, null));
327            
328            Period p = new Period(0, 0, 0, 0, 0, 0, 0, 0);
329            assertEquals("Hours:0", f.print(p));
330            assertEquals(7, f.getPrinter().calculatePrintedLength(p, null));
331            assertEquals(1, f.getPrinter().countFieldsToPrint(p, Integer.MAX_VALUE, null));
332        }
333    
334        public void testFormatPrefixSimple3() {
335            try {
336                builder.appendPrefix(null);
337                fail();
338            } catch (IllegalArgumentException ex) {}
339        }
340    
341        public void testFormatPrefixPlural1() {
342            PeriodFormatter f = builder.appendPrefix("Year:", "Years:").appendYears().toFormatter();
343            assertEquals("Year:1", f.print(PERIOD));
344            assertEquals(6, f.getPrinter().calculatePrintedLength(PERIOD, null));
345            assertEquals(1, f.getPrinter().countFieldsToPrint(PERIOD, Integer.MAX_VALUE, null));
346            
347            Period p = new Period(0, 0, 0, 0, 0, 0, 0, 0);
348            assertEquals("Years:0", f.print(p));
349            assertEquals(7, f.getPrinter().calculatePrintedLength(p, null));
350            assertEquals(1, f.getPrinter().countFieldsToPrint(p, Integer.MAX_VALUE, null));
351        }
352    
353        public void testFormatPrefixPlural2() {
354            PeriodFormatter f = builder.appendPrefix("Hour:", "Hours:").appendHours().toFormatter();
355            assertEquals("Hours:5", f.print(PERIOD));
356            assertEquals(7, f.getPrinter().calculatePrintedLength(PERIOD, null));
357            assertEquals(1, f.getPrinter().countFieldsToPrint(PERIOD, Integer.MAX_VALUE, null));
358            
359            Period p = new Period(0, 0, 0, 0, 0, 0, 0, 0);
360            assertEquals("Hours:0", f.print(p));
361            assertEquals(7, f.getPrinter().calculatePrintedLength(p, null));
362            assertEquals(1, f.getPrinter().countFieldsToPrint(p, Integer.MAX_VALUE, null));
363        }
364    
365        public void testFormatPrefixPlural3() {
366            try {
367                builder.appendPrefix(null, "");
368                fail();
369            } catch (IllegalArgumentException ex) {}
370            try {
371                builder.appendPrefix("", null);
372                fail();
373            } catch (IllegalArgumentException ex) {}
374            try {
375                builder.appendPrefix(null, null);
376                fail();
377            } catch (IllegalArgumentException ex) {}
378        }
379    
380        //-----------------------------------------------------------------------
381        public void testFormatSuffixSimple1() {
382            PeriodFormatter f = builder.appendYears().appendSuffix(" years").toFormatter();
383            assertEquals("1 years", f.print(PERIOD));
384            assertEquals(7, f.getPrinter().calculatePrintedLength(PERIOD, null));
385            assertEquals(1, f.getPrinter().countFieldsToPrint(PERIOD, Integer.MAX_VALUE, null));
386            
387            Period p = new Period(0, 0, 0, 0, 0, 0, 0, 0);
388            assertEquals("0 years", f.print(p));
389            assertEquals(7, f.getPrinter().calculatePrintedLength(p, null));
390            assertEquals(1, f.getPrinter().countFieldsToPrint(p, Integer.MAX_VALUE, null));
391        }
392    
393        public void testFormatSuffixSimple2() {
394            PeriodFormatter f = builder.appendHours().appendSuffix(" hours").toFormatter();
395            assertEquals("5 hours", f.print(PERIOD));
396            assertEquals(7, f.getPrinter().calculatePrintedLength(PERIOD, null));
397            assertEquals(1, f.getPrinter().countFieldsToPrint(PERIOD, Integer.MAX_VALUE, null));
398            
399            Period p = new Period(0, 0, 0, 0, 0, 0, 0, 0);
400            assertEquals("0 hours", f.print(p));
401            assertEquals(7, f.getPrinter().calculatePrintedLength(p, null));
402            assertEquals(1, f.getPrinter().countFieldsToPrint(p, Integer.MAX_VALUE, null));
403        }
404    
405        public void testFormatSuffixSimple3() {
406            try {
407                builder.appendSuffix(null);
408                fail();
409            } catch (IllegalArgumentException ex) {}
410        }
411    
412        public void testFormatSuffixSimple4() {
413            try {
414                builder.appendSuffix(" hours");
415                fail();
416            } catch (IllegalStateException ex) {}
417        }
418    
419        public void testFormatSuffixPlural1() {
420            PeriodFormatter f = builder.appendYears().appendSuffix(" year", " years").toFormatter();
421            assertEquals("1 year", f.print(PERIOD));
422            assertEquals(6, f.getPrinter().calculatePrintedLength(PERIOD, null));
423            assertEquals(1, f.getPrinter().countFieldsToPrint(PERIOD, Integer.MAX_VALUE, null));
424            
425            Period p = new Period(0, 0, 0, 0, 0, 0, 0, 0);
426            assertEquals("0 years", f.print(p));
427            assertEquals(7, f.getPrinter().calculatePrintedLength(p, null));
428            assertEquals(1, f.getPrinter().countFieldsToPrint(p, Integer.MAX_VALUE, null));
429        }
430    
431        public void testFormatSuffixPlural2() {
432            PeriodFormatter f = builder.appendHours().appendSuffix(" hour", " hours").toFormatter();
433            assertEquals("5 hours", f.print(PERIOD));
434            assertEquals(7, f.getPrinter().calculatePrintedLength(PERIOD, null));
435            assertEquals(1, f.getPrinter().countFieldsToPrint(PERIOD, Integer.MAX_VALUE, null));
436            
437            Period p = new Period(0, 0, 0, 0, 0, 0, 0, 0);
438            assertEquals("0 hours", f.print(p));
439            assertEquals(7, f.getPrinter().calculatePrintedLength(p, null));
440            assertEquals(1, f.getPrinter().countFieldsToPrint(p, Integer.MAX_VALUE, null));
441        }
442    
443        public void testFormatSuffixPlural3() {
444            try {
445                builder.appendSuffix(null, "");
446                fail();
447            } catch (IllegalArgumentException ex) {}
448            try {
449                builder.appendSuffix("", null);
450                fail();
451            } catch (IllegalArgumentException ex) {}
452            try {
453                builder.appendSuffix(null, null);
454                fail();
455            } catch (IllegalArgumentException ex) {}
456        }
457    
458        public void testFormatSuffixPlural4() {
459            try {
460                builder.appendSuffix(" hour", " hours");
461                fail();
462            } catch (IllegalStateException ex) {}
463        }
464    
465        //-----------------------------------------------------------------------
466        public void testFormatPrefixSuffix() {
467            PeriodFormatter f = builder.appendPrefix("P").appendYears().appendSuffix("Y").toFormatter();
468            assertEquals("P1Y", f.print(PERIOD));
469            assertEquals(3, f.getPrinter().calculatePrintedLength(PERIOD, null));
470            assertEquals(1, f.getPrinter().countFieldsToPrint(PERIOD, Integer.MAX_VALUE, null));
471            
472            Period p = new Period(0, 0, 0, 0, 0, 0, 0, 0);
473            assertEquals("P0Y", f.print(p));
474            assertEquals(3, f.getPrinter().calculatePrintedLength(p, null));
475            assertEquals(1, f.getPrinter().countFieldsToPrint(p, Integer.MAX_VALUE, null));
476        }
477    
478        //-----------------------------------------------------------------------
479        public void testFormatSeparatorSimple() {
480            PeriodFormatter f = builder.appendYears().appendSeparator("T").appendHours().toFormatter();
481            assertEquals("1T5", f.print(PERIOD));
482            assertEquals(3, f.getPrinter().calculatePrintedLength(PERIOD, null));
483            assertEquals(2, f.getPrinter().countFieldsToPrint(PERIOD, Integer.MAX_VALUE, null));
484            
485            assertEquals("5", f.print(TIME_PERIOD));
486            assertEquals(1, f.getPrinter().calculatePrintedLength(TIME_PERIOD, null));
487            assertEquals(1, f.getPrinter().countFieldsToPrint(TIME_PERIOD, Integer.MAX_VALUE, null));
488            
489            assertEquals("1", f.print(DATE_PERIOD));
490            assertEquals(1, f.getPrinter().calculatePrintedLength(DATE_PERIOD, null));
491            assertEquals(1, f.getPrinter().countFieldsToPrint(DATE_PERIOD, Integer.MAX_VALUE, null));
492        }
493    
494        public void testFormatSeparatorComplex() {
495            PeriodFormatter f = builder
496                .appendYears().appendSeparator(", ", " and ")
497                .appendHours().appendSeparator(", ", " and ")
498                .appendMinutes().appendSeparator(", ", " and ")
499                .toFormatter();
500            assertEquals("1, 5 and 6", f.print(PERIOD));
501            assertEquals(10, f.getPrinter().calculatePrintedLength(PERIOD, null));
502            assertEquals(3, f.getPrinter().countFieldsToPrint(PERIOD, Integer.MAX_VALUE, null));
503            
504            assertEquals("5 and 6", f.print(TIME_PERIOD));
505            assertEquals(7, f.getPrinter().calculatePrintedLength(TIME_PERIOD, null));
506            assertEquals(2, f.getPrinter().countFieldsToPrint(TIME_PERIOD, Integer.MAX_VALUE, null));
507            
508            assertEquals("1", f.print(DATE_PERIOD));
509            assertEquals(1, f.getPrinter().calculatePrintedLength(DATE_PERIOD, null));
510            assertEquals(1, f.getPrinter().countFieldsToPrint(DATE_PERIOD, Integer.MAX_VALUE, null));
511        }
512    
513        public void testFormatSeparatorIfFieldsAfter() {
514            PeriodFormatter f = builder.appendYears().appendSeparatorIfFieldsAfter("T").appendHours().toFormatter();
515            assertEquals("1T5", f.print(PERIOD));
516            assertEquals(3, f.getPrinter().calculatePrintedLength(PERIOD, null));
517            assertEquals(2, f.getPrinter().countFieldsToPrint(PERIOD, Integer.MAX_VALUE, null));
518            
519            assertEquals("T5", f.print(TIME_PERIOD));
520            assertEquals(2, f.getPrinter().calculatePrintedLength(TIME_PERIOD, null));
521            assertEquals(1, f.getPrinter().countFieldsToPrint(TIME_PERIOD, Integer.MAX_VALUE, null));
522            
523            assertEquals("1", f.print(DATE_PERIOD));
524            assertEquals(1, f.getPrinter().calculatePrintedLength(DATE_PERIOD, null));
525            assertEquals(1, f.getPrinter().countFieldsToPrint(DATE_PERIOD, Integer.MAX_VALUE, null));
526        }
527    
528        public void testFormatSeparatorIfFieldsBefore() {
529            PeriodFormatter f = builder.appendYears().appendSeparatorIfFieldsBefore("T").appendHours().toFormatter();
530            assertEquals("1T5", f.print(PERIOD));
531            assertEquals(3, f.getPrinter().calculatePrintedLength(PERIOD, null));
532            assertEquals(2, f.getPrinter().countFieldsToPrint(PERIOD, Integer.MAX_VALUE, null));
533            
534            assertEquals("5", f.print(TIME_PERIOD));
535            assertEquals(1, f.getPrinter().calculatePrintedLength(TIME_PERIOD, null));
536            assertEquals(1, f.getPrinter().countFieldsToPrint(TIME_PERIOD, Integer.MAX_VALUE, null));
537            
538            assertEquals("1T", f.print(DATE_PERIOD));
539            assertEquals(2, f.getPrinter().calculatePrintedLength(DATE_PERIOD, null));
540            assertEquals(1, f.getPrinter().countFieldsToPrint(DATE_PERIOD, Integer.MAX_VALUE, null));
541        }
542    
543        //-----------------------------------------------------------------------
544        public void testFormatLiteral() {
545            PeriodFormatter f = builder.appendLiteral("HELLO").toFormatter();
546            assertEquals("HELLO", f.print(PERIOD));
547            assertEquals(5, f.getPrinter().calculatePrintedLength(PERIOD, null));
548            assertEquals(0, f.getPrinter().countFieldsToPrint(PERIOD, Integer.MAX_VALUE, null));
549        }
550    
551        public void testFormatAppendFormatter() {
552            PeriodFormatter base = builder.appendYears().appendLiteral("-").toFormatter();
553            PeriodFormatter f = new PeriodFormatterBuilder().append(base).appendYears().toFormatter();
554            assertEquals("1-1", f.print(PERIOD));
555            assertEquals(3, f.getPrinter().calculatePrintedLength(PERIOD, null));
556            assertEquals(2, f.getPrinter().countFieldsToPrint(PERIOD, Integer.MAX_VALUE, null));
557        }
558    
559        public void testFormatMinDigits() {
560            PeriodFormatter f = new PeriodFormatterBuilder().minimumPrintedDigits(4).appendYears().toFormatter();
561            assertEquals("0001", f.print(PERIOD));
562            assertEquals(4, f.getPrinter().calculatePrintedLength(PERIOD, null));
563            assertEquals(1, f.getPrinter().countFieldsToPrint(PERIOD, Integer.MAX_VALUE, null));
564        }
565    
566        //-----------------------------------------------------------------------
567        public void testFormatPrintZeroDefault() {
568            PeriodFormatter f =
569                new PeriodFormatterBuilder()
570                    .appendYears().appendLiteral("-")
571                    .appendMonths().appendLiteral("-")
572                    .appendWeeks().appendLiteral("-")
573                    .appendDays().toFormatter();
574            assertEquals("1-2-3-4", f.print(PERIOD));
575            assertEquals(7, f.getPrinter().calculatePrintedLength(PERIOD, null));
576            assertEquals(4, f.getPrinter().countFieldsToPrint(PERIOD, Integer.MAX_VALUE, null));
577            
578            assertEquals("---0", f.print(EMPTY_YEAR_DAY_PERIOD));
579            assertEquals(4, f.getPrinter().calculatePrintedLength(EMPTY_YEAR_DAY_PERIOD, null));
580            assertEquals(1, f.getPrinter().countFieldsToPrint(EMPTY_YEAR_DAY_PERIOD, Integer.MAX_VALUE, null));
581            
582            assertEquals("1---4", f.print(YEAR_DAY_PERIOD));
583            assertEquals(5, f.getPrinter().calculatePrintedLength(YEAR_DAY_PERIOD, null));
584            assertEquals(2, f.getPrinter().countFieldsToPrint(YEAR_DAY_PERIOD, Integer.MAX_VALUE, null));
585            
586            assertEquals("---0", f.print(EMPTY_PERIOD));
587            assertEquals(4, f.getPrinter().calculatePrintedLength(EMPTY_PERIOD, null));
588            assertEquals(1, f.getPrinter().countFieldsToPrint(EMPTY_PERIOD, Integer.MAX_VALUE, null));
589            
590            // test only last instance of same field is output
591            f = new PeriodFormatterBuilder()
592                    .appendYears().appendLiteral("-")
593                    .appendYears().toFormatter();
594            assertEquals("-0", f.print(EMPTY_PERIOD));
595            assertEquals(2, f.getPrinter().calculatePrintedLength(EMPTY_PERIOD, null));
596            assertEquals(1, f.getPrinter().countFieldsToPrint(EMPTY_PERIOD, Integer.MAX_VALUE, null));
597        }
598    
599        public void testFormatPrintZeroRarelyLast() {
600            PeriodFormatter f =
601                new PeriodFormatterBuilder()
602                    .printZeroRarelyLast()
603                    .appendYears().appendLiteral("-")
604                    .appendMonths().appendLiteral("-")
605                    .appendWeeks().appendLiteral("-")
606                    .appendDays().toFormatter();
607            assertEquals("1-2-3-4", f.print(PERIOD));
608            assertEquals(7, f.getPrinter().calculatePrintedLength(PERIOD, null));
609            assertEquals(4, f.getPrinter().countFieldsToPrint(PERIOD, Integer.MAX_VALUE, null));
610            
611            assertEquals("---0", f.print(EMPTY_YEAR_DAY_PERIOD));
612            assertEquals(4, f.getPrinter().calculatePrintedLength(EMPTY_YEAR_DAY_PERIOD, null));
613            assertEquals(1, f.getPrinter().countFieldsToPrint(EMPTY_YEAR_DAY_PERIOD, Integer.MAX_VALUE, null));
614            
615            assertEquals("1---4", f.print(YEAR_DAY_PERIOD));
616            assertEquals(5, f.getPrinter().calculatePrintedLength(YEAR_DAY_PERIOD, null));
617            assertEquals(2, f.getPrinter().countFieldsToPrint(YEAR_DAY_PERIOD, Integer.MAX_VALUE, null));
618            
619            assertEquals("---0", f.print(EMPTY_PERIOD));
620            assertEquals(4, f.getPrinter().calculatePrintedLength(EMPTY_PERIOD, null));
621            assertEquals(1, f.getPrinter().countFieldsToPrint(EMPTY_PERIOD, Integer.MAX_VALUE, null));
622        }
623    
624        public void testFormatPrintZeroRarelyFirst() {
625            PeriodFormatter f =
626                new PeriodFormatterBuilder()
627                    .printZeroRarelyFirst()
628                    .appendYears().appendLiteral("-")
629                    .appendMonths().appendLiteral("-")
630                    .appendWeeks().appendLiteral("-")
631                    .appendDays().toFormatter();
632            assertEquals("1-2-3-4", f.print(PERIOD));
633            assertEquals(7, f.getPrinter().calculatePrintedLength(PERIOD, null));
634            assertEquals(4, f.getPrinter().countFieldsToPrint(PERIOD, Integer.MAX_VALUE, null));
635            
636            assertEquals("0---", f.print(EMPTY_YEAR_DAY_PERIOD));
637            assertEquals(4, f.getPrinter().calculatePrintedLength(EMPTY_YEAR_DAY_PERIOD, null));
638            assertEquals(1, f.getPrinter().countFieldsToPrint(EMPTY_YEAR_DAY_PERIOD, Integer.MAX_VALUE, null));
639            
640            assertEquals("1---4", f.print(YEAR_DAY_PERIOD));
641            assertEquals(5, f.getPrinter().calculatePrintedLength(YEAR_DAY_PERIOD, null));
642            assertEquals(2, f.getPrinter().countFieldsToPrint(YEAR_DAY_PERIOD, Integer.MAX_VALUE, null));
643            
644            assertEquals("0---", f.print(EMPTY_PERIOD));
645            assertEquals(4, f.getPrinter().calculatePrintedLength(EMPTY_PERIOD, null));
646            assertEquals(1, f.getPrinter().countFieldsToPrint(EMPTY_PERIOD, Integer.MAX_VALUE, null));
647        }
648    
649        public void testFormatPrintZeroRarelyFirstYears() {
650            PeriodFormatter f = new PeriodFormatterBuilder()
651                .printZeroRarelyFirst()
652                .appendYears().toFormatter();
653            assertEquals("0", f.print(EMPTY_PERIOD));
654        }
655    
656        public void testFormatPrintZeroRarelyFirstMonths() {
657            PeriodFormatter f = new PeriodFormatterBuilder()
658                .printZeroRarelyFirst()
659                .appendMonths().toFormatter();
660            assertEquals("0", f.print(EMPTY_PERIOD));
661        }
662    
663        public void testFormatPrintZeroRarelyFirstWeeks() {
664            PeriodFormatter f = new PeriodFormatterBuilder()
665                .printZeroRarelyFirst()
666                .appendWeeks().toFormatter();
667            assertEquals("0", f.print(EMPTY_PERIOD));
668        }
669    
670        public void testFormatPrintZeroRarelyFirstDays() {
671            PeriodFormatter f = new PeriodFormatterBuilder()
672                .printZeroRarelyFirst()
673                .appendDays().toFormatter();
674            assertEquals("0", f.print(EMPTY_PERIOD));
675        }
676    
677        public void testFormatPrintZeroRarelyFirstHours() {
678            PeriodFormatter f = new PeriodFormatterBuilder()
679                .printZeroRarelyFirst()
680                .appendHours().toFormatter();
681            assertEquals("0", f.print(EMPTY_PERIOD));
682        }
683    
684        public void testFormatPrintZeroRarelyFirstMinutes() {
685            PeriodFormatter f = new PeriodFormatterBuilder()
686                .printZeroRarelyFirst()
687                .appendMinutes().toFormatter();
688            assertEquals("0", f.print(EMPTY_PERIOD));
689        }
690    
691        public void testFormatPrintZeroRarelyFirstSeconds() {
692            PeriodFormatter f = new PeriodFormatterBuilder()
693                .printZeroRarelyFirst()
694                .appendSeconds().toFormatter();
695            assertEquals("0", f.print(EMPTY_PERIOD));
696        }
697    
698        public void testFormatPrintZeroIfSupported() {
699            PeriodFormatter f =
700                new PeriodFormatterBuilder()
701                    .printZeroIfSupported()
702                    .appendYears().appendLiteral("-")
703                    .appendMonths().appendLiteral("-")
704                    .appendWeeks().appendLiteral("-")
705                    .appendDays().toFormatter();
706            assertEquals("1-2-3-4", f.print(PERIOD));
707            assertEquals(7, f.getPrinter().calculatePrintedLength(PERIOD, null));
708            assertEquals(4, f.getPrinter().countFieldsToPrint(PERIOD, Integer.MAX_VALUE, null));
709            
710            assertEquals("0---0", f.print(EMPTY_YEAR_DAY_PERIOD));
711            assertEquals(5, f.getPrinter().calculatePrintedLength(EMPTY_YEAR_DAY_PERIOD, null));
712            assertEquals(2, f.getPrinter().countFieldsToPrint(EMPTY_YEAR_DAY_PERIOD, Integer.MAX_VALUE, null));
713            
714            assertEquals("1---4", f.print(YEAR_DAY_PERIOD));
715            assertEquals(5, f.getPrinter().calculatePrintedLength(YEAR_DAY_PERIOD, null));
716            assertEquals(2, f.getPrinter().countFieldsToPrint(YEAR_DAY_PERIOD, Integer.MAX_VALUE, null));
717            
718            assertEquals("0-0-0-0", f.print(EMPTY_PERIOD));
719            assertEquals(7, f.getPrinter().calculatePrintedLength(EMPTY_PERIOD, null));
720            assertEquals(4, f.getPrinter().countFieldsToPrint(EMPTY_PERIOD, Integer.MAX_VALUE, null));
721        }
722    
723        public void testFormatPrintZeroAlways() {
724            PeriodFormatter f =
725                new PeriodFormatterBuilder()
726                    .printZeroAlways()
727                    .appendYears().appendLiteral("-")
728                    .appendMonths().appendLiteral("-")
729                    .appendWeeks().appendLiteral("-")
730                    .appendDays().toFormatter();
731            assertEquals("1-2-3-4", f.print(PERIOD));
732            assertEquals(7, f.getPrinter().calculatePrintedLength(PERIOD, null));
733            assertEquals(4, f.getPrinter().countFieldsToPrint(PERIOD, Integer.MAX_VALUE, null));
734            
735            assertEquals("0-0-0-0", f.print(EMPTY_YEAR_DAY_PERIOD));
736            assertEquals(7, f.getPrinter().calculatePrintedLength(EMPTY_YEAR_DAY_PERIOD, null));
737            assertEquals(4, f.getPrinter().countFieldsToPrint(EMPTY_YEAR_DAY_PERIOD, Integer.MAX_VALUE, null));
738            
739            assertEquals("1-0-0-4", f.print(YEAR_DAY_PERIOD));
740            assertEquals(7, f.getPrinter().calculatePrintedLength(YEAR_DAY_PERIOD, null));
741            assertEquals(4, f.getPrinter().countFieldsToPrint(YEAR_DAY_PERIOD, Integer.MAX_VALUE, null));
742            
743            assertEquals("0-0-0-0", f.print(EMPTY_PERIOD));
744            assertEquals(7, f.getPrinter().calculatePrintedLength(EMPTY_PERIOD, null));
745            assertEquals(4, f.getPrinter().countFieldsToPrint(EMPTY_PERIOD, Integer.MAX_VALUE, null));
746        }
747    
748        public void testFormatPrintZeroNever() {
749            PeriodFormatter f =
750                new PeriodFormatterBuilder()
751                    .printZeroNever()
752                    .appendYears().appendLiteral("-")
753                    .appendMonths().appendLiteral("-")
754                    .appendWeeks().appendLiteral("-")
755                    .appendDays().toFormatter();
756            assertEquals("1-2-3-4", f.print(PERIOD));
757            assertEquals(7, f.getPrinter().calculatePrintedLength(PERIOD, null));
758            assertEquals(4, f.getPrinter().countFieldsToPrint(PERIOD, Integer.MAX_VALUE, null));
759            
760            assertEquals("---", f.print(EMPTY_YEAR_DAY_PERIOD));
761            assertEquals(3, f.getPrinter().calculatePrintedLength(EMPTY_YEAR_DAY_PERIOD, null));
762            assertEquals(0, f.getPrinter().countFieldsToPrint(EMPTY_YEAR_DAY_PERIOD, Integer.MAX_VALUE, null));
763            
764            assertEquals("1---4", f.print(YEAR_DAY_PERIOD));
765            assertEquals(5, f.getPrinter().calculatePrintedLength(YEAR_DAY_PERIOD, null));
766            assertEquals(2, f.getPrinter().countFieldsToPrint(YEAR_DAY_PERIOD, Integer.MAX_VALUE, null));
767            
768            assertEquals("---", f.print(EMPTY_PERIOD));
769            assertEquals(3, f.getPrinter().calculatePrintedLength(EMPTY_PERIOD, null));
770            assertEquals(0, f.getPrinter().countFieldsToPrint(EMPTY_PERIOD, Integer.MAX_VALUE, null));
771        }
772    
773        //-----------------------------------------------------------------------
774        public void testFormatAppend_PrinterParser_null_null() {
775            try {
776                new PeriodFormatterBuilder().append(null, null);
777                fail();
778            } catch (IllegalArgumentException ex) {}
779        }
780    
781        public void testFormatAppend_PrinterParser_Printer_null() {
782            PeriodPrinter printer = new PeriodFormatterBuilder().appendYears().appendLiteral("-").toPrinter();
783            PeriodFormatterBuilder bld = new PeriodFormatterBuilder().append(printer, null).appendMonths();
784            assertNotNull(bld.toPrinter());
785            assertNull(bld.toParser());
786            
787            PeriodFormatter f = bld.toFormatter();
788            assertEquals("1-2", f.print(PERIOD));
789            try {
790                f.parsePeriod("1-2");
791                fail();
792            } catch (UnsupportedOperationException ex) {}
793        }
794    
795        public void testFormatAppend_PrinterParser_null_Parser() {
796            PeriodParser parser = new PeriodFormatterBuilder().appendWeeks().appendLiteral("-").toParser();
797            PeriodFormatterBuilder bld = new PeriodFormatterBuilder().append(null, parser).appendMonths();
798            assertNull(bld.toPrinter());
799            assertNotNull(bld.toParser());
800            
801            PeriodFormatter f = bld.toFormatter();
802            try {
803                f.print(PERIOD);
804                fail();
805            } catch (UnsupportedOperationException ex) {}
806            assertEquals(new Period(0, 2, 1, 0, 0, 0, 0, 0), f.parsePeriod("1-2"));
807        }
808    
809        public void testFormatAppend_PrinterParser_PrinterParser() {
810            PeriodPrinter printer = new PeriodFormatterBuilder().appendYears().appendLiteral("-").toPrinter();
811            PeriodParser parser = new PeriodFormatterBuilder().appendWeeks().appendLiteral("-").toParser();
812            PeriodFormatterBuilder bld = new PeriodFormatterBuilder().append(printer, parser).appendMonths();
813            assertNotNull(bld.toPrinter());
814            assertNotNull(bld.toParser());
815            
816            PeriodFormatter f = bld.toFormatter();
817            assertEquals("1-2", f.print(PERIOD));
818            assertEquals(new Period(0, 2, 1, 0, 0, 0, 0, 0), f.parsePeriod("1-2"));
819        }
820    
821        public void testFormatAppend_PrinterParser_Printer_null_null_Parser() {
822            PeriodPrinter printer = new PeriodFormatterBuilder().appendYears().appendLiteral("-").toPrinter();
823            PeriodParser parser = new PeriodFormatterBuilder().appendWeeks().appendLiteral("-").toParser();
824            PeriodFormatterBuilder bld = new PeriodFormatterBuilder().append(printer, null).append(null, parser);
825            assertNull(bld.toPrinter());
826            assertNull(bld.toParser());
827            
828            try {
829                bld.toFormatter();
830                fail();
831            } catch (IllegalStateException ex) {}
832        }
833    
834        public void testFormatAppend_PrinterParserThenClear() {
835            PeriodPrinter printer = new PeriodFormatterBuilder().appendYears().appendLiteral("-").toPrinter();
836            PeriodParser parser = new PeriodFormatterBuilder().appendWeeks().appendLiteral("-").toParser();
837            PeriodFormatterBuilder bld = new PeriodFormatterBuilder().append(printer, null).append(null, parser);
838            assertNull(bld.toPrinter());
839            assertNull(bld.toParser());
840            bld.clear();
841            bld.appendMonths();
842            assertNotNull(bld.toPrinter());
843            assertNotNull(bld.toParser());
844        }
845    
846        public void testBug2495455() {
847            PeriodFormatter pfmt1 = new PeriodFormatterBuilder()
848                .appendLiteral("P")
849                .appendYears()
850                .appendSuffix("Y")
851                .appendMonths()
852                .appendSuffix("M")
853                .appendWeeks()
854                .appendSuffix("W")
855                .appendDays()
856                .appendSuffix("D")
857                .appendSeparatorIfFieldsAfter("T")
858                .appendHours()
859                .appendSuffix("H")
860                .appendMinutes()
861                .appendSuffix("M")
862                .appendSecondsWithOptionalMillis()
863                .appendSuffix("S")
864                .toFormatter();
865            PeriodFormatter pfmt2 = new PeriodFormatterBuilder()
866                .append(ISOPeriodFormat.standard())
867                .toFormatter();
868            pfmt1.parsePeriod("PT1003199059S");
869            pfmt2.parsePeriod("PT1003199059S");
870        }
871    
872    }