@Test
  public void testReleaseValidation() {
    Assert.assertFalse("Should not be valid by default", viewModel.releaseValidation().isValid());

    viewModel.backlogProperty().set(null);
    Assert.assertFalse("Null release is not valid", viewModel.releaseValidation().isValid());

    viewModel.releaseProperty().set(new Release("", new Project(), LocalDate.now(), ""));
    Assert.assertTrue("Non null release is valid", viewModel.releaseValidation().isValid());
  }
  @Test
  public void testBacklogValidation() {
    Assert.assertFalse("Should not be valid by default", viewModel.backlogValidation().isValid());

    viewModel.backlogProperty().set(null);
    Assert.assertFalse("Null backlog is not valid", viewModel.backlogValidation().isValid());

    viewModel.backlogProperty().set(new Backlog());
    Assert.assertTrue("Non null backlog is valid", viewModel.backlogValidation().isValid());
  }
  @Test
  public void testTeamValidation() {
    Assert.assertFalse("Should not be valid by default", viewModel.teamValidation().isValid());

    viewModel.teamProperty().set(null);
    Assert.assertFalse("Null team is not valid", viewModel.teamValidation().isValid());

    viewModel.teamProperty().set(new Team());
    Assert.assertTrue("Non null team is valid", viewModel.teamValidation().isValid());
  }
  @Test
  public void testStartDateValidator() {
    // empty is invalid
    Assert.assertFalse(viewModel.startDateValidation().isValid());

    viewModel.endDateProperty().set(LocalDate.now());
    Assert.assertFalse(viewModel.startDateValidation().isValid());

    viewModel.endDateProperty().set(null);
    viewModel.startDateProperty().setValue(LocalDate.now());
    Assert.assertTrue(viewModel.startDateValidation().isValid());

    viewModel.endDateProperty().setValue(LocalDate.now().minusDays(2));
    Assert.assertFalse(viewModel.startDateValidation().isValid());
  }
  @Test
  public void testEndDateValidator() {
    Assert.assertFalse("Null end date is invalid", viewModel.endDateValidation().isValid());

    viewModel.endDateProperty().set(LocalDate.now().plusDays(3));
    viewModel.releaseProperty().set(new Release("", null, LocalDate.now().plusDays(2), ""));
    Assert.assertFalse(
        "End date must be before release date", viewModel.endDateValidation().isValid());
    viewModel.endDateProperty().set(LocalDate.now().plusDays(2));
    Assert.assertTrue(
        "End date same as release date is valid", viewModel.endDateValidation().isValid());

    viewModel.releaseProperty().set(new Release("", null, LocalDate.now(), ""));
    Assert.assertFalse(
        "Release date must not be before end date", viewModel.endDateValidation().isValid());
  }
  @Test
  public void testGoalValidator() {
    viewModel.goalProperty().setValue("");
    // Can't be empty
    Assert.assertFalse(viewModel.goalValidation().isValid());

    viewModel.goalProperty().setValue("Sprint1");
    // can be non empty and unique
    Assert.assertTrue(viewModel.goalValidation().isValid());

    Project project = new Project();
    viewModel
        .backlogProperty()
        .setValue(new Backlog("backlog", null, null, null, project, new ArrayList<Story>(), null));

    Sprint sprint = new Sprint();
    sprint.setGoal("Sprint");
    viewModel.goalProperty().set("Sprint");

    viewModel.goalProperty().set("Must be less than 20 characters");
    Assert.assertFalse(viewModel.goalValidation().isValid());
  }
  @Test
  public void testStoriesValidator() {
    Assert.assertTrue("Sprint can have no stories", viewModel.storiesValidation().isValid());

    Story unreadyStory = new Story();
    unreadyStory.setIsReady(false);

    Story readyStory = new Story();
    readyStory.setIsReady(true);

    viewModel.stories().add(readyStory);
    Assert.assertTrue("Sprint can have ready stories", viewModel.storiesValidation().isValid());

    viewModel.stories().add(unreadyStory);
    Assert.assertFalse(
        "Sprint cannot have un-ready stories", viewModel.storiesValidation().isValid());

    viewModel.stories().remove(unreadyStory);
    Assert.assertTrue("Sprint can have ready stories", viewModel.storiesValidation().isValid());
  }
  @Test
  public void testLongNameValidation() {
    SprintViewModel sprintFormViewModel = new SprintViewModel();

    Assert.assertFalse(
        "Must not be valid initially.",
        sprintFormViewModel.longNameValidation().validProperty().get());

    sprintFormViewModel.longNameProperty().set("Billy Goat");
    Assert.assertTrue(
        "Valid input not recognised as valid.",
        sprintFormViewModel.longNameValidation().validProperty().get());

    sprintFormViewModel.longNameProperty().set("");
    Assert.assertFalse(
        "Must not be an empty string.",
        sprintFormViewModel.longNameValidation().validProperty().get());
  }