View Javadoc

1   /*
2    *  Copyright 2001-2010 Stephen Colebourne
3    *
4    *  Licensed under the Apache License, Version 2.0 (the "License");
5    *  you may not use this file except in compliance with the License.
6    *  You may obtain a copy of the License at
7    *
8    *      http://www.apache.org/licenses/LICENSE-2.0
9    *
10   *  Unless required by applicable law or agreed to in writing, software
11   *  distributed under the License is distributed on an "AS IS" BASIS,
12   *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   *  See the License for the specific language governing permissions and
14   *  limitations under the License.
15   */
16  package org.joda.time;
17  
18  import java.io.ByteArrayInputStream;
19  import java.io.ByteArrayOutputStream;
20  import java.io.ObjectInputStream;
21  import java.io.ObjectOutputStream;
22  import java.util.Arrays;
23  import java.util.Calendar;
24  import java.util.Date;
25  import java.util.GregorianCalendar;
26  import java.util.Locale;
27  import java.util.SimpleTimeZone;
28  import java.util.TimeZone;
29  
30  import junit.framework.TestCase;
31  import junit.framework.TestSuite;
32  
33  import org.joda.time.chrono.BuddhistChronology;
34  import org.joda.time.chrono.CopticChronology;
35  import org.joda.time.chrono.GJChronology;
36  import org.joda.time.chrono.GregorianChronology;
37  import org.joda.time.chrono.ISOChronology;
38  import org.joda.time.format.DateTimeFormat;
39  import org.joda.time.format.DateTimeFormatter;
40  
41  /**
42   * This class is a Junit unit test for LocalDate.
43   *
44   * @author Stephen Colebourne
45   */
46  public class TestLocalDateTime_Basics extends TestCase {
47  
48      private static final DateTimeZone PARIS = DateTimeZone.forID("Europe/Paris");
49      private static final DateTimeZone LONDON = DateTimeZone.forID("Europe/London");
50      private static final DateTimeZone TOKYO = DateTimeZone.forID("Asia/Tokyo");
51      private static final int OFFSET = 1;
52      private static final GJChronology GJ_UTC = GJChronology.getInstanceUTC();
53      private static final Chronology COPTIC_PARIS = CopticChronology.getInstance(PARIS);
54      private static final Chronology COPTIC_LONDON = CopticChronology.getInstance(LONDON);
55      private static final Chronology COPTIC_TOKYO = CopticChronology.getInstance(TOKYO);
56      private static final Chronology COPTIC_UTC = CopticChronology.getInstanceUTC();
57      private static final Chronology ISO_PARIS = ISOChronology.getInstance(PARIS);
58      private static final Chronology ISO_LONDON = ISOChronology.getInstance(LONDON);
59      private static final Chronology ISO_TOKYO = ISOChronology.getInstance(TOKYO);
60      private static final Chronology ISO_UTC = ISOChronology.getInstanceUTC();
61      private static final Chronology GREGORIAN_UTC = GregorianChronology.getInstanceUTC();
62      private static final Chronology BUDDHIST_PARIS = BuddhistChronology.getInstance(PARIS);
63      private static final Chronology BUDDHIST_LONDON = BuddhistChronology.getInstance(LONDON);
64      private static final Chronology BUDDHIST_TOKYO = BuddhistChronology.getInstance(TOKYO);
65      private static final Chronology BUDDHIST_UTC = BuddhistChronology.getInstanceUTC();
66  
67  //    private long TEST_TIME1 =
68  //        (31L + 28L + 31L + 6L -1L) * DateTimeConstants.MILLIS_PER_DAY
69  //        + 12L * DateTimeConstants.MILLIS_PER_HOUR
70  //        + 24L * DateTimeConstants.MILLIS_PER_MINUTE;
71  //
72  //    private long TEST_TIME2 =
73  //        (365L + 31L + 28L + 31L + 30L + 7L -1L) * DateTimeConstants.MILLIS_PER_DAY
74  //        + 14L * DateTimeConstants.MILLIS_PER_HOUR
75  //        + 28L * DateTimeConstants.MILLIS_PER_MINUTE;
76  
77      private int MILLIS_OF_DAY_UTC =
78          (int) (10L * DateTimeConstants.MILLIS_PER_HOUR
79          + 20L * DateTimeConstants.MILLIS_PER_MINUTE
80          + 30L * DateTimeConstants.MILLIS_PER_SECOND
81          + 40L);
82  
83      private long TEST_TIME_NOW_UTC =
84          (31L + 28L + 31L + 30L + 31L + 9L -1L) * DateTimeConstants.MILLIS_PER_DAY + MILLIS_OF_DAY_UTC;
85  
86      private DateTimeZone zone = null;
87  
88      private Locale systemDefaultLocale = null;
89  
90      public static void main(String[] args) {
91          junit.textui.TestRunner.run(suite());
92      }
93  
94      public static TestSuite suite() {
95          return new TestSuite(TestLocalDateTime_Basics.class);
96      }
97  
98      public TestLocalDateTime_Basics(String name) {
99          super(name);
100     }
101 
102     protected void setUp() throws Exception {
103         DateTimeUtils.setCurrentMillisFixed(TEST_TIME_NOW_UTC);
104         zone = DateTimeZone.getDefault();
105         DateTimeZone.setDefault(LONDON);
106         systemDefaultLocale = Locale.getDefault();
107         Locale.setDefault(Locale.ENGLISH);
108     }
109 
110     protected void tearDown() throws Exception {
111         DateTimeUtils.setCurrentMillisSystem();
112         DateTimeZone.setDefault(zone);
113         zone = null;
114         Locale.setDefault(systemDefaultLocale);
115         systemDefaultLocale = null;
116     }
117 
118     //-----------------------------------------------------------------------
119     public void testGet_DateTimeFieldType() {
120         LocalDateTime test = new LocalDateTime(1970, 6, 9, 10, 20, 30, 40);
121         assertEquals(1970, test.get(DateTimeFieldType.year()));
122         assertEquals(6, test.get(DateTimeFieldType.monthOfYear()));
123         assertEquals(9, test.get(DateTimeFieldType.dayOfMonth()));
124         assertEquals(2, test.get(DateTimeFieldType.dayOfWeek()));
125         assertEquals(160, test.get(DateTimeFieldType.dayOfYear()));
126         assertEquals(24, test.get(DateTimeFieldType.weekOfWeekyear()));
127         assertEquals(1970, test.get(DateTimeFieldType.weekyear()));
128         assertEquals(10, test.get(DateTimeFieldType.hourOfDay()));
129         assertEquals(20, test.get(DateTimeFieldType.minuteOfHour()));
130         assertEquals(30, test.get(DateTimeFieldType.secondOfMinute()));
131         assertEquals(40, test.get(DateTimeFieldType.millisOfSecond()));
132         assertEquals(MILLIS_OF_DAY_UTC / 60000 , test.get(DateTimeFieldType.minuteOfDay()));
133         assertEquals(MILLIS_OF_DAY_UTC / 1000 , test.get(DateTimeFieldType.secondOfDay()));
134         assertEquals(MILLIS_OF_DAY_UTC , test.get(DateTimeFieldType.millisOfDay()));
135         assertEquals(10, test.get(DateTimeFieldType.hourOfHalfday()));
136         assertEquals(DateTimeConstants.AM, test.get(DateTimeFieldType.halfdayOfDay()));
137         
138         test = new LocalDateTime(1970, 6, 9, 12, 30);
139         assertEquals(0, test.get(DateTimeFieldType.hourOfHalfday()));
140         assertEquals(12, test.get(DateTimeFieldType.clockhourOfHalfday()));
141         assertEquals(12, test.get(DateTimeFieldType.clockhourOfDay()));
142         assertEquals(DateTimeConstants.PM, test.get(DateTimeFieldType.halfdayOfDay()));
143         test = new LocalDateTime(1970, 6, 9, 14, 30);
144         assertEquals(2, test.get(DateTimeFieldType.hourOfHalfday()));
145         assertEquals(2, test.get(DateTimeFieldType.clockhourOfHalfday()));
146         assertEquals(14, test.get(DateTimeFieldType.clockhourOfDay()));
147         assertEquals(DateTimeConstants.PM, test.get(DateTimeFieldType.halfdayOfDay()));
148         test = new LocalDateTime(1970, 6, 9, 0, 30);
149         assertEquals(0, test.get(DateTimeFieldType.hourOfHalfday()));
150         assertEquals(12, test.get(DateTimeFieldType.clockhourOfHalfday()));
151         assertEquals(24, test.get(DateTimeFieldType.clockhourOfDay()));
152         assertEquals(DateTimeConstants.AM, test.get(DateTimeFieldType.halfdayOfDay()));
153         try {
154             test.get(null);
155             fail();
156         } catch (IllegalArgumentException ex) {}
157     }
158 
159     public void testSize() {
160         LocalDateTime test = new LocalDateTime();
161         assertEquals(4, test.size());
162     }
163 
164     public void testGetFieldType_int() {
165         LocalDateTime test = new LocalDateTime(COPTIC_PARIS);
166         assertSame(DateTimeFieldType.year(), test.getFieldType(0));
167         assertSame(DateTimeFieldType.monthOfYear(), test.getFieldType(1));
168         assertSame(DateTimeFieldType.dayOfMonth(), test.getFieldType(2));
169         assertSame(DateTimeFieldType.millisOfDay(), test.getFieldType(3));
170         try {
171             test.getFieldType(-1);
172         } catch (IndexOutOfBoundsException ex) {}
173         try {
174             test.getFieldType(3);
175         } catch (IndexOutOfBoundsException ex) {}
176     }
177 
178     public void testGetFieldTypes() {
179         LocalDateTime test = new LocalDateTime(COPTIC_PARIS);
180         DateTimeFieldType[] fields = test.getFieldTypes();
181         assertSame(DateTimeFieldType.year(), fields[0]);
182         assertSame(DateTimeFieldType.monthOfYear(), fields[1]);
183         assertSame(DateTimeFieldType.dayOfMonth(), fields[2]);
184         assertSame(DateTimeFieldType.millisOfDay(), fields[3]);
185         assertNotSame(test.getFieldTypes(), test.getFieldTypes());
186     }
187 
188     public void testGetField_int() {
189         LocalDateTime test = new LocalDateTime(COPTIC_PARIS);
190         assertSame(COPTIC_UTC.year(), test.getField(0));
191         assertSame(COPTIC_UTC.monthOfYear(), test.getField(1));
192         assertSame(COPTIC_UTC.dayOfMonth(), test.getField(2));
193         assertSame(COPTIC_UTC.millisOfDay(), test.getField(3));
194         try {
195             test.getField(-1);
196         } catch (IndexOutOfBoundsException ex) {}
197         try {
198             test.getField(3);
199         } catch (IndexOutOfBoundsException ex) {}
200     }
201 
202     public void testGetFields() {
203         LocalDateTime test = new LocalDateTime(COPTIC_PARIS);
204         DateTimeField[] fields = test.getFields();
205         assertSame(COPTIC_UTC.year(), fields[0]);
206         assertSame(COPTIC_UTC.monthOfYear(), fields[1]);
207         assertSame(COPTIC_UTC.dayOfMonth(), fields[2]);
208         assertSame(COPTIC_UTC.millisOfDay(), fields[3]);
209         assertNotSame(test.getFields(), test.getFields());
210     }
211 
212     public void testGetValue_int() {
213         LocalDateTime test = new LocalDateTime(ISO_UTC);
214         assertEquals(1970, test.getValue(0));
215         assertEquals(6, test.getValue(1));
216         assertEquals(9, test.getValue(2));
217         assertEquals(MILLIS_OF_DAY_UTC, test.getValue(3));
218         try {
219             test.getValue(-1);
220         } catch (IndexOutOfBoundsException ex) {}
221         try {
222             test.getValue(3);
223         } catch (IndexOutOfBoundsException ex) {}
224     }
225 
226     public void testGetValues() {
227         LocalDateTime test = new LocalDateTime(ISO_UTC);
228         int[] values = test.getValues();
229         assertEquals(1970, values[0]);
230         assertEquals(6, values[1]);
231         assertEquals(9, values[2]);
232         assertEquals(MILLIS_OF_DAY_UTC, values[3]);
233         assertNotSame(test.getValues(), test.getValues());
234     }
235 
236     public void testIsSupported_DateTimeFieldType() {
237         LocalDateTime test = new LocalDateTime();
238         assertEquals(true, test.isSupported(DateTimeFieldType.year()));
239         assertEquals(true, test.isSupported(DateTimeFieldType.monthOfYear()));
240         assertEquals(true, test.isSupported(DateTimeFieldType.dayOfMonth()));
241         assertEquals(true, test.isSupported(DateTimeFieldType.dayOfWeek()));
242         assertEquals(true, test.isSupported(DateTimeFieldType.dayOfYear()));
243         assertEquals(true, test.isSupported(DateTimeFieldType.weekOfWeekyear()));
244         assertEquals(true, test.isSupported(DateTimeFieldType.weekyear()));
245         assertEquals(true, test.isSupported(DateTimeFieldType.yearOfCentury()));
246         assertEquals(true, test.isSupported(DateTimeFieldType.yearOfEra()));
247         assertEquals(true, test.isSupported(DateTimeFieldType.centuryOfEra()));
248         assertEquals(true, test.isSupported(DateTimeFieldType.weekyearOfCentury()));
249         assertEquals(true, test.isSupported(DateTimeFieldType.era()));
250         
251         assertEquals(true, test.isSupported(DateTimeFieldType.hourOfDay()));
252         assertEquals(true, test.isSupported(DateTimeFieldType.minuteOfHour()));
253         assertEquals(true, test.isSupported(DateTimeFieldType.secondOfMinute()));
254         assertEquals(true, test.isSupported(DateTimeFieldType.millisOfSecond()));
255         assertEquals(true, test.isSupported(DateTimeFieldType.minuteOfDay()));
256         assertEquals(true, test.isSupported(DateTimeFieldType.secondOfDay()));
257         assertEquals(true, test.isSupported(DateTimeFieldType.millisOfDay()));
258         assertEquals(true, test.isSupported(DateTimeFieldType.hourOfHalfday()));
259         assertEquals(true, test.isSupported(DateTimeFieldType.halfdayOfDay()));
260         assertEquals(true, test.isSupported(DateTimeFieldType.clockhourOfHalfday()));
261         assertEquals(true, test.isSupported(DateTimeFieldType.clockhourOfDay()));
262         
263         assertEquals(false, test.isSupported((DateTimeFieldType) null));
264     }
265 
266     public void testIsSupported_DurationFieldType() {
267         LocalDateTime test = new LocalDateTime();
268         assertEquals(false, test.isSupported(DurationFieldType.eras()));
269         assertEquals(true, test.isSupported(DurationFieldType.centuries()));
270         assertEquals(true, test.isSupported(DurationFieldType.years()));
271         assertEquals(true, test.isSupported(DurationFieldType.months()));
272         assertEquals(true, test.isSupported(DurationFieldType.weekyears()));
273         assertEquals(true, test.isSupported(DurationFieldType.weeks()));
274         assertEquals(true, test.isSupported(DurationFieldType.days()));
275         
276         assertEquals(true, test.isSupported(DurationFieldType.hours()));
277         assertEquals(true, test.isSupported(DurationFieldType.minutes()));
278         assertEquals(true, test.isSupported(DurationFieldType.seconds()));
279         assertEquals(true, test.isSupported(DurationFieldType.millis()));
280         assertEquals(true, test.isSupported(DurationFieldType.halfdays()));
281         
282         assertEquals(false, test.isSupported((DurationFieldType) null));
283     }
284 
285     public void testEqualsHashCode() {
286         LocalDateTime test1 = new LocalDateTime(1970, 6, 9, 10, 20, 30, 40, COPTIC_PARIS);
287         LocalDateTime test2 = new LocalDateTime(1970, 6, 9, 10, 20, 30, 40, COPTIC_PARIS);
288         assertEquals(true, test1.equals(test2));
289         assertEquals(true, test2.equals(test1));
290         assertEquals(true, test1.equals(test1));
291         assertEquals(true, test2.equals(test2));
292         assertEquals(true, test1.hashCode() == test2.hashCode());
293         assertEquals(true, test1.hashCode() == test1.hashCode());
294         assertEquals(true, test2.hashCode() == test2.hashCode());
295         
296         LocalDateTime test3 = new LocalDateTime(1971, 6, 9, 10, 20, 30, 40);
297         assertEquals(false, test1.equals(test3));
298         assertEquals(false, test2.equals(test3));
299         assertEquals(false, test3.equals(test1));
300         assertEquals(false, test3.equals(test2));
301         assertEquals(false, test1.hashCode() == test3.hashCode());
302         assertEquals(false, test2.hashCode() == test3.hashCode());
303         
304         assertEquals(false, test1.equals("Hello"));
305         assertEquals(true, test1.equals(new MockInstant()));
306         Partial partial = new Partial(
307                 new DateTimeFieldType[] {
308                         DateTimeFieldType.year(), DateTimeFieldType.monthOfYear(),
309                         DateTimeFieldType.dayOfMonth(), DateTimeFieldType.millisOfDay()},
310                 new int[] {1970, 6, 9, MILLIS_OF_DAY_UTC}, COPTIC_PARIS);
311         assertEquals(true, test1.equals(partial));
312         assertEquals(true, test1.hashCode() == partial.hashCode());
313         assertEquals(false, test1.equals(MockPartial.EMPTY_INSTANCE));
314     }
315     
316     class MockInstant extends MockPartial {
317         public Chronology getChronology() {
318             return COPTIC_UTC;
319         }
320         public DateTimeField[] getFields() {
321             return new DateTimeField[] {
322                 COPTIC_UTC.year(),
323                 COPTIC_UTC.monthOfYear(),
324                 COPTIC_UTC.dayOfMonth(),
325                 COPTIC_UTC.millisOfDay(),
326             };
327         }
328         public int[] getValues() {
329             return new int[] {1970, 6, 9, MILLIS_OF_DAY_UTC};
330         }
331     }
332 
333     //-----------------------------------------------------------------------
334     public void testCompareTo() {
335         LocalDateTime test1 = new LocalDateTime(2005, 6, 2, 10, 20, 30, 40);
336         LocalDateTime test1a = new LocalDateTime(2005, 6, 2, 10, 20, 30, 40);
337         assertEquals(0, test1.compareTo(test1a));
338         assertEquals(0, test1a.compareTo(test1));
339         assertEquals(0, test1.compareTo(test1));
340         assertEquals(0, test1a.compareTo(test1a));
341         
342         LocalDateTime test2 = new LocalDateTime(2005, 7, 2, 10, 20, 30, 40);
343         assertEquals(-1, test1.compareTo(test2));
344         assertEquals(+1, test2.compareTo(test1));
345         
346         LocalDateTime test3 = new LocalDateTime(2005, 7, 2, 10, 20, 30, 40, GREGORIAN_UTC);
347         assertEquals(-1, test1.compareTo(test3));
348         assertEquals(+1, test3.compareTo(test1));
349         assertEquals(0, test3.compareTo(test2));
350         
351         DateTimeFieldType[] types = new DateTimeFieldType[] {
352             DateTimeFieldType.year(),
353             DateTimeFieldType.monthOfYear(),
354             DateTimeFieldType.dayOfMonth(),
355             DateTimeFieldType.millisOfDay(),
356         };
357         int[] values = new int[] {2005, 6, 2, MILLIS_OF_DAY_UTC};
358         Partial p = new Partial(types, values);
359         assertEquals(0, test1.compareTo(p));
360         try {
361             test1.compareTo(null);
362             fail();
363         } catch (NullPointerException ex) {}
364 //        try {
365 //            test1.compareTo(new Date());
366 //            fail();
367 //        } catch (ClassCastException ex) {}
368         try {
369             test1.compareTo(new YearMonthDay());
370             fail();
371         } catch (ClassCastException ex) {}
372         try {
373             test1.compareTo(new TimeOfDay());
374             fail();
375         } catch (ClassCastException ex) {}
376         Partial partial = new Partial()
377             .with(DateTimeFieldType.centuryOfEra(), 1)
378             .with(DateTimeFieldType.halfdayOfDay(), 0)
379             .with(DateTimeFieldType.dayOfMonth(), 9);
380         try {
381             new LocalDateTime(1970, 6, 9, 10, 20, 30, 40).compareTo(partial);
382             fail();
383         } catch (ClassCastException ex) {}
384     }
385     
386     //-----------------------------------------------------------------------
387     public void testIsEqual_LocalDateTime() {
388         LocalDateTime test1 = new LocalDateTime(2005, 6, 2, 10, 20, 30, 40);
389         LocalDateTime test1a = new LocalDateTime(2005, 6, 2, 10, 20, 30, 40);
390         assertEquals(true, test1.isEqual(test1a));
391         assertEquals(true, test1a.isEqual(test1));
392         assertEquals(true, test1.isEqual(test1));
393         assertEquals(true, test1a.isEqual(test1a));
394         
395         LocalDateTime test2 = new LocalDateTime(2005, 7, 2, 10, 20, 30, 40);
396         assertEquals(false, test1.isEqual(test2));
397         assertEquals(false, test2.isEqual(test1));
398         
399         LocalDateTime test3 = new LocalDateTime(2005, 7, 2, 10, 20, 30, 40, GREGORIAN_UTC);
400         assertEquals(false, test1.isEqual(test3));
401         assertEquals(false, test3.isEqual(test1));
402         assertEquals(true, test3.isEqual(test2));
403         
404         try {
405             new LocalDateTime(2005, 7, 2, 10, 20, 30, 40).isEqual(null);
406             fail();
407         } catch (IllegalArgumentException ex) {}
408     }
409     
410     //-----------------------------------------------------------------------
411     public void testIsBefore_LocalDateTime() {
412         LocalDateTime test1 = new LocalDateTime(2005, 6, 2, 10, 20, 30, 40);
413         LocalDateTime test1a = new LocalDateTime(2005, 6, 2, 10, 20, 30, 40);
414         assertEquals(false, test1.isBefore(test1a));
415         assertEquals(false, test1a.isBefore(test1));
416         assertEquals(false, test1.isBefore(test1));
417         assertEquals(false, test1a.isBefore(test1a));
418         
419         LocalDateTime test2 = new LocalDateTime(2005, 7, 2, 10, 20, 30, 40);
420         assertEquals(true, test1.isBefore(test2));
421         assertEquals(false, test2.isBefore(test1));
422         
423         LocalDateTime test3 = new LocalDateTime(2005, 7, 2, 10, 20, 30, 40, GREGORIAN_UTC);
424         assertEquals(true, test1.isBefore(test3));
425         assertEquals(false, test3.isBefore(test1));
426         assertEquals(false, test3.isBefore(test2));
427         
428         try {
429             new LocalDateTime(2005, 7, 2, 10, 20, 30, 40).isBefore(null);
430             fail();
431         } catch (IllegalArgumentException ex) {}
432     }
433     
434     //-----------------------------------------------------------------------
435     public void testIsAfter_LocalDateTime() {
436         LocalDateTime test1 = new LocalDateTime(2005, 6, 2, 10, 20, 30, 40);
437         LocalDateTime test1a = new LocalDateTime(2005, 6, 2, 10, 20, 30, 40);
438         assertEquals(false, test1.isAfter(test1a));
439         assertEquals(false, test1a.isAfter(test1));
440         assertEquals(false, test1.isAfter(test1));
441         assertEquals(false, test1a.isAfter(test1a));
442         
443         LocalDateTime test2 = new LocalDateTime(2005, 7, 2, 10, 20, 30, 40);
444         assertEquals(false, test1.isAfter(test2));
445         assertEquals(true, test2.isAfter(test1));
446         
447         LocalDateTime test3 = new LocalDateTime(2005, 7, 2, 10, 20, 30, 40, GREGORIAN_UTC);
448         assertEquals(false, test1.isAfter(test3));
449         assertEquals(true, test3.isAfter(test1));
450         assertEquals(false, test3.isAfter(test2));
451         
452         try {
453             new LocalDateTime(2005, 7, 2, 10, 20, 30, 40).isAfter(null);
454             fail();
455         } catch (IllegalArgumentException ex) {}
456     }
457 
458     //-----------------------------------------------------------------------
459     public void testWithDate() {
460         LocalDateTime test = new LocalDateTime(2004, 6, 9, 10, 20, 30, 40);
461         LocalDateTime result = test.withDate(2006, 2, 1);
462         
463         check(test, 2004, 6, 9, 10, 20, 30, 40);
464         check(result, 2006, 2, 1, 10, 20, 30, 40);
465     }
466 
467     //-----------------------------------------------------------------------
468     public void testWithTime() {
469         LocalDateTime test = new LocalDateTime(2004, 6, 9, 10, 20, 30, 40);
470         LocalDateTime result = test.withTime(9, 8, 7, 6);
471         
472         check(test, 2004, 6, 9, 10, 20, 30, 40);
473         check(result, 2004, 6, 9, 9, 8, 7, 6);
474     }
475 
476     //-----------------------------------------------------------------------
477     public void testWithField_DateTimeFieldType_int_1() {
478         LocalDateTime test = new LocalDateTime(2004, 6, 9, 10, 20, 30, 40);
479         LocalDateTime result = test.withField(DateTimeFieldType.year(), 2006);
480         
481         assertEquals(new LocalDateTime(2004, 6, 9, 10, 20, 30, 40), test);
482         assertEquals(new LocalDateTime(2006, 6, 9, 10, 20, 30, 40), result);
483     }
484 
485     public void testWithField_DateTimeFieldType_int_2() {
486         LocalDateTime test = new LocalDateTime(2004, 6, 9, 10, 20, 30, 40);
487         try {
488             test.withField(null, 6);
489             fail();
490         } catch (IllegalArgumentException ex) {}
491     }
492 
493     public void testWithField_DateTimeFieldType_int_3() {
494         LocalDateTime test = new LocalDateTime(2004, 6, 9, 10, 20, 30, 40);
495         LocalDateTime result = test.withField(DateTimeFieldType.year(), 2004);
496         assertEquals(new LocalDateTime(2004, 6, 9, 10, 20, 30, 40), test);
497         assertSame(test, result);
498     }
499 
500     //-----------------------------------------------------------------------
501     public void testWithFieldAdded_DurationFieldType_int_1() {
502         LocalDateTime test = new LocalDateTime(2004, 6, 9, 10, 20, 30, 40);
503         LocalDateTime result = test.withFieldAdded(DurationFieldType.years(), 6);
504         
505         assertEquals(new LocalDateTime(2004, 6, 9, 10, 20, 30, 40), test);
506         assertEquals(new LocalDateTime(2010, 6, 9, 10, 20, 30, 40), result);
507     }
508 
509     public void testWithFieldAdded_DurationFieldType_int_2() {
510         LocalDateTime test = new LocalDateTime(2004, 6, 9, 10, 20, 30, 40);
511         try {
512             test.withFieldAdded(null, 0);
513             fail();
514         } catch (IllegalArgumentException ex) {}
515     }
516 
517     public void testWithFieldAdded_DurationFieldType_int_3() {
518         LocalDateTime test = new LocalDateTime(2004, 6, 9, 10, 20, 30, 40);
519         try {
520             test.withFieldAdded(null, 6);
521             fail();
522         } catch (IllegalArgumentException ex) {}
523     }
524 
525     public void testWithFieldAdded_DurationFieldType_int_4() {
526         LocalDateTime test = new LocalDateTime(2004, 6, 9, 10, 20, 30, 40);
527         LocalDateTime result = test.withFieldAdded(DurationFieldType.years(), 0);
528         assertSame(test, result);
529     }
530 
531     //-----------------------------------------------------------------------
532     public void testPlus_RP() {
533         LocalDateTime test = new LocalDateTime(2002, 5, 3, 10, 20, 30, 40, BUDDHIST_LONDON);
534         LocalDateTime result = test.plus(new Period(1, 2, 3, 4, 29, 6, 7, 8));
535         LocalDateTime expected = new LocalDateTime(2003, 7, 29, 15, 26, 37, 48, BUDDHIST_LONDON);
536         assertEquals(expected, result);
537         
538         result = test.plus((ReadablePeriod) null);
539         assertSame(test, result);
540     }
541 
542     public void testPlusYears_int() {
543         LocalDateTime test = new LocalDateTime(2002, 5, 3, 10, 20, 30, 40, BUDDHIST_LONDON);
544         LocalDateTime result = test.plusYears(1);
545         LocalDateTime expected = new LocalDateTime(2003, 5, 3, 10, 20, 30, 40, BUDDHIST_LONDON);
546         assertEquals(expected, result);
547         
548         result = test.plusYears(0);
549         assertSame(test, result);
550     }
551 
552     public void testPlusMonths_int() {
553         LocalDateTime test = new LocalDateTime(2002, 5, 3, 10, 20, 30, 40, BUDDHIST_LONDON);
554         LocalDateTime result = test.plusMonths(1);
555         LocalDateTime expected = new LocalDateTime(2002, 6, 3, 10, 20, 30, 40, BUDDHIST_LONDON);
556         assertEquals(expected, result);
557         
558         result = test.plusMonths(0);
559         assertSame(test, result);
560     }
561 
562     public void testPlusWeeks_int() {
563         LocalDateTime test = new LocalDateTime(2002, 5, 3, 10, 20, 30, 40, BUDDHIST_LONDON);
564         LocalDateTime result = test.plusWeeks(1);
565         LocalDateTime expected = new LocalDateTime(2002, 5, 10, 10, 20, 30, 40, BUDDHIST_LONDON);
566         assertEquals(expected, result);
567         
568         result = test.plusWeeks(0);
569         assertSame(test, result);
570     }
571 
572     public void testPlusDays_int() {
573         LocalDateTime test = new LocalDateTime(2002, 5, 3, 10, 20, 30, 40, BUDDHIST_LONDON);
574         LocalDateTime result = test.plusDays(1);
575         LocalDateTime expected = new LocalDateTime(2002, 5, 4, 10, 20, 30, 40, BUDDHIST_LONDON);
576         assertEquals(expected, result);
577         
578         result = test.plusDays(0);
579         assertSame(test, result);
580     }
581 
582     public void testPlusHours_int() {
583         LocalDateTime test = new LocalDateTime(2002, 5, 3, 10, 20, 30, 40, BUDDHIST_LONDON);
584         LocalDateTime result = test.plusHours(1);
585         LocalDateTime expected = new LocalDateTime(2002, 5, 3, 11, 20, 30, 40, BUDDHIST_LONDON);
586         assertEquals(expected, result);
587         
588         result = test.plusHours(0);
589         assertSame(test, result);
590     }
591 
592     public void testPlusMinutes_int() {
593         LocalDateTime test = new LocalDateTime(2002, 5, 3, 10, 20, 30, 40, BUDDHIST_LONDON);
594         LocalDateTime result = test.plusMinutes(1);
595         LocalDateTime expected = new LocalDateTime(2002, 5, 3, 10, 21, 30, 40, BUDDHIST_LONDON);
596         assertEquals(expected, result);
597         
598         result = test.plusMinutes(0);
599         assertSame(test, result);
600     }
601 
602     public void testPlusSeconds_int() {
603         LocalDateTime test = new LocalDateTime(2002, 5, 3, 10, 20, 30, 40, BUDDHIST_LONDON);
604         LocalDateTime result = test.plusSeconds(1);
605         LocalDateTime expected = new LocalDateTime(2002, 5, 3, 10, 20, 31, 40, BUDDHIST_LONDON);
606         assertEquals(expected, result);
607         
608         result = test.plusSeconds(0);
609         assertSame(test, result);
610     }
611 
612     public void testPlusMillis_int() {
613         LocalDateTime test = new LocalDateTime(2002, 5, 3, 10, 20, 30, 40, BUDDHIST_LONDON);
614         LocalDateTime result = test.plusMillis(1);
615         LocalDateTime expected = new LocalDateTime(2002, 5, 3, 10, 20, 30, 41, BUDDHIST_LONDON);
616         assertEquals(expected, result);
617         
618         result = test.plusMillis(0);
619         assertSame(test, result);
620     }
621 
622     //-----------------------------------------------------------------------
623     public void testMinus_RP() {
624         LocalDateTime test = new LocalDateTime(2002, 5, 3, 10, 20, 30, 40, BUDDHIST_LONDON);
625         LocalDateTime result = test.minus(new Period(1, 1, 1, 1, 1, 1, 1, 1));
626         
627         LocalDateTime expected = new LocalDateTime(2001, 3, 26, 9, 19, 29, 39, BUDDHIST_LONDON);
628         assertEquals(expected, result);
629         
630         result = test.minus((ReadablePeriod) null);
631         assertSame(test, result);
632     }
633 
634     public void testMinusYears_int() {
635         LocalDateTime test = new LocalDateTime(2002, 5, 3, 10, 20, 30, 40, BUDDHIST_LONDON);
636         LocalDateTime result = test.minusYears(1);
637         LocalDateTime expected = new LocalDateTime(2001, 5, 3, 10, 20, 30, 40, BUDDHIST_LONDON);
638         assertEquals(expected, result);
639         
640         result = test.minusYears(0);
641         assertSame(test, result);
642     }
643 
644     public void testMinusMonths_int() {
645         LocalDateTime test = new LocalDateTime(2002, 5, 3, 10, 20, 30, 40, BUDDHIST_LONDON);
646         LocalDateTime result = test.minusMonths(1);
647         LocalDateTime expected = new LocalDateTime(2002, 4, 3, 10, 20, 30, 40, BUDDHIST_LONDON);
648         assertEquals(expected, result);
649         
650         result = test.minusMonths(0);
651         assertSame(test, result);
652     }
653 
654     public void testMinusWeeks_int() {
655         LocalDateTime test = new LocalDateTime(2002, 5, 3, 10, 20, 30, 40, BUDDHIST_LONDON);
656         LocalDateTime result = test.minusWeeks(1);
657         LocalDateTime expected = new LocalDateTime(2002, 4, 26, 10, 20, 30, 40, BUDDHIST_LONDON);
658         assertEquals(expected, result);
659         
660         result = test.minusWeeks(0);
661         assertSame(test, result);
662     }
663 
664     public void testMinusDays_int() {
665         LocalDateTime test = new LocalDateTime(2002, 5, 3, 10, 20, 30, 40, BUDDHIST_LONDON);
666         LocalDateTime result = test.minusDays(1);
667         LocalDateTime expected = new LocalDateTime(2002, 5, 2, 10, 20, 30, 40, BUDDHIST_LONDON);
668         assertEquals(expected, result);
669         
670         result = test.minusDays(0);
671         assertSame(test, result);
672     }
673 
674     public void testMinusHours_int() {
675         LocalDateTime test = new LocalDateTime(2002, 5, 3, 10, 20, 30, 40, BUDDHIST_LONDON);
676         LocalDateTime result = test.minusHours(1);
677         LocalDateTime expected = new LocalDateTime(2002, 5, 3, 9, 20, 30, 40, BUDDHIST_LONDON);
678         assertEquals(expected, result);
679         
680         result = test.minusHours(0);
681         assertSame(test, result);
682     }
683 
684     public void testMinusMinutes_int() {
685         LocalDateTime test = new LocalDateTime(2002, 5, 3, 10, 20, 30, 40, BUDDHIST_LONDON);
686         LocalDateTime result = test.minusMinutes(1);
687         LocalDateTime expected = new LocalDateTime(2002, 5, 3, 10, 19, 30, 40, BUDDHIST_LONDON);
688         assertEquals(expected, result);
689         
690         result = test.minusMinutes(0);
691         assertSame(test, result);
692     }
693 
694     public void testMinusSeconds_int() {
695         LocalDateTime test = new LocalDateTime(2002, 5, 3, 10, 20, 30, 40, BUDDHIST_LONDON);
696         LocalDateTime result = test.minusSeconds(1);
697         LocalDateTime expected = new LocalDateTime(2002, 5, 3, 10, 20, 29, 40, BUDDHIST_LONDON);
698         assertEquals(expected, result);
699         
700         result = test.minusSeconds(0);
701         assertSame(test, result);
702     }
703 
704     public void testMinusMillis_int() {
705         LocalDateTime test = new LocalDateTime(2002, 5, 3, 10, 20, 30, 40, BUDDHIST_LONDON);
706         LocalDateTime result = test.minusMillis(1);
707         LocalDateTime expected = new LocalDateTime(2002, 5, 3, 10, 20, 30, 39, BUDDHIST_LONDON);
708         assertEquals(expected, result);
709         
710         result = test.minusMillis(0);
711         assertSame(test, result);
712     }
713 
714     //-----------------------------------------------------------------------
715     public void testGetters() {
716         LocalDateTime test = new LocalDateTime(1970, 6, 9, 10, 20, 30, 40, GJ_UTC);
717         assertEquals(1970, test.getYear());
718         assertEquals(6, test.getMonthOfYear());
719         assertEquals(9, test.getDayOfMonth());
720         assertEquals(160, test.getDayOfYear());
721         assertEquals(2, test.getDayOfWeek());
722         assertEquals(24, test.getWeekOfWeekyear());
723         assertEquals(1970, test.getWeekyear());
724         assertEquals(70, test.getYearOfCentury());
725         assertEquals(20, test.getCenturyOfEra());
726         assertEquals(1970, test.getYearOfEra());
727         assertEquals(DateTimeConstants.AD, test.getEra());
728         assertEquals(10, test.getHourOfDay());
729         assertEquals(20, test.getMinuteOfHour());
730         assertEquals(30, test.getSecondOfMinute());
731         assertEquals(40, test.getMillisOfSecond());
732         assertEquals(MILLIS_OF_DAY_UTC, test.getMillisOfDay());
733     }
734 
735     //-----------------------------------------------------------------------
736     public void testWithers() {
737         LocalDateTime test = new LocalDateTime(1970, 6, 9, 10, 20, 30, 40, GJ_UTC);
738         check(test.withYear(2000), 2000, 6, 9, 10, 20, 30, 40);
739         check(test.withMonthOfYear(2), 1970, 2, 9, 10, 20, 30, 40);
740         check(test.withDayOfMonth(2), 1970, 6, 2, 10, 20, 30, 40);
741         check(test.withDayOfYear(6), 1970, 1, 6, 10, 20, 30, 40);
742         check(test.withDayOfWeek(6), 1970, 6, 13, 10, 20, 30, 40);
743         check(test.withWeekOfWeekyear(6), 1970, 2, 3, 10, 20, 30, 40);
744         check(test.withWeekyear(1971), 1971, 6, 15, 10, 20, 30, 40);
745         check(test.withYearOfCentury(60), 1960, 6, 9, 10, 20, 30, 40);
746         check(test.withCenturyOfEra(21), 2070, 6, 9, 10, 20, 30, 40);
747         check(test.withYearOfEra(1066), 1066, 6, 9, 10, 20, 30, 40);
748         check(test.withEra(DateTimeConstants.BC), -1970, 6, 9, 10, 20, 30, 40);
749         check(test.withHourOfDay(6), 1970, 6, 9, 6, 20, 30, 40);
750         check(test.withMinuteOfHour(6), 1970, 6, 9, 10, 6, 30, 40);
751         check(test.withSecondOfMinute(6), 1970, 6, 9, 10, 20, 6, 40);
752         check(test.withMillisOfSecond(6), 1970, 6, 9, 10, 20, 30, 6);
753         check(test.withMillisOfDay(61234), 1970, 6, 9, 0, 1, 1, 234);
754         try {
755             test.withMonthOfYear(0);
756             fail();
757         } catch (IllegalArgumentException ex) {}
758         try {
759             test.withMonthOfYear(13);
760             fail();
761         } catch (IllegalArgumentException ex) {}
762     }
763 
764     //-----------------------------------------------------------------------
765     public void testToDateTime() {
766         LocalDateTime base = new LocalDateTime(2005, 6, 9, 6, 7, 8, 9, COPTIC_PARIS); // PARIS irrelevant
767         
768         DateTime test = base.toDateTime();
769         check(base, 2005, 6, 9, 6, 7, 8, 9);
770         DateTime expected = new DateTime(2005, 6, 9, 6, 7, 8, 9, COPTIC_LONDON);
771         assertEquals(expected, test);
772     }
773 
774     //-----------------------------------------------------------------------
775     public void testToDateTime_Zone() {
776         LocalDateTime base = new LocalDateTime(2005, 6, 9, 6, 7, 8, 9, COPTIC_PARIS); // PARIS irrelevant
777         
778         DateTime test = base.toDateTime(TOKYO);
779         check(base, 2005, 6, 9, 6, 7, 8, 9);
780         DateTime expected = new DateTime(2005, 6, 9, 6, 7, 8, 9, COPTIC_TOKYO);
781         assertEquals(expected, test);
782     }
783 
784     public void testToDateTime_nullZone() {
785         LocalDateTime base = new LocalDateTime(2005, 6, 9, 6, 7, 8, 9, COPTIC_PARIS); // PARIS irrelevant
786         
787         DateTime test = base.toDateTime((DateTimeZone) null);
788         check(base, 2005, 6, 9, 6, 7, 8, 9);
789         DateTime expected = new DateTime(2005, 6, 9, 6, 7, 8, 9, COPTIC_LONDON);
790         assertEquals(expected, test);
791     }
792 
793     //-----------------------------------------------------------------------
794     public void testToLocalDate() {
795         LocalDateTime base = new LocalDateTime(2005, 6, 9, 6, 7, 8, 9, COPTIC_PARIS); // PARIS irrelevant
796         LocalDate expected = new LocalDate(2005, 6, 9, COPTIC_LONDON);
797         assertEquals(expected,base.toLocalDate());
798     }
799 
800     public void testToLocalTime() {
801         LocalDateTime base = new LocalDateTime(2005, 6, 9, 6, 7, 8, 9, COPTIC_PARIS); // PARIS irrelevant
802         LocalTime expected = new LocalTime(6, 7, 8, 9, COPTIC_LONDON);
803         assertEquals(expected,base.toLocalTime());
804     }
805 
806     //-----------------------------------------------------------------------
807     public void testToDateTime_RI() {
808         LocalDateTime base = new LocalDateTime(2005, 6, 9, 10, 20, 30, 40, COPTIC_PARIS);
809         DateTime dt = new DateTime(2002, 1, 3, 4, 5, 6, 7, BUDDHIST_TOKYO);
810         
811         DateTime test = base.toDateTime(dt);
812         check(base, 2005, 6, 9, 10, 20, 30, 40);
813         DateTime expected = new DateTime(2005, 6, 9, 10, 20, 30, 40, BUDDHIST_TOKYO);
814         assertEquals(expected, test);
815     }
816 
817     public void testToDateTime_nullRI() {
818         LocalDateTime base = new LocalDateTime(2005, 6, 9, 10, 20, 30, 40, COPTIC_PARIS);
819         
820         DateTime test = base.toDateTime((ReadableInstant) null);
821         check(base, 2005, 6, 9, 10, 20, 30, 40);
822         DateTime expected = new DateTime(2005, 6, 9, 10, 20, 30, 40, ISO_LONDON);
823         assertEquals(expected, test);
824     }
825 
826     //-----------------------------------------------------------------------
827     public void testToDate_summer() {
828         LocalDateTime base = new LocalDateTime(2005, 7, 9, 10, 20, 30, 40, COPTIC_PARIS);
829         
830         Date test = base.toDate();
831         check(base, 2005, 7, 9, 10, 20, 30, 40);
832         
833         GregorianCalendar gcal = new GregorianCalendar();
834         gcal.clear();
835         gcal.set(Calendar.YEAR, 2005);
836         gcal.set(Calendar.MONTH, Calendar.JULY);
837         gcal.set(Calendar.DAY_OF_MONTH, 9);
838         gcal.set(Calendar.HOUR_OF_DAY, 10);
839         gcal.set(Calendar.MINUTE, 20);
840         gcal.set(Calendar.SECOND, 30);
841         gcal.set(Calendar.MILLISECOND, 40);
842         assertEquals(gcal.getTime(), test);
843     }
844 
845     public void testToDate_winter() {
846         LocalDateTime base = new LocalDateTime(2005, 1, 9, 10, 20, 30, 40, COPTIC_PARIS);
847         
848         Date test = base.toDate();
849         check(base, 2005, 1, 9, 10, 20, 30, 40);
850         
851         GregorianCalendar gcal = new GregorianCalendar();
852         gcal.clear();
853         gcal.set(Calendar.YEAR, 2005);
854         gcal.set(Calendar.MONTH, Calendar.JANUARY);
855         gcal.set(Calendar.DAY_OF_MONTH, 9);
856         gcal.set(Calendar.HOUR_OF_DAY, 10);
857         gcal.set(Calendar.MINUTE, 20);
858         gcal.set(Calendar.SECOND, 30);
859         gcal.set(Calendar.MILLISECOND, 40);
860         assertEquals(gcal.getTime(), test);
861     }
862 
863     public void testToDate_springDST() {
864         LocalDateTime base = new LocalDateTime(2007, 4, 2, 0, 20, 0, 0);
865         
866         SimpleTimeZone testZone = new SimpleTimeZone(3600000, "NoMidnight",
867                 Calendar.APRIL, 2, 0, 0, Calendar.OCTOBER, 2, 0, 3600000);
868         TimeZone currentZone = TimeZone.getDefault();
869         try {
870             TimeZone.setDefault(testZone);
871             Date test = base.toDate();
872             check(base, 2007, 4, 2, 0, 20, 0, 0);
873             assertEquals("Mon Apr 02 01:00:00 GMT+02:00 2007", test.toString());
874         } finally {
875             TimeZone.setDefault(currentZone);
876         }
877     }
878 
879     public void testToDate_springDST_2Hour40Savings() {
880         LocalDateTime base = new LocalDateTime(2007, 4, 2, 0, 20, 0, 0);
881         
882         SimpleTimeZone testZone = new SimpleTimeZone(3600000, "NoMidnight",
883                 Calendar.APRIL, 2, 0, 0, Calendar.OCTOBER, 2, 0, 3600000, (3600000 / 6) * 16);
884         TimeZone currentZone = TimeZone.getDefault();
885         try {
886             TimeZone.setDefault(testZone);
887             Date test = base.toDate();
888             check(base, 2007, 4, 2, 0, 20, 0, 0);
889             assertEquals("Mon Apr 02 02:40:00 GMT+03:40 2007", test.toString());
890         } finally {
891             TimeZone.setDefault(currentZone);
892         }
893     }
894 
895     public void testToDate_autumnDST() {
896         LocalDateTime base = new LocalDateTime(2007, 10, 2, 0, 20, 30, 0);
897         
898         SimpleTimeZone testZone = new SimpleTimeZone(3600000, "NoMidnight",
899                 Calendar.APRIL, 2, 0, 0, Calendar.OCTOBER, 2, 0, 3600000);
900         TimeZone currentZone = TimeZone.getDefault();
901         try {
902             TimeZone.setDefault(testZone);
903             Date test = base.toDate();
904             check(base, 2007, 10, 2, 0, 20, 30, 0);
905             assertEquals("Tue Oct 02 00:20:30 GMT+02:00 2007", test.toString());
906         } finally {
907             TimeZone.setDefault(currentZone);
908         }
909     }
910 
911     //-----------------------------------------------------------------------
912     public void testProperty() {
913         LocalDateTime test = new LocalDateTime(2005, 6, 9, 10, 20, 30, 40, GJ_UTC);
914         assertEquals(test.year(), test.property(DateTimeFieldType.year()));
915         assertEquals(test.monthOfYear(), test.property(DateTimeFieldType.monthOfYear()));
916         assertEquals(test.dayOfMonth(), test.property(DateTimeFieldType.dayOfMonth()));
917         assertEquals(test.dayOfWeek(), test.property(DateTimeFieldType.dayOfWeek()));
918         assertEquals(test.dayOfYear(), test.property(DateTimeFieldType.dayOfYear()));
919         assertEquals(test.weekOfWeekyear(), test.property(DateTimeFieldType.weekOfWeekyear()));
920         assertEquals(test.weekyear(), test.property(DateTimeFieldType.weekyear()));
921         assertEquals(test.yearOfCentury(), test.property(DateTimeFieldType.yearOfCentury()));
922         assertEquals(test.yearOfEra(), test.property(DateTimeFieldType.yearOfEra()));
923         assertEquals(test.centuryOfEra(), test.property(DateTimeFieldType.centuryOfEra()));
924         assertEquals(test.era(), test.property(DateTimeFieldType.era()));
925         assertEquals(test.hourOfDay(), test.property(DateTimeFieldType.hourOfDay()));
926         assertEquals(test.minuteOfHour(), test.property(DateTimeFieldType.minuteOfHour()));
927         assertEquals(test.secondOfMinute(), test.property(DateTimeFieldType.secondOfMinute()));
928         assertEquals(test.millisOfSecond(), test.property(DateTimeFieldType.millisOfSecond()));
929         assertEquals(test.millisOfDay(), test.property(DateTimeFieldType.millisOfDay()));
930         
931         try {
932             test.property(null);
933             fail();
934         } catch (IllegalArgumentException ex) {}
935         assertEquals(test, test.property(DateTimeFieldType.minuteOfDay()).getLocalDateTime());
936     }
937 
938     //-----------------------------------------------------------------------
939     public void testSerialization() throws Exception {
940         LocalDateTime test = new LocalDateTime(1972, 6, 9, 10, 20, 30, 40, COPTIC_PARIS);
941         
942         ByteArrayOutputStream baos = new ByteArrayOutputStream();
943         ObjectOutputStream oos = new ObjectOutputStream(baos);
944         oos.writeObject(test);
945         byte[] bytes = baos.toByteArray();
946         oos.close();
947         
948         ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
949         ObjectInputStream ois = new ObjectInputStream(bais);
950         LocalDateTime result = (LocalDateTime) ois.readObject();
951         ois.close();
952         
953         assertEquals(test, result);
954         assertTrue(Arrays.equals(test.getValues(), result.getValues()));
955         assertTrue(Arrays.equals(test.getFields(), result.getFields()));
956         assertEquals(test.getChronology(), result.getChronology());
957         assertTrue(result.isSupported(DateTimeFieldType.dayOfMonth()));  // check deserialization
958     }
959 
960     //-----------------------------------------------------------------------
961     public void testToString() {
962         LocalDateTime test = new LocalDateTime(2002, 6, 9, 10, 20, 30, 40);
963         assertEquals("2002-06-09T10:20:30.040", test.toString());
964     }
965 
966     //-----------------------------------------------------------------------
967     public void testToString_String() {
968         LocalDateTime test = new LocalDateTime(2002, 6, 9, 10, 20, 30, 40);
969         assertEquals("2002 10", test.toString("yyyy HH"));
970         assertEquals("2002-06-09T10:20:30.040", test.toString((String) null));
971     }
972 
973     //-----------------------------------------------------------------------
974     public void testToString_String_Locale() {
975         LocalDateTime test = new LocalDateTime(1970, 6, 9, 10, 20, 30, 40);
976         assertEquals("Tue 9/6", test.toString("EEE d/M", Locale.ENGLISH));
977         assertEquals("mar. 9/6", test.toString("EEE d/M", Locale.FRENCH));
978         assertEquals("1970-06-09T10:20:30.040", test.toString(null, Locale.ENGLISH));
979         assertEquals("Tue 9/6", test.toString("EEE d/M", null));
980         assertEquals("1970-06-09T10:20:30.040", test.toString(null, null));
981     }
982 
983     //-----------------------------------------------------------------------
984     public void testToString_DTFormatter() {
985         LocalDateTime test = new LocalDateTime(2002, 6, 9, 10, 20, 30, 40);
986         assertEquals("2002 10", test.toString(DateTimeFormat.forPattern("yyyy HH")));
987         assertEquals("2002-06-09T10:20:30.040", test.toString((DateTimeFormatter) null));
988     }
989 
990     //-----------------------------------------------------------------------
991     private void check(LocalDateTime test, int year, int month, int day, int hour, int min, int sec, int mil) {
992         assertEquals(year, test.getYear());
993         assertEquals(month, test.getMonthOfYear());
994         assertEquals(day, test.getDayOfMonth());
995         assertEquals(hour, test.getHourOfDay());
996         assertEquals(min, test.getMinuteOfHour());
997         assertEquals(sec, test.getSecondOfMinute());
998         assertEquals(mil, test.getMillisOfSecond());
999     }
1000 }