@Test
 public void allValuesPopulatedHappyPath() {
   ChangePasswordForm form = new ChangePasswordForm();
   form.setOldPassword("0ldPassw$rd");
   form.setPassword("passw0rd");
   form.setRetypedPassword("passw0rd");
   Set<ConstraintViolation<ChangePasswordForm>> errors = validator.validate(form);
   assertEquals("Should be no errors", 0, errors.size());
 }
 @Test
 public void testSpacesPermittted() throws Exception {
   ChangePasswordForm form = new ChangePasswordForm();
   form.setPassword("Ben Kingsley  is my no. 1 actor");
   form.setRetypedPassword("Ben Kingsley  is my no. 1 actor");
   form.setOldPassword("ååååååå1å");
   Set<ConstraintViolation<ChangePasswordForm>> errors = validator.validate(form);
   assertEquals("Should be no errors", 0, errors.size());
 }
 @Test
 public void testNonUsAsciiCharsPermitted() throws Exception {
   ChangePasswordForm form = new ChangePasswordForm();
   form.setOldPassword("passw0rd");
   form.setPassword("ååååååå1å");
   form.setRetypedPassword("ååååååå1å");
   Set<ConstraintViolation<ChangePasswordForm>> errors = validator.validate(form);
   assertEquals("Should be no errors", 0, errors.size());
 }
  @Test
  public void testPasswordMissingNumberInvalid() {
    ChangePasswordForm form = new ChangePasswordForm();
    form.setOldPassword("£$$$$$$r");
    Set<ConstraintViolation<ChangePasswordForm>> violations = validator.validate(form);
    Map<String, String> allErrorValues = retrieveErrorKeyAndMessage(violations);

    String password = allErrorValues.get("oldPassword");
    assertEquals(
        "Passwords must be 8 or more characters and contain at least 1 number and at least 1 alpha character or symbol",
        password);

    // add in a number
    form.setOldPassword("£$$$$$r1");
    violations = validator.validate(form);
    allErrorValues = retrieveErrorKeyAndMessage(violations);

    password = allErrorValues.get("oldPassword");
    assertNull(password);
  }
  @Test
  public void testSymbolsPermitttedButNotRequired() throws Exception {
    ChangePasswordForm form = new ChangePasswordForm();
    form.setOldPassword("Ben Kingsley  is my no. 1 actor");
    form.setPassword("passw0rd");
    form.setRetypedPassword("passw0rd");
    Set<ConstraintViolation<ChangePasswordForm>> errors = validator.validate(form);
    assertEquals("Should be no errors", 0, errors.size());

    // check that the test doesn't break when symbols introduced
    form.setPassword("p$ssw0rd");
    form.setRetypedPassword("p$ssw0rd");
    errors = validator.validate(form);
    assertEquals("Should be no errors", 0, errors.size());
  }
  @Test
  public void testPasswordFormMissingData() {
    ChangePasswordForm form = new ChangePasswordForm();
    form.setOldPassword("");
    form.setPassword("");
    form.setRetypedPassword("");
    Set<ConstraintViolation<ChangePasswordForm>> violations = validator.validate(form);
    Map<String, String> allErrorValues = retrieveErrorKeyAndMessage(violations);

    String password = allErrorValues.get("password");
    String confirmedPassword = allErrorValues.get("retypedPassword");
    String oldPassword = allErrorValues.get("oldPassword");

    assertEquals(
        "Passwords must be 8 or more characters and contain at least 1 number and at least 1 alpha character or symbol",
        password);
    assertEquals(
        "Passwords must be 8 or more characters and contain at least 1 number and at least 1 alpha character or symbol",
        confirmedPassword);
    assertEquals(
        "Passwords must be 8 or more characters and contain at least 1 number and at least 1 alpha character or symbol",
        oldPassword);
  }