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