package net.time4j;
import net.time4j.base.GregorianMath;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import static net.time4j.CalendarUnit.CENTURIES;
import static net.time4j.CalendarUnit.DECADES;
import static net.time4j.CalendarUnit.MILLENNIA;
import static net.time4j.CalendarUnit.MONTHS;
import static net.time4j.CalendarUnit.QUARTERS;
import static net.time4j.CalendarUnit.YEARS;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
@RunWith(JUnit4.class)
public class YearMonthArithmeticTest {
@Test
public void plusOneYear() {
assertThat(
PlainDate.of(2012, 2, 1).plus(1, YEARS),
is(PlainDate.of(2013, 2, 1)));
assertThat(
PlainDate.of(2012, 2, 28).plus(1, YEARS),
is(PlainDate.of(2013, 2, 28)));
assertThat(
PlainDate.of(2012, 2, 29).plus(1, YEARS),
is(PlainDate.of(2013, 2, 28)));
}
@Test
public void plusFourYears() {
assertThat(
PlainDate.of(2012, 2, 1).plus(4, YEARS),
is(PlainDate.of(2016, 2, 1)));
assertThat(
PlainDate.of(2012, 2, 28).plus(4, YEARS),
is(PlainDate.of(2016, 2, 28)));
assertThat(
PlainDate.of(2012, 2, 29).plus(4, YEARS),
is(PlainDate.of(2016, 2, 29)));
}
@Test(expected=ArithmeticException.class)
public void maxPlusYear() {
PlainDate.of(GregorianMath.MAX_YEAR, 1, 1).plus(1, YEARS);
}
@Test
public void minusOneYear() {
assertThat(
PlainDate.of(2012, 2, 1).minus(1, YEARS),
is(PlainDate.of(2011, 2, 1)));
assertThat(
PlainDate.of(2012, 2, 28).minus(1, YEARS),
is(PlainDate.of(2011, 2, 28)));
assertThat(
PlainDate.of(2012, 2, 29).minus(1, YEARS),
is(PlainDate.of(2011, 2, 28)));
}
@Test
public void minusFourYears() {
assertThat(
PlainDate.of(2012, 2, 1).minus(4, YEARS),
is(PlainDate.of(2008, 2, 1)));
assertThat(
PlainDate.of(2012, 2, 28).minus(4, YEARS),
is(PlainDate.of(2008, 2, 28)));
assertThat(
PlainDate.of(2012, 2, 29).minus(4, YEARS),
is(PlainDate.of(2008, 2, 29)));
}
@Test(expected=ArithmeticException.class)
public void minMinusYear() {
PlainDate.of(GregorianMath.MIN_YEAR, 12, 31).minus(1, YEARS);
}
@Test
public void plusOneMonth() {
assertThat(
PlainDate.of(2012, 12, 14).plus(1, MONTHS),
is(PlainDate.of(2013, 1, 14)));
assertThat(
PlainDate.of(2012, 1, 1).plus(1, MONTHS),
is(PlainDate.of(2012, 2, 1)));
assertThat(
PlainDate.of(2012, 1, 28).plus(1, MONTHS),
is(PlainDate.of(2012, 2, 28)));
assertThat(
PlainDate.of(2014, 1, 29).plus(1, MONTHS),
is(PlainDate.of(2014, 2, 28)));
assertThat(
PlainDate.of(2012, 1, 29).plus(1, MONTHS),
is(PlainDate.of(2012, 2, 29)));
assertThat(
PlainDate.of(2012, 1, 30).plus(1, MONTHS),
is(PlainDate.of(2012, 2, 29)));
assertThat(
PlainDate.of(2012, 3, 31).plus(1, MONTHS),
is(PlainDate.of(2012, 4, 30)));
assertThat(
PlainDate.of(2012, 2, 1).plus(1, MONTHS),
is(PlainDate.of(2012, 3, 1)));
assertThat(
PlainDate.of(2012, 7, 31).plus(1, MONTHS),
is(PlainDate.of(2012, 8, 31)));
}
@Test
public void plusThirteenMonths() {
assertThat(
PlainDate.of(2012, 2, 19).plus(13, MONTHS),
is(PlainDate.of(2013, 3, 19)));
assertThat(
PlainDate.of(2011, 1, 30).plus(13, MONTHS),
is(PlainDate.of(2012, 2, 29)));
assertThat(
PlainDate.of(2010, 1, 29).plus(13, MONTHS),
is(PlainDate.of(2011, 2, 28)));
}
@Test(expected=ArithmeticException.class)
public void maxPlusMonth() {
PlainDate.of(GregorianMath.MAX_YEAR, 12, 1).plus(1, MONTHS);
}
@Test
public void minusOneMonth() {
assertThat(
PlainDate.of(2012, 1, 14).minus(1, MONTHS),
is(PlainDate.of(2011, 12, 14)));
assertThat(
PlainDate.of(2012, 3, 1).minus(1, MONTHS),
is(PlainDate.of(2012, 2, 1)));
assertThat(
PlainDate.of(2012, 3, 28).minus(1, MONTHS),
is(PlainDate.of(2012, 2, 28)));
assertThat(
PlainDate.of(2012, 3, 29).minus(1, MONTHS),
is(PlainDate.of(2012, 2, 29)));
assertThat(
PlainDate.of(2012, 3, 30).minus(1, MONTHS),
is(PlainDate.of(2012, 2, 29)));
assertThat(
PlainDate.of(2012, 3, 31).minus(1, MONTHS),
is(PlainDate.of(2012, 2, 29)));
assertThat(
PlainDate.of(2012, 4, 1).minus(1, MONTHS),
is(PlainDate.of(2012, 3, 1)));
assertThat(
PlainDate.of(2012, 5, 31).minus(1, MONTHS),
is(PlainDate.of(2012, 4, 30)));
}
@Test
public void minusThirteenMonths() {
assertThat(
PlainDate.of(2013, 3, 19).minus(13, MONTHS),
is(PlainDate.of(2012, 2, 19)));
assertThat(
PlainDate.of(2013, 3, 31).minus(13, MONTHS),
is(PlainDate.of(2012, 2, 29)));
assertThat(
PlainDate.of(2014, 3, 31).minus(13, MONTHS),
is(PlainDate.of(2013, 2, 28)));
}
@Test(expected=ArithmeticException.class)
public void minMinusMonth() {
PlainDate.of(GregorianMath.MIN_YEAR, 1, 31).minus(1, MONTHS);
}
@Test(expected=ArithmeticException.class)
public void plusLongMaxYears() {
PlainDate.of(1, 1).plus(Long.MAX_VALUE, YEARS);
}
@Test(expected=ArithmeticException.class)
public void minusLongMaxYears() {
PlainDate.of(1, 1).minus(Long.MAX_VALUE, YEARS);
}
@Test(expected=ArithmeticException.class)
public void plusLongMaxMonths() {
PlainDate.of(1, 1).plus(Long.MAX_VALUE, MONTHS);
}
@Test(expected=ArithmeticException.class)
public void minusLongMaxMonths() {
PlainDate.of(1, 1).minus(Long.MAX_VALUE, MONTHS);
}
@Test(expected=ArithmeticException.class)
public void plusLongMinYears() {
PlainDate.of(1, 1).plus(Long.MIN_VALUE, YEARS);
}
@Test(expected=ArithmeticException.class)
public void minusLongMinYears() {
PlainDate.of(1, 1).minus(Long.MIN_VALUE, YEARS);
}
@Test(expected=ArithmeticException.class)
public void plusLongMinMonths() {
PlainDate.of(1, 1).plus(Long.MIN_VALUE, MONTHS);
}
@Test(expected=ArithmeticException.class)
public void minusLongMinMonths() {
PlainDate.of(1, 1).minus(Long.MIN_VALUE, MONTHS);
}
@Test(expected=NullPointerException.class)
public void plusNull() {
PlainDate.of(1, 1).plus(Long.MAX_VALUE, null);
}
@Test(expected=NullPointerException.class)
public void minusNull() {
PlainDate.of(1, 1).minus(Long.MAX_VALUE, null);
}
@Test
public void plusMillennia() {
assertThat(
PlainDate.of(2014, 9, 20).plus(2, MILLENNIA),
is(PlainDate.of(4014, 9, 20)));
}
@Test
public void plusCenturies() {
assertThat(
PlainDate.of(2014, 9, 20).plus(2, CENTURIES),
is(PlainDate.of(2214, 9, 20)));
assertThat(
PlainDate.of(2000, 2, 29).plus(3, CENTURIES),
is(PlainDate.of(2300, 2, 28)));
assertThat(
PlainDate.of(2000, 2, 29).plus(4, CENTURIES),
is(PlainDate.of(2400, 2, 29)));
}
@Test
public void plusDecades() {
assertThat(
PlainDate.of(2014, 9, 20).plus(2, DECADES),
is(PlainDate.of(2034, 9, 20)));
}
@Test
public void plusQuarters() {
assertThat(
PlainDate.of(2014, 9, 20).plus(2, QUARTERS),
is(PlainDate.of(2015, 3, 20)));
assertThat(
PlainDate.of(2014, 11, 30).plus(1, QUARTERS),
is(PlainDate.of(2015, 2, 28)));
}
@Test
public void minusQuarters() {
assertThat(
PlainDate.of(2014, 9, 20).minus(2, QUARTERS),
is(PlainDate.of(2014, 3, 20)));
assertThat(
PlainDate.of(2014, 12, 31).minus(1, QUARTERS),
is(PlainDate.of(2014, 9, 30)));
}
@Test
public void quartersBetween() {
assertThat(
QUARTERS.between(
PlainDate.of(2014, 9, 20),
PlainDate.of(2015, 3, 20)),
is(2L));
assertThat(
QUARTERS.between(
PlainDate.of(2014, 12, 31),
PlainDate.of(2014, 9, 30)),
is(-1L));
assertThat(
QUARTERS.between(
PlainDate.of(2014, 9, 20),
PlainDate.of(2015, 3, 19)),
is(1L));
assertThat(
QUARTERS.between(
PlainDate.of(2014, 12, 29),
PlainDate.of(2014, 9, 30)),
is(0L));
}
@Test
public void monthsBetween() {
assertThat(
MONTHS.between(
PlainDate.of(2014, 9, 1),
PlainDate.of(2014, 9, 30)),
is(0L));
assertThat(
MONTHS.between(
PlainDate.of(2014, 9, 30),
PlainDate.of(2014, 9, 1)),
is(0L));
assertThat(
MONTHS.between(
PlainDate.of(2014, 9, 20),
PlainDate.of(2015, 3, 20)),
is(6L));
assertThat(
MONTHS.between(
PlainDate.of(2014, 12, 31),
PlainDate.of(2014, 9, 30)),
is(-3L));
assertThat(
MONTHS.between(
PlainDate.of(2014, 9, 20),
PlainDate.of(2015, 3, 19)),
is(5L));
assertThat(
MONTHS.between(
PlainDate.of(2014, 12, 29),
PlainDate.of(2014, 9, 30)),
is(-2L));
}
@Test
public void yearsBetween() {
assertThat(
YEARS.between(
PlainDate.of(2014, 9, 20),
PlainDate.of(2015, 9, 20)),
is(1L));
assertThat(
YEARS.between(
PlainDate.of(2014, 9, 20),
PlainDate.of(2015, 9, 19)),
is(0L));
assertThat(
YEARS.between(
PlainDate.of(2014, 12, 31),
PlainDate.of(2014, 9, 30)),
is(0L));
assertThat(
YEARS.between(
PlainDate.of(2014, 12, 29),
PlainDate.of(2011, 9, 30)),
is(-3L));
assertThat(
YEARS.between(
PlainDate.of(2014, 12, 29),
PlainDate.of(2011, 12, 30)),
is(-2L));
}
@Test
public void decadesBetween() {
assertThat(
DECADES.between(
PlainDate.of(1914, 9, 20),
PlainDate.of(2004, 9, 20)),
is(9L));
assertThat(
DECADES.between(
PlainDate.of(1914, 9, 20),
PlainDate.of(2004, 9, 19)),
is(8L));
}
@Test
public void centuriesBetween() {
assertThat(
CENTURIES.between(
PlainDate.of(1914, 9, 20),
PlainDate.of(2014, 9, 20)),
is(1L));
assertThat(
CENTURIES.between(
PlainDate.of(1914, 9, 20),
PlainDate.of(2014, 9, 19)),
is(0L));
}
@Test
public void millenniaBetween() {
assertThat(
MILLENNIA.between(
PlainDate.of(1914, 9, 20),
PlainDate.of(3914, 9, 20)),
is(2L));
assertThat(
MILLENNIA.between(
PlainDate.of(1914, 9, 20),
PlainDate.of(3914, 9, 19)),
is(1L));
assertThat(
MILLENNIA.between(
PlainDate.of(1914, 9, 20),
PlainDate.of(3014, 9, 19)),
is(1L));
}
}