@Test
  public void testEqualsForNull() {
    final DocumentSortComparatorSource source = new DocumentSortComparatorSource(null);

    assertEquals(source, source);
    assertEquals(source.hashCode(), source.hashCode());

    final DocumentSortComparatorSource source2 = new DocumentSortComparatorSource(null);

    assertEquals(source, source2);
    assertEquals(source.hashCode(), source2.hashCode());
  }
  @Test
  public void testEquals() {
    final AtomicInteger hashCodeCalled = new AtomicInteger(0);
    final AtomicInteger equalsCodeCalled = new AtomicInteger(0);

    final IssueSortComparator sortComparator2 =
        new DefaultIssueSortComparator(new MockIssueComparator(), new SimpleMockIssueFactory()) {
          public int compare(final Issue issue, final Issue issue2) {
            throw new UnsupportedOperationException("Not Implemented.");
          }
        };

    final IssueSortComparator sortComparator =
        new DefaultIssueSortComparator(new MockIssueComparator(), new SimpleMockIssueFactory()) {
          public int compare(final Issue issue, final Issue issue2) {
            throw new UnsupportedOperationException("Not Implemented.");
          }

          @Override
          public int hashCode() {
            hashCodeCalled.incrementAndGet();
            return 10;
          }

          @Override
          public boolean equals(final Object obj) {
            Assert.assertSame(sortComparator2, obj);
            equalsCodeCalled.incrementAndGet();
            return true;
          }
        };

    final DocumentSortComparatorSource source = new DocumentSortComparatorSource(sortComparator);

    assertEquals(source, source);
    assertEquals(10, source.hashCode());
    assertEquals(1, hashCodeCalled.get());
    // Should not be called as we are comparing the same instance
    assertEquals(0, equalsCodeCalled.get());

    final DocumentSortComparatorSource source2 = new DocumentSortComparatorSource(sortComparator2);
    assertTrue(source.equals(source2));
    assertEquals(1, equalsCodeCalled.get());

    final IssueSortComparator sortComparator3 =
        new DefaultIssueSortComparator(new MockIssueComparator(), new SimpleMockIssueFactory()) {
          public int compare(final Issue issue, final Issue issue2) {
            throw new UnsupportedOperationException("Not Implemented.");
          }

          @Override
          public boolean equals(final Object obj) {
            Assert.assertSame(sortComparator, obj);
            equalsCodeCalled.incrementAndGet();
            return false;
          }
        };

    // Ensure the return value from sort comparitor is respected
    final DocumentSortComparatorSource source3 = new DocumentSortComparatorSource(sortComparator3);
    assertFalse(source3.equals(source));
    assertEquals(2, equalsCodeCalled.get());

    assertFalse(source.equals(null));
    assertFalse(source.equals(new Object()));
    assertFalse(source.equals(new MappedSortComparator(null)));
  }