@Test
public void testEqualsStrict() {

    // null
    assertEqualsStrict((Serializable) null, (Serializable) null);
    assertNotEqualsStrict((Serializable) null, "foo");
    // Serializable
    assertEqualsStrict("foo", "foo");
    assertNotEqualsStrict("foo", "bar");
    assertEqualsStrict(Long.valueOf(123456), Long.valueOf(123456));
    assertNotEqualsStrict(Long.valueOf(123456), Long.valueOf(789123));
    assertNotEqualsStrict("foo", Long.valueOf(123456));
    // mixed
    assertNotEqualsStrict("foo", new State());
    assertNotEqualsStrict("foo", new ArrayList<Serializable>());
    assertNotEqualsStrict(new State(), new ArrayList<Serializable>());
    // Arrays
    assertEqualsStrict(new String[0], new String[0]);
    assertEqualsStrict(new String[] { "foo" }, new String[] { "foo" });
    assertNotEqualsStrict(new String[] { "foo" }, new String[] { "bar" });
    // States
    State a = new State();
    State b = new State();
    assertEqualsStrict(a, b);
    a.put("foo", "bar");
    assertNotEqualsStrict(a, b);
    b.put("foo", "bar");
    assertEqualsStrict(a, b);
    b.put("foo", "moo");
    assertNotEqualsStrict(a, b);
    a.put("foo", new State());
    b.put("foo", new State());
    assertEqualsStrict(a, b);
    // Lists
    ArrayList<Serializable> la = new ArrayList<Serializable>();
    ArrayList<Serializable> lb = new ArrayList<Serializable>();
    assertEqualsStrict(la, lb);
    la.add(new State());
    assertNotEqualsStrict(la, lb);
    lb.add(new State());
    assertEqualsStrict(la, lb);
    ((State) la.get(0)).put("foo", "bar");
    assertNotEqualsStrict(la, lb);
    ((State) lb.get(0)).put("foo", "bar");
    assertEqualsStrict(la, lb);
    ((State) lb.get(0)).put("foo", "moo");
    assertNotEqualsStrict(la, lb);
}