@Test
  public void testHashCodeMethod() {
    // Create an instance...
    final AciServerDetails details1 = new AciServerDetails();
    details1.setHost("host1.example.com");
    details1.setPort(5790);
    details1.setCharsetName("UTF-8");

    // Create an instance...
    final AciServerDetails details2 = new AciServerDetails();
    details2.setHost("host1.example.com");
    details2.setPort(5790);
    details2.setCharsetName("UTF-8");

    // Create yet another instance...
    final AciServerDetails details3 = new AciServerDetails();
    details3.setHost("host2.example.com");
    details3.setPort(5790);
    details3.setCharsetName("UTF-8");

    // Assert that 1 & 2 are the same and 1 & 3 and 2 & 3 are different...
    assertThat("Hash codes should be equal", details1.hashCode() == details2.hashCode(), is(true));
    assertThat(
        "Hash codes should not be equal", details1.hashCode() == details3.hashCode(), is(false));
    assertThat(
        "Hash codes should not be equal", details2.hashCode() == details3.hashCode(), is(false));

    details1.setEncryptionCodec(new TestEncryptionCodec());
    assertThat(details1.hashCode() == details2.hashCode(), is(false));

    details2.setEncryptionCodec(new TestEncryptionCodec());
    assertThat(details1.hashCode() == details2.hashCode(), is(true));
  }
  @Test
  public void testPortProperty() {
    // Create an instance...
    final AciServerDetails details = new AciServerDetails();
    assertThat("port property is not 0", details.getPort(), is(0));

    // Set the port to minus out of range...
    try {
      details.setPort(-10);
      fail("Should have thrown an IllegalArgumentException as port is out of range.");
    } catch (final IllegalArgumentException iae) {
      // Expected due to out of range port number...
    }

    // Set port to positive out of range...
    try {
      details.setPort(90000);
      fail("Should have thrown an IllegalArgumentException as port is out of range.");
    } catch (final IllegalArgumentException iae) {
      // Expected due to out of range port number...
    }

    // Set the port to a number in range...
    final int port = 12000;
    details.setPort(port);
    assertThat("port property is not as expected", details.getPort(), is(equalTo(port)));
  }
  @Test
  public void testEqualsMethod() {
    // Create an instance...
    final AciServerDetails details1 = new AciServerDetails();
    details1.setHost("host1.example.com");
    details1.setPort(5790);
    details1.setCharsetName("UTF-8");

    // Create another instance...
    final AciServerDetails details2 = new AciServerDetails();
    details2.setHost("host2.example.com");
    details2.setPort(5790);
    details2.setCharsetName("UTF-8");

    // Compare to itself and the other details...
    assertThat("Details should be equal to itself", details1.equals(details1), is(true));
    assertThat("Details should not be equal", details1.equals(details2), is(false));

    // Change details2 to have the same name so tecxhnically they'return the same...
    details2.setHost("host1.example.com");
    assertThat("Details should be equal", details1.equals(details2), is(true));

    // Compare it to some random object, it should be false...
    assertThat("Parameters should be equal", details1.equals(new Object()), is(false));

    // Create yet another instance...
    final AciServerDetails details3 = new AciServerDetails();
    details3.setHost("host1.example.com");
    details3.setPort(5790);
    details3.setCharsetName("UTF-8");
    details3.setEncryptionCodec(new TestEncryptionCodec());

    // Check against details1 which is the same apart from the codec...
    assertThat("Details should not be equal", details3.equals(details1), is(false));

    // Set the same codec on details1, it should now be the same as details3...
    details1.setEncryptionCodec(new TestEncryptionCodec());
    assertThat(details3.equals(details1), is(true));
  }
  @Test
  public void testCopyConstructor() {
    // The codec to use...
    final TestEncryptionCodec encryptionCodec = new TestEncryptionCodec();

    // Create an instance...
    final AciServerDetails details = new AciServerDetails();
    details.setHost("localhost");
    details.setPort(12345);
    details.setEncryptionCodec(encryptionCodec);

    // Copy...
    final AciServerDetails newDetails = new AciServerDetails(details);

    // Check everything was coppied across...
    assertThat("protocol", newDetails.getProtocol(), is(equalTo(details.getProtocol())));
    assertThat("host", newDetails.getHost(), is(equalTo(details.getHost())));
    assertThat("port", newDetails.getPort(), is(equalTo(details.getPort())));
    assertThat("charsetName", newDetails.getCharsetName(), is(equalTo(details.getCharsetName())));
    assertThat(
        "encryptionCodec",
        newDetails.getEncryptionCodec(),
        is(sameInstance(details.getEncryptionCodec())));
  }