001    /*
002     *  Copyright 2001-2006 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    
023    import junit.framework.TestCase;
024    import junit.framework.TestSuite;
025    
026    /**
027     * This class is a Junit unit test for Hours.
028     *
029     * @author Stephen Colebourne
030     */
031    public class TestHours extends TestCase {
032        // Test in 2002/03 as time zones are more well known
033        // (before the late 90's they were all over the place)
034        private static final DateTimeZone PARIS = DateTimeZone.forID("Europe/Paris");
035    
036        public static void main(String[] args) {
037            junit.textui.TestRunner.run(suite());
038        }
039    
040        public static TestSuite suite() {
041            return new TestSuite(TestHours.class);
042        }
043    
044        public TestHours(String name) {
045            super(name);
046        }
047    
048        protected void setUp() throws Exception {
049        }
050    
051        protected void tearDown() throws Exception {
052        }
053    
054        //-----------------------------------------------------------------------
055        public void testConstants() {
056            assertEquals(0, Hours.ZERO.getHours());
057            assertEquals(1, Hours.ONE.getHours());
058            assertEquals(2, Hours.TWO.getHours());
059            assertEquals(3, Hours.THREE.getHours());
060            assertEquals(4, Hours.FOUR.getHours());
061            assertEquals(5, Hours.FIVE.getHours());
062            assertEquals(6, Hours.SIX.getHours());
063            assertEquals(7, Hours.SEVEN.getHours());
064            assertEquals(8, Hours.EIGHT.getHours());
065            assertEquals(Integer.MAX_VALUE, Hours.MAX_VALUE.getHours());
066            assertEquals(Integer.MIN_VALUE, Hours.MIN_VALUE.getHours());
067        }
068    
069        //-----------------------------------------------------------------------
070        public void testFactory_hours_int() {
071            assertSame(Hours.ZERO, Hours.hours(0));
072            assertSame(Hours.ONE, Hours.hours(1));
073            assertSame(Hours.TWO, Hours.hours(2));
074            assertSame(Hours.THREE, Hours.hours(3));
075            assertSame(Hours.FOUR, Hours.hours(4));
076            assertSame(Hours.FIVE, Hours.hours(5));
077            assertSame(Hours.SIX, Hours.hours(6));
078            assertSame(Hours.SEVEN, Hours.hours(7));
079            assertSame(Hours.EIGHT, Hours.hours(8));
080            assertSame(Hours.MAX_VALUE, Hours.hours(Integer.MAX_VALUE));
081            assertSame(Hours.MIN_VALUE, Hours.hours(Integer.MIN_VALUE));
082            assertEquals(-1, Hours.hours(-1).getHours());
083            assertEquals(9, Hours.hours(9).getHours());
084        }
085    
086        //-----------------------------------------------------------------------
087        public void testFactory_hoursBetween_RInstant() {
088            DateTime start = new DateTime(2006, 6, 9, 12, 0, 0, 0, PARIS);
089            DateTime end1 = new DateTime(2006, 6, 9, 15, 0, 0, 0, PARIS);
090            DateTime end2 = new DateTime(2006, 6, 9, 18, 0, 0, 0, PARIS);
091            
092            assertEquals(3, Hours.hoursBetween(start, end1).getHours());
093            assertEquals(0, Hours.hoursBetween(start, start).getHours());
094            assertEquals(0, Hours.hoursBetween(end1, end1).getHours());
095            assertEquals(-3, Hours.hoursBetween(end1, start).getHours());
096            assertEquals(6, Hours.hoursBetween(start, end2).getHours());
097        }
098    
099        public void testFactory_hoursBetween_RPartial() {
100            LocalTime start = new LocalTime(12, 0);
101            LocalTime end1 = new LocalTime(15, 0);
102            TimeOfDay end2 = new TimeOfDay(18, 0);
103            
104            assertEquals(3, Hours.hoursBetween(start, end1).getHours());
105            assertEquals(0, Hours.hoursBetween(start, start).getHours());
106            assertEquals(0, Hours.hoursBetween(end1, end1).getHours());
107            assertEquals(-3, Hours.hoursBetween(end1, start).getHours());
108            assertEquals(6, Hours.hoursBetween(start, end2).getHours());
109        }
110    
111        public void testFactory_hoursIn_RInterval() {
112            DateTime start = new DateTime(2006, 6, 9, 12, 0, 0, 0, PARIS);
113            DateTime end1 = new DateTime(2006, 6, 9, 15, 0, 0, 0, PARIS);
114            DateTime end2 = new DateTime(2006, 6, 9, 18, 0, 0, 0, PARIS);
115            
116            assertEquals(0, Hours.hoursIn((ReadableInterval) null).getHours());
117            assertEquals(3, Hours.hoursIn(new Interval(start, end1)).getHours());
118            assertEquals(0, Hours.hoursIn(new Interval(start, start)).getHours());
119            assertEquals(0, Hours.hoursIn(new Interval(end1, end1)).getHours());
120            assertEquals(6, Hours.hoursIn(new Interval(start, end2)).getHours());
121        }
122    
123        public void testFactory_standardHoursIn_RPeriod() {
124            assertEquals(0, Hours.standardHoursIn((ReadablePeriod) null).getHours());
125            assertEquals(0, Hours.standardHoursIn(Period.ZERO).getHours());
126            assertEquals(1, Hours.standardHoursIn(new Period(0, 0, 0, 0, 1, 0, 0, 0)).getHours());
127            assertEquals(123, Hours.standardHoursIn(Period.hours(123)).getHours());
128            assertEquals(-987, Hours.standardHoursIn(Period.hours(-987)).getHours());
129            assertEquals(1, Hours.standardHoursIn(Period.minutes(119)).getHours());
130            assertEquals(2, Hours.standardHoursIn(Period.minutes(120)).getHours());
131            assertEquals(2, Hours.standardHoursIn(Period.minutes(121)).getHours());
132            assertEquals(48, Hours.standardHoursIn(Period.days(2)).getHours());
133            try {
134                Hours.standardHoursIn(Period.months(1));
135                fail();
136            } catch (IllegalArgumentException ex) {
137                // expeceted
138            }
139        }
140    
141        public void testFactory_parseHours_String() {
142            assertEquals(0, Hours.parseHours((String) null).getHours());
143            assertEquals(0, Hours.parseHours("PT0H").getHours());
144            assertEquals(1, Hours.parseHours("PT1H").getHours());
145            assertEquals(-3, Hours.parseHours("PT-3H").getHours());
146            assertEquals(2, Hours.parseHours("P0Y0M0DT2H").getHours());
147            assertEquals(2, Hours.parseHours("PT2H0M").getHours());
148            try {
149                Hours.parseHours("P1Y1D");
150                fail();
151            } catch (IllegalArgumentException ex) {
152                // expeceted
153            }
154            try {
155                Hours.parseHours("P1DT1H");
156                fail();
157            } catch (IllegalArgumentException ex) {
158                // expeceted
159            }
160        }
161    
162        //-----------------------------------------------------------------------
163        public void testGetMethods() {
164            Hours test = Hours.hours(20);
165            assertEquals(20, test.getHours());
166        }
167    
168        public void testGetFieldType() {
169            Hours test = Hours.hours(20);
170            assertEquals(DurationFieldType.hours(), test.getFieldType());
171        }
172    
173        public void testGetPeriodType() {
174            Hours test = Hours.hours(20);
175            assertEquals(PeriodType.hours(), test.getPeriodType());
176        }
177    
178        //-----------------------------------------------------------------------
179        public void testIsGreaterThan() {
180            assertEquals(true, Hours.THREE.isGreaterThan(Hours.TWO));
181            assertEquals(false, Hours.THREE.isGreaterThan(Hours.THREE));
182            assertEquals(false, Hours.TWO.isGreaterThan(Hours.THREE));
183            assertEquals(true, Hours.ONE.isGreaterThan(null));
184            assertEquals(false, Hours.hours(-1).isGreaterThan(null));
185        }
186    
187        public void testIsLessThan() {
188            assertEquals(false, Hours.THREE.isLessThan(Hours.TWO));
189            assertEquals(false, Hours.THREE.isLessThan(Hours.THREE));
190            assertEquals(true, Hours.TWO.isLessThan(Hours.THREE));
191            assertEquals(false, Hours.ONE.isLessThan(null));
192            assertEquals(true, Hours.hours(-1).isLessThan(null));
193        }
194    
195        //-----------------------------------------------------------------------
196        public void testToString() {
197            Hours test = Hours.hours(20);
198            assertEquals("PT20H", test.toString());
199            
200            test = Hours.hours(-20);
201            assertEquals("PT-20H", test.toString());
202        }
203    
204        //-----------------------------------------------------------------------
205        public void testSerialization() throws Exception {
206            Hours test = Hours.SEVEN;
207            
208            ByteArrayOutputStream baos = new ByteArrayOutputStream();
209            ObjectOutputStream oos = new ObjectOutputStream(baos);
210            oos.writeObject(test);
211            byte[] bytes = baos.toByteArray();
212            oos.close();
213            
214            ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
215            ObjectInputStream ois = new ObjectInputStream(bais);
216            Hours result = (Hours) ois.readObject();
217            ois.close();
218            
219            assertSame(test, result);
220        }
221    
222        //-----------------------------------------------------------------------
223        public void testToStandardWeeks() {
224            Hours test = Hours.hours(24 * 7 * 2);
225            Weeks expected = Weeks.weeks(2);
226            assertEquals(expected, test.toStandardWeeks());
227        }
228    
229        public void testToStandardDays() {
230            Hours test = Hours.hours(24 * 2);
231            Days expected = Days.days(2);
232            assertEquals(expected, test.toStandardDays());
233        }
234    
235        public void testToStandardMinutes() {
236            Hours test = Hours.hours(3);
237            Minutes expected = Minutes.minutes(3 * 60);
238            assertEquals(expected, test.toStandardMinutes());
239            
240            try {
241                Hours.MAX_VALUE.toStandardMinutes();
242                fail();
243            } catch (ArithmeticException ex) {
244                // expected
245            }
246        }
247    
248        public void testToStandardSeconds() {
249            Hours test = Hours.hours(3);
250            Seconds expected = Seconds.seconds(3 * 60 * 60);
251            assertEquals(expected, test.toStandardSeconds());
252            
253            try {
254                Hours.MAX_VALUE.toStandardSeconds();
255                fail();
256            } catch (ArithmeticException ex) {
257                // expected
258            }
259        }
260    
261        public void testToStandardDuration() {
262            Hours test = Hours.hours(20);
263            Duration expected = new Duration(20L * DateTimeConstants.MILLIS_PER_HOUR);
264            assertEquals(expected, test.toStandardDuration());
265            
266            expected = new Duration(((long) Integer.MAX_VALUE) * DateTimeConstants.MILLIS_PER_HOUR);
267            assertEquals(expected, Hours.MAX_VALUE.toStandardDuration());
268        }
269    
270        //-----------------------------------------------------------------------
271        public void testPlus_int() {
272            Hours test2 = Hours.hours(2);
273            Hours result = test2.plus(3);
274            assertEquals(2, test2.getHours());
275            assertEquals(5, result.getHours());
276            
277            assertEquals(1, Hours.ONE.plus(0).getHours());
278            
279            try {
280                Hours.MAX_VALUE.plus(1);
281                fail();
282            } catch (ArithmeticException ex) {
283                // expected
284            }
285        }
286    
287        public void testPlus_Hours() {
288            Hours test2 = Hours.hours(2);
289            Hours test3 = Hours.hours(3);
290            Hours result = test2.plus(test3);
291            assertEquals(2, test2.getHours());
292            assertEquals(3, test3.getHours());
293            assertEquals(5, result.getHours());
294            
295            assertEquals(1, Hours.ONE.plus(Hours.ZERO).getHours());
296            assertEquals(1, Hours.ONE.plus((Hours) null).getHours());
297            
298            try {
299                Hours.MAX_VALUE.plus(Hours.ONE);
300                fail();
301            } catch (ArithmeticException ex) {
302                // expected
303            }
304        }
305    
306        public void testMinus_int() {
307            Hours test2 = Hours.hours(2);
308            Hours result = test2.minus(3);
309            assertEquals(2, test2.getHours());
310            assertEquals(-1, result.getHours());
311            
312            assertEquals(1, Hours.ONE.minus(0).getHours());
313            
314            try {
315                Hours.MIN_VALUE.minus(1);
316                fail();
317            } catch (ArithmeticException ex) {
318                // expected
319            }
320        }
321    
322        public void testMinus_Hours() {
323            Hours test2 = Hours.hours(2);
324            Hours test3 = Hours.hours(3);
325            Hours result = test2.minus(test3);
326            assertEquals(2, test2.getHours());
327            assertEquals(3, test3.getHours());
328            assertEquals(-1, result.getHours());
329            
330            assertEquals(1, Hours.ONE.minus(Hours.ZERO).getHours());
331            assertEquals(1, Hours.ONE.minus((Hours) null).getHours());
332            
333            try {
334                Hours.MIN_VALUE.minus(Hours.ONE);
335                fail();
336            } catch (ArithmeticException ex) {
337                // expected
338            }
339        }
340    
341        public void testMultipliedBy_int() {
342            Hours test = Hours.hours(2);
343            assertEquals(6, test.multipliedBy(3).getHours());
344            assertEquals(2, test.getHours());
345            assertEquals(-6, test.multipliedBy(-3).getHours());
346            assertSame(test, test.multipliedBy(1));
347            
348            Hours halfMax = Hours.hours(Integer.MAX_VALUE / 2 + 1);
349            try {
350                halfMax.multipliedBy(2);
351                fail();
352            } catch (ArithmeticException ex) {
353                // expected
354            }
355        }
356    
357        public void testDividedBy_int() {
358            Hours test = Hours.hours(12);
359            assertEquals(6, test.dividedBy(2).getHours());
360            assertEquals(12, test.getHours());
361            assertEquals(4, test.dividedBy(3).getHours());
362            assertEquals(3, test.dividedBy(4).getHours());
363            assertEquals(2, test.dividedBy(5).getHours());
364            assertEquals(2, test.dividedBy(6).getHours());
365            assertSame(test, test.dividedBy(1));
366            
367            try {
368                Hours.ONE.dividedBy(0);
369                fail();
370            } catch (ArithmeticException ex) {
371                // expected
372            }
373        }
374    
375        public void testNegated() {
376            Hours test = Hours.hours(12);
377            assertEquals(-12, test.negated().getHours());
378            assertEquals(12, test.getHours());
379            
380            try {
381                Hours.MIN_VALUE.negated();
382                fail();
383            } catch (ArithmeticException ex) {
384                // expected
385            }
386        }
387    
388        //-----------------------------------------------------------------------
389        public void testAddToLocalDate() {
390            Hours test = Hours.hours(26);
391            LocalDateTime date = new LocalDateTime(2006, 6, 1, 0, 0, 0, 0);
392            LocalDateTime expected = new LocalDateTime(2006, 6, 2, 2, 0, 0, 0);
393            assertEquals(expected, date.plus(test));
394        }
395    
396    }