### Question:
BinaryProcedureProcedure implements Procedure<A> { @Override public boolean equals(Object obj) { if (obj == this) { return true; } if (!(obj instanceof BinaryProcedureProcedure<?>)) { return false; } BinaryProcedureProcedure<?> that = (BinaryProcedureProcedure<?>) obj; return this.procedure.equals(that.procedure); } BinaryProcedureProcedure(BinaryProcedure<? super A, ? super A> procedure); void run(A obj); @Override boolean equals(Object obj); @Override int hashCode(); @Override String toString(); static Procedure<A> adapt(BinaryProcedure<? super A, ? super A> procedure);  }### Answer:
@Test public void testEquals() throws Exception { Procedure<Object> p = new BinaryProcedureProcedure<Object>(NoOp.INSTANCE); assertEquals(p, p); assertObjectsAreEqual(p, new BinaryProcedureProcedure<Object>(NoOp.INSTANCE)); assertObjectsAreNotEqual(p, NoOp.INSTANCE); assertObjectsAreNotEqual(p, new BinaryProcedureProcedure<Object>(IgnoreLeftProcedure.adapt(NoOp.INSTANCE))); assertTrue(!p.equals(null)); }