CalendarMatchers.java

/**
 * Powerunit - A JDK1.8 test framework
 * Copyright (C) 2014 Mathieu Boretti.
 *
 * This file is part of Powerunit
 *
 * Powerunit is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * Powerunit is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with Powerunit. If not, see <http://www.gnu.org/licenses/>.
 */
package ch.powerunit.matchers.datetime;

import java.util.Calendar;

import org.hamcrest.FeatureMatcher;
import org.hamcrest.Matcher;

import ch.powerunit.TestSuite;

/**
 * @author borettim
 *
 */
public final class CalendarMatchers {

	private CalendarMatchers() {
	}

	private static final class CalendarFieldMatcher extends
			FeatureMatcher<Calendar, Integer> {

		private final int field;

		public CalendarFieldMatcher(Matcher<? super Integer> subMatcher,
				String featureName, int field) {
			super(subMatcher, featureName, featureName);
			this.field = field;
		}

		@Override
		protected Integer featureValueOf(Calendar actual) {
			return actual.get(field);
		}

	}

	public static Matcher<Calendar> isYear(int year) {
		return new CalendarFieldMatcher(TestSuite.DSL.equalTo(year), "year",
				Calendar.YEAR);
	}

	public static Matcher<Calendar> isDayOfMonth(int dayOfMonth) {
		return new CalendarFieldMatcher(TestSuite.DSL.equalTo(dayOfMonth),
				"day of month", Calendar.DAY_OF_MONTH);
	}

	public static Matcher<Calendar> isMonth(int month) {
		return new CalendarFieldMatcher(TestSuite.DSL.equalTo(month), "month",
				Calendar.MONTH);
	}

	public static Matcher<Calendar> isHourOfDay(int hourOfDay) {
		return new CalendarFieldMatcher(TestSuite.DSL.equalTo(hourOfDay),
				"hour of day", Calendar.HOUR_OF_DAY);
	}

	public static Matcher<Calendar> isMinute(int minute) {
		return new CalendarFieldMatcher(TestSuite.DSL.equalTo(minute),
				"minute", Calendar.MINUTE);
	}

	public static Matcher<Calendar> isSecond(int second) {
		return new CalendarFieldMatcher(TestSuite.DSL.equalTo(second),
				"second", Calendar.SECOND);
	}

	public static Matcher<Calendar> isMillisecond(int millisecond) {
		return new CalendarFieldMatcher(TestSuite.DSL.equalTo(millisecond),
				"millisecond", Calendar.MILLISECOND);
	}

	public static Matcher<Calendar> isDayOfWeek(int dayOfWeek) {
		return new CalendarFieldMatcher(TestSuite.DSL.equalTo(dayOfWeek),
				"day of week", Calendar.DAY_OF_WEEK);
	}

	public static Matcher<Calendar> isMonday() {
		return new CalendarFieldMatcher(TestSuite.DSL.describedAs("Monday",
				TestSuite.DSL.equalTo(Calendar.MONDAY)), "day of week",
				Calendar.DAY_OF_WEEK);
	}

	public static Matcher<Calendar> isThurday() {
		return new CalendarFieldMatcher(TestSuite.DSL.describedAs("Thursday",
				TestSuite.DSL.equalTo(Calendar.THURSDAY)), "day of week",
				Calendar.DAY_OF_WEEK);
	}

	public static Matcher<Calendar> isWednesday() {
		return new CalendarFieldMatcher(TestSuite.DSL.describedAs("Wednesday",
				TestSuite.DSL.equalTo(Calendar.WEDNESDAY)), "day of week",
				Calendar.DAY_OF_WEEK);
	}

	public static Matcher<Calendar> isTuesday() {
		return new CalendarFieldMatcher(TestSuite.DSL.describedAs("Tuesday",
				TestSuite.DSL.equalTo(Calendar.TUESDAY)), "day of week",
				Calendar.DAY_OF_WEEK);
	}

	public static Matcher<Calendar> isFriday() {
		return new CalendarFieldMatcher(TestSuite.DSL.describedAs("Friday",
				TestSuite.DSL.equalTo(Calendar.FRIDAY)), "day of week",
				Calendar.DAY_OF_WEEK);
	}

