package com.softwaremill.common.test.util.fest;
import org.assertj.core.api.AbstractAssert;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.joda.time.LocalDateTime;
import java.util.Date;
import static java.lang.String.format;
import static org.assertj.core.api.Assertions.fail;
public class TimeAssertions {
public static final String PATTERN = "yyyy-MM-dd HH:mm:ss.SSS";
public static DateTimeAssert assertTime(DateTime date) {
return new DateTimeAssert(DateTimeAssert.class, date);
}
public static DateTimeAssert assertTime(Date date) {
return new DateTimeAssert(DateTimeAssert.class, new DateTime(date.getTime()));
}
public static LocalDateTimeAssert assertTime(LocalDateTime localDateTime) {
return new LocalDateTimeAssert(LocalDateTimeAssert.class, localDateTime);
}
public static class DateTimeAssert extends AbstractAssert<DateTimeAssert, DateTime> {
/**
* @param selfType the "self type"
* @param actual the actual value to verify
*/
protected DateTimeAssert(Class<DateTimeAssert> selfType, DateTime actual) {
super(actual, selfType);
}
public DateTimeAssert isBefore(DateTime moment) {
if (!actual.isBefore(moment)) {
fail(format("Moment %s is not before %s", actual.toString(PATTERN), moment.toString(PATTERN)));
}
return this;
}
public DateTimeAssert isBefore(Date moment) {
if (!actual.isBefore(new DateTime(moment))) {
fail(format("Moment %s is not before %s", actual.toString(PATTERN), new DateTime(moment).toString(PATTERN)));
}
return this;
}
public DateTimeAssert isBeforeOrAt(DateTime moment) {
if (actual.isAfter(moment)) {
fail(format("Moment %s is not before %s nor at the same time.", actual.toString(PATTERN), moment.toString(PATTERN)));
}
return this;
}
public DateTimeAssert isBeforeOrAt(Date moment) {
if (actual.isAfter(new DateTime(moment))) {
fail(format("Moment %s is not before %s nor at the same time.", actual.toString(PATTERN), new DateTime(moment).toString(PATTERN)));
}
return this;
}
public DateTimeAssert isAfterOrAt(DateTime moment) {
if (actual.isBefore(moment)) {
fail(format("Moment %s is not after %s nor at the same time", actual.toString(PATTERN), moment.toString(PATTERN)));
}
return this;
}
public DateTimeAssert isAfterOrAt(Date moment) {
if (actual.isBefore(new DateTime(moment))) {
fail(format("Moment %s is not after %s nor at the same time", actual.toString(PATTERN), new DateTime(moment).toString(PATTERN)));
}
return this;
}
public DateTimeAssert isAfter(DateTime moment) {
if (!actual.isAfter(moment)) {
fail(format("Moment %s is not after %s", actual.toString(PATTERN), moment.toString(PATTERN)));
}
return this;
}
public DateTimeAssert isAfter(Date moment) {
if (!actual.isAfter(new DateTime(moment))) {
fail(format("Moment %s is not after %s", actual.toString(PATTERN), new DateTime(moment).toString(PATTERN)));
}
return this;
}
}
public static class LocalDateTimeAssert extends AbstractAssert<LocalDateTimeAssert, LocalDateTime> {
private final DateTimeAssert delegate;
protected LocalDateTimeAssert(Class<LocalDateTimeAssert> selfType, LocalDateTime actual) {
super(actual, selfType);
delegate = new DateTimeAssert(DateTimeAssert.class, actual.toDateTime(DateTimeZone.UTC));
}
public LocalDateTimeAssert isBefore(LocalDateTime moment) {
delegate.isBefore(moment.toDateTime(DateTimeZone.UTC));
return this;
}
public LocalDateTimeAssert isBeforeOrAt(LocalDateTime moment) {
delegate.isBeforeOrAt(moment.toDateTime(DateTimeZone.UTC));
return this;
}
public LocalDateTimeAssert isAfterOrAt(LocalDateTime moment) {
delegate.isAfterOrAt(moment.toDateTime(DateTimeZone.UTC));
return this;
}
public LocalDateTimeAssert isAfter(LocalDateTime moment) {
delegate.isAfter(moment.toDateTime(DateTimeZone.UTC));
return this;
}
}
}