public void testHashCode() {
    assertTrue(pair1a.hashCode() == ("a".hashCode() ^ "b".hashCode()));
    assertTrue(pair2a.hashCode() == "a".hashCode());
    assertTrue(pair3a.hashCode() == "b".hashCode());
    assertTrue(pair4a.hashCode() == 0);

    assertTrue(pair1a.hashCode() != pair2a.hashCode());
    assertTrue(pair1a.hashCode() != pair3a.hashCode());
    assertTrue(pair1a.hashCode() != pair4a.hashCode());

    assertTrue(pair1a.hashCode() == pair1d.hashCode());
    assertTrue(pair2a.hashCode() == pair2c.hashCode());
    assertTrue(pair3a.hashCode() == pair3c.hashCode());
    assertTrue(pair4a.hashCode() == pair4b.hashCode());

    assertTrue(pair2b.hashCode() == pair3a.hashCode());
  }
  public void testEquals() {
    assertTrue(pair1a.equals(pair1d) && pair1d.equals(pair1a));
    assertTrue(pair1a.equals(pair1e) && pair1e.equals(pair1a));
    assertFalse(pair1a.equals(pair1b));
    assertFalse(pair1a.equals(pair1c));
    assertFalse(pair1a.equals(pair2a));
    assertFalse(pair1a.equals(pair3a));
    assertFalse(pair1a.equals(pair4a));

    assertTrue(pair2a.equals(pair2c) && pair2c.equals(pair2a));
    assertTrue(pair2b.equals(pair3a) && pair3a.equals(pair2b));
    assertFalse(pair2a.equals(pair2b));
    assertFalse(pair2a.equals(pair1a));
    assertFalse(pair2b.equals(pair1e));
    assertFalse(pair2b.equals(pair3b));
    assertFalse(pair2a.equals(pair4a));

    assertTrue(pair3a.equals(pair3c) && pair3c.equals(pair3a));
    assertTrue(pair3c.equals(pair2b) && pair2b.equals(pair3c));
    assertFalse(pair3a.equals(pair3b));
    assertFalse(pair3b.equals(pair3a));
    assertFalse(pair3a.equals(pair1a));
    assertFalse(pair3a.equals(pair2a));
    assertFalse(pair3a.equals(pair4a));

    assertTrue(pair4a.equals(pair4b) && pair4b.equals(pair4a));
    assertFalse(pair4a.equals(pair1b) || pair4a.equals(pair2a) || pair4a.equals(pair3a));
  }