Revision implements
        Byteable,
        Versioned { @Override @SuppressWarnings("unchecked") public boolean equals(Object obj) { if(obj.getClass() == this.getClass()) { Revision<L, K, V> other = (Revision<L, K, V>) obj; return locator.equals(other.locator) && key.equals(other.key) && value.equals(other.value); } return false; } @DoNotInvoke  Revision(ByteBuffer bytes); protected  Revision(L locator, K key, V value, long version, Action type); static TableRevision createPrimaryRevision(PrimaryKey record,
            Text key, Value value, long version, Action type); static CorpusRevision createSearchRevision(Text key, Text word,
            Position position, long version, Action type); static IndexRevision createSecondaryRevision(Text key, Value value,
            PrimaryKey record, long version, Action type); CompactRevision<V> compact(); @Override void copyTo(ByteSink sink); @Override @SuppressWarnings("unchecked") boolean equals(Object obj); @Override ByteBuffer getBytes(); K getKey(); L getLocator(); Action getType(); V getValue(); @Override long getVersion(); @Override int hashCode(); @Override boolean isStorable(); @Override int size(); @Override String toString();  }
@Test @Theory public void testEquals(Revision<?, ?, ?> revision) { Assert.assertEquals(revision, duplicate(revision)); }