	public static Matcher<Calendar> isSaturday() {
		return new CalendarFieldMatcher(TestSuite.DSL.describedAs("Saturday",
				TestSuite.DSL.equalTo(Calendar.SATURDAY)), "day of week",
				Calendar.DAY_OF_WEEK);
	}

	public static Matcher<Calendar> isSunday() {
		return new CalendarFieldMatcher(TestSuite.DSL.describedAs("Sunday",
				TestSuite.DSL.equalTo(Calendar.SUNDAY)), "day of week",
				Calendar.DAY_OF_WEEK);
	}

	public static Matcher<Calendar> isJanuary() {
		return new CalendarFieldMatcher(TestSuite.DSL.describedAs("January",
				TestSuite.DSL.equalTo(Calendar.JANUARY)), "month",
				Calendar.MONTH);
	}

	public static Matcher<Calendar> isFebruary() {
		return new CalendarFieldMatcher(TestSuite.DSL.describedAs("February",
				TestSuite.DSL.equalTo(Calendar.FEBRUARY)), "month",
				Calendar.MONTH);
	}

	public static Matcher<Calendar> isMarch() {
		return new CalendarFieldMatcher(TestSuite.DSL.describedAs("March",
				TestSuite.DSL.equalTo(Calendar.MARCH)), "month", Calendar.MONTH);
	}

	public static Matcher<Calendar> isApril() {
		return new CalendarFieldMatcher(TestSuite.DSL.describedAs("April",
				TestSuite.DSL.equalTo(Calendar.APRIL)), "month", Calendar.MONTH);
	}

	public static Matcher<Calendar> isMay() {
		return new CalendarFieldMatcher(TestSuite.DSL.describedAs("May",
				TestSuite.DSL.equalTo(Calendar.MAY)), "month", Calendar.MONTH);
	}

	public static Matcher<Calendar> isJune() {
		return new CalendarFieldMatcher(TestSuite.DSL.describedAs("June",
				TestSuite.DSL.equalTo(Calendar.JUNE)), "month", Calendar.MONTH);
	}

	public static Matcher<Calendar> isJuly() {
		return new CalendarFieldMatcher(TestSuite.DSL.describedAs("July",
				TestSuite.DSL.equalTo(Calendar.JULY)), "month", Calendar.MONTH);
	}

	public static Matcher<Calendar> isAugust() {
		return new CalendarFieldMatcher(TestSuite.DSL.describedAs("August",
				TestSuite.DSL.equalTo(Calendar.AUGUST)), "month",
				Calendar.MONTH);
	}

	public static Matcher<Calendar> isSeptember() {
		return new CalendarFieldMatcher(TestSuite.DSL.describedAs("September",
				TestSuite.DSL.equalTo(Calendar.SEPTEMBER)), "month",
				Calendar.MONTH);
	}

	public static Matcher<Calendar> isOctober() {
		return new CalendarFieldMatcher(TestSuite.DSL.describedAs("October",
				TestSuite.DSL.equalTo(Calendar.OCTOBER)), "month",
				Calendar.MONTH);
	}

	public static Matcher<Calendar> isNovember() {
		return new CalendarFieldMatcher(TestSuite.DSL.describedAs("November",
				TestSuite.DSL.equalTo(Calendar.NOVEMBER)), "month",
				Calendar.MONTH);
	}

	public static Matcher<Calendar> isDecember() {
		return new CalendarFieldMatcher(TestSuite.DSL.describedAs("December",
				TestSuite.DSL.equalTo(Calendar.DECEMBER)), "month",
				Calendar.MONTH);
	}

	public static Matcher<Calendar> sameDate(Calendar other) {
		return other == null ? TestSuite.DSL.nullValue(Calendar.class)
				: TestSuite.DSL.both(isYear(other.get(Calendar.YEAR)))
						.and(isDayOfMonth(other.get(Calendar.DAY_OF_MONTH)))
						.and(isMonth(other.get(Calendar.DAY_OF_MONTH)));
	}
}