package org.gedcomx.date;
import org.testng.annotations.Test;
import java.util.Arrays;
import java.util.List;
import static org.fest.assertions.api.Assertions.assertThat;
import static org.fest.assertions.api.Assertions.fail;
/**
* @author John Clark.
*/
public class SimpleTest {
@Test
public void errorOnBlankString() {
try {
new GedcomxDateSimple("");
fail("GedcomxDateException expected because date must not be empty");
} catch(GedcomxDateException e) {
assertThat(e.getMessage()).isEqualTo("Invalid Date: Must have at least [+-]YYYY");
}
}
/**
* YEAR
*/
@Test
public void errorOnMissingPlusMinus() {
try {
new GedcomxDateSimple("2000-03-01");
fail("GedcomxDateException expected because missing plus");
} catch(GedcomxDateException e) {
assertThat(e.getMessage()).isEqualTo("Invalid Date: Must begin with + or -");
}
}
@Test
public void errorOnMalformedYear() {
try {
new GedcomxDateSimple("+1ooo");
fail("GedcomxDateException expected because o != 0");
} catch(GedcomxDateException e) {
assertThat(e.getMessage()).isEqualTo("Invalid Date: Malformed Year");
}
}
@Test
public void successOnPositiveYear() {
GedcomxDateSimple date = new GedcomxDateSimple("+1000");
assertThat(date.getYear()).isEqualTo(1000);
}
@Test
public void successOnNegativeYear() {
GedcomxDateSimple date = new GedcomxDateSimple("-0010");
assertThat(date.getYear()).isEqualTo(-10);
}
@Test
public void successOnNegativeYearZero() {
GedcomxDateSimple date = new GedcomxDateSimple("-0000");
assertThat(date.getYear()).isEqualTo(0);
}
@Test
public void successOnYearHour() {
GedcomxDateSimple date = new GedcomxDateSimple("+1000T10");
assertThat(date.getYear()).isEqualTo(1000);
assertThat(date.getHours()).isEqualTo(10);
}
@Test
public void errorOnInvalidYearMonthSeparator() {
try {
new GedcomxDateSimple("+1000_10");
fail("GedcomxDateException expected because _ is not the year-month separator");
} catch(GedcomxDateException e) {
assertThat(e.getMessage()).isEqualTo("Invalid Date: Invalid Year-Month Separator");
}
}
/**
* MONTH
*/
@Test
public void errorOnOneDigitMonth() {
try {
new GedcomxDateSimple("+1000-1");
fail("GedcomxDateException expected because month must be 2 digits");
} catch(GedcomxDateException e) {
assertThat(e.getMessage()).isEqualTo("Invalid Date: Month must be 2 digits");
}
}
@Test
public void errorOnInvalidMonth() {
try {
new GedcomxDateSimple("+1000-o1-01");
fail("GedcomxDateException expected because o != 0");
} catch(GedcomxDateException e) {
assertThat(e.getMessage()).isEqualTo("Invalid Date: Malformed Month");
}
}
@Test
public void errorOnMonth0() {
try {
new GedcomxDateSimple("+1000-00");
fail("GedcomxDateException expected because there is no month 0");
} catch(GedcomxDateException e) {
assertThat(e.getMessage()).isEqualTo("Invalid Date: Month must be between 1 and 12");
}
}
@Test
public void errorOnMonth13() {
try {
new GedcomxDateSimple("+1000-13");
fail("GedcomxDateException expected because there are only 12 months");
} catch(GedcomxDateException e) {
assertThat(e.getMessage()).isEqualTo("Invalid Date: Month must be between 1 and 12");
}
}
@Test
public void successOnYearMonth() {
GedcomxDateSimple date = new GedcomxDateSimple("+0987-04");
assertThat(date.getYear()).isEqualTo(987);
assertThat(date.getMonth()).isEqualTo(4);
assertThat(date.getDay()).isEqualTo(null);
}
@Test
public void successOnYearMonthHour() {
GedcomxDateSimple date = new GedcomxDateSimple("+1000-10T10");
assertThat(date.getYear()).isEqualTo(1000);
assertThat(date.getMonth()).isEqualTo(10);
assertThat(date.getDay()).isEqualTo(null);
assertThat(date.getHours()).isEqualTo(10);
}
@Test
public void errorOnInvalidMonthDaySeparator() {
try {
new GedcomxDateSimple("+1000-10=01");
fail("GedcomxDateException expected because = is not the month-day separator");
} catch(GedcomxDateException e) {
assertThat(e.getMessage()).isEqualTo("Invalid Date: Invalid Month-Day Separator");
}
}
/**
* DAY
*/
@Test
public void errorOnOneDigitDay() {
try {
new GedcomxDateSimple("+1000-10-1");
fail("GedcomxDateException expected because day must be 2 digits");
} catch(GedcomxDateException e) {
assertThat(e.getMessage()).isEqualTo("Invalid Date: Day must be 2 digits");
}
}
@Test
public void errorOnInvalidDay() {
try {
new GedcomxDateSimple("+1000-01-o1");
fail("GedcomxDateException expected because o != 0");
} catch(GedcomxDateException e) {
assertThat(e.getMessage()).isEqualTo("Invalid Date: Malformed Day");
}
}
@Test
public void errorOnDay0() {
try {
new GedcomxDateSimple("+1000-10-00");
fail("GedcomxDateException expected because there is no day 0");
} catch(GedcomxDateException e) {
assertThat(e.getMessage()).isEqualTo("Invalid Date: Day 0 does not exist");
}
}
@Test
public void errorOnDay31InFeb() {
try {
new GedcomxDateSimple("+1000-04-31");
fail("GedcomxDateException expected because there is no day 31 in february");
} catch(GedcomxDateException e) {
assertThat(e.getMessage()).isEqualTo("Invalid Date: There are only 30 days in Month 4 year 1000");
}
}
@Test
public void successOnLeapYear() {
GedcomxDateSimple date = new GedcomxDateSimple("+1600-02-29");
assertThat(date.getYear()).isEqualTo(1600);
assertThat(date.getMonth()).isEqualTo(2);
assertThat(date.getDay()).isEqualTo(29);
assertThat(date.getHours()).isEqualTo(null);
}
@Test
public void errorOnMissingT() {
try {
new GedcomxDateSimple("+1492-03-1501:02:03");
fail("GedcomxDateException expected because T required before time");
} catch(GedcomxDateException e) {
assertThat(e.getMessage()).isEqualTo("Invalid Date: +YYYY-MM-DD must have T before time");
}
}
/**
* HOURS
*/
@Test
public void errorOnOneDigitHour() {
try {
new GedcomxDateSimple("+1000-10-11T1");
fail("GedcomxDateException expected because hour must be 2 digits");
} catch(GedcomxDateException e) {
assertThat(e.getMessage()).isEqualTo("Invalid Date: Hours must be 2 digits");
}
}
@Test
public void errorOnInvalidHour() {
try {
new GedcomxDateSimple("+1000-01-11T1o");
fail("GedcomxDateException expected because o != 0");
} catch(GedcomxDateException e) {
assertThat(e.getMessage()).isEqualTo("Invalid Date: Malformed Hours");
}
}
@Test
public void errorOnHour25() {
try {
new GedcomxDateSimple("+1000-10-01T25");
fail("GedcomxDateException expected because there is no hour 25");
} catch(GedcomxDateException e) {
assertThat(e.getMessage()).isEqualTo("Invalid Date: Hours must be between 0 and 24");
}
}
@Test
public void successOnHour24() {
GedcomxDateSimple date = new GedcomxDateSimple("+0987-01-25T24Z");
assertThat(date.getYear()).isEqualTo(987);
assertThat(date.getMonth()).isEqualTo(1);
assertThat(date.getDay()).isEqualTo(25);
assertThat(date.getHours()).isEqualTo(24);
assertThat(date.getMinutes()).isEqualTo(null);
assertThat(date.getSeconds()).isEqualTo(null);
assertThat(date.getTzHours()).isEqualTo(0);
assertThat(date.getTzMinutes()).isEqualTo(0);
}
@Test
public void errorOnInvalidHourMinuteSeparator() {
try {
new GedcomxDateSimple("+1000-10-01T10|30");
fail("GedcomxDateException expected because | is not the hour-minute separator");
} catch(GedcomxDateException e) {
assertThat(e.getMessage()).isEqualTo("Invalid Date: Invalid Hour-Minute Separator");
}
}
/**
* MINUTES
*/
@Test
public void errorOnOneDigitMinute() {
try {
new GedcomxDateSimple("+1000-10-11T10:1");
fail("GedcomxDateException expected because minutes must be 2 digits");
} catch(GedcomxDateException e) {
assertThat(e.getMessage()).isEqualTo("Invalid Date: Minutes must be 2 digits");
}
}
@Test
public void errorOnInvalidMinute() {
try {
new GedcomxDateSimple("+1000-01-11T10:1o");
fail("GedcomxDateException expected because o != 0");
} catch(GedcomxDateException e) {
assertThat(e.getMessage()).isEqualTo("Invalid Date: Malformed Minutes");
}
}
@Test
public void errorOnMinute60() {
try {
new GedcomxDateSimple("+1000-10-01T23:60");
fail("GedcomxDateException expected because there is no minute 60");
} catch(GedcomxDateException e) {
assertThat(e.getMessage()).isEqualTo("Invalid Date: Minutes must be between 0 and 59");
}
}
@Test
public void errorOnHour24MinuteNot0() {
try {
new GedcomxDateSimple("+1000-10-01T24:15");
fail("GedcomxDateException expected because there is no minute 15 when hour is 24");
} catch(GedcomxDateException e) {
assertThat(e.getMessage()).isEqualTo("Invalid Date: Hours of 24 requires 00 Minutes");
}
}
@Test
public void successOnHour23_59() {
GedcomxDateSimple date = new GedcomxDateSimple("+0987-01-25T23:59");
assertThat(date.getYear()).isEqualTo(987);
assertThat(date.getMonth()).isEqualTo(1);
assertThat(date.getDay()).isEqualTo(25);
assertThat(date.getHours()).isEqualTo(23);
assertThat(date.getMinutes()).isEqualTo(59);
assertThat(date.getSeconds()).isEqualTo(null);
}
@Test
public void successOnHour23_59Z() {
GedcomxDateSimple date = new GedcomxDateSimple("+0987-01-25T23:59Z");
assertThat(date.getYear()).isEqualTo(987);
assertThat(date.getMonth()).isEqualTo(1);
assertThat(date.getDay()).isEqualTo(25);
assertThat(date.getHours()).isEqualTo(23);
assertThat(date.getMinutes()).isEqualTo(59);
assertThat(date.getSeconds()).isEqualTo(null);
assertThat(date.getTzHours()).isEqualTo(0);
assertThat(date.getTzMinutes()).isEqualTo(0);
}
@Test
public void errorOnInvalidMinuteSecondSeparator() {
try {
new GedcomxDateSimple("+1000-10-01T10:30|15");
fail("GedcomxDateException expected because | is not the minute-second separator");
} catch(GedcomxDateException e) {
assertThat(e.getMessage()).isEqualTo("Invalid Date: Invalid Minute-Second Separator");
}
}
/**
* SECONDS
*/
@Test
public void errorOnOneDigitSecond() {
try {
new GedcomxDateSimple("+1000-10-11T10:15:1");
fail("GedcomxDateException expected because seconds must be 2 digits");
} catch(GedcomxDateException e) {
assertThat(e.getMessage()).isEqualTo("Invalid Date: Seconds must be 2 digits");
}
}
@Test
public void errorOnInvalidSecond() {
try {
new GedcomxDateSimple("+1000-01-11T10:15:1o");
fail("GedcomxDateException expected because o != 0");
} catch(GedcomxDateException e) {
assertThat(e.getMessage()).isEqualTo("Invalid Date: Malformed Seconds");
}
}
@Test
public void errorOnSecond60() {
try {
new GedcomxDateSimple("+1000-10-01T23:24:60");
fail("GedcomxDateException expected because there is no second 60");
} catch(GedcomxDateException e) {
assertThat(e.getMessage()).isEqualTo("Invalid Date: Seconds must be between 0 and 59");
}
}
@Test
public void errorOnHour24SecondNot0() {
try {
new GedcomxDateSimple("+1000-10-01T24:00:01");
fail("GedcomxDateException expected because there is no second 1 when hour is 24");
} catch(GedcomxDateException e) {
assertThat(e.getMessage()).isEqualTo("Invalid Date: Hours of 24 requires 00 Seconds");
}
}
@Test
public void successOnHour23_59_59() {
GedcomxDateSimple date = new GedcomxDateSimple("+0987-01-25T23:59:59");
assertThat(date.getYear()).isEqualTo(987);
assertThat(date.getMonth()).isEqualTo(1);
assertThat(date.getDay()).isEqualTo(25);
assertThat(date.getHours()).isEqualTo(23);
assertThat(date.getMinutes()).isEqualTo(59);
assertThat(date.getSeconds()).isEqualTo(59);
}
@Test
public void successOnHour23_59_59Z() {
GedcomxDateSimple date = new GedcomxDateSimple("+0987-01-25T23:59:59Z");
assertThat(date.getYear()).isEqualTo(987);
assertThat(date.getMonth()).isEqualTo(1);
assertThat(date.getDay()).isEqualTo(25);
assertThat(date.getHours()).isEqualTo(23);
assertThat(date.getMinutes()).isEqualTo(59);
assertThat(date.getSeconds()).isEqualTo(59);
assertThat(date.getTzHours()).isEqualTo(0);
assertThat(date.getTzMinutes()).isEqualTo(0);
}
/**
* TZHOURS
*/
@Test
public void successOnZ() {
GedcomxDateSimple date = new GedcomxDateSimple("+1000-01-01T23:15Z");
assertThat(date.getYear()).isEqualTo(1000);
assertThat(date.getMonth()).isEqualTo(1);
assertThat(date.getDay()).isEqualTo(1);
assertThat(date.getHours()).isEqualTo(23);
assertThat(date.getMinutes()).isEqualTo(15);
assertThat(date.getSeconds()).isEqualTo(null);
assertThat(date.getTzHours()).isEqualTo(0);
assertThat(date.getTzMinutes()).isEqualTo(0);
}
@Test
public void errorOnExtraCharsAfterZ() {
try {
new GedcomxDateSimple("+1000-10-01T24:00:00ZSTUFF");
fail("GedcomxDateException expected because there is no STUFF allowed");
} catch(GedcomxDateException e) {
assertThat(e.getMessage()).isEqualTo("Invalid Date: Malformed Timezone - No Characters allowed after Z");
}
}
@Test
public void errorOnMissingTZHours() {
try {
new GedcomxDateSimple("+1000-10-01T24:00:00-1");
fail("GedcomxDateException expected because tzHours must be 2 digits");
} catch(GedcomxDateException e) {
assertThat(e.getMessage()).isEqualTo("Invalid Date: Malformed Timezone - tzHours must be [+-] followed by 2 digits");
}
}
@Test
public void errorOnInvalidTZHoursPrefix() {
try {
new GedcomxDateSimple("+1000-10-01T24:00:00_10");
fail("GedcomxDateException expected because tzHours must start with + or -");
} catch(GedcomxDateException e) {
assertThat(e.getMessage()).isEqualTo("Invalid Date: TimeZone Hours must begin with + or -");
}
}
@Test
public void errorOnInvalidTZHours() {
try {
new GedcomxDateSimple("+1000-01-11T10:15:10+1o");
fail("GedcomxDateException expected because o != 0");
} catch(GedcomxDateException e) {
assertThat(e.getMessage()).isEqualTo("Invalid Date: Malformed tzHours");
}
}
@Test
public void successOnPositiveTZHours() {
GedcomxDateSimple date = new GedcomxDateSimple("+1000-01-01T23:15+15");
assertThat(date.getYear()).isEqualTo(1000);
assertThat(date.getMonth()).isEqualTo(1);
assertThat(date.getDay()).isEqualTo(1);
assertThat(date.getHours()).isEqualTo(23);
assertThat(date.getMinutes()).isEqualTo(15);
assertThat(date.getSeconds()).isEqualTo(null);
assertThat(date.getTzHours()).isEqualTo(15);
assertThat(date.getTzMinutes()).isEqualTo(0);
}
@Test
public void successOnNegativeTZHours() {
GedcomxDateSimple date = new GedcomxDateSimple("+1000-01-01T23:15-02");
assertThat(date.getYear()).isEqualTo(1000);
assertThat(date.getMonth()).isEqualTo(1);
assertThat(date.getDay()).isEqualTo(1);
assertThat(date.getHours()).isEqualTo(23);
assertThat(date.getMinutes()).isEqualTo(15);
assertThat(date.getSeconds()).isEqualTo(null);
assertThat(date.getTzHours()).isEqualTo(-2);
assertThat(date.getTzMinutes()).isEqualTo(0);
}
@Test
public void successOnZeroTZHours() {
GedcomxDateSimple date = new GedcomxDateSimple("+1000-01-01T23:15-00");
assertThat(date.getYear()).isEqualTo(1000);
assertThat(date.getMonth()).isEqualTo(1);
assertThat(date.getDay()).isEqualTo(1);
assertThat(date.getHours()).isEqualTo(23);
assertThat(date.getMinutes()).isEqualTo(15);
assertThat(date.getSeconds()).isEqualTo(null);
assertThat(date.getTzHours()).isEqualTo(0);
assertThat(date.getTzMinutes()).isEqualTo(0);
}
@Test
public void errorOnInvalidTZHourTZMinuteSeparator() {
try {
new GedcomxDateSimple("+1000-10-01T10:30:15-06-30");
fail("GedcomxDateException expected because | is not the tzHour-tzMinute separator");
} catch(GedcomxDateException e) {
assertThat(e.getMessage()).isEqualTo("Invalid Date: Invalid tzHour-tzMinute Separator");
}
}
/**
* TZMINUTES
*/
@Test
public void errorOnMissingTZMinutes() {
try {
new GedcomxDateSimple("+1000-10-01T24:00:00-10:1");
fail("GedcomxDateException expected because tzHours must be 2 digits");
} catch(GedcomxDateException e) {
assertThat(e.getMessage()).isEqualTo("Invalid Date: tzSecond must be 2 digits");
}
}
@Test
public void errorOnInvalidTZMinutes() {
try {
new GedcomxDateSimple("+1000-01-11T10:15:10+10:1o");
fail("GedcomxDateException expected because o != 0");
} catch(GedcomxDateException e) {
assertThat(e.getMessage()).isEqualTo("Invalid Date: Malformed tzMinutes");
}
}
@Test
public void errorOnExtraCharsAfterTZSeconds() {
try {
new GedcomxDateSimple("+1000-01-11T10:15:10+10:10blah");
fail("GedcomxDateException expected because nothing is allowed after tzSeconds");
} catch(GedcomxDateException e) {
assertThat(e.getMessage()).isEqualTo("Invalid Date: Malformed Timezone - No characters allowed after tzSeconds");
}
}
@Test
public void successOnTZMinutes() {
GedcomxDateSimple date = new GedcomxDateSimple("+1000-01-01T23:15-00:30");
assertThat(date.getYear()).isEqualTo(1000);
assertThat(date.getMonth()).isEqualTo(1);
assertThat(date.getDay()).isEqualTo(1);
assertThat(date.getHours()).isEqualTo(23);
assertThat(date.getMinutes()).isEqualTo(15);
assertThat(date.getSeconds()).isEqualTo(null);
assertThat(date.getTzHours()).isEqualTo(0);
assertThat(date.getTzMinutes()).isEqualTo(30);
}
/**
* Other Methods
*/
@Test
public void getType() {
GedcomxDateSimple simple = new GedcomxDateSimple("+1000");
assertThat(simple.getType()).isEqualTo(GedcomxDateType.SIMPLE);
}
@Test
public void isApproximate() {
GedcomxDateSimple simple = new GedcomxDateSimple("+1000");
assertThat(simple.isApproximate()).isEqualTo(false);
}
@Test
public void toFormalString() {
List<String> tests = Arrays.asList("+1000-01-01T24:00:00Z","-1000-01-01T23:15:15-06:30","+0001-12","-0090");
for(String test: tests) {
GedcomxDateSimple simple = new GedcomxDateSimple(test);
assertThat(simple.toFormalString()).isEqualTo(test);
}
}
}