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 }