@Test
  public void testMergeDemergeWithNullAsPassword() {
    MockPasswordEncoder pwd = new MockPasswordEncoder();

    String merged = pwd.nowMergePasswordAndSalt(null, "foo", true);
    assertThat(merged).isEqualTo("{foo}");

    String[] demerged = pwd.nowDemergePasswordAndSalt(merged);
    assertThat(demerged[0]).isEqualTo("");
    assertThat(demerged[1]).isEqualTo("foo");
  }
  @Test
  public void testDemergeWithNullIsRejected() {
    MockPasswordEncoder pwd = new MockPasswordEncoder();

    try {
      pwd.nowDemergePasswordAndSalt(null);
      fail("Should have thrown IllegalArgumentException");
    } catch (IllegalArgumentException expected) {
      assertThat(expected.getMessage()).isEqualTo("Cannot pass a null or empty String");
    }
  }
  @Test
  public void testStrictMergeRejectsDelimitersInSalt2() {
    MockPasswordEncoder pwd = new MockPasswordEncoder();

    try {
      pwd.nowMergePasswordAndSalt("password", "f}oo", true);
      fail("Should have thrown IllegalArgumentException");
    } catch (IllegalArgumentException expected) {
      assertThat(expected.getMessage()).isEqualTo("Cannot use { or } in salt.toString()");
    }
  }
  @Test
  public void testMergeDemergeWithDelimitersInPassword() {
    MockPasswordEncoder pwd = new MockPasswordEncoder();

    String merged = pwd.nowMergePasswordAndSalt("p{ass{w{o}rd", "foo", true);
    assertThat(merged).isEqualTo("p{ass{w{o}rd{foo}");

    String[] demerged = pwd.nowDemergePasswordAndSalt(merged);

    assertThat(demerged[0]).isEqualTo("p{ass{w{o}rd");
    assertThat(demerged[1]).isEqualTo("foo");
  }
  @Test
  public void testDemergeHandlesEmptyAndNullSalts() {
    MockPasswordEncoder pwd = new MockPasswordEncoder();

    String merged = pwd.nowMergePasswordAndSalt("password", null, true);

    String[] demerged = pwd.nowDemergePasswordAndSalt(merged);
    assertThat(demerged[0]).isEqualTo("password");
    assertThat(demerged[1]).isEqualTo("");

    merged = pwd.nowMergePasswordAndSalt("password", "", true);

    demerged = pwd.nowDemergePasswordAndSalt(merged);
    assertThat(demerged[0]).isEqualTo("password");
    assertThat(demerged[1]).isEqualTo("");
  }