001 /*
002 * Copyright 2001-2005 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.field;
017
018 import java.util.Arrays;
019 import java.util.Locale;
020
021 import junit.framework.TestCase;
022 import junit.framework.TestSuite;
023
024 import org.joda.time.Chronology;
025 import org.joda.time.DateTimeField;
026 import org.joda.time.DateTimeFieldType;
027 import org.joda.time.DurationField;
028 import org.joda.time.DurationFieldType;
029 import org.joda.time.TimeOfDay;
030 import org.joda.time.base.BasePartial;
031 import org.joda.time.chrono.ISOChronology;
032
033 /**
034 * This class is a Junit unit test for BaseDateTimeField.
035 *
036 * @author Stephen Colebourne
037 */
038 public class TestBaseDateTimeField extends TestCase {
039
040 public static void main(String[] args) {
041 junit.textui.TestRunner.run(suite());
042 }
043
044 public static TestSuite suite() {
045 return new TestSuite(TestBaseDateTimeField.class);
046 }
047
048 public TestBaseDateTimeField(String name) {
049 super(name);
050 }
051
052 protected void setUp() throws Exception {
053 }
054
055 protected void tearDown() throws Exception {
056 }
057
058 //-----------------------------------------------------------------------
059 public void test_constructor() {
060 BaseDateTimeField field = new MockBaseDateTimeField();
061 assertEquals(DateTimeFieldType.secondOfMinute(), field.getType());
062 try {
063 field = new MockBaseDateTimeField(null);
064 fail();
065 } catch (IllegalArgumentException ex) {}
066 }
067
068 public void test_getType() {
069 BaseDateTimeField field = new MockBaseDateTimeField(DateTimeFieldType.secondOfDay());
070 assertEquals(DateTimeFieldType.secondOfDay(), field.getType());
071 }
072
073 public void test_getName() {
074 BaseDateTimeField field = new MockBaseDateTimeField(DateTimeFieldType.secondOfDay());
075 assertEquals("secondOfDay", field.getName());
076 }
077
078 public void test_toString() {
079 BaseDateTimeField field = new MockBaseDateTimeField(DateTimeFieldType.secondOfDay());
080 assertEquals("DateTimeField[secondOfDay]", field.toString());
081 }
082
083 public void test_isSupported() {
084 BaseDateTimeField field = new MockBaseDateTimeField();
085 assertEquals(true, field.isSupported());
086 }
087
088 public void test_get() {
089 BaseDateTimeField field = new MockBaseDateTimeField();
090 assertEquals(0, field.get(0));
091 assertEquals(1, field.get(60));
092 assertEquals(2, field.get(123));
093 }
094
095 //-----------------------------------------------------------------------
096 public void test_getAsText_long_Locale() {
097 BaseDateTimeField field = new MockBaseDateTimeField();
098 assertEquals("29", field.getAsText(60L * 29, Locale.ENGLISH));
099 assertEquals("29", field.getAsText(60L * 29, null));
100 }
101
102 public void test_getAsText_long() {
103 BaseDateTimeField field = new MockBaseDateTimeField();
104 assertEquals("29", field.getAsText(60L * 29));
105 }
106
107 public void test_getAsText_RP_int_Locale() {
108 BaseDateTimeField field = new MockBaseDateTimeField();
109 assertEquals("20", field.getAsText(new TimeOfDay(12, 30, 40, 50), 20, Locale.ENGLISH));
110 assertEquals("20", field.getAsText(new TimeOfDay(12, 30, 40, 50), 20, null));
111 }
112
113 public void test_getAsText_RP_Locale() {
114 BaseDateTimeField field = new MockBaseDateTimeField();
115 assertEquals("40", field.getAsText(new TimeOfDay(12, 30, 40, 50), Locale.ENGLISH));
116 assertEquals("40", field.getAsText(new TimeOfDay(12, 30, 40, 50), null));
117 }
118
119 public void test_getAsText_int_Locale() {
120 BaseDateTimeField field = new MockBaseDateTimeField();
121 assertEquals("80", field.getAsText(80, Locale.ENGLISH));
122 assertEquals("80", field.getAsText(80, null));
123 }
124
125 //-----------------------------------------------------------------------
126 public void test_getAsShortText_long_Locale() {
127 BaseDateTimeField field = new MockBaseDateTimeField();
128 assertEquals("29", field.getAsShortText(60L * 29, Locale.ENGLISH));
129 assertEquals("29", field.getAsShortText(60L * 29, null));
130 }
131
132 public void test_getAsShortText_long() {
133 BaseDateTimeField field = new MockBaseDateTimeField();
134 assertEquals("29", field.getAsShortText(60L * 29));
135 }
136
137 public void test_getAsShortText_RP_int_Locale() {
138 BaseDateTimeField field = new MockBaseDateTimeField();
139 assertEquals("20", field.getAsShortText(new TimeOfDay(12, 30, 40, 50), 20, Locale.ENGLISH));
140 assertEquals("20", field.getAsShortText(new TimeOfDay(12, 30, 40, 50), 20, null));
141 }
142
143 public void test_getAsShortText_RP_Locale() {
144 BaseDateTimeField field = new MockBaseDateTimeField();
145 assertEquals("40", field.getAsShortText(new TimeOfDay(12, 30, 40, 50), Locale.ENGLISH));
146 assertEquals("40", field.getAsShortText(new TimeOfDay(12, 30, 40, 50), null));
147 }
148
149 public void test_getAsShortText_int_Locale() {
150 BaseDateTimeField field = new MockBaseDateTimeField();
151 assertEquals("80", field.getAsShortText(80, Locale.ENGLISH));
152 assertEquals("80", field.getAsShortText(80, null));
153 }
154
155 //-----------------------------------------------------------------------
156 public void test_add_long_int() {
157 MockCountingDurationField.add_int = 0;
158 BaseDateTimeField field = new MockBaseDateTimeField();
159 assertEquals(61, field.add(1L, 1));
160 assertEquals(1, MockCountingDurationField.add_int);
161 }
162
163 public void test_add_long_long() {
164 MockCountingDurationField.add_long = 0;
165 BaseDateTimeField field = new MockBaseDateTimeField();
166 assertEquals(61, field.add(1L, 1L));
167 assertEquals(1, MockCountingDurationField.add_long);
168 }
169
170 public void test_add_RP_int_intarray_int() {
171 int[] values = new int[] {10, 20, 30, 40};
172 int[] expected = new int[] {10, 20, 30, 40};
173 BaseDateTimeField field = new MockStandardBaseDateTimeField();
174 int[] result = field.add(new TimeOfDay(), 2, values, 0);
175 assertEquals(true, Arrays.equals(expected, result));
176
177 values = new int[] {10, 20, 30, 40};
178 expected = new int[] {10, 20, 31, 40};
179 result = field.add(new TimeOfDay(), 2, values, 1);
180 assertEquals(true, Arrays.equals(expected, result));
181
182 values = new int[] {10, 20, 30, 40};
183 expected = new int[] {10, 21, 0, 40};
184 result = field.add(new TimeOfDay(), 2, values, 30);
185 assertEquals(true, Arrays.equals(expected, result));
186
187 values = new int[] {23, 59, 30, 40};
188 try {
189 field.add(new TimeOfDay(), 2, values, 30);
190 fail();
191 } catch (IllegalArgumentException ex) {}
192
193 values = new int[] {10, 20, 30, 40};
194 expected = new int[] {10, 20, 29, 40};
195 result = field.add(new TimeOfDay(), 2, values, -1);
196 assertEquals(true, Arrays.equals(expected, result));
197
198 values = new int[] {10, 20, 30, 40};
199 expected = new int[] {10, 19, 59, 40};
200 result = field.add(new TimeOfDay(), 2, values, -31);
201 assertEquals(true, Arrays.equals(expected, result));
202
203 values = new int[] {0, 0, 30, 40};
204 try {
205 field.add(new TimeOfDay(), 2, values, -31);
206 fail();
207 } catch (IllegalArgumentException ex) {}
208
209 values = new int[] {0, 0};
210 try {
211 field.add(new MockPartial(), 0, values, 1000);
212 fail();
213 } catch (IllegalArgumentException ex) {}
214
215 values = new int[] {1, 0};
216 try {
217 field.add(new MockPartial(), 0, values, -1000);
218 fail();
219 } catch (IllegalArgumentException ex) {}
220 }
221
222 //-----------------------------------------------------------------------
223 public void test_addWrapField_long_int() {
224 BaseDateTimeField field = new MockBaseDateTimeField();
225 assertEquals(1029, field.addWrapField(60L * 29, 0));
226 assertEquals(1059, field.addWrapField(60L * 29, 30));
227 assertEquals(1000, field.addWrapField(60L * 29, 31));
228 }
229
230 public void test_addWrapField_RP_int_intarray_int() {
231 BaseDateTimeField field = new MockBaseDateTimeField();
232 int[] values = new int[] {10, 20, 30, 40};
233 int[] expected = new int[] {10, 20, 30, 40};
234 int[] result = field.addWrapField(new TimeOfDay(), 2, values, 0);
235 assertEquals(true, Arrays.equals(result, expected));
236
237 values = new int[] {10, 20, 30, 40};
238 expected = new int[] {10, 20, 59, 40};
239 result = field.addWrapField(new TimeOfDay(), 2, values, 29);
240 assertEquals(true, Arrays.equals(result, expected));
241
242 values = new int[] {10, 20, 30, 40};
243 expected = new int[] {10, 20, 0, 40};
244 result = field.addWrapField(new TimeOfDay(), 2, values, 30);
245 assertEquals(true, Arrays.equals(result, expected));
246
247 values = new int[] {10, 20, 30, 40};
248 expected = new int[] {10, 20, 1, 40};
249 result = field.addWrapField(new TimeOfDay(), 2, values, 31);
250 assertEquals(true, Arrays.equals(result, expected));
251 }
252
253 //-----------------------------------------------------------------------
254 public void test_getDifference_long_long() {
255 MockCountingDurationField.difference_long = 0;
256 BaseDateTimeField field = new MockBaseDateTimeField();
257 assertEquals(30, field.getDifference(0L, 0L));
258 assertEquals(1, MockCountingDurationField.difference_long);
259 }
260
261 public void test_getDifferenceAsLong_long_long() {
262 MockCountingDurationField.difference_long = 0;
263 BaseDateTimeField field = new MockBaseDateTimeField();
264 assertEquals(30, field.getDifferenceAsLong(0L, 0L));
265 assertEquals(1, MockCountingDurationField.difference_long);
266 }
267
268 //-----------------------------------------------------------------------
269 public void test_set_long_int() {
270 BaseDateTimeField field = new MockBaseDateTimeField();
271 assertEquals(1000, field.set(0L, 0));
272 assertEquals(1029, field.set(0L, 29));
273 }
274
275 public void test_set_RP_int_intarray_int() {
276 BaseDateTimeField field = new MockBaseDateTimeField();
277 int[] values = new int[] {10, 20, 30, 40};
278 int[] expected = new int[] {10, 20, 30, 40};
279 int[] result = field.set(new TimeOfDay(), 2, values, 30);
280 assertEquals(true, Arrays.equals(result, expected));
281
282 values = new int[] {10, 20, 30, 40};
283 expected = new int[] {10, 20, 29, 40};
284 result = field.set(new TimeOfDay(), 2, values, 29);
285 assertEquals(true, Arrays.equals(result, expected));
286
287 values = new int[] {10, 20, 30, 40};
288 expected = new int[] {10, 20, 30, 40};
289 try {
290 field.set(new TimeOfDay(), 2, values, 60);
291 fail();
292 } catch (IllegalArgumentException ex) {}
293 assertEquals(true, Arrays.equals(values, expected));
294
295 values = new int[] {10, 20, 30, 40};
296 expected = new int[] {10, 20, 30, 40};
297 try {
298 field.set(new TimeOfDay(), 2, values, -1);
299 fail();
300 } catch (IllegalArgumentException ex) {}
301 assertEquals(true, Arrays.equals(values, expected));
302 }
303
304 public void test_set_long_String_Locale() {
305 BaseDateTimeField field = new MockBaseDateTimeField();
306 assertEquals(1000, field.set(0L, "0", null));
307 assertEquals(1029, field.set(0L, "29", Locale.ENGLISH));
308 }
309
310 public void test_set_long_String() {
311 BaseDateTimeField field = new MockBaseDateTimeField();
312 assertEquals(1000, field.set(0L, "0"));
313 assertEquals(1029, field.set(0L, "29"));
314 }
315
316 public void test_set_RP_int_intarray_String_Locale() {
317 BaseDateTimeField field = new MockBaseDateTimeField();
318 int[] values = new int[] {10, 20, 30, 40};
319 int[] expected = new int[] {10, 20, 30, 40};
320 int[] result = field.set(new TimeOfDay(), 2, values, "30", null);
321 assertEquals(true, Arrays.equals(result, expected));
322
323 values = new int[] {10, 20, 30, 40};
324 expected = new int[] {10, 20, 29, 40};
325 result = field.set(new TimeOfDay(), 2, values, "29", Locale.ENGLISH);
326 assertEquals(true, Arrays.equals(result, expected));
327
328 values = new int[] {10, 20, 30, 40};
329 expected = new int[] {10, 20, 30, 40};
330 try {
331 field.set(new TimeOfDay(), 2, values, "60", null);
332 fail();
333 } catch (IllegalArgumentException ex) {}
334 assertEquals(true, Arrays.equals(values, expected));
335
336 values = new int[] {10, 20, 30, 40};
337 expected = new int[] {10, 20, 30, 40};
338 try {
339 field.set(new TimeOfDay(), 2, values, "-1", null);
340 fail();
341 } catch (IllegalArgumentException ex) {}
342 assertEquals(true, Arrays.equals(values, expected));
343 }
344
345 public void test_convertText() {
346 BaseDateTimeField field = new MockBaseDateTimeField();
347 assertEquals(0, field.convertText("0", null));
348 assertEquals(29, field.convertText("29", null));
349 try {
350 field.convertText("2A", null);
351 fail();
352 } catch (IllegalArgumentException ex) {}
353 try {
354 field.convertText(null, null);
355 fail();
356 } catch (IllegalArgumentException ex) {}
357 }
358
359 //------------------------------------------------------------------------
360 // public abstract DurationField getDurationField();
361 //
362 // public abstract DurationField getRangeDurationField();
363
364 public void test_isLeap_long() {
365 BaseDateTimeField field = new MockBaseDateTimeField();
366 assertEquals(false, field.isLeap(0L));
367 }
368
369 public void test_getLeapAmount_long() {
370 BaseDateTimeField field = new MockBaseDateTimeField();
371 assertEquals(0, field.getLeapAmount(0L));
372 }
373
374 public void test_getLeapDurationField() {
375 BaseDateTimeField field = new MockBaseDateTimeField();
376 assertEquals(null, field.getLeapDurationField());
377 }
378
379 //-----------------------------------------------------------------------
380 public void test_getMinimumValue() {
381 BaseDateTimeField field = new MockBaseDateTimeField();
382 assertEquals(0, field.getMinimumValue());
383 }
384
385 public void test_getMinimumValue_long() {
386 BaseDateTimeField field = new MockBaseDateTimeField();
387 assertEquals(0, field.getMinimumValue(0L));
388 }
389
390 public void test_getMinimumValue_RP() {
391 BaseDateTimeField field = new MockBaseDateTimeField();
392 assertEquals(0, field.getMinimumValue(new TimeOfDay()));
393 }
394
395 public void test_getMinimumValue_RP_intarray() {
396 BaseDateTimeField field = new MockBaseDateTimeField();
397 assertEquals(0, field.getMinimumValue(new TimeOfDay(), new int[4]));
398 }
399
400 public void test_getMaximumValue() {
401 BaseDateTimeField field = new MockBaseDateTimeField();
402 assertEquals(59, field.getMaximumValue());
403 }
404
405 public void test_getMaximumValue_long() {
406 BaseDateTimeField field = new MockBaseDateTimeField();
407 assertEquals(59, field.getMaximumValue(0L));
408 }
409
410 public void test_getMaximumValue_RP() {
411 BaseDateTimeField field = new MockBaseDateTimeField();
412 assertEquals(59, field.getMaximumValue(new TimeOfDay()));
413 }
414
415 public void test_getMaximumValue_RP_intarray() {
416 BaseDateTimeField field = new MockBaseDateTimeField();
417 assertEquals(59, field.getMaximumValue(new TimeOfDay(), new int[4]));
418 }
419
420 //-----------------------------------------------------------------------
421 public void test_getMaximumTextLength_Locale() {
422 BaseDateTimeField field = new MockBaseDateTimeField();
423 assertEquals(2, field.getMaximumTextLength(Locale.ENGLISH));
424
425 field = new MockBaseDateTimeField() {
426 public int getMaximumValue() {
427 return 5;
428 }
429 };
430 assertEquals(1, field.getMaximumTextLength(Locale.ENGLISH));
431
432 field = new MockBaseDateTimeField() {
433 public int getMaximumValue() {
434 return 555;
435 }
436 };
437 assertEquals(3, field.getMaximumTextLength(Locale.ENGLISH));
438
439 field = new MockBaseDateTimeField() {
440 public int getMaximumValue() {
441 return 5555;
442 }
443 };
444 assertEquals(4, field.getMaximumTextLength(Locale.ENGLISH));
445
446 field = new MockBaseDateTimeField() {
447 public int getMaximumValue() {
448 return -1;
449 }
450 };
451 assertEquals(2, field.getMaximumTextLength(Locale.ENGLISH));
452 }
453
454 public void test_getMaximumShortTextLength_Locale() {
455 BaseDateTimeField field = new MockBaseDateTimeField();
456 assertEquals(2, field.getMaximumShortTextLength(Locale.ENGLISH));
457 }
458
459 //------------------------------------------------------------------------
460 public void test_roundFloor_long() {
461 BaseDateTimeField field = new MockBaseDateTimeField();
462 assertEquals(0L, field.roundFloor(0L));
463 assertEquals(0L, field.roundFloor(29L));
464 assertEquals(0L, field.roundFloor(30L));
465 assertEquals(0L, field.roundFloor(31L));
466 assertEquals(60L, field.roundFloor(60L));
467 }
468
469 public void test_roundCeiling_long() {
470 BaseDateTimeField field = new MockBaseDateTimeField();
471 assertEquals(0L, field.roundCeiling(0L));
472 assertEquals(60L, field.roundCeiling(29L));
473 assertEquals(60L, field.roundCeiling(30L));
474 assertEquals(60L, field.roundCeiling(31L));
475 assertEquals(60L, field.roundCeiling(60L));
476 }
477
478 public void test_roundHalfFloor_long() {
479 BaseDateTimeField field = new MockBaseDateTimeField();
480 assertEquals(0L, field.roundHalfFloor(0L));
481 assertEquals(0L, field.roundHalfFloor(29L));
482 assertEquals(0L, field.roundHalfFloor(30L));
483 assertEquals(60L, field.roundHalfFloor(31L));
484 assertEquals(60L, field.roundHalfFloor(60L));
485 }
486
487 public void test_roundHalfCeiling_long() {
488 BaseDateTimeField field = new MockBaseDateTimeField();
489 assertEquals(0L, field.roundHalfCeiling(0L));
490 assertEquals(0L, field.roundHalfCeiling(29L));
491 assertEquals(60L, field.roundHalfCeiling(30L));
492 assertEquals(60L, field.roundHalfCeiling(31L));
493 assertEquals(60L, field.roundHalfCeiling(60L));
494 }
495
496 public void test_roundHalfEven_long() {
497 BaseDateTimeField field = new MockBaseDateTimeField();
498 assertEquals(0L, field.roundHalfEven(0L));
499 assertEquals(0L, field.roundHalfEven(29L));
500 assertEquals(0L, field.roundHalfEven(30L));
501 assertEquals(60L, field.roundHalfEven(31L));
502 assertEquals(60L, field.roundHalfEven(60L));
503 assertEquals(60L, field.roundHalfEven(89L));
504 assertEquals(120L, field.roundHalfEven(90L));
505 assertEquals(120L, field.roundHalfEven(91L));
506 }
507
508 public void test_remainder_long() {
509 BaseDateTimeField field = new MockBaseDateTimeField();
510 assertEquals(0L, field.remainder(0L));
511 assertEquals(29L, field.remainder(29L));
512 assertEquals(30L, field.remainder(30L));
513 assertEquals(31L, field.remainder(31L));
514 assertEquals(0L, field.remainder(60L));
515 }
516
517 //-----------------------------------------------------------------------
518 static class MockBaseDateTimeField extends BaseDateTimeField {
519 protected MockBaseDateTimeField() {
520 super(DateTimeFieldType.secondOfMinute());
521 }
522 protected MockBaseDateTimeField(DateTimeFieldType type) {
523 super(type);
524 }
525 public int get(long instant) {
526 return (int) (instant / 60L);
527 }
528 public long set(long instant, int value) {
529 return 1000 + value;
530 }
531 public DurationField getDurationField() {
532 return new MockCountingDurationField(DurationFieldType.seconds());
533 }
534 public DurationField getRangeDurationField() {
535 return new MockCountingDurationField(DurationFieldType.minutes());
536 }
537 public int getMinimumValue() {
538 return 0;
539 }
540 public int getMaximumValue() {
541 return 59;
542 }
543 public long roundFloor(long instant) {
544 return (instant / 60L) * 60L;
545 }
546 public boolean isLenient() {
547 return false;
548 }
549 }
550
551 static class MockStandardBaseDateTimeField extends MockBaseDateTimeField {
552 protected MockStandardBaseDateTimeField() {
553 super();
554 }
555 public DurationField getDurationField() {
556 return ISOChronology.getInstanceUTC().seconds();
557 }
558 public DurationField getRangeDurationField() {
559 return ISOChronology.getInstanceUTC().minutes();
560 }
561 }
562
563 //-----------------------------------------------------------------------
564 static class MockCountingDurationField extends BaseDurationField {
565 static int add_int = 0;
566 static int add_long = 0;
567 static int difference_long = 0;
568
569 protected MockCountingDurationField(DurationFieldType type) {
570 super(type);
571 }
572 public boolean isPrecise() {
573 return false;
574 }
575 public long getUnitMillis() {
576 return 0;
577 }
578 public long getValueAsLong(long duration, long instant) {
579 return 0;
580 }
581 public long getMillis(int value, long instant) {
582 return 0;
583 }
584 public long getMillis(long value, long instant) {
585 return 0;
586 }
587 public long add(long instant, int value) {
588 add_int++;
589 return instant + (value * 60L);
590 }
591 public long add(long instant, long value) {
592 add_long++;
593 return instant + (value * 60L);
594 }
595 public long getDifferenceAsLong(long minuendInstant, long subtrahendInstant) {
596 difference_long++;
597 return 30;
598 }
599 }
600
601 static class MockPartial extends BasePartial {
602 protected DateTimeField getField(int index, Chronology chrono) {
603 if (index == 0) {
604 return ISOChronology.getInstanceUTC().minuteOfHour();
605 }
606 if (index == 1) {
607 return ISOChronology.getInstanceUTC().millisOfSecond();
608 }
609 return null;
610 }
611 public int size() {
612 return 2;
613 }
614
615 }
616 }