/*
* Copyright 2001-2013 Stephen Colebourne
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.joda.time;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import org.joda.time.base.BaseSingleFieldPeriod;
/**
* This class is a Junit unit test for BaseSingleFieldPeriod.
*
* @author Stephen Colebourne
*/
public class TestBaseSingleFieldPeriod extends TestCase {
// Test in 2002/03 as time zones are more well known
// (before the late 90's they were all over the place)
private static final DateTimeZone PARIS = DateTimeZone.forID("Europe/Paris");
public static void main(String[] args) {
junit.textui.TestRunner.run(suite());
}
public static TestSuite suite() {
return new TestSuite(TestBaseSingleFieldPeriod.class);
}
public TestBaseSingleFieldPeriod(String name) {
super(name);
}
protected void setUp() throws Exception {
}
protected void tearDown() throws Exception {
}
//-----------------------------------------------------------------------
public void testFactory_between_RInstant() {
// test using Days
DateTime start = new DateTime(2006, 6, 9, 12, 0, 0, 0, PARIS);
DateTime end1 = new DateTime(2006, 6, 12, 12, 0, 0, 0, PARIS);
DateTime end2 = new DateTime(2006, 6, 15, 18, 0, 0, 0, PARIS);
assertEquals(3, Single.between(start, end1, DurationFieldType.days()));
assertEquals(0, Single.between(start, start, DurationFieldType.days()));
assertEquals(0, Single.between(end1, end1, DurationFieldType.days()));
assertEquals(-3, Single.between(end1, start, DurationFieldType.days()));
assertEquals(6, Single.between(start, end2, DurationFieldType.days()));
try {
Single.between(start, (ReadableInstant) null, DurationFieldType.days());
fail();
} catch (IllegalArgumentException ex) {
// expected
}
try {
Single.between((ReadableInstant) null, end1, DurationFieldType.days());
fail();
} catch (IllegalArgumentException ex) {
// expected
}
try {
Single.between((ReadableInstant) null, (ReadableInstant) null, DurationFieldType.days());
fail();
} catch (IllegalArgumentException ex) {
// expected
}
}
@SuppressWarnings("deprecation")
public void testFactory_between_RPartial() {
LocalDate start = new LocalDate(2006, 6, 9);
LocalDate end1 = new LocalDate(2006, 6, 12);
YearMonthDay end2 = new YearMonthDay(2006, 6, 15);
Single zero = new Single(0);
assertEquals(3, Single.between(start, end1, zero));
assertEquals(0, Single.between(start, start, zero));
assertEquals(0, Single.between(end1, end1, zero));
assertEquals(-3, Single.between(end1, start, zero));
assertEquals(6, Single.between(start, end2, zero));
try {
Single.between(start, (ReadablePartial) null, zero);
fail();
} catch (IllegalArgumentException ex) {
// expected
}
try {
Single.between((ReadablePartial) null, end1, zero);
fail();
} catch (IllegalArgumentException ex) {
// expected
}
try {
Single.between((ReadablePartial) null, (ReadablePartial) null, zero);
fail();
} catch (IllegalArgumentException ex) {
// expected
}
try {
Single.between(start, new LocalTime(), zero);
fail();
} catch (IllegalArgumentException ex) {
// expected
}
try {
Single.between(new Partial(DateTimeFieldType.dayOfWeek(), 2), new Partial(DateTimeFieldType.dayOfMonth(), 3), zero);
fail();
} catch (IllegalArgumentException ex) {
// expected
}
Partial p = new Partial(
new DateTimeFieldType[] {DateTimeFieldType.year(), DateTimeFieldType.hourOfDay()},
new int[] {1, 2});
try {
Single.between(p, p, zero);
fail();
} catch (IllegalArgumentException ex) {
// expected
}
}
public void testFactory_standardPeriodIn_RPeriod() {
assertEquals(0, Single.standardPeriodIn((ReadablePeriod) null, DateTimeConstants.MILLIS_PER_DAY));
assertEquals(0, Single.standardPeriodIn(Period.ZERO, DateTimeConstants.MILLIS_PER_DAY));
assertEquals(1, Single.standardPeriodIn(new Period(0, 0, 0, 1, 0, 0, 0, 0), DateTimeConstants.MILLIS_PER_DAY));
assertEquals(123, Single.standardPeriodIn(Period.days(123), DateTimeConstants.MILLIS_PER_DAY));
assertEquals(-987, Single.standardPeriodIn(Period.days(-987), DateTimeConstants.MILLIS_PER_DAY));
assertEquals(1, Single.standardPeriodIn(Period.hours(47), DateTimeConstants.MILLIS_PER_DAY));
assertEquals(2, Single.standardPeriodIn(Period.hours(48), DateTimeConstants.MILLIS_PER_DAY));
assertEquals(2, Single.standardPeriodIn(Period.hours(49), DateTimeConstants.MILLIS_PER_DAY));
assertEquals(14, Single.standardPeriodIn(Period.weeks(2), DateTimeConstants.MILLIS_PER_DAY));
try {
Single.standardPeriodIn(Period.months(1), DateTimeConstants.MILLIS_PER_DAY);
fail();
} catch (IllegalArgumentException ex) {
// expeceted
}
}
//-----------------------------------------------------------------------
public void testValueIndexMethods() {
Single test = new Single(20);
assertEquals(1, test.size());
assertEquals(20, test.getValue(0));
try {
test.getValue(1);
fail();
} catch (IndexOutOfBoundsException ex) {
// expected
}
}
public void testFieldTypeIndexMethods() {
Single test = new Single(20);
assertEquals(1, test.size());
assertEquals(DurationFieldType.days(), test.getFieldType(0));
try {
test.getFieldType(1);
fail();
} catch (IndexOutOfBoundsException ex) {
// expected
}
}
public void testIsSupported() {
Single test = new Single(20);
assertEquals(false, test.isSupported(DurationFieldType.years()));
assertEquals(false, test.isSupported(DurationFieldType.months()));
assertEquals(false, test.isSupported(DurationFieldType.weeks()));
assertEquals(true, test.isSupported(DurationFieldType.days()));
assertEquals(false, test.isSupported(DurationFieldType.hours()));
assertEquals(false, test.isSupported(DurationFieldType.minutes()));
assertEquals(false, test.isSupported(DurationFieldType.seconds()));
assertEquals(false, test.isSupported(DurationFieldType.millis()));
}
public void testGet() {
Single test = new Single(20);
assertEquals(0, test.get(DurationFieldType.years()));
assertEquals(0, test.get(DurationFieldType.months()));
assertEquals(0, test.get(DurationFieldType.weeks()));
assertEquals(20, test.get(DurationFieldType.days()));
assertEquals(0, test.get(DurationFieldType.hours()));
assertEquals(0, test.get(DurationFieldType.minutes()));
assertEquals(0, test.get(DurationFieldType.seconds()));
assertEquals(0, test.get(DurationFieldType.millis()));
}
//-----------------------------------------------------------------------
public void testEqualsHashCode() {
Single testA = new Single(20);
Single testB = new Single(20);
assertEquals(true, testA.equals(testB));
assertEquals(true, testB.equals(testA));
assertEquals(true, testA.equals(testA));
assertEquals(true, testB.equals(testB));
assertEquals(true, testA.hashCode() == testB.hashCode());
assertEquals(true, testA.hashCode() == testA.hashCode());
assertEquals(true, testB.hashCode() == testB.hashCode());
Single testC = new Single(30);
assertEquals(false, testA.equals(testC));
assertEquals(false, testB.equals(testC));
assertEquals(false, testC.equals(testA));
assertEquals(false, testC.equals(testB));
assertEquals(false, testA.hashCode() == testC.hashCode());
assertEquals(false, testB.hashCode() == testC.hashCode());
assertEquals(true, testA.equals(Days.days(20)));
assertEquals(true, testA.equals(new Period(0, 0, 0, 20, 0, 0, 0, 0, PeriodType.days())));
assertEquals(false, testA.equals(Period.days(2)));
assertEquals(false, testA.equals("Hello"));
assertEquals(false, testA.equals(Hours.hours(2)));
assertEquals(false, testA.equals(null));
}
public void testCompareTo() {
Single test1 = new Single(21);
Single test2 = new Single(22);
Single test3 = new Single(23);
assertEquals(true, test1.compareTo(test1) == 0);
assertEquals(true, test1.compareTo(test2) < 0);
assertEquals(true, test1.compareTo(test3) < 0);
assertEquals(true, test2.compareTo(test1) > 0);
assertEquals(true, test2.compareTo(test2) == 0);
assertEquals(true, test2.compareTo(test3) < 0);
assertEquals(true, test3.compareTo(test1) > 0);
assertEquals(true, test3.compareTo(test2) > 0);
assertEquals(true, test3.compareTo(test3) == 0);
// try {
// test1.compareTo("Hello");
// fail();
// } catch (ClassCastException ex) {
// // expected
// }
// try {
// test1.compareTo(new Period(0, 0, 0, 21, 0, 0, 0, 0, PeriodType.days()));
// fail();
// } catch (ClassCastException ex) {
// // expected
// }
try {
test1.compareTo(null);
fail();
} catch (NullPointerException ex) {
// expected
}
}
//-----------------------------------------------------------------------
public void testToPeriod() {
Single test = new Single(20);
Period expected = Period.days(20);
assertEquals(expected, test.toPeriod());
}
public void testToMutablePeriod() {
Single test = new Single(20);
MutablePeriod expected = new MutablePeriod(0, 0, 0, 20, 0, 0, 0, 0);
assertEquals(expected, test.toMutablePeriod());
}
// public void testToDurationFrom() {
// Period test = new Period(123L);
// assertEquals(new Duration(123L), test.toDurationFrom(new Instant(0L)));
// }
//
// public void testToDurationTo() {
// Period test = new Period(123L);
// assertEquals(new Duration(123L), test.toDurationTo(new Instant(123L)));
// }
//
//-----------------------------------------------------------------------
public void testGetSetValue() {
Single test = new Single(20);
assertEquals(20, test.getValue());
test.setValue(10);
assertEquals(10, test.getValue());
}
//-----------------------------------------------------------------------
/** Test class. */
static class Single extends BaseSingleFieldPeriod {
public Single(int period) {
super(period);
}
public static int between(ReadableInstant start, ReadableInstant end, DurationFieldType field) {
return BaseSingleFieldPeriod.between(start, end, field);
}
public static int between(ReadablePartial start, ReadablePartial end, ReadablePeriod zeroInstance) {
return BaseSingleFieldPeriod.between(start, end, zeroInstance);
}
public static int standardPeriodIn(ReadablePeriod period, long millisPerUnit) {
return BaseSingleFieldPeriod.standardPeriodIn(period, millisPerUnit);
}
public DurationFieldType getFieldType() {
return DurationFieldType.days();
}
public PeriodType getPeriodType() {
return PeriodType.days();
}
public int getValue() {
return super.getValue();
}
public void setValue(int value) {
super.setValue(value);
}
}
}