### Question:
ConditionalBinaryProcedure implements BinaryProcedure<L, R> { @Override public boolean equals(Object obj) { if (obj == this) { return true; } if (!(obj instanceof ConditionalBinaryProcedure<?, ?>)) { return false; } ConditionalBinaryProcedure<?, ?> that = (ConditionalBinaryProcedure<?, ?>) obj; return this.ifPred.equals(that.ifPred) && this.thenProc.equals(that.thenProc) && this.elseProc.equals(that.elseProc); } ConditionalBinaryProcedure(BinaryPredicate<? super L, ? super R> ifPred,
            BinaryProcedure<? super L, ? super R> thenProc);  ConditionalBinaryProcedure(BinaryPredicate<? super L, ? super R> ifPred,
            BinaryProcedure<? super L, ? super R> thenProc, BinaryProcedure<? super L, ? super R> elseProc); void run(L left, R right); @Override boolean equals(Object obj); @Override int hashCode(); @Override String toString();  }### Answer:
@Test public void testEquals() throws Exception { ConditionalBinaryProcedure<?, ?> p = new ConditionalBinaryProcedure<Boolean, Object>( LeftIdentity.PREDICATE, NoOp.instance(), NoOp.instance()); assertEquals(p,p); assertObjectsAreEqual(p,new ConditionalBinaryProcedure<Boolean, Object>( LeftIdentity.PREDICATE, NoOp.instance(), NoOp.instance())); assertObjectsAreNotEqual(p,new ConditionalBinaryProcedure<Object, Object>( Constant.TRUE, NoOp.instance(), NoOp.instance())); assertObjectsAreNotEqual(p,new ConditionalBinaryProcedure<Boolean, Object>( LeftIdentity.PREDICATE, new RunCounter(), NoOp.instance())); assertObjectsAreNotEqual(p,new ConditionalBinaryProcedure<Boolean, Object>( LeftIdentity.PREDICATE, NoOp.instance(), new RunCounter())); assertObjectsAreNotEqual(p,new ConditionalBinaryProcedure<Boolean, Object>( Constant.TRUE, NoOp.instance())); assertTrue(!p.equals(null)); }