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 RangeTest { @Test public void errorOnBlankString() { try { new GedcomxDateRange(""); fail("GedcomxDateException expected because date must not be empty"); } catch(GedcomxDateException e) { assertThat(e.getMessage()).isEqualTo("Invalid Range"); } } @Test public void errorOnJustA() { try { new GedcomxDateRange("A"); fail("GedcomxDateException expected because range must have a /"); } catch(GedcomxDateException e) { assertThat(e.getMessage()).isEqualTo("Invalid Range: / is required"); } } @Test public void errorOnOnePart() { try { new GedcomxDateRange("A+1000"); fail("GedcomxDateException expected because range must have a /"); } catch(GedcomxDateException e) { assertThat(e.getMessage()).isEqualTo("Invalid Range: / is required"); } } @Test public void errorOnJustSlash() { try { new GedcomxDateRange("/"); fail("GedcomxDateException expected because range must have something other than a /"); } catch(GedcomxDateException e) { assertThat(e.getMessage()).isEqualTo("Invalid Range: One or two parts are required"); } } @Test public void errorOnManySlashes() { try { new GedcomxDateRange("+1000/+2000/+3000"); fail("GedcomxDateException expected because range must have only 1 slash"); } catch(GedcomxDateException e) { assertThat(e.getMessage()).isEqualTo("Invalid Range: One or two parts are required"); } } @Test public void errorOnInvalidPart1() { try { new GedcomxDateRange("+1000_10/"); fail("GedcomxDateException expected because range has invalid part 1"); } catch(GedcomxDateException e) { assertThat(e.getMessage()).isEqualTo("Invalid Date: Invalid Year-Month Separator in Range Start Date"); } } @Test public void errorOnDurationOnly() { try { new GedcomxDateRange("/P100Y"); fail("GedcomxDateException expected because range only has a duration"); } catch(GedcomxDateException e) { assertThat(e.getMessage()).isEqualTo("Invalid Range: A range may not end with a duration if missing a start date"); } } @Test public void errorOnInvalidDuration() { try { new GedcomxDateRange("+1000/P100Q"); fail("GedcomxDateException expected because range only has a duration"); } catch(GedcomxDateException e) { assertThat(e.getMessage()).isEqualTo("Invalid Duration: Unknown letter Q in Range End Duration"); } } @Test public void errorOnInvalidPart2() { try { new GedcomxDateRange("/+1000_10"); fail("GedcomxDateException expected because range has invalid part 2"); } catch(GedcomxDateException e) { assertThat(e.getMessage()).isEqualTo("Invalid Date: Invalid Year-Month Separator in Range End Date"); } } @Test public void successOnDuration() { GedcomxDateRange range = new GedcomxDateRange("+1000/P1Y2M3DT4H5M6S"); GedcomxDateSimple start = range.getStart(); GedcomxDateSimple end = range.getEnd(); GedcomxDateDuration duration = range.getDuration(); assertThat(start.getYear()).isEqualTo(1000); assertThat(start.getMonth()).isEqualTo(null); assertThat(end.getYear()).isEqualTo(1001); assertThat(end.getMonth()).isEqualTo(3); assertThat(end.getDay()).isEqualTo(4); assertThat(end.getHours()).isEqualTo(4); assertThat(end.getMinutes()).isEqualTo(5); assertThat(end.getSeconds()).isEqualTo(6); assertThat(duration.getYears()).isEqualTo(1); assertThat(duration.getMonths()).isEqualTo(2); assertThat(duration.getDays()).isEqualTo(3); assertThat(duration.getHours()).isEqualTo(4); assertThat(duration.getMinutes()).isEqualTo(5); assertThat(duration.getSeconds()).isEqualTo(6); } @Test public void successOnEndDate() { GedcomxDateRange range = new GedcomxDateRange("+1000/+2000-10-01"); GedcomxDateSimple start = range.getStart(); GedcomxDateSimple end = range.getEnd(); GedcomxDateDuration duration = range.getDuration(); assertThat(start.getYear()).isEqualTo(1000); assertThat(start.getMonth()).isEqualTo(null); assertThat(end.getYear()).isEqualTo(2000); assertThat(end.getMonth()).isEqualTo(10); assertThat(end.getDay()).isEqualTo(1); assertThat(end.getHours()).isEqualTo(null); assertThat(end.getMinutes()).isEqualTo(null); assertThat(end.getSeconds()).isEqualTo(null); assertThat(duration.getYears()).isEqualTo(1000); assertThat(duration.getMonths()).isEqualTo(9); assertThat(duration.getDays()).isEqualTo(null); assertThat(duration.getHours()).isEqualTo(null); assertThat(duration.getMinutes()).isEqualTo(null); assertThat(duration.getSeconds()).isEqualTo(null); } /** * Other Methods */ @Test public void getType() { GedcomxDateRange range = new GedcomxDateRange("+1000/+2000-10-01"); assertThat(range.getType()).isEqualTo(GedcomxDateType.RANGE); } @Test public void isApproximate() { GedcomxDateRange range; range = new GedcomxDateRange("A+1000/+2000-10-01"); assertThat(range.isApproximate()).isEqualTo(true); range = new GedcomxDateRange("+1000/+2000-10-01"); assertThat(range.isApproximate()).isEqualTo(false); } @Test public void toFormalString() { List<String> tests = Arrays.asList("+1000/P1000Y9M", "A+1000/P1000Y9M", "/+1000"); for(String test: tests) { GedcomxDateRange range = new GedcomxDateRange(test); assertThat(range.toFormalString()).isEqualTo(test); } } }