### Question:
ConditionalProcedure implements Procedure<A> { @Override public boolean equals(Object obj) { if (obj == this) { return true; } if (!(obj instanceof ConditionalProcedure<?>)) { return false; } ConditionalProcedure<?> that = (ConditionalProcedure<?>) obj; return this.ifPred.equals(that.ifPred) && this.thenProc.equals(that.thenProc) && this.elseProc.equals(that.elseProc); } ConditionalProcedure(Predicate<? super A> ifPred, Procedure<? super A> thenProc);  ConditionalProcedure(Predicate<? super A> ifPred,
            Procedure<? super A> thenProc,
            Procedure<? super A> elseProc); void run(A obj); @Override boolean equals(Object obj); @Override int hashCode(); @Override String toString();  }### Answer:
@Test public void testEquals() throws Exception { ConditionalProcedure<Object> p = new ConditionalProcedure<Object>( Identity.INSTANCE, NoOp.INSTANCE, NoOp.INSTANCE); assertEquals(p,p); assertObjectsAreEqual(p,new ConditionalProcedure<Object>( Identity.INSTANCE, NoOp.INSTANCE, NoOp.INSTANCE)); assertObjectsAreNotEqual(p,new ConditionalProcedure<Object>( Constant.TRUE, NoOp.INSTANCE, NoOp.INSTANCE)); assertObjectsAreNotEqual(p,new ConditionalProcedure<Object>( Identity.INSTANCE, new RunCounter(), NoOp.INSTANCE)); assertObjectsAreNotEqual(p,new ConditionalProcedure<Object>( Identity.INSTANCE, NoOp.INSTANCE, new RunCounter())); assertObjectsAreNotEqual(p, new ConditionalProcedure<Object>( Constant.TRUE, new RunCounter())); assertTrue(!p.equals(null)); }