001    /*
002     *  Copyright 2001-2009 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;
017    
018    import java.io.ByteArrayInputStream;
019    import java.io.ByteArrayOutputStream;
020    import java.io.ObjectInputStream;
021    import java.io.ObjectOutputStream;
022    import java.util.Arrays;
023    import java.util.Locale;
024    
025    import junit.framework.TestCase;
026    import junit.framework.TestSuite;
027    
028    import org.joda.time.chrono.BuddhistChronology;
029    import org.joda.time.chrono.CopticChronology;
030    import org.joda.time.chrono.ISOChronology;
031    import org.joda.time.format.DateTimeFormat;
032    import org.joda.time.format.DateTimeFormatter;
033    
034    /**
035     * This class is a Junit unit test for Partial.
036     *
037     * @author Stephen Colebourne
038     */
039    public class TestPartial_Basics extends TestCase {
040    
041        private static final DateTimeZone PARIS = DateTimeZone.forID("Europe/Paris");
042        private static final DateTimeZone LONDON = DateTimeZone.forID("Europe/London");
043        private static final DateTimeZone TOKYO = DateTimeZone.forID("Asia/Tokyo");
044        private static final int OFFSET = 1;
045        private static final Chronology COPTIC_PARIS = CopticChronology.getInstance(PARIS);
046        private static final Chronology COPTIC_LONDON = CopticChronology.getInstance(LONDON);
047        private static final Chronology COPTIC_TOKYO = CopticChronology.getInstance(TOKYO);
048        private static final Chronology COPTIC_UTC = CopticChronology.getInstanceUTC();
049        private static final Chronology ISO_PARIS = ISOChronology.getInstance(PARIS);
050        private static final Chronology ISO_LONDON = ISOChronology.getInstance(LONDON);
051        private static final Chronology ISO_TOKYO = ISOChronology.getInstance(TOKYO);
052        private static final Chronology ISO_UTC = ISOChronology.getInstanceUTC();
053        private static final Chronology BUDDHIST_PARIS = BuddhistChronology.getInstance(PARIS);
054        private static final Chronology BUDDHIST_LONDON = BuddhistChronology.getInstance(LONDON);
055        private static final Chronology BUDDHIST_TOKYO = BuddhistChronology.getInstance(TOKYO);
056        private static final Chronology BUDDHIST_UTC = BuddhistChronology.getInstanceUTC();
057        
058        private long TEST_TIME_NOW =
059                10L * DateTimeConstants.MILLIS_PER_HOUR
060                + 20L * DateTimeConstants.MILLIS_PER_MINUTE
061                + 30L * DateTimeConstants.MILLIS_PER_SECOND
062                + 40L;
063                
064        private long TEST_TIME1 =
065            1L * DateTimeConstants.MILLIS_PER_HOUR
066            + 2L * DateTimeConstants.MILLIS_PER_MINUTE
067            + 3L * DateTimeConstants.MILLIS_PER_SECOND
068            + 4L;
069            
070        private long TEST_TIME2 =
071            1L * DateTimeConstants.MILLIS_PER_DAY
072            + 5L * DateTimeConstants.MILLIS_PER_HOUR
073            + 6L * DateTimeConstants.MILLIS_PER_MINUTE
074            + 7L * DateTimeConstants.MILLIS_PER_SECOND
075            + 8L;
076            
077        private DateTimeZone zone = null;
078    
079        public static void main(String[] args) {
080            junit.textui.TestRunner.run(suite());
081        }
082    
083        public static TestSuite suite() {
084            return new TestSuite(TestPartial_Basics.class);
085        }
086    
087        public TestPartial_Basics(String name) {
088            super(name);
089        }
090    
091        protected void setUp() throws Exception {
092            DateTimeUtils.setCurrentMillisFixed(TEST_TIME_NOW);
093            zone = DateTimeZone.getDefault();
094            DateTimeZone.setDefault(LONDON);
095        }
096    
097        protected void tearDown() throws Exception {
098            DateTimeUtils.setCurrentMillisSystem();
099            DateTimeZone.setDefault(zone);
100            zone = null;
101        }
102    
103        //-----------------------------------------------------------------------
104        public void testGet() {
105            Partial test = createHourMinPartial();
106            assertEquals(10, test.get(DateTimeFieldType.hourOfDay()));
107            assertEquals(20, test.get(DateTimeFieldType.minuteOfHour()));
108            try {
109                test.get(null);
110                fail();
111            } catch (IllegalArgumentException ex) {}
112            try {
113                test.get(DateTimeFieldType.secondOfMinute());
114                fail();
115            } catch (IllegalArgumentException ex) {}
116        }
117    
118        public void testSize() {
119            Partial test = createHourMinPartial();
120            assertEquals(2, test.size());
121        }
122    
123        public void testGetFieldType() {
124            Partial test = createHourMinPartial();
125            assertSame(DateTimeFieldType.hourOfDay(), test.getFieldType(0));
126            assertSame(DateTimeFieldType.minuteOfHour(), test.getFieldType(1));
127            try {
128                test.getFieldType(-1);
129            } catch (IndexOutOfBoundsException ex) {}
130            try {
131                test.getFieldType(2);
132            } catch (IndexOutOfBoundsException ex) {}
133        }
134    
135        public void testGetFieldTypes() {
136            Partial test = createHourMinPartial();
137            DateTimeFieldType[] fields = test.getFieldTypes();
138            assertEquals(2, fields.length);
139            assertSame(DateTimeFieldType.hourOfDay(), fields[0]);
140            assertSame(DateTimeFieldType.minuteOfHour(), fields[1]);
141            assertNotSame(test.getFieldTypes(), test.getFieldTypes());
142        }
143    
144        public void testGetField() {
145            Partial test = createHourMinPartial(COPTIC_PARIS);
146            assertSame(CopticChronology.getInstanceUTC().hourOfDay(), test.getField(0));
147            assertSame(CopticChronology.getInstanceUTC().minuteOfHour(), test.getField(1));
148            try {
149                test.getField(-1);
150            } catch (IndexOutOfBoundsException ex) {}
151            try {
152                test.getField(5);
153            } catch (IndexOutOfBoundsException ex) {}
154        }
155    
156        public void testGetFields() {
157            Partial test = createHourMinPartial(COPTIC_PARIS);
158            DateTimeField[] fields = test.getFields();
159            assertEquals(2, fields.length);
160            assertSame(CopticChronology.getInstanceUTC().hourOfDay(), fields[0]);
161            assertSame(CopticChronology.getInstanceUTC().minuteOfHour(), fields[1]);
162            assertNotSame(test.getFields(), test.getFields());
163        }
164    
165        public void testGetValue() {
166            Partial test = createHourMinPartial(COPTIC_PARIS);
167            assertEquals(10, test.getValue(0));
168            assertEquals(20, test.getValue(1));
169            try {
170                test.getValue(-1);
171            } catch (IndexOutOfBoundsException ex) {}
172            try {
173                test.getValue(2);
174            } catch (IndexOutOfBoundsException ex) {}
175        }
176    
177        public void testGetValues() {
178            Partial test = createHourMinPartial(COPTIC_PARIS);
179            int[] values = test.getValues();
180            assertEquals(2, values.length);
181            assertEquals(10, values[0]);
182            assertEquals(20, values[1]);
183            assertNotSame(test.getValues(), test.getValues());
184        }
185    
186        public void testIsSupported() {
187            Partial test = createHourMinPartial(COPTIC_PARIS);
188            assertEquals(true, test.isSupported(DateTimeFieldType.hourOfDay()));
189            assertEquals(true, test.isSupported(DateTimeFieldType.minuteOfHour()));
190            assertEquals(false, test.isSupported(DateTimeFieldType.secondOfMinute()));
191            assertEquals(false, test.isSupported(DateTimeFieldType.millisOfSecond()));
192            assertEquals(false, test.isSupported(DateTimeFieldType.dayOfMonth()));
193        }
194    
195        public void testEqualsHashCode() {
196            Partial test1 = createHourMinPartial(COPTIC_PARIS);
197            Partial test2 = createHourMinPartial(COPTIC_PARIS);
198            assertEquals(true, test1.equals(test2));
199            assertEquals(true, test2.equals(test1));
200            assertEquals(true, test1.equals(test1));
201            assertEquals(true, test2.equals(test2));
202            assertEquals(true, test1.hashCode() == test2.hashCode());
203            assertEquals(true, test1.hashCode() == test1.hashCode());
204            assertEquals(true, test2.hashCode() == test2.hashCode());
205            
206            Partial test3 = createHourMinPartial2(COPTIC_PARIS);
207            assertEquals(false, test1.equals(test3));
208            assertEquals(false, test2.equals(test3));
209            assertEquals(false, test3.equals(test1));
210            assertEquals(false, test3.equals(test2));
211            assertEquals(false, test1.hashCode() == test3.hashCode());
212            assertEquals(false, test2.hashCode() == test3.hashCode());
213            
214            assertEquals(false, test1.equals("Hello"));
215            assertEquals(false, test1.equals(MockPartial.EMPTY_INSTANCE));
216            assertEquals(new TimeOfDay(10, 20, 30, 40), createTODPartial(ISO_UTC));
217        }
218    
219        //-----------------------------------------------------------------------
220        public void testCompareTo() {
221            Partial test1 = createHourMinPartial();
222            Partial test1a = createHourMinPartial();
223            assertEquals(0, test1.compareTo(test1a));
224            assertEquals(0, test1a.compareTo(test1));
225            assertEquals(0, test1.compareTo(test1));
226            assertEquals(0, test1a.compareTo(test1a));
227            
228            Partial test2 = createHourMinPartial2(ISO_UTC);
229            assertEquals(-1, test1.compareTo(test2));
230            assertEquals(+1, test2.compareTo(test1));
231            
232            Partial test3 = createHourMinPartial2(COPTIC_UTC);
233            assertEquals(-1, test1.compareTo(test3));
234            assertEquals(+1, test3.compareTo(test1));
235            assertEquals(0, test3.compareTo(test2));
236            
237            assertEquals(0, new TimeOfDay(10, 20, 30, 40).compareTo(createTODPartial(ISO_UTC)));
238            
239            try {
240                test1.compareTo(null);
241                fail();
242            } catch (NullPointerException ex) {}
243    //        try {
244    //            test1.compareTo(new Date());
245    //            fail();
246    //        } catch (ClassCastException ex) {}
247            try {
248                test1.compareTo(new YearMonthDay());
249                fail();
250            } catch (ClassCastException ex) {}
251            try {
252                createTODPartial(ISO_UTC).without(DateTimeFieldType.hourOfDay()).compareTo(new YearMonthDay());
253                fail();
254            } catch (ClassCastException ex) {}
255        }
256    
257        //-----------------------------------------------------------------------
258        public void testIsEqual_TOD() {
259            Partial test1 = createHourMinPartial();
260            Partial test1a = createHourMinPartial();
261            assertEquals(true, test1.isEqual(test1a));
262            assertEquals(true, test1a.isEqual(test1));
263            assertEquals(true, test1.isEqual(test1));
264            assertEquals(true, test1a.isEqual(test1a));
265            
266            Partial test2 = createHourMinPartial2(ISO_UTC);
267            assertEquals(false, test1.isEqual(test2));
268            assertEquals(false, test2.isEqual(test1));
269            
270            Partial test3 = createHourMinPartial2(COPTIC_UTC);
271            assertEquals(false, test1.isEqual(test3));
272            assertEquals(false, test3.isEqual(test1));
273            assertEquals(true, test3.isEqual(test2));
274            
275            try {
276                createHourMinPartial().isEqual(null);
277                fail();
278            } catch (IllegalArgumentException ex) {}
279        }
280        
281        //-----------------------------------------------------------------------
282        public void testIsBefore_TOD() {
283            Partial test1 = createHourMinPartial();
284            Partial test1a = createHourMinPartial();
285            assertEquals(false, test1.isBefore(test1a));
286            assertEquals(false, test1a.isBefore(test1));
287            assertEquals(false, test1.isBefore(test1));
288            assertEquals(false, test1a.isBefore(test1a));
289            
290            Partial test2 = createHourMinPartial2(ISO_UTC);
291            assertEquals(true, test1.isBefore(test2));
292            assertEquals(false, test2.isBefore(test1));
293            
294            Partial test3 = createHourMinPartial2(COPTIC_UTC);
295            assertEquals(true, test1.isBefore(test3));
296            assertEquals(false, test3.isBefore(test1));
297            assertEquals(false, test3.isBefore(test2));
298            
299            try {
300                createHourMinPartial().isBefore(null);
301                fail();
302            } catch (IllegalArgumentException ex) {}
303        }
304        
305        //-----------------------------------------------------------------------
306        public void testIsAfter_TOD() {
307            Partial test1 = createHourMinPartial();
308            Partial test1a = createHourMinPartial();
309            assertEquals(false, test1.isAfter(test1a));
310            assertEquals(false, test1a.isAfter(test1));
311            assertEquals(false, test1.isAfter(test1));
312            assertEquals(false, test1a.isAfter(test1a));
313            
314            Partial test2 = createHourMinPartial2(ISO_UTC);
315            assertEquals(false, test1.isAfter(test2));
316            assertEquals(true, test2.isAfter(test1));
317            
318            Partial test3 = createHourMinPartial2(COPTIC_UTC);
319            assertEquals(false, test1.isAfter(test3));
320            assertEquals(true, test3.isAfter(test1));
321            assertEquals(false, test3.isAfter(test2));
322            
323            try {
324                createHourMinPartial().isAfter(null);
325                fail();
326            } catch (IllegalArgumentException ex) {}
327        }
328        
329        //-----------------------------------------------------------------------
330        public void testWithChronologyRetainFields_Chrono() {
331            Partial base = createHourMinPartial(COPTIC_PARIS);
332            Partial test = base.withChronologyRetainFields(BUDDHIST_TOKYO);
333            check(base, 10, 20);
334            assertEquals(COPTIC_UTC, base.getChronology());
335            check(test, 10, 20);
336            assertEquals(BUDDHIST_UTC, test.getChronology());
337        }
338    
339        public void testWithChronologyRetainFields_sameChrono() {
340            Partial base = createHourMinPartial(COPTIC_PARIS);
341            Partial test = base.withChronologyRetainFields(COPTIC_TOKYO);
342            assertSame(base, test);
343        }
344    
345        public void testWithChronologyRetainFields_nullChrono() {
346            Partial base = createHourMinPartial(COPTIC_PARIS);
347            Partial test = base.withChronologyRetainFields(null);
348            check(base, 10, 20);
349            assertEquals(COPTIC_UTC, base.getChronology());
350            check(test, 10, 20);
351            assertEquals(ISO_UTC, test.getChronology());
352        }
353    
354        //-----------------------------------------------------------------------
355        public void testWith1() {
356            Partial test = createHourMinPartial();
357            Partial result = test.with(DateTimeFieldType.hourOfDay(), 15);
358            check(test, 10, 20);
359            check(result, 15, 20);
360        }
361    
362        public void testWith2() {
363            Partial test = createHourMinPartial();
364            try {
365                test.with(null, 6);
366                fail();
367            } catch (IllegalArgumentException ex) {}
368            check(test, 10, 20);
369        }
370    
371        public void testWith3a() {
372            Partial test = createHourMinPartial();
373            Partial result = test.with(DateTimeFieldType.secondOfMinute(), 15);
374            check(test, 10, 20);
375            assertEquals(3, result.size());
376            assertEquals(true, result.isSupported(DateTimeFieldType.hourOfDay()));
377            assertEquals(true, result.isSupported(DateTimeFieldType.minuteOfHour()));
378            assertEquals(true, result.isSupported(DateTimeFieldType.secondOfMinute()));
379            assertEquals(DateTimeFieldType.hourOfDay(), result.getFieldType(0));
380            assertEquals(DateTimeFieldType.minuteOfHour(), result.getFieldType(1));
381            assertEquals(DateTimeFieldType.secondOfMinute(), result.getFieldType(2));
382            assertEquals(10, result.get(DateTimeFieldType.hourOfDay()));
383            assertEquals(20, result.get(DateTimeFieldType.minuteOfHour()));
384            assertEquals(15, result.get(DateTimeFieldType.secondOfMinute()));
385        }
386    
387        public void testWith3b() {
388            Partial test = createHourMinPartial();
389            Partial result = test.with(DateTimeFieldType.minuteOfDay(), 15);
390            check(test, 10, 20);
391            assertEquals(3, result.size());
392            assertEquals(true, result.isSupported(DateTimeFieldType.hourOfDay()));
393            assertEquals(true, result.isSupported(DateTimeFieldType.minuteOfDay()));
394            assertEquals(true, result.isSupported(DateTimeFieldType.minuteOfHour()));
395            assertEquals(DateTimeFieldType.hourOfDay(), result.getFieldType(0));
396            assertEquals(DateTimeFieldType.minuteOfDay(), result.getFieldType(1));
397            assertEquals(DateTimeFieldType.minuteOfHour(), result.getFieldType(2));
398            assertEquals(10, result.get(DateTimeFieldType.hourOfDay()));
399            assertEquals(20, result.get(DateTimeFieldType.minuteOfHour()));
400            assertEquals(15, result.get(DateTimeFieldType.minuteOfDay()));
401        }
402    
403        public void testWith3c() {
404            Partial test = createHourMinPartial();
405            Partial result = test.with(DateTimeFieldType.dayOfMonth(), 15);
406            check(test, 10, 20);
407            assertEquals(3, result.size());
408            assertEquals(true, result.isSupported(DateTimeFieldType.dayOfMonth()));
409            assertEquals(true, result.isSupported(DateTimeFieldType.hourOfDay()));
410            assertEquals(true, result.isSupported(DateTimeFieldType.minuteOfHour()));
411            assertEquals(DateTimeFieldType.dayOfMonth(), result.getFieldType(0));
412            assertEquals(DateTimeFieldType.hourOfDay(), result.getFieldType(1));
413            assertEquals(DateTimeFieldType.minuteOfHour(), result.getFieldType(2));
414            assertEquals(10, result.get(DateTimeFieldType.hourOfDay()));
415            assertEquals(20, result.get(DateTimeFieldType.minuteOfHour()));
416            assertEquals(15, result.get(DateTimeFieldType.dayOfMonth()));
417        }
418    
419        public void testWith3d() {
420            Partial test = new Partial(DateTimeFieldType.year(), 2005);
421            Partial result = test.with(DateTimeFieldType.monthOfYear(), 6);
422            assertEquals(2, result.size());
423            assertEquals(2005, result.get(DateTimeFieldType.year()));
424            assertEquals(6, result.get(DateTimeFieldType.monthOfYear()));
425        }        
426    
427        public void testWith3e() {
428            Partial test = new Partial(DateTimeFieldType.era(), 1);
429            Partial result = test.with(DateTimeFieldType.halfdayOfDay(), 0);
430            assertEquals(2, result.size());
431            assertEquals(1, result.get(DateTimeFieldType.era()));
432            assertEquals(0, result.get(DateTimeFieldType.halfdayOfDay()));
433            assertEquals(0, result.indexOf(DateTimeFieldType.era()));
434            assertEquals(1, result.indexOf(DateTimeFieldType.halfdayOfDay()));
435        }        
436    
437        public void testWith3f() {
438            Partial test = new Partial(DateTimeFieldType.halfdayOfDay(), 0);
439            Partial result = test.with(DateTimeFieldType.era(), 1);
440            assertEquals(2, result.size());
441            assertEquals(1, result.get(DateTimeFieldType.era()));
442            assertEquals(0, result.get(DateTimeFieldType.halfdayOfDay()));
443            assertEquals(0, result.indexOf(DateTimeFieldType.era()));
444            assertEquals(1, result.indexOf(DateTimeFieldType.halfdayOfDay()));
445        }        
446    
447        public void testWith4() {
448            Partial test = createHourMinPartial();
449            Partial result = test.with(DateTimeFieldType.hourOfDay(), 10);
450            assertSame(test, result);
451        }
452    
453        //-----------------------------------------------------------------------
454        public void testWithout1() {
455            Partial test = createHourMinPartial();
456            Partial result = test.without(DateTimeFieldType.year());
457            check(test, 10, 20);
458            check(result, 10, 20);
459        }
460    
461        public void testWithout2() {
462            Partial test = createHourMinPartial();
463            Partial result = test.without((DateTimeFieldType) null);
464            check(test, 10, 20);
465            check(result, 10, 20);
466        }
467    
468        public void testWithout3() {
469            Partial test = createHourMinPartial();
470            Partial result = test.without(DateTimeFieldType.hourOfDay());
471            check(test, 10, 20);
472            assertEquals(1, result.size());
473            assertEquals(false, result.isSupported(DateTimeFieldType.hourOfDay()));
474            assertEquals(true, result.isSupported(DateTimeFieldType.minuteOfHour()));
475            assertEquals(DateTimeFieldType.minuteOfHour(), result.getFieldType(0));
476        }
477    
478        public void testWithout4() {
479            Partial test = createHourMinPartial();
480            Partial result = test.without(DateTimeFieldType.minuteOfHour());
481            check(test, 10, 20);
482            assertEquals(1, result.size());
483            assertEquals(true, result.isSupported(DateTimeFieldType.hourOfDay()));
484            assertEquals(false, result.isSupported(DateTimeFieldType.minuteOfHour()));
485            assertEquals(DateTimeFieldType.hourOfDay(), result.getFieldType(0));
486        }
487    
488        public void testWithout5() {
489            Partial test = new Partial(DateTimeFieldType.hourOfDay(), 12);
490            Partial result = test.without(DateTimeFieldType.hourOfDay());
491            assertEquals(0, result.size());
492            assertEquals(false, result.isSupported(DateTimeFieldType.hourOfDay()));
493        }
494    
495        //-----------------------------------------------------------------------
496        public void testWithField1() {
497            Partial test = createHourMinPartial();
498            Partial result = test.withField(DateTimeFieldType.hourOfDay(), 15);
499            check(test, 10, 20);
500            check(result, 15, 20);
501        }
502    
503        public void testWithField2() {
504            Partial test = createHourMinPartial();
505            try {
506                test.withField(null, 6);
507                fail();
508            } catch (IllegalArgumentException ex) {}
509            check(test, 10, 20);
510        }
511    
512        public void testWithField3() {
513            Partial test = createHourMinPartial();
514            try {
515                test.withField(DateTimeFieldType.dayOfMonth(), 6);
516                fail();
517            } catch (IllegalArgumentException ex) {}
518            check(test, 10, 20);
519        }
520    
521        public void testWithField4() {
522            Partial test = createHourMinPartial();
523            Partial result = test.withField(DateTimeFieldType.hourOfDay(), 10);
524            assertSame(test, result);
525        }
526    
527        //-----------------------------------------------------------------------
528        public void testWithFieldAdded1() {
529            Partial test = createHourMinPartial();
530            Partial result = test.withFieldAdded(DurationFieldType.hours(), 6);
531            
532            assertEquals(createHourMinPartial(), test);
533            check(test, 10, 20);
534            check(result, 16, 20);
535        }
536    
537        public void testWithFieldAdded2() {
538            Partial test = createHourMinPartial();
539            try {
540                test.withFieldAdded(null, 0);
541                fail();
542            } catch (IllegalArgumentException ex) {}
543            check(test, 10, 20);
544        }
545    
546        public void testWithFieldAdded3() {
547            Partial test = createHourMinPartial();
548            try {
549                test.withFieldAdded(null, 6);
550                fail();
551            } catch (IllegalArgumentException ex) {}
552            check(test, 10, 20);
553        }
554    
555        public void testWithFieldAdded4() {
556            Partial test = createHourMinPartial();
557            Partial result = test.withFieldAdded(DurationFieldType.hours(), 0);
558            assertSame(test, result);
559        }
560    
561        public void testWithFieldAdded5() {
562            Partial test = createHourMinPartial();
563            try {
564                test.withFieldAdded(DurationFieldType.days(), 6);
565                fail();
566            } catch (IllegalArgumentException ex) {}
567            check(test, 10, 20);
568        }
569    
570        public void testWithFieldAdded6() {
571            Partial test = createHourMinPartial();
572            try {
573                test.withFieldAdded(DurationFieldType.hours(), 16);
574                fail();
575            } catch (IllegalArgumentException ex) {
576                // expected
577            }
578            check(test, 10, 20);
579        }
580    
581        public void testWithFieldAdded7() {
582            Partial test = createHourMinPartial(23, 59, ISO_UTC);
583            try {
584                test.withFieldAdded(DurationFieldType.minutes(), 1);
585                fail();
586            } catch (IllegalArgumentException ex) {
587                // expected
588            }
589            check(test, 23, 59);
590            
591            test = createHourMinPartial(23, 59, ISO_UTC);
592            try {
593                test.withFieldAdded(DurationFieldType.hours(), 1);
594                fail();
595            } catch (IllegalArgumentException ex) {
596                // expected
597            }
598            check(test, 23, 59);
599        }
600    
601        public void testWithFieldAdded8() {
602            Partial test = createHourMinPartial(0, 0, ISO_UTC);
603            try {
604                test.withFieldAdded(DurationFieldType.minutes(), -1);
605                fail();
606            } catch (IllegalArgumentException ex) {
607                // expected
608            }
609            check(test, 0, 0);
610            
611            test = createHourMinPartial(0, 0, ISO_UTC);
612            try {
613                test.withFieldAdded(DurationFieldType.hours(), -1);
614                fail();
615            } catch (IllegalArgumentException ex) {
616                // expected
617            }
618            check(test, 0, 0);
619        }
620    
621        //-----------------------------------------------------------------------
622        public void testWithFieldAddWrapped1() {
623            Partial test = createHourMinPartial();
624            Partial result = test.withFieldAddWrapped(DurationFieldType.hours(), 6);
625            
626            assertEquals(createHourMinPartial(), test);
627            check(test, 10, 20);
628            check(result, 16, 20);
629        }
630    
631        public void testWithFieldAddWrapped2() {
632            Partial test = createHourMinPartial();
633            try {
634                test.withFieldAddWrapped(null, 0);
635                fail();
636            } catch (IllegalArgumentException ex) {}
637            check(test, 10, 20);
638        }
639    
640        public void testWithFieldAddWrapped3() {
641            Partial test = createHourMinPartial();
642            try {
643                test.withFieldAddWrapped(null, 6);
644                fail();
645            } catch (IllegalArgumentException ex) {}
646            check(test, 10, 20);
647        }
648    
649        public void testWithFieldAddWrapped4() {
650            Partial test = createHourMinPartial();
651            Partial result = test.withFieldAddWrapped(DurationFieldType.hours(), 0);
652            assertSame(test, result);
653        }
654    
655        public void testWithFieldAddWrapped5() {
656            Partial test = createHourMinPartial();
657            try {
658                test.withFieldAddWrapped(DurationFieldType.days(), 6);
659                fail();
660            } catch (IllegalArgumentException ex) {}
661            check(test, 10, 20);
662        }
663    
664        public void testWithFieldAddWrapped6() {
665            Partial test = createHourMinPartial();
666            Partial result = test.withFieldAddWrapped(DurationFieldType.hours(), 16);
667            
668            assertEquals(createHourMinPartial(), test);
669            check(test, 10, 20);
670            check(result, 2, 20);
671        }
672    
673        public void testWithFieldAddWrapped7() {
674            Partial test = createHourMinPartial(23, 59, ISO_UTC);
675            Partial result = test.withFieldAddWrapped(DurationFieldType.minutes(), 1);
676            check(test, 23, 59);
677            check(result, 0, 0);
678            
679            test = createHourMinPartial(23, 59, ISO_UTC);
680            result = test.withFieldAddWrapped(DurationFieldType.hours(), 1);
681            check(test, 23, 59);
682            check(result, 0, 59);
683        }
684    
685        public void testWithFieldAddWrapped8() {
686            Partial test = createHourMinPartial(0, 0, ISO_UTC);
687            Partial result = test.withFieldAddWrapped(DurationFieldType.minutes(), -1);
688            check(test, 0, 0);
689            check(result, 23, 59);
690            
691            test = createHourMinPartial(0, 0, ISO_UTC);
692            result = test.withFieldAddWrapped(DurationFieldType.hours(), -1);
693            check(test, 0, 0);
694            check(result, 23, 0);
695        }
696    
697        //-----------------------------------------------------------------------
698        public void testPlus_RP() {
699            Partial test = createHourMinPartial(BUDDHIST_LONDON);
700            Partial result = test.plus(new Period(1, 2, 3, 4, 5, 6, 7, 8));
701            check(test, 10, 20);
702            check(result, 15, 26);
703            
704            result = test.plus((ReadablePeriod) null);
705            assertSame(test, result);
706        }
707    
708        //-----------------------------------------------------------------------
709        public void testMinus_RP() {
710            Partial test = createHourMinPartial(BUDDHIST_LONDON);
711            Partial result = test.minus(new Period(1, 1, 1, 1, 1, 1, 1, 1));
712            check(test, 10, 20);
713            check(result, 9, 19);
714            
715            result = test.minus((ReadablePeriod) null);
716            assertSame(test, result);
717        }
718    
719        //-----------------------------------------------------------------------
720        public void testToDateTime_RI() {
721            Partial base = createHourMinPartial(COPTIC_PARIS);
722            DateTime dt = new DateTime(0L); // LONDON zone
723            assertEquals("1970-01-01T01:00:00.000+01:00", dt.toString());
724            
725            DateTime test = base.toDateTime(dt);
726            check(base, 10, 20);
727            assertEquals("1970-01-01T01:00:00.000+01:00", dt.toString());
728            assertEquals("1970-01-01T10:20:00.000+01:00", test.toString());
729        }
730    
731        public void testToDateTime_nullRI() {
732            Partial base = createHourMinPartial(1, 2, ISO_UTC);
733            DateTimeUtils.setCurrentMillisFixed(TEST_TIME2);
734            
735            DateTime test = base.toDateTime((ReadableInstant) null);
736            check(base, 1, 2);
737            assertEquals("1970-01-02T01:02:07.008+01:00", test.toString());
738        }
739    
740        //-----------------------------------------------------------------------
741        public void testProperty() {
742            Partial test = createHourMinPartial();
743            assertNotNull(test.property(DateTimeFieldType.hourOfDay()));
744            assertNotNull(test.property(DateTimeFieldType.minuteOfHour()));
745            try {
746                test.property(DateTimeFieldType.secondOfDay());
747                fail();
748            } catch (IllegalArgumentException ex) {}
749            try {
750                test.property(null);
751                fail();
752            } catch (IllegalArgumentException ex) {}
753        }
754    
755        //-----------------------------------------------------------------------
756        public void testSerialization() throws Exception {
757            Partial test = createHourMinPartial(COPTIC_PARIS);
758            
759            ByteArrayOutputStream baos = new ByteArrayOutputStream();
760            ObjectOutputStream oos = new ObjectOutputStream(baos);
761            oos.writeObject(test);
762            byte[] bytes = baos.toByteArray();
763            oos.close();
764            
765            ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
766            ObjectInputStream ois = new ObjectInputStream(bais);
767            Partial result = (Partial) ois.readObject();
768            ois.close();
769            
770            assertEquals(test, result);
771            assertTrue(Arrays.equals(test.getValues(), result.getValues()));
772            assertTrue(Arrays.equals(test.getFields(), result.getFields()));
773            assertEquals(test.getChronology(), result.getChronology());
774        }
775    
776        //-----------------------------------------------------------------------
777        public void testGetFormatter1() {
778            Partial test = new Partial(DateTimeFieldType.year(), 2005);
779            assertEquals("2005", test.getFormatter().print(test));
780            
781            test = test.with(DateTimeFieldType.monthOfYear(), 6);
782            assertEquals("2005-06", test.getFormatter().print(test));
783            
784            test = test.with(DateTimeFieldType.dayOfMonth(), 25);
785            assertEquals("2005-06-25", test.getFormatter().print(test));
786            
787            test = test.without(DateTimeFieldType.monthOfYear());
788            assertEquals("2005--25", test.getFormatter().print(test));
789        }
790    
791        public void testGetFormatter2() {
792            Partial test = new Partial();
793            assertEquals(null, test.getFormatter());
794            
795            test = test.with(DateTimeFieldType.era(), 1);
796            assertEquals(null, test.getFormatter());
797            
798            test = test.with(DateTimeFieldType.halfdayOfDay(), 0);
799            assertEquals(null, test.getFormatter());
800        }
801    
802        public void testGetFormatter3() {
803            Partial test = new Partial(DateTimeFieldType.dayOfWeek(), 5);
804            assertEquals("-W-5", test.getFormatter().print(test));
805            
806            // contrast with testToString5
807            test = test.with(DateTimeFieldType.dayOfMonth(), 13);
808            assertEquals("---13", test.getFormatter().print(test));
809        }
810    
811        //-----------------------------------------------------------------------
812        public void testToString1() {
813            Partial test = createHourMinPartial();
814            assertEquals("10:20", test.toString());
815        }
816    
817        public void testToString2() {
818            Partial test = new Partial();
819            assertEquals("[]", test.toString());
820        }
821    
822        public void testToString3() {
823            Partial test = new Partial(DateTimeFieldType.year(), 2005);
824            assertEquals("2005", test.toString());
825            
826            test = test.with(DateTimeFieldType.monthOfYear(), 6);
827            assertEquals("2005-06", test.toString());
828            
829            test = test.with(DateTimeFieldType.dayOfMonth(), 25);
830            assertEquals("2005-06-25", test.toString());
831            
832            test = test.without(DateTimeFieldType.monthOfYear());
833            assertEquals("2005--25", test.toString());
834        }
835    
836        public void testToString4() {
837            Partial test = new Partial(DateTimeFieldType.dayOfWeek(), 5);
838            assertEquals("-W-5", test.toString());
839            
840            test = test.with(DateTimeFieldType.dayOfMonth(), 13);
841            assertEquals("[dayOfMonth=13, dayOfWeek=5]", test.toString());
842        }
843    
844        public void testToString5() {
845            Partial test = new Partial(DateTimeFieldType.era(), 1);
846            assertEquals("[era=1]", test.toString());
847            
848            test = test.with(DateTimeFieldType.halfdayOfDay(), 0);
849            assertEquals("[era=1, halfdayOfDay=0]", test.toString());
850        }
851    
852        //-----------------------------------------------------------------------
853        public void testToString_String() {
854            Partial test = createHourMinPartial();
855            assertEquals("\ufffd\ufffd\ufffd\ufffd 10", test.toString("yyyy HH"));
856            assertEquals("10:20", test.toString((String) null));
857        }
858    
859        //-----------------------------------------------------------------------
860        public void testToString_String_Locale() {
861            Partial test = createHourMinPartial();
862            assertEquals("10 20", test.toString("H m", Locale.ENGLISH));
863            assertEquals("10:20", test.toString(null, Locale.ENGLISH));
864            assertEquals("10 20", test.toString("H m", null));
865            assertEquals("10:20", test.toString(null, null));
866        }
867    
868        //-----------------------------------------------------------------------
869        public void testToString_DTFormatter() {
870            Partial test = createHourMinPartial();
871            assertEquals("\ufffd\ufffd\ufffd\ufffd 10", test.toString(DateTimeFormat.forPattern("yyyy HH")));
872            assertEquals("10:20", test.toString((DateTimeFormatter) null));
873        }
874    
875        //-----------------------------------------------------------------------
876        private Partial createHourMinPartial() {
877            return createHourMinPartial(ISO_UTC);
878        }
879    
880        private Partial createHourMinPartial(Chronology chrono) {
881            return createHourMinPartial(10, 20, chrono);
882        }
883    
884        private Partial createHourMinPartial2(Chronology chrono) {
885            return createHourMinPartial(15, 20, chrono);
886        }
887    
888        private Partial createHourMinPartial(int hour, int min, Chronology chrono) {
889            return new Partial(
890                new DateTimeFieldType[] {DateTimeFieldType.hourOfDay(), DateTimeFieldType.minuteOfHour()},
891                new int[] {hour, min},
892                chrono);
893        }
894    
895        private Partial createTODPartial(Chronology chrono) {
896            return new Partial(
897                new DateTimeFieldType[] {
898                        DateTimeFieldType.hourOfDay(), DateTimeFieldType.minuteOfHour(),
899                        DateTimeFieldType.secondOfMinute(), DateTimeFieldType.millisOfSecond()},
900                new int[] {10, 20, 30, 40},
901                chrono);
902        }
903    
904        private void check(Partial test, int hour, int min) {
905            assertEquals(test.toString(), hour, test.get(DateTimeFieldType.hourOfDay()));
906            assertEquals(test.toString(), min, test.get(DateTimeFieldType.minuteOfHour()));
907        }
908    }