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;
017    
018    import java.io.ByteArrayInputStream;
019    import java.io.ByteArrayOutputStream;
020    import java.io.ObjectInputStream;
021    import java.io.ObjectOutputStream;
022    import java.math.BigInteger;
023    import java.util.Arrays;
024    import java.util.Locale;
025    import java.util.TimeZone;
026    
027    import junit.framework.TestCase;
028    import junit.framework.TestSuite;
029    
030    import org.joda.time.base.BasePeriod;
031    import org.joda.time.format.PeriodFormat;
032    import org.joda.time.format.PeriodFormatter;
033    
034    /**
035     * This class is a Junit unit test for Duration.
036     *
037     * @author Stephen Colebourne
038     */
039    public class TestPeriod_Basics extends TestCase {
040        // Test in 2002/03 as time zones are more well known
041        // (before the late 90's they were all over the place)
042    
043        //private static final DateTimeZone PARIS = DateTimeZone.forID("Europe/Paris");
044        private static final DateTimeZone LONDON = DateTimeZone.forID("Europe/London");
045        
046        long y2002days = 365 + 365 + 366 + 365 + 365 + 365 + 366 + 365 + 365 + 365 + 
047                         366 + 365 + 365 + 365 + 366 + 365 + 365 + 365 + 366 + 365 + 
048                         365 + 365 + 366 + 365 + 365 + 365 + 366 + 365 + 365 + 365 +
049                         366 + 365;
050        long y2003days = 365 + 365 + 366 + 365 + 365 + 365 + 366 + 365 + 365 + 365 + 
051                         366 + 365 + 365 + 365 + 366 + 365 + 365 + 365 + 366 + 365 + 
052                         365 + 365 + 366 + 365 + 365 + 365 + 366 + 365 + 365 + 365 +
053                         366 + 365 + 365;
054        
055        // 2002-06-09
056        private long TEST_TIME_NOW =
057                (y2002days + 31L + 28L + 31L + 30L + 31L + 9L -1L) * DateTimeConstants.MILLIS_PER_DAY;
058                
059        // 2002-04-05
060        private long TEST_TIME1 =
061                (y2002days + 31L + 28L + 31L + 5L -1L) * DateTimeConstants.MILLIS_PER_DAY
062                + 12L * DateTimeConstants.MILLIS_PER_HOUR
063                + 24L * DateTimeConstants.MILLIS_PER_MINUTE;
064            
065        // 2003-05-06
066        private long TEST_TIME2 =
067                (y2003days + 31L + 28L + 31L + 30L + 6L -1L) * DateTimeConstants.MILLIS_PER_DAY
068                + 14L * DateTimeConstants.MILLIS_PER_HOUR
069                + 28L * DateTimeConstants.MILLIS_PER_MINUTE;
070        
071        private DateTimeZone originalDateTimeZone = null;
072        private TimeZone originalTimeZone = null;
073        private Locale originalLocale = null;
074    
075        public static void main(String[] args) {
076            junit.textui.TestRunner.run(suite());
077        }
078    
079        public static TestSuite suite() {
080            return new TestSuite(TestPeriod_Basics.class);
081        }
082    
083        public TestPeriod_Basics(String name) {
084            super(name);
085        }
086    
087        protected void setUp() throws Exception {
088            DateTimeUtils.setCurrentMillisFixed(TEST_TIME_NOW);
089            originalDateTimeZone = DateTimeZone.getDefault();
090            originalTimeZone = TimeZone.getDefault();
091            originalLocale = Locale.getDefault();
092            DateTimeZone.setDefault(LONDON);
093            TimeZone.setDefault(TimeZone.getTimeZone("Europe/London"));
094            Locale.setDefault(Locale.UK);
095        }
096    
097        protected void tearDown() throws Exception {
098            DateTimeUtils.setCurrentMillisSystem();
099            DateTimeZone.setDefault(originalDateTimeZone);
100            TimeZone.setDefault(originalTimeZone);
101            Locale.setDefault(originalLocale);
102            originalDateTimeZone = null;
103            originalTimeZone = null;
104            originalLocale = null;
105        }
106    
107        //-----------------------------------------------------------------------
108        public void testTest() {
109            assertEquals("2002-06-09T00:00:00.000Z", new Instant(TEST_TIME_NOW).toString());
110            assertEquals("2002-04-05T12:24:00.000Z", new Instant(TEST_TIME1).toString());
111            assertEquals("2003-05-06T14:28:00.000Z", new Instant(TEST_TIME2).toString());
112        }
113    
114        //-----------------------------------------------------------------------
115        public void testGetPeriodType() {
116            Period test = new Period(0L);
117            assertEquals(PeriodType.standard(), test.getPeriodType());
118        }
119    
120        public void testGetMethods() {
121            Period test = new Period(0L);
122            assertEquals(0, test.getYears());
123            assertEquals(0, test.getMonths());
124            assertEquals(0, test.getWeeks());
125            assertEquals(0, test.getDays());
126            assertEquals(0, test.getHours());
127            assertEquals(0, test.getMinutes());
128            assertEquals(0, test.getSeconds());
129            assertEquals(0, test.getMillis());
130        }
131    
132        public void testValueIndexMethods() {
133            Period test = new Period(1, 0, 0, 4, 5, 6, 7, 8, PeriodType.yearDayTime());
134            assertEquals(6, test.size());
135            assertEquals(1, test.getValue(0));
136            assertEquals(4, test.getValue(1));
137            assertEquals(5, test.getValue(2));
138            assertEquals(6, test.getValue(3));
139            assertEquals(7, test.getValue(4));
140            assertEquals(8, test.getValue(5));
141            assertEquals(true, Arrays.equals(new int[] {1, 4, 5, 6, 7, 8}, test.getValues()));
142        }
143    
144        public void testTypeIndexMethods() {
145            Period test = new Period(1, 0, 0, 4, 5, 6, 7, 8, PeriodType.yearDayTime());
146            assertEquals(6, test.size());
147            assertEquals(DurationFieldType.years(), test.getFieldType(0));
148            assertEquals(DurationFieldType.days(), test.getFieldType(1));
149            assertEquals(DurationFieldType.hours(), test.getFieldType(2));
150            assertEquals(DurationFieldType.minutes(), test.getFieldType(3));
151            assertEquals(DurationFieldType.seconds(), test.getFieldType(4));
152            assertEquals(DurationFieldType.millis(), test.getFieldType(5));
153            assertEquals(true, Arrays.equals(new DurationFieldType[] {
154                DurationFieldType.years(), DurationFieldType.days(), DurationFieldType.hours(),
155                DurationFieldType.minutes(), DurationFieldType.seconds(), DurationFieldType.millis()},
156                test.getFieldTypes()));
157        }
158    
159        public void testIsSupported() {
160            Period test = new Period(1, 0, 0, 4, 5, 6, 7, 8, PeriodType.yearDayTime());
161            assertEquals(true, test.isSupported(DurationFieldType.years()));
162            assertEquals(false, test.isSupported(DurationFieldType.months()));
163            assertEquals(false, test.isSupported(DurationFieldType.weeks()));
164            assertEquals(true, test.isSupported(DurationFieldType.days()));
165            assertEquals(true, test.isSupported(DurationFieldType.hours()));
166            assertEquals(true, test.isSupported(DurationFieldType.minutes()));
167            assertEquals(true, test.isSupported(DurationFieldType.seconds()));
168            assertEquals(true, test.isSupported(DurationFieldType.millis()));
169        }        
170    
171        public void testIndexOf() {
172            Period test = new Period(1, 0, 0, 4, 5, 6, 7, 8, PeriodType.yearDayTime());
173            assertEquals(0, test.indexOf(DurationFieldType.years()));
174            assertEquals(-1, test.indexOf(DurationFieldType.months()));
175            assertEquals(-1, test.indexOf(DurationFieldType.weeks()));
176            assertEquals(1, test.indexOf(DurationFieldType.days()));
177            assertEquals(2, test.indexOf(DurationFieldType.hours()));
178            assertEquals(3, test.indexOf(DurationFieldType.minutes()));
179            assertEquals(4, test.indexOf(DurationFieldType.seconds()));
180            assertEquals(5, test.indexOf(DurationFieldType.millis()));
181        }
182    
183        public void testGet() {
184            Period test = new Period(1, 0, 0, 4, 5, 6, 7, 8, PeriodType.yearDayTime());
185            assertEquals(1, test.get(DurationFieldType.years()));
186            assertEquals(0, test.get(DurationFieldType.months()));
187            assertEquals(0, test.get(DurationFieldType.weeks()));
188            assertEquals(4, test.get(DurationFieldType.days()));
189            assertEquals(5, test.get(DurationFieldType.hours()));
190            assertEquals(6, test.get(DurationFieldType.minutes()));
191            assertEquals(7, test.get(DurationFieldType.seconds()));
192            assertEquals(8, test.get(DurationFieldType.millis()));
193        }
194    
195        public void testEqualsHashCode() {
196            Period test1 = new Period(123L);
197            Period test2 = new Period(123L);
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            Period test3 = new Period(321L);
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(true, test1.equals(new MockPeriod(123L)));
216            assertEquals(false, test1.equals(new Period(123L, PeriodType.dayTime())));
217        }
218        
219        class MockPeriod extends BasePeriod {
220            public MockPeriod(long value) {
221                super(value, null, null);
222            }
223        }
224    
225        //-----------------------------------------------------------------------
226        public void testSerialization() throws Exception {
227            Period test = new Period(123L);
228            
229            ByteArrayOutputStream baos = new ByteArrayOutputStream();
230            ObjectOutputStream oos = new ObjectOutputStream(baos);
231            oos.writeObject(test);
232            byte[] bytes = baos.toByteArray();
233            oos.close();
234            
235            ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
236            ObjectInputStream ois = new ObjectInputStream(bais);
237            Period result = (Period) ois.readObject();
238            ois.close();
239            
240            assertEquals(test, result);
241        }
242    
243    //    //-----------------------------------------------------------------------
244    //    public void testAddTo1() {
245    //        long expected = TEST_TIME_NOW;
246    //        expected = ISOChronology.getInstance().years().add(expected, 1);
247    //        expected = ISOChronology.getInstance().months().add(expected, 2);
248    //        expected = ISOChronology.getInstance().weeks().add(expected, 3);
249    //        expected = ISOChronology.getInstance().days().add(expected, 4);
250    //        expected = ISOChronology.getInstance().hours().add(expected, 5);
251    //        expected = ISOChronology.getInstance().minutes().add(expected, 6);
252    //        expected = ISOChronology.getInstance().seconds().add(expected, 7);
253    //        expected = ISOChronology.getInstance().millis().add(expected, 8);
254    //        
255    //        Period test = new Period(1, 2, 3, 4, 5, 6, 7, 8);
256    //        long added = test.addTo(TEST_TIME_NOW, 1);
257    //        assertEquals(expected, added);
258    //    }
259    //    
260    //    public void testAddTo2() {
261    //        long expected = TEST_TIME_NOW;
262    //        expected = ISOChronology.getInstance().years().add(expected, -2);
263    //        expected = ISOChronology.getInstance().months().add(expected, -4);
264    //        expected = ISOChronology.getInstance().weeks().add(expected, -6);
265    //        expected = ISOChronology.getInstance().days().add(expected, -8);
266    //        expected = ISOChronology.getInstance().hours().add(expected, -10);
267    //        expected = ISOChronology.getInstance().minutes().add(expected, -12);
268    //        expected = ISOChronology.getInstance().seconds().add(expected, -14);
269    //        expected = ISOChronology.getInstance().millis().add(expected, -16);
270    //        
271    //        Period test = new Period(1, 2, 3, 4, 5, 6, 7, 8);
272    //        long added = test.addTo(TEST_TIME_NOW, -2);
273    //        assertEquals(expected, added);
274    //    }
275    //    
276    //    public void testAddTo3() {
277    //        long expected = TEST_TIME_NOW;
278    //        Period test = new Period(1, 2, 3, 4, 5, 6, 7, 8);
279    //        long added = test.addTo(TEST_TIME_NOW, 0);
280    //        assertEquals(expected, added);
281    //    }
282    //    
283    //    public void testAddTo4() {
284    //        long expected = TEST_TIME_NOW + 100L;
285    //        Period test = new Period(100L);
286    //        long added = test.addTo(TEST_TIME_NOW, 1);
287    //        assertEquals(expected, added);
288    //    }
289    //    
290    //    //-----------------------------------------------------------------------
291    //    public void testAddToWithChronology1() {
292    //        long expected = TEST_TIME_NOW;
293    //        expected = ISOChronology.getInstance().years().add(expected, 1);
294    //        expected = ISOChronology.getInstance().months().add(expected, 2);
295    //        expected = ISOChronology.getInstance().weeks().add(expected, 3);
296    //        expected = ISOChronology.getInstance().days().add(expected, 4);
297    //        expected = ISOChronology.getInstance().hours().add(expected, 5);
298    //        expected = ISOChronology.getInstance().minutes().add(expected, 6);
299    //        expected = ISOChronology.getInstance().seconds().add(expected, 7);
300    //        expected = ISOChronology.getInstance().millis().add(expected, 8);
301    //        
302    //        Period test = new Period(1, 2, 3, 4, 5, 6, 7, 8);
303    //        long added = test.addTo(TEST_TIME_NOW, 1, ISOChronology.getInstance());
304    //        assertEquals(expected, added);
305    //    }
306    //    
307    //    public void testAddToWithChronology2() {
308    //        long expected = TEST_TIME_NOW;
309    //        expected = ISOChronology.getInstanceUTC().years().add(expected, -2);
310    //        expected = ISOChronology.getInstanceUTC().months().add(expected, -4);
311    //        expected = ISOChronology.getInstanceUTC().weeks().add(expected, -6);
312    //        expected = ISOChronology.getInstanceUTC().days().add(expected, -8);
313    //        expected = ISOChronology.getInstanceUTC().hours().add(expected, -10);
314    //        expected = ISOChronology.getInstanceUTC().minutes().add(expected, -12);
315    //        expected = ISOChronology.getInstanceUTC().seconds().add(expected, -14);
316    //        expected = ISOChronology.getInstanceUTC().millis().add(expected, -16);
317    //        
318    //        Period test = new Period(1, 2, 3, 4, 5, 6, 7, 8, PeriodType.standard());
319    //        long added = test.addTo(TEST_TIME_NOW, -2, ISOChronology.getInstanceUTC());  // local specified so use it
320    //        assertEquals(expected, added);
321    //    }
322    //    
323    //    public void testAddToWithChronology3() {
324    //        long expected = TEST_TIME_NOW;
325    //        expected = ISOChronology.getInstance().years().add(expected, -2);
326    //        expected = ISOChronology.getInstance().months().add(expected, -4);
327    //        expected = ISOChronology.getInstance().weeks().add(expected, -6);
328    //        expected = ISOChronology.getInstance().days().add(expected, -8);
329    //        expected = ISOChronology.getInstance().hours().add(expected, -10);
330    //        expected = ISOChronology.getInstance().minutes().add(expected, -12);
331    //        expected = ISOChronology.getInstance().seconds().add(expected, -14);
332    //        expected = ISOChronology.getInstance().millis().add(expected, -16);
333    //        
334    //        Period test = new Period(1, 2, 3, 4, 5, 6, 7, 8, PeriodType.standard());
335    //        long added = test.addTo(TEST_TIME_NOW, -2, null);  // no chrono specified so use default
336    //        assertEquals(expected, added);
337    //    }
338    //    
339    //    //-----------------------------------------------------------------------
340    //    public void testAddToRI1() {
341    //        long expected = TEST_TIME_NOW;
342    //        expected = ISOChronology.getInstance().years().add(expected, 1);
343    //        expected = ISOChronology.getInstance().months().add(expected, 2);
344    //        expected = ISOChronology.getInstance().weeks().add(expected, 3);
345    //        expected = ISOChronology.getInstance().days().add(expected, 4);
346    //        expected = ISOChronology.getInstance().hours().add(expected, 5);
347    //        expected = ISOChronology.getInstance().minutes().add(expected, 6);
348    //        expected = ISOChronology.getInstance().seconds().add(expected, 7);
349    //        expected = ISOChronology.getInstance().millis().add(expected, 8);
350    //        
351    //        Period test = new Period(1, 2, 3, 4, 5, 6, 7, 8);
352    //        DateTime added = test.addTo(new Instant(), 1);  // Instant has no time zone, use default
353    //        assertEquals(expected, added.getMillis());
354    //        assertEquals(ISOChronology.getInstance(), added.getChronology());
355    //    }
356    //    
357    //    public void testAddToRI2() {
358    //        long expected = TEST_TIME_NOW;
359    //        expected = ISOChronology.getInstance().years().add(expected, -2);
360    //        expected = ISOChronology.getInstance().months().add(expected, -4);
361    //        expected = ISOChronology.getInstance().weeks().add(expected, -6);
362    //        expected = ISOChronology.getInstance().days().add(expected, -8);
363    //        expected = ISOChronology.getInstance().hours().add(expected, -10);
364    //        expected = ISOChronology.getInstance().minutes().add(expected, -12);
365    //        expected = ISOChronology.getInstance().seconds().add(expected, -14);
366    //        expected = ISOChronology.getInstance().millis().add(expected, -16);
367    //        
368    //        Period test = new Period(1, 2, 3, 4, 5, 6, 7, 8, PeriodType.standard());
369    //        DateTime added = test.addTo(new Instant(), -2);  // Instant has no time zone, use default
370    //        assertEquals(expected, added.getMillis());
371    //        assertEquals(ISOChronology.getInstance(), added.getChronology());
372    //    }
373    //    
374    //    public void testAddToRI3() {
375    //        long expected = TEST_TIME_NOW;
376    //        expected = ISOChronology.getInstanceUTC().years().add(expected, -2);
377    //        expected = ISOChronology.getInstanceUTC().months().add(expected, -4);
378    //        expected = ISOChronology.getInstanceUTC().weeks().add(expected, -6);
379    //        expected = ISOChronology.getInstanceUTC().days().add(expected, -8);
380    //        expected = ISOChronology.getInstanceUTC().hours().add(expected, -10);
381    //        expected = ISOChronology.getInstanceUTC().minutes().add(expected, -12);
382    //        expected = ISOChronology.getInstanceUTC().seconds().add(expected, -14);
383    //        expected = ISOChronology.getInstanceUTC().millis().add(expected, -16);
384    //        
385    //        Period test = new Period(1, 2, 3, 4, 5, 6, 7, 8, PeriodType.standard());
386    //        DateTime added = test.addTo(new DateTime(ISOChronology.getInstanceUTC()), -2);  // DateTime has UTC time zone
387    //        assertEquals(expected, added.getMillis());
388    //        assertEquals(ISOChronology.getInstanceUTC(), added.getChronology());
389    //    }
390    //    
391    //    public void testAddToRI4() {
392    //        long expected = TEST_TIME_NOW;
393    //        expected = ISOChronology.getInstance(PARIS).years().add(expected, -2);
394    //        expected = ISOChronology.getInstance(PARIS).months().add(expected, -4);
395    //        expected = ISOChronology.getInstance(PARIS).weeks().add(expected, -6);
396    //        expected = ISOChronology.getInstance(PARIS).days().add(expected, -8);
397    //        expected = ISOChronology.getInstance(PARIS).hours().add(expected, -10);
398    //        expected = ISOChronology.getInstance(PARIS).minutes().add(expected, -12);
399    //        expected = ISOChronology.getInstance(PARIS).seconds().add(expected, -14);
400    //        expected = ISOChronology.getInstance(PARIS).millis().add(expected, -16);
401    //        
402    //        Period test = new Period(1, 2, 3, 4, 5, 6, 7, 8, PeriodType.standard());
403    //        DateTime added = test.addTo(new DateTime(PARIS), -2);  // DateTime has PARIS time zone
404    //        assertEquals(expected, added.getMillis());
405    //        assertEquals(ISOChronology.getInstance(PARIS), added.getChronology());
406    //    }
407    //    
408    //    public void testAddToRI5() {
409    //        long expected = TEST_TIME_NOW;
410    //        expected = ISOChronology.getInstance().years().add(expected, -2);
411    //        expected = ISOChronology.getInstance().months().add(expected, -4);
412    //        expected = ISOChronology.getInstance().weeks().add(expected, -6);
413    //        expected = ISOChronology.getInstance().days().add(expected, -8);
414    //        expected = ISOChronology.getInstance().hours().add(expected, -10);
415    //        expected = ISOChronology.getInstance().minutes().add(expected, -12);
416    //        expected = ISOChronology.getInstance().seconds().add(expected, -14);
417    //        expected = ISOChronology.getInstance().millis().add(expected, -16);
418    //        
419    //        Period test = new Period(1, 2, 3, 4, 5, 6, 7, 8, PeriodType.standard());
420    //        DateTime added = test.addTo(null, -2);  // null has no time zone, use default
421    //        assertEquals(expected, added.getMillis());
422    //        assertEquals(ISOChronology.getInstance(), added.getChronology());
423    //    }
424    //    
425    //    //-----------------------------------------------------------------------
426    //    public void testAddIntoRWI1() {
427    //        long expected = TEST_TIME_NOW;
428    //        expected = ISOChronology.getInstance().years().add(expected, 1);
429    //        expected = ISOChronology.getInstance().months().add(expected, 2);
430    //        expected = ISOChronology.getInstance().weeks().add(expected, 3);
431    //        expected = ISOChronology.getInstance().days().add(expected, 4);
432    //        expected = ISOChronology.getInstance().hours().add(expected, 5);
433    //        expected = ISOChronology.getInstance().minutes().add(expected, 6);
434    //        expected = ISOChronology.getInstance().seconds().add(expected, 7);
435    //        expected = ISOChronology.getInstance().millis().add(expected, 8);
436    //        
437    //        Period test = new Period(1, 2, 3, 4, 5, 6, 7, 8);
438    //        MutableDateTime mdt = new MutableDateTime();
439    //        test.addInto(mdt, 1);
440    //        assertEquals(expected, mdt.getMillis());
441    //    }
442    //    
443    //    public void testAddIntoRWI2() {
444    //        long expected = TEST_TIME_NOW;
445    //        expected = ISOChronology.getInstance().years().add(expected, -2);
446    //        expected = ISOChronology.getInstance().months().add(expected, -4);
447    //        expected = ISOChronology.getInstance().weeks().add(expected, -6);
448    //        expected = ISOChronology.getInstance().days().add(expected, -8);
449    //        expected = ISOChronology.getInstance().hours().add(expected, -10);
450    //        expected = ISOChronology.getInstance().minutes().add(expected, -12);
451    //        expected = ISOChronology.getInstance().seconds().add(expected, -14);
452    //        expected = ISOChronology.getInstance().millis().add(expected, -16);
453    //        
454    //        Period test = new Period(1, 2, 3, 4, 5, 6, 7, 8, PeriodType.standard());
455    //        MutableDateTime mdt = new MutableDateTime();
456    //        test.addInto(mdt, -2);  // MutableDateTime has a chronology, use it
457    //        assertEquals(expected, mdt.getMillis());
458    //    }
459    //    
460    //    public void testAddIntoRWI3() {
461    //        Period test = new Period(1, 2, 3, 4, 5, 6, 7, 8);
462    //        try {
463    //            test.addInto(null, 1);
464    //            fail();
465    //        } catch (IllegalArgumentException ex) {}
466    //    }
467        
468        //-----------------------------------------------------------------------
469        public void testToString() {
470            Period test = new Period(1, 2, 3, 4, 5, 6, 7, 8);
471            assertEquals("P1Y2M3W4DT5H6M7.008S", test.toString());
472            
473            test = new Period(0, 0, 0, 0, 0, 0, 0, 0);
474            assertEquals("PT0S", test.toString());
475            
476            test = new Period(12345L);
477            assertEquals("PT12.345S", test.toString());
478        }
479    
480        //-----------------------------------------------------------------------
481        public void testToString_PeriodFormatter() {
482            Period test = new Period(1, 2, 3, 4, 5, 6, 7, 8);
483            assertEquals("1 year, 2 months, 3 weeks, 4 days, 5 hours, 6 minutes, 7 seconds and 8 milliseconds", test.toString(PeriodFormat.getDefault()));
484            
485            test = new Period(0, 0, 0, 0, 0, 0, 0, 0);
486            assertEquals("0 milliseconds", test.toString(PeriodFormat.getDefault()));
487        }
488    
489        public void testToString_nullPeriodFormatter() {
490            Period test = new Period(1, 2, 3, 4, 5, 6, 7, 8);
491            assertEquals("P1Y2M3W4DT5H6M7.008S", test.toString((PeriodFormatter) null));
492        }
493    
494        //-----------------------------------------------------------------------
495        public void testToPeriod() {
496            Period test = new Period(123L);
497            Period result = test.toPeriod();
498            assertSame(test, result);
499        }
500    
501        public void testToMutablePeriod() {
502            Period test = new Period(123L);
503            MutablePeriod result = test.toMutablePeriod();
504            assertEquals(test, result);
505        }
506    
507        //-----------------------------------------------------------------------
508    //    public void testToDurationMillisFrom() {
509    //        Period test = new Period(123L);
510    //        assertEquals(123L, test.toDurationMillisFrom(0L, null));
511    //    }
512    
513        public void testToDurationFrom() {
514            Period test = new Period(123L);
515            assertEquals(new Duration(123L), test.toDurationFrom(new Instant(0L)));
516        }
517    
518        public void testToDurationTo() {
519            Period test = new Period(123L);
520            assertEquals(new Duration(123L), test.toDurationTo(new Instant(123L)));
521        }
522    
523        //-----------------------------------------------------------------------
524        public void testWithPeriodType1() {
525            Period test = new Period(123L);
526            Period result = test.withPeriodType(PeriodType.standard());
527            assertSame(test, result);
528        }
529    
530        public void testWithPeriodType2() {
531            Period test = new Period(3123L);
532            Period result = test.withPeriodType(PeriodType.dayTime());
533            assertEquals(3, result.getSeconds());
534            assertEquals(123, result.getMillis());
535            assertEquals(PeriodType.dayTime(), result.getPeriodType());
536        }
537    
538        public void testWithPeriodType3() {
539            Period test = new Period(1, 2, 3, 4, 5, 6, 7, 8, PeriodType.standard());
540            try {
541                test.withPeriodType(PeriodType.dayTime());
542                fail();
543            } catch (IllegalArgumentException ex) {}
544        }
545    
546        public void testWithPeriodType4() {
547            Period test = new Period(3123L);
548            Period result = test.withPeriodType(null);
549            assertEquals(3, result.getSeconds());
550            assertEquals(123, result.getMillis());
551            assertEquals(PeriodType.standard(), result.getPeriodType());
552        }
553    
554        public void testWithPeriodType5() {
555            Period test = new Period(1, 2, 0, 4, 5, 6, 7, 8, PeriodType.standard());
556            Period result = test.withPeriodType(PeriodType.yearMonthDayTime());
557            assertEquals(PeriodType.yearMonthDayTime(), result.getPeriodType());
558            assertEquals(1, result.getYears());
559            assertEquals(2, result.getMonths());
560            assertEquals(0, result.getWeeks());
561            assertEquals(4, result.getDays());
562            assertEquals(5, result.getHours());
563            assertEquals(6, result.getMinutes());
564            assertEquals(7, result.getSeconds());
565            assertEquals(8, result.getMillis());
566        }
567    
568        //-----------------------------------------------------------------------
569        public void testWithFields1() {
570            Period test1 = new Period(1, 2, 3, 4, 5, 6, 7, 8);
571            Period test2 = new Period(0, 0, 0, 0, 0, 0, 0, 9, PeriodType.millis());
572            Period result = test1.withFields(test2);
573            
574            assertEquals(new Period(1, 2, 3, 4, 5, 6, 7, 8), test1);
575            assertEquals(new Period(0, 0, 0, 0, 0, 0, 0, 9, PeriodType.millis()), test2);
576            assertEquals(new Period(1, 2, 3, 4, 5, 6, 7, 9), result);
577        }
578    
579        public void testWithFields2() {
580            Period test1 = new Period(1, 2, 3, 4, 5, 6, 7, 8);
581            Period test2 = null;
582            Period result = test1.withFields(test2);
583            
584            assertEquals(new Period(1, 2, 3, 4, 5, 6, 7, 8), test1);
585            assertSame(test1, result);
586        }
587    
588        public void testWithFields3() {
589            Period test1 = new Period(0, 0, 0, 0, 0, 0, 0, 9, PeriodType.millis());
590            Period test2 = new Period(1, 2, 3, 4, 5, 6, 7, 8);
591            try {
592                test1.withFields(test2);
593                fail();
594            } catch (IllegalArgumentException ex) {}
595            assertEquals(new Period(0, 0, 0, 0, 0, 0, 0, 9, PeriodType.millis()), test1);
596            assertEquals(new Period(1, 2, 3, 4, 5, 6, 7, 8), test2);
597        }
598    
599        //-----------------------------------------------------------------------
600        public void testWithField1() {
601            Period test = new Period(1, 2, 3, 4, 5, 6, 7, 8);
602            Period result = test.withField(DurationFieldType.years(), 6);
603            
604            assertEquals(new Period(1, 2, 3, 4, 5, 6, 7, 8), test);
605            assertEquals(new Period(6, 2, 3, 4, 5, 6, 7, 8), result);
606        }
607    
608        public void testWithField2() {
609            Period test = new Period(1, 2, 3, 4, 5, 6, 7, 8);
610            try {
611                test.withField(null, 6);
612                fail();
613            } catch (IllegalArgumentException ex) {}
614        }
615    
616        public void testWithField3() {
617            Period test = new Period(0, 0, 0, 0, 5, 6, 7, 8, PeriodType.time());
618            try {
619                test.withField(DurationFieldType.years(), 6);
620                fail();
621            } catch (IllegalArgumentException ex) {}
622        }
623    
624        public void testWithField4() {
625            Period test = new Period(0, 0, 0, 0, 5, 6, 7, 8, PeriodType.time());
626            Period result = test.withField(DurationFieldType.years(), 0);
627            assertEquals(test, result);
628        }
629    
630        //-----------------------------------------------------------------------
631        public void testWithFieldAdded1() {
632            Period test = new Period(1, 2, 3, 4, 5, 6, 7, 8);
633            Period result = test.withFieldAdded(DurationFieldType.years(), 6);
634            
635            assertEquals(new Period(1, 2, 3, 4, 5, 6, 7, 8), test);
636            assertEquals(new Period(7, 2, 3, 4, 5, 6, 7, 8), result);
637        }
638    
639        public void testWithFieldAdded2() {
640            Period test = new Period(1, 2, 3, 4, 5, 6, 7, 8);
641            try {
642                test.withFieldAdded(null, 0);
643                fail();
644            } catch (IllegalArgumentException ex) {}
645        }
646    
647        public void testWithFieldAdded3() {
648            Period test = new Period(0, 0, 0, 0, 5, 6, 7, 8, PeriodType.time());
649            try {
650                test.withFieldAdded(DurationFieldType.years(), 6);
651                fail();
652            } catch (IllegalArgumentException ex) {}
653        }
654    
655        public void testWithFieldAdded4() {
656            Period test = new Period(0, 0, 0, 0, 5, 6, 7, 8, PeriodType.time());
657            Period result = test.withFieldAdded(DurationFieldType.years(), 0);
658            assertEquals(test, result);
659        }
660    
661        //-----------------------------------------------------------------------
662        public void testPeriodStatics() {
663            Period test;
664            test = Period.years(1);
665            assertEquals(test, new Period(1, 0, 0, 0, 0, 0, 0, 0, PeriodType.standard()));
666            test = Period.months(1);
667            assertEquals(test, new Period(0, 1, 0, 0, 0, 0, 0, 0, PeriodType.standard()));
668            test = Period.weeks(1);
669            assertEquals(test, new Period(0, 0, 1, 0, 0, 0, 0, 0, PeriodType.standard()));
670            test = Period.days(1);
671            assertEquals(test, new Period(0, 0, 0, 1, 0, 0, 0, 0, PeriodType.standard()));
672            test = Period.hours(1);
673            assertEquals(test, new Period(0, 0, 0, 0, 1, 0, 0, 0, PeriodType.standard()));
674            test = Period.minutes(1);
675            assertEquals(test, new Period(0, 0, 0, 0, 0, 1, 0, 0, PeriodType.standard()));
676            test = Period.seconds(1);
677            assertEquals(test, new Period(0, 0, 0, 0, 0, 0, 1, 0, PeriodType.standard()));
678            test = Period.millis(1);
679            assertEquals(test, new Period(0, 0, 0, 0, 0, 0, 0, 1, PeriodType.standard()));
680        }
681    
682        //-----------------------------------------------------------------------
683        public void testWith() {
684            Period test;
685            test = Period.years(5).withYears(1);
686            assertEquals(test, new Period(1, 0, 0, 0, 0, 0, 0, 0, PeriodType.standard()));
687            test = Period.months(5).withMonths(1);
688            assertEquals(test, new Period(0, 1, 0, 0, 0, 0, 0, 0, PeriodType.standard()));
689            test = Period.weeks(5).withWeeks(1);
690            assertEquals(test, new Period(0, 0, 1, 0, 0, 0, 0, 0, PeriodType.standard()));
691            test = Period.days(5).withDays(1);
692            assertEquals(test, new Period(0, 0, 0, 1, 0, 0, 0, 0, PeriodType.standard()));
693            test = Period.hours(5).withHours(1);
694            assertEquals(test, new Period(0, 0, 0, 0, 1, 0, 0, 0, PeriodType.standard()));
695            test = Period.minutes(5).withMinutes(1);
696            assertEquals(test, new Period(0, 0, 0, 0, 0, 1, 0, 0, PeriodType.standard()));
697            test = Period.seconds(5).withSeconds(1);
698            assertEquals(test, new Period(0, 0, 0, 0, 0, 0, 1, 0, PeriodType.standard()));
699            test = Period.millis(5).withMillis(1);
700            assertEquals(test, new Period(0, 0, 0, 0, 0, 0, 0, 1, PeriodType.standard()));
701            
702            test = new Period(0L, PeriodType.millis());
703            try {
704                test.withYears(1);
705                fail();
706            } catch (UnsupportedOperationException ex) {}
707        }
708    
709        //-----------------------------------------------------------------------
710        public void testPlus() {
711            Period base = new Period(1, 2, 3, 4, 5, 6, 7, 8);
712            Period baseDaysOnly = new Period(0, 0, 0, 10, 0, 0, 0, 0, PeriodType.days());
713            
714            Period test = base.plus((ReadablePeriod) null);
715            assertSame(base, test);
716            
717            test = base.plus(Period.years(10));
718            assertEquals(11, test.getYears());
719            assertEquals(2, test.getMonths());
720            assertEquals(3, test.getWeeks());
721            assertEquals(4, test.getDays());
722            assertEquals(5, test.getHours());
723            assertEquals(6, test.getMinutes());
724            assertEquals(7, test.getSeconds());
725            assertEquals(8, test.getMillis());
726            
727            test = base.plus(Years.years(10));
728            assertEquals(11, test.getYears());
729            assertEquals(2, test.getMonths());
730            assertEquals(3, test.getWeeks());
731            assertEquals(4, test.getDays());
732            assertEquals(5, test.getHours());
733            assertEquals(6, test.getMinutes());
734            assertEquals(7, test.getSeconds());
735            assertEquals(8, test.getMillis());
736            
737            test = base.plus(Period.days(10));
738            assertEquals(1, test.getYears());
739            assertEquals(2, test.getMonths());
740            assertEquals(3, test.getWeeks());
741            assertEquals(14, test.getDays());
742            assertEquals(5, test.getHours());
743            assertEquals(6, test.getMinutes());
744            assertEquals(7, test.getSeconds());
745            assertEquals(8, test.getMillis());
746            
747            test = baseDaysOnly.plus(Period.years(0));
748            assertEquals(0, test.getYears());
749            assertEquals(0, test.getMonths());
750            assertEquals(0, test.getWeeks());
751            assertEquals(10, test.getDays());
752            assertEquals(0, test.getHours());
753            assertEquals(0, test.getMinutes());
754            assertEquals(0, test.getSeconds());
755            assertEquals(0, test.getMillis());
756            
757            test = baseDaysOnly.plus(baseDaysOnly);
758            assertEquals(0, test.getYears());
759            assertEquals(0, test.getMonths());
760            assertEquals(0, test.getWeeks());
761            assertEquals(20, test.getDays());
762            assertEquals(0, test.getHours());
763            assertEquals(0, test.getMinutes());
764            assertEquals(0, test.getSeconds());
765            assertEquals(0, test.getMillis());
766            
767            try {
768                baseDaysOnly.plus(Period.years(1));
769                fail();
770            } catch (UnsupportedOperationException ex) {}
771            
772            try {
773                Period.days(Integer.MAX_VALUE).plus(Period.days(1));
774                fail();
775            } catch (ArithmeticException ex) {}
776            
777            try {
778                Period.days(Integer.MIN_VALUE).plus(Period.days(-1));
779                fail();
780            } catch (ArithmeticException ex) {}
781        }
782    
783        //-----------------------------------------------------------------------
784        public void testMinus() {
785            Period base = new Period(1, 2, 3, 4, 5, 6, 7, 8);
786            Period baseDaysOnly = new Period(0, 0, 0, 10, 0, 0, 0, 0, PeriodType.days());
787            
788            Period test = base.minus((ReadablePeriod) null);
789            assertSame(base, test);
790            
791            test = base.minus(Period.years(10));
792            assertEquals(-9, test.getYears());
793            assertEquals(2, test.getMonths());
794            assertEquals(3, test.getWeeks());
795            assertEquals(4, test.getDays());
796            assertEquals(5, test.getHours());
797            assertEquals(6, test.getMinutes());
798            assertEquals(7, test.getSeconds());
799            assertEquals(8, test.getMillis());
800            
801            test = base.minus(Years.years(10));
802            assertEquals(-9, test.getYears());
803            assertEquals(2, test.getMonths());
804            assertEquals(3, test.getWeeks());
805            assertEquals(4, test.getDays());
806            assertEquals(5, test.getHours());
807            assertEquals(6, test.getMinutes());
808            assertEquals(7, test.getSeconds());
809            assertEquals(8, test.getMillis());
810            
811            test = base.minus(Period.days(10));
812            assertEquals(1, test.getYears());
813            assertEquals(2, test.getMonths());
814            assertEquals(3, test.getWeeks());
815            assertEquals(-6, test.getDays());
816            assertEquals(5, test.getHours());
817            assertEquals(6, test.getMinutes());
818            assertEquals(7, test.getSeconds());
819            assertEquals(8, test.getMillis());
820            
821            test = baseDaysOnly.minus(Period.years(0));
822            assertEquals(0, test.getYears());
823            assertEquals(0, test.getMonths());
824            assertEquals(0, test.getWeeks());
825            assertEquals(10, test.getDays());
826            assertEquals(0, test.getHours());
827            assertEquals(0, test.getMinutes());
828            assertEquals(0, test.getSeconds());
829            assertEquals(0, test.getMillis());
830            
831            test = baseDaysOnly.minus(baseDaysOnly);
832            assertEquals(0, test.getYears());
833            assertEquals(0, test.getMonths());
834            assertEquals(0, test.getWeeks());
835            assertEquals(0, test.getDays());
836            assertEquals(0, test.getHours());
837            assertEquals(0, test.getMinutes());
838            assertEquals(0, test.getSeconds());
839            assertEquals(0, test.getMillis());
840            
841            try {
842                baseDaysOnly.minus(Period.years(1));
843                fail();
844            } catch (UnsupportedOperationException ex) {}
845            
846            try {
847                Period.days(Integer.MAX_VALUE).minus(Period.days(-1));
848                fail();
849            } catch (ArithmeticException ex) {}
850            
851            try {
852                Period.days(Integer.MIN_VALUE).minus(Period.days(1));
853                fail();
854            } catch (ArithmeticException ex) {}
855        }
856    
857        //-----------------------------------------------------------------------
858        public void testPlusFields() {
859            Period test;
860            test = Period.years(1).plusYears(1);
861            assertEquals(new Period(2, 0, 0, 0, 0, 0, 0, 0, PeriodType.standard()), test);
862            test = Period.months(1).plusMonths(1);
863            assertEquals(new Period(0, 2, 0, 0, 0, 0, 0, 0, PeriodType.standard()), test);
864            test = Period.weeks(1).plusWeeks(1);
865            assertEquals(new Period(0, 0, 2, 0, 0, 0, 0, 0, PeriodType.standard()), test);
866            test = Period.days(1).plusDays(1);
867            assertEquals(new Period(0, 0, 0, 2, 0, 0, 0, 0, PeriodType.standard()), test);
868            test = Period.hours(1).plusHours(1);
869            assertEquals(new Period(0, 0, 0, 0, 2, 0, 0, 0, PeriodType.standard()), test);
870            test = Period.minutes(1).plusMinutes(1);
871            assertEquals(new Period(0, 0, 0, 0, 0, 2, 0, 0, PeriodType.standard()), test);
872            test = Period.seconds(1).plusSeconds(1);
873            assertEquals(new Period(0, 0, 0, 0, 0, 0, 2, 0, PeriodType.standard()), test);
874            test = Period.millis(1).plusMillis(1);
875            assertEquals(new Period(0, 0, 0, 0, 0, 0, 0, 2, PeriodType.standard()), test);
876            
877            test = new Period(0L, PeriodType.millis());
878            try {
879                test.plusYears(1);
880                fail();
881            } catch (UnsupportedOperationException ex) {}
882        }
883    
884        public void testPlusFieldsZero() {
885            Period test, result;
886            test = Period.years(1);
887            result = test.plusYears(0);
888            assertSame(test, result);
889            test = Period.months(1);
890            result = test.plusMonths(0);
891            assertSame(test, result);
892            test = Period.weeks(1);
893            result = test.plusWeeks(0);
894            assertSame(test, result);
895            test = Period.days(1);
896            result = test.plusDays(0);
897            assertSame(test, result);
898            test = Period.hours(1);
899            result = test.plusHours(0);
900            assertSame(test, result);
901            test = Period.minutes(1);
902            result = test.plusMinutes(0);
903            assertSame(test, result);
904            test = Period.seconds(1);
905            result = test.plusSeconds(0);
906            assertSame(test, result);
907            test = Period.millis(1);
908            result = test.plusMillis(0);
909            assertSame(test, result);
910        }
911    
912        public void testMinusFields() {
913            Period test;
914            test = Period.years(3).minusYears(1);
915            assertEquals(new Period(2, 0, 0, 0, 0, 0, 0, 0, PeriodType.standard()), test);
916            test = Period.months(3).minusMonths(1);
917            assertEquals(new Period(0, 2, 0, 0, 0, 0, 0, 0, PeriodType.standard()), test);
918            test = Period.weeks(3).minusWeeks(1);
919            assertEquals(new Period(0, 0, 2, 0, 0, 0, 0, 0, PeriodType.standard()), test);
920            test = Period.days(3).minusDays(1);
921            assertEquals(new Period(0, 0, 0, 2, 0, 0, 0, 0, PeriodType.standard()), test);
922            test = Period.hours(3).minusHours(1);
923            assertEquals(new Period(0, 0, 0, 0, 2, 0, 0, 0, PeriodType.standard()), test);
924            test = Period.minutes(3).minusMinutes(1);
925            assertEquals(new Period(0, 0, 0, 0, 0, 2, 0, 0, PeriodType.standard()), test);
926            test = Period.seconds(3).minusSeconds(1);
927            assertEquals(new Period(0, 0, 0, 0, 0, 0, 2, 0, PeriodType.standard()), test);
928            test = Period.millis(3).minusMillis(1);
929            assertEquals(new Period(0, 0, 0, 0, 0, 0, 0, 2, PeriodType.standard()), test);
930            
931            test = new Period(0L, PeriodType.millis());
932            try {
933                test.minusYears(1);
934                fail();
935            } catch (UnsupportedOperationException ex) {}
936        }
937    
938        //-----------------------------------------------------------------------
939        public void testMultipliedBy() {
940            Period base = new Period(1, 2, 3, 4, 5, 6, 7, 8);
941            
942            Period test = base.multipliedBy(1);
943            assertSame(base, test);
944            
945            test = base.multipliedBy(0);
946            assertEquals(Period.ZERO, test);
947            
948            test = base.multipliedBy(2);
949            assertEquals(2, test.getYears());
950            assertEquals(4, test.getMonths());
951            assertEquals(6, test.getWeeks());
952            assertEquals(8, test.getDays());
953            assertEquals(10, test.getHours());
954            assertEquals(12, test.getMinutes());
955            assertEquals(14, test.getSeconds());
956            assertEquals(16, test.getMillis());
957            
958            test = base.multipliedBy(3);
959            assertEquals(3, test.getYears());
960            assertEquals(6, test.getMonths());
961            assertEquals(9, test.getWeeks());
962            assertEquals(12, test.getDays());
963            assertEquals(15, test.getHours());
964            assertEquals(18, test.getMinutes());
965            assertEquals(21, test.getSeconds());
966            assertEquals(24, test.getMillis());
967            
968            test = base.multipliedBy(-4);
969            assertEquals(-4, test.getYears());
970            assertEquals(-8, test.getMonths());
971            assertEquals(-12, test.getWeeks());
972            assertEquals(-16, test.getDays());
973            assertEquals(-20, test.getHours());
974            assertEquals(-24, test.getMinutes());
975            assertEquals(-28, test.getSeconds());
976            assertEquals(-32, test.getMillis());
977            
978            try {
979                Period.days(Integer.MAX_VALUE).multipliedBy(2);
980                fail();
981            } catch (ArithmeticException ex) {}
982            
983            try {
984                Period.days(Integer.MIN_VALUE).multipliedBy(2);
985                fail();
986            } catch (ArithmeticException ex) {}
987        }
988    
989        //-----------------------------------------------------------------------
990        public void testNegated() {
991            Period base = new Period(1, 2, 3, 4, 5, 6, 7, 8);
992            
993            Period test = Period.ZERO.negated();
994            assertEquals(Period.ZERO, test);
995            
996            test = base.negated();
997            assertEquals(-1, test.getYears());
998            assertEquals(-2, test.getMonths());
999            assertEquals(-3, test.getWeeks());
1000            assertEquals(-4, test.getDays());
1001            assertEquals(-5, test.getHours());
1002            assertEquals(-6, test.getMinutes());
1003            assertEquals(-7, test.getSeconds());
1004            assertEquals(-8, test.getMillis());
1005            
1006            test = Period.days(Integer.MAX_VALUE).negated();
1007            assertEquals(-Integer.MAX_VALUE, test.getDays());
1008            
1009            try {
1010                Period.days(Integer.MIN_VALUE).negated();
1011                fail();
1012            } catch (ArithmeticException ex) {}
1013        }
1014    
1015        //-----------------------------------------------------------------------
1016        public void testToStandardWeeks() {
1017            Period test = new Period(0, 0, 3, 4, 5, 6, 7, 8);
1018            assertEquals(3, test.toStandardWeeks().getWeeks());
1019            
1020            test = new Period(0, 0, 3, 7, 0, 0, 0, 0);
1021            assertEquals(4, test.toStandardWeeks().getWeeks());
1022            
1023            test = new Period(0, 0, 0, 6, 23, 59, 59, 1000);
1024            assertEquals(1, test.toStandardWeeks().getWeeks());
1025            
1026            test = new Period(0, 0, Integer.MAX_VALUE, 0, 0, 0, 0, 0);
1027            assertEquals(Integer.MAX_VALUE, test.toStandardWeeks().getWeeks());
1028            
1029            test = new Period(0, 0, 0, Integer.MAX_VALUE, Integer.MAX_VALUE, Integer.MAX_VALUE, Integer.MAX_VALUE, Integer.MAX_VALUE);
1030            long intMax = Integer.MAX_VALUE;
1031            BigInteger expected = BigInteger.valueOf(intMax);
1032            expected = expected.add(BigInteger.valueOf(intMax * DateTimeConstants.MILLIS_PER_SECOND));
1033            expected = expected.add(BigInteger.valueOf(intMax * DateTimeConstants.MILLIS_PER_MINUTE));
1034            expected = expected.add(BigInteger.valueOf(intMax * DateTimeConstants.MILLIS_PER_HOUR));
1035            expected = expected.add(BigInteger.valueOf(intMax * DateTimeConstants.MILLIS_PER_DAY));
1036            expected = expected.divide(BigInteger.valueOf(DateTimeConstants.MILLIS_PER_WEEK));
1037            assertTrue(expected.compareTo(BigInteger.valueOf(Long.MAX_VALUE)) < 0);
1038            assertEquals(expected.longValue(), test.toStandardWeeks().getWeeks());
1039            
1040            test = new Period(0, 0, Integer.MAX_VALUE, 7, 0, 0, 0, 0);
1041            try {
1042                test.toStandardWeeks();
1043                fail();
1044            } catch (ArithmeticException ex) {}
1045        }
1046    
1047        public void testToStandardWeeks_years() {
1048            Period test = Period.years(1);
1049            try {
1050                test.toStandardWeeks();
1051                fail();
1052            } catch (UnsupportedOperationException ex) {}
1053            
1054            test = Period.years(-1);
1055            try {
1056                test.toStandardWeeks();
1057                fail();
1058            } catch (UnsupportedOperationException ex) {}
1059            
1060            test = Period.years(0);
1061            assertEquals(0, test.toStandardWeeks().getWeeks());
1062        }
1063    
1064        public void testToStandardWeeks_months() {
1065            Period test = Period.months(1);
1066            try {
1067                test.toStandardWeeks();
1068                fail();
1069            } catch (UnsupportedOperationException ex) {}
1070            
1071            test = Period.months(-1);
1072            try {
1073                test.toStandardWeeks();
1074                fail();
1075            } catch (UnsupportedOperationException ex) {}
1076            
1077            test = Period.months(0);
1078            assertEquals(0, test.toStandardWeeks().getWeeks());
1079        }
1080    
1081        //-----------------------------------------------------------------------
1082        public void testToStandardDays() {
1083            Period test = new Period(0, 0, 0, 4, 5, 6, 7, 8);
1084            assertEquals(4, test.toStandardDays().getDays());
1085            
1086            test = new Period(0, 0, 1, 4, 0, 0, 0, 0);
1087            assertEquals(11, test.toStandardDays().getDays());
1088            
1089            test = new Period(0, 0, 0, 0, 23, 59, 59, 1000);
1090            assertEquals(1, test.toStandardDays().getDays());
1091            
1092            test = new Period(0, 0, 0, Integer.MAX_VALUE, 0, 0, 0, 0);
1093            assertEquals(Integer.MAX_VALUE, test.toStandardDays().getDays());
1094            
1095            test = new Period(0, 0, 0, 0, Integer.MAX_VALUE, Integer.MAX_VALUE, Integer.MAX_VALUE, Integer.MAX_VALUE);
1096            long intMax = Integer.MAX_VALUE;
1097            BigInteger expected = BigInteger.valueOf(intMax);
1098            expected = expected.add(BigInteger.valueOf(intMax * DateTimeConstants.MILLIS_PER_SECOND));
1099            expected = expected.add(BigInteger.valueOf(intMax * DateTimeConstants.MILLIS_PER_MINUTE));
1100            expected = expected.add(BigInteger.valueOf(intMax * DateTimeConstants.MILLIS_PER_HOUR));
1101            expected = expected.divide(BigInteger.valueOf(DateTimeConstants.MILLIS_PER_DAY));
1102            assertTrue(expected.compareTo(BigInteger.valueOf(Long.MAX_VALUE)) < 0);
1103            assertEquals(expected.longValue(), test.toStandardDays().getDays());
1104            
1105            test = new Period(0, 0, 0, Integer.MAX_VALUE, 24, 0, 0, 0);
1106            try {
1107                test.toStandardDays();
1108                fail();
1109            } catch (ArithmeticException ex) {}
1110        }
1111    
1112        public void testToStandardDays_years() {
1113            Period test = Period.years(1);
1114            try {
1115                test.toStandardDays();
1116                fail();
1117            } catch (UnsupportedOperationException ex) {}
1118            
1119            test = Period.years(-1);
1120            try {
1121                test.toStandardDays();
1122                fail();
1123            } catch (UnsupportedOperationException ex) {}
1124            
1125            test = Period.years(0);
1126            assertEquals(0, test.toStandardDays().getDays());
1127        }
1128    
1129        public void testToStandardDays_months() {
1130            Period test = Period.months(1);
1131            try {
1132                test.toStandardDays();
1133                fail();
1134            } catch (UnsupportedOperationException ex) {}
1135            
1136            test = Period.months(-1);
1137            try {
1138                test.toStandardDays();
1139                fail();
1140            } catch (UnsupportedOperationException ex) {}
1141            
1142            test = Period.months(0);
1143            assertEquals(0, test.toStandardDays().getDays());
1144        }
1145    
1146        //-----------------------------------------------------------------------
1147        public void testToStandardHours() {
1148            Period test = new Period(0, 0, 0, 0, 5, 6, 7, 8);
1149            assertEquals(5, test.toStandardHours().getHours());
1150            
1151            test = new Period(0, 0, 0, 1, 5, 0, 0, 0);
1152            assertEquals(29, test.toStandardHours().getHours());
1153            
1154            test = new Period(0, 0, 0, 0, 0, 59, 59, 1000);
1155            assertEquals(1, test.toStandardHours().getHours());
1156            
1157            test = new Period(0, 0, 0, 0, Integer.MAX_VALUE, 0, 0, 0);
1158            assertEquals(Integer.MAX_VALUE, test.toStandardHours().getHours());
1159            
1160            test = new Period(0, 0, 0, 0, 0, Integer.MAX_VALUE, Integer.MAX_VALUE, Integer.MAX_VALUE);
1161            long intMax = Integer.MAX_VALUE;
1162            BigInteger expected = BigInteger.valueOf(intMax);
1163            expected = expected.add(BigInteger.valueOf(intMax * DateTimeConstants.MILLIS_PER_SECOND));
1164            expected = expected.add(BigInteger.valueOf(intMax * DateTimeConstants.MILLIS_PER_MINUTE));
1165            expected = expected.divide(BigInteger.valueOf(DateTimeConstants.MILLIS_PER_HOUR));
1166            assertTrue(expected.compareTo(BigInteger.valueOf(Long.MAX_VALUE)) < 0);
1167            assertEquals(expected.longValue(), test.toStandardHours().getHours());
1168            
1169            test = new Period(0, 0, 0, 0, Integer.MAX_VALUE, 60, 0, 0);
1170            try {
1171                test.toStandardHours();
1172                fail();
1173            } catch (ArithmeticException ex) {}
1174        }
1175    
1176        public void testToStandardHours_years() {
1177            Period test = Period.years(1);
1178            try {
1179                test.toStandardHours();
1180                fail();
1181            } catch (UnsupportedOperationException ex) {}
1182            
1183            test = Period.years(-1);
1184            try {
1185                test.toStandardHours();
1186                fail();
1187            } catch (UnsupportedOperationException ex) {}
1188            
1189            test = Period.years(0);
1190            assertEquals(0, test.toStandardHours().getHours());
1191        }
1192    
1193        public void testToStandardHours_months() {
1194            Period test = Period.months(1);
1195            try {
1196                test.toStandardHours();
1197                fail();
1198            } catch (UnsupportedOperationException ex) {}
1199            
1200            test = Period.months(-1);
1201            try {
1202                test.toStandardHours();
1203                fail();
1204            } catch (UnsupportedOperationException ex) {}
1205            
1206            test = Period.months(0);
1207            assertEquals(0, test.toStandardHours().getHours());
1208        }
1209    
1210        //-----------------------------------------------------------------------
1211        public void testToStandardMinutes() {
1212            Period test = new Period(0, 0, 0, 0, 0, 6, 7, 8);
1213            assertEquals(6, test.toStandardMinutes().getMinutes());
1214            
1215            test = new Period(0, 0, 0, 0, 1, 6, 0, 0);
1216            assertEquals(66, test.toStandardMinutes().getMinutes());
1217            
1218            test = new Period(0, 0, 0, 0, 0, 0, 59, 1000);
1219            assertEquals(1, test.toStandardMinutes().getMinutes());
1220            
1221            test = new Period(0, 0, 0, 0, 0, Integer.MAX_VALUE, 0, 0);
1222            assertEquals(Integer.MAX_VALUE, test.toStandardMinutes().getMinutes());
1223            
1224            test = new Period(0, 0, 0, 0, 0, 0, Integer.MAX_VALUE, Integer.MAX_VALUE);
1225            long intMax = Integer.MAX_VALUE;
1226            BigInteger expected = BigInteger.valueOf(intMax);
1227            expected = expected.add(BigInteger.valueOf(intMax * DateTimeConstants.MILLIS_PER_SECOND));
1228            expected = expected.divide(BigInteger.valueOf(DateTimeConstants.MILLIS_PER_MINUTE));
1229            assertTrue(expected.compareTo(BigInteger.valueOf(Long.MAX_VALUE)) < 0);
1230            assertEquals(expected.longValue(), test.toStandardMinutes().getMinutes());
1231            
1232            test = new Period(0, 0, 0, 0, 0, Integer.MAX_VALUE, 60, 0);
1233            try {
1234                test.toStandardMinutes();
1235                fail();
1236            } catch (ArithmeticException ex) {}
1237        }
1238    
1239        public void testToStandardMinutes_years() {
1240            Period test = Period.years(1);
1241            try {
1242                test.toStandardMinutes();
1243                fail();
1244            } catch (UnsupportedOperationException ex) {}
1245            
1246            test = Period.years(-1);
1247            try {
1248                test.toStandardMinutes();
1249                fail();
1250            } catch (UnsupportedOperationException ex) {}
1251            
1252            test = Period.years(0);
1253            assertEquals(0, test.toStandardMinutes().getMinutes());
1254        }
1255    
1256        public void testToStandardMinutes_months() {
1257            Period test = Period.months(1);
1258            try {
1259                test.toStandardMinutes();
1260                fail();
1261            } catch (UnsupportedOperationException ex) {}
1262            
1263            test = Period.months(-1);
1264            try {
1265                test.toStandardMinutes();
1266                fail();
1267            } catch (UnsupportedOperationException ex) {}
1268            
1269            test = Period.months(0);
1270            assertEquals(0, test.toStandardMinutes().getMinutes());
1271        }
1272    
1273        //-----------------------------------------------------------------------
1274        public void testToStandardSeconds() {
1275            Period test = new Period(0, 0, 0, 0, 0, 0, 7, 8);
1276            assertEquals(7, test.toStandardSeconds().getSeconds());
1277            
1278            test = new Period(0, 0, 0, 0, 0, 1, 3, 0);
1279            assertEquals(63, test.toStandardSeconds().getSeconds());
1280            
1281            test = new Period(0, 0, 0, 0, 0, 0, 0, 1000);
1282            assertEquals(1, test.toStandardSeconds().getSeconds());
1283            
1284            test = new Period(0, 0, 0, 0, 0, 0, Integer.MAX_VALUE, 0);
1285            assertEquals(Integer.MAX_VALUE, test.toStandardSeconds().getSeconds());
1286            
1287            test = new Period(0, 0, 0, 0, 0, 0, 20, Integer.MAX_VALUE);
1288            long expected = 20;
1289            expected += ((long) Integer.MAX_VALUE) / DateTimeConstants.MILLIS_PER_SECOND;
1290            assertEquals(expected, test.toStandardSeconds().getSeconds());
1291            
1292            test = new Period(0, 0, 0, 0, 0, 0, Integer.MAX_VALUE, 1000);
1293            try {
1294                test.toStandardSeconds();
1295                fail();
1296            } catch (ArithmeticException ex) {}
1297        }
1298    
1299        public void testToStandardSeconds_years() {
1300            Period test = Period.years(1);
1301            try {
1302                test.toStandardSeconds();
1303                fail();
1304            } catch (UnsupportedOperationException ex) {}
1305            
1306            test = Period.years(-1);
1307            try {
1308                test.toStandardSeconds();
1309                fail();
1310            } catch (UnsupportedOperationException ex) {}
1311            
1312            test = Period.years(0);
1313            assertEquals(0, test.toStandardSeconds().getSeconds());
1314        }
1315    
1316        public void testToStandardSeconds_months() {
1317            Period test = Period.months(1);
1318            try {
1319                test.toStandardSeconds();
1320                fail();
1321            } catch (UnsupportedOperationException ex) {}
1322            
1323            test = Period.months(-1);
1324            try {
1325                test.toStandardSeconds();
1326                fail();
1327            } catch (UnsupportedOperationException ex) {}
1328            
1329            test = Period.months(0);
1330            assertEquals(0, test.toStandardSeconds().getSeconds());
1331        }
1332    
1333        //-----------------------------------------------------------------------
1334        public void testToStandardDuration() {
1335            Period test = new Period(0, 0, 0, 0, 0, 0, 0, 8);
1336            assertEquals(8, test.toStandardDuration().getMillis());
1337            
1338            test = new Period(0, 0, 0, 0, 0, 0, 1, 20);
1339            assertEquals(1020, test.toStandardDuration().getMillis());
1340            
1341            test = new Period(0, 0, 0, 0, 0, 0, 0, Integer.MAX_VALUE);
1342            assertEquals(Integer.MAX_VALUE, test.toStandardDuration().getMillis());
1343            
1344            test = new Period(0, 0, 0, 0, 0, 10, 20, Integer.MAX_VALUE);
1345            long expected = Integer.MAX_VALUE;
1346            expected += 10L * ((long) DateTimeConstants.MILLIS_PER_MINUTE);
1347            expected += 20L * ((long) DateTimeConstants.MILLIS_PER_SECOND);
1348            assertEquals(expected, test.toStandardDuration().getMillis());
1349            
1350            // proof that overflow does not occur
1351            BigInteger intMax = BigInteger.valueOf(Integer.MAX_VALUE);
1352            BigInteger exp = intMax;
1353            exp = exp.add(intMax.multiply(BigInteger.valueOf(DateTimeConstants.MILLIS_PER_SECOND)));
1354            exp = exp.add(intMax.multiply(BigInteger.valueOf(DateTimeConstants.MILLIS_PER_MINUTE)));
1355            exp = exp.add(intMax.multiply(BigInteger.valueOf(DateTimeConstants.MILLIS_PER_HOUR)));
1356            exp = exp.add(intMax.multiply(BigInteger.valueOf(DateTimeConstants.MILLIS_PER_DAY)));
1357            exp = exp.add(intMax.multiply(BigInteger.valueOf(DateTimeConstants.MILLIS_PER_WEEK)));
1358            assertTrue(exp.compareTo(BigInteger.valueOf(Long.MAX_VALUE)) < 0);
1359    //        test = new Period(0, 0, Integer.MAX_VALUE, Integer.MAX_VALUE, Integer.MAX_VALUE, Integer.MAX_VALUE, Integer.MAX_VALUE, Integer.MAX_VALUE);
1360    //        try {
1361    //            test.toStandardDuration();
1362    //            fail();
1363    //        } catch (ArithmeticException ex) {}
1364        }
1365    
1366        public void testToStandardDuration_years() {
1367            Period test = Period.years(1);
1368            try {
1369                test.toStandardDuration();
1370                fail();
1371            } catch (UnsupportedOperationException ex) {}
1372            
1373            test = Period.years(-1);
1374            try {
1375                test.toStandardDuration();
1376                fail();
1377            } catch (UnsupportedOperationException ex) {}
1378            
1379            test = Period.years(0);
1380            assertEquals(0, test.toStandardDuration().getMillis());
1381        }
1382    
1383        public void testToStandardDuration_months() {
1384            Period test = Period.months(1);
1385            try {
1386                test.toStandardDuration();
1387                fail();
1388            } catch (UnsupportedOperationException ex) {}
1389            
1390            test = Period.months(-1);
1391            try {
1392                test.toStandardDuration();
1393                fail();
1394            } catch (UnsupportedOperationException ex) {}
1395            
1396            test = Period.months(0);
1397            assertEquals(0, test.toStandardDuration().getMillis());
1398        }
1399    
1400        //-----------------------------------------------------------------------
1401        public void testNormalizedStandard_yearMonth1() {
1402            Period test = new Period(1, 15, 0, 0, 0, 0, 0, 0);
1403            Period result = test.normalizedStandard();
1404            assertEquals(new Period(1, 15, 0, 0, 0, 0, 0, 0), test);
1405            assertEquals(new Period(2, 3, 0, 0, 0, 0, 0, 0), result);
1406        }
1407    
1408        public void testNormalizedStandard_yearMonth2() {
1409            Period test = new Period(Integer.MAX_VALUE, 15, 0, 0, 0, 0, 0, 0);
1410            try {
1411                test.normalizedStandard();
1412                fail();
1413            } catch (ArithmeticException ex) {}
1414        }
1415    
1416        public void testNormalizedStandard_weekDay1() {
1417            Period test = new Period(0, 0, 1, 12, 0, 0, 0, 0);
1418            Period result = test.normalizedStandard();
1419            assertEquals(new Period(0, 0, 1, 12, 0, 0, 0, 0), test);
1420            assertEquals(new Period(0, 0, 2, 5, 0, 0, 0, 0), result);
1421        }
1422    
1423        public void testNormalizedStandard_weekDay2() {
1424            Period test = new Period(0, 0, Integer.MAX_VALUE, 7, 0, 0, 0, 0);
1425            try {
1426                test.normalizedStandard();
1427                fail();
1428            } catch (ArithmeticException ex) {}
1429        }
1430    
1431        public void testNormalizedStandard_yearMonthWeekDay() {
1432            Period test = new Period(1, 15, 1, 12, 0, 0, 0, 0);
1433            Period result = test.normalizedStandard();
1434            assertEquals(new Period(1, 15, 1, 12, 0, 0, 0, 0), test);
1435            assertEquals(new Period(2, 3, 2, 5, 0, 0, 0, 0), result);
1436        }
1437    
1438        public void testNormalizedStandard_yearMonthDay() {
1439            Period test = new Period(1, 15, 0, 36, 0, 0, 0, 0);
1440            Period result = test.normalizedStandard();
1441            assertEquals(new Period(1, 15, 0, 36, 0, 0, 0, 0), test);
1442            assertEquals(new Period(2, 3, 5, 1, 0, 0, 0, 0), result);
1443        }
1444    
1445        public void testNormalizedStandard_negative() {
1446            Period test = new Period(0, 0, 0, 0, 2, -10, 0, 0);
1447            Period result = test.normalizedStandard();
1448            assertEquals(new Period(0, 0, 0, 0, 2, -10, 0, 0), test);
1449            assertEquals(new Period(0, 0, 0, 0, 1, 50, 0, 0), result);
1450        }
1451    
1452        public void testNormalizedStandard_fullNegative() {
1453            Period test = new Period(0, 0, 0, 0, 1, -70, 0, 0);
1454            Period result = test.normalizedStandard();
1455            assertEquals(new Period(0, 0, 0, 0, 1, -70, 0, 0), test);
1456            assertEquals(new Period(0, 0, 0, 0, 0, -10, 0, 0), result);
1457        }
1458    
1459        //-----------------------------------------------------------------------
1460        public void testNormalizedStandard_periodType_yearMonth1() {
1461            Period test = new Period(1, 15, 0, 0, 0, 0, 0, 0);
1462            Period result = test.normalizedStandard((PeriodType) null);
1463            assertEquals(new Period(1, 15, 0, 0, 0, 0, 0, 0), test);
1464            assertEquals(new Period(2, 3, 0, 0, 0, 0, 0, 0), result);
1465        }
1466    
1467        public void testNormalizedStandard_periodType_yearMonth2() {
1468            Period test = new Period(Integer.MAX_VALUE, 15, 0, 0, 0, 0, 0, 0);
1469            try {
1470                test.normalizedStandard((PeriodType) null);
1471                fail();
1472            } catch (ArithmeticException ex) {}
1473        }
1474    
1475        public void testNormalizedStandard_periodType_yearMonth3() {
1476            Period test = new Period(1, 15, 3, 4, 0, 0, 0, 0);
1477            try {
1478                test.normalizedStandard(PeriodType.dayTime());
1479                fail();
1480            } catch (UnsupportedOperationException ex) {}
1481        }
1482    
1483        public void testNormalizedStandard_periodType_weekDay1() {
1484            Period test = new Period(0, 0, 1, 12, 0, 0, 0, 0);
1485            Period result = test.normalizedStandard((PeriodType) null);
1486            assertEquals(new Period(0, 0, 1, 12, 0, 0, 0, 0), test);
1487            assertEquals(new Period(0, 0, 2, 5, 0, 0, 0, 0), result);
1488        }
1489    
1490        public void testNormalizedStandard_periodType_weekDay2() {
1491            Period test = new Period(0, 0, Integer.MAX_VALUE, 7, 0, 0, 0, 0);
1492            try {
1493                test.normalizedStandard((PeriodType) null);
1494                fail();
1495            } catch (ArithmeticException ex) {}
1496        }
1497    
1498        public void testNormalizedStandard_periodType_weekDay3() {
1499            Period test = new Period(0, 0, 1, 12, 0, 0, 0, 0);
1500            Period result = test.normalizedStandard(PeriodType.dayTime());
1501            assertEquals(new Period(0, 0, 1, 12, 0, 0, 0, 0), test);
1502            assertEquals(new Period(0, 0, 0, 19, 0, 0, 0, 0, PeriodType.dayTime()), result);
1503        }
1504    
1505        public void testNormalizedStandard_periodType_yearMonthWeekDay() {
1506            Period test = new Period(1, 15, 1, 12, 0, 0, 0, 0);
1507            Period result = test.normalizedStandard(PeriodType.yearMonthDayTime());
1508            assertEquals(new Period(1, 15, 1, 12, 0, 0, 0, 0), test);
1509            assertEquals(new Period(2, 3, 0, 19, 0, 0, 0, 0, PeriodType.yearMonthDayTime()), result);
1510        }
1511    
1512        public void testNormalizedStandard_periodType_yearMonthDay() {
1513            Period test = new Period(1, 15, 0, 36, 27, 0, 0, 0);
1514            Period result = test.normalizedStandard(PeriodType.yearMonthDayTime());
1515            assertEquals(new Period(1, 15, 0, 36, 27, 0, 0, 0), test);
1516            assertEquals(new Period(2, 3, 0, 37, 3, 0, 0, 0, PeriodType.yearMonthDayTime()), result);
1517        }
1518    
1519    }