### Question:
BinaryProcedureBinaryFunction implements BinaryFunction<L, R, T> { @Override public boolean equals(Object obj) { if (obj == this) { return true; } if (!(obj instanceof BinaryProcedureBinaryFunction<?, ?, ?>)) { return false; } BinaryProcedureBinaryFunction<?, ?, ?> that = (BinaryProcedureBinaryFunction<?, ?, ?>) obj; return this.procedure.equals(that.procedure); } BinaryProcedureBinaryFunction(BinaryProcedure<? super L, ? super R> procedure); T evaluate(L left, R right); @Override boolean equals(Object obj); @Override int hashCode(); @Override String toString(); static BinaryProcedureBinaryFunction<L, R, T> adapt(
            BinaryProcedure<? super L, ? super R> procedure);  }### Answer:
@Test public void testEquals() throws Exception { BinaryFunction<Object, Object, Object> f = new BinaryProcedureBinaryFunction<Object, Object, Object>(new NoOp()); assertEquals(f,f); assertObjectsAreEqual(f,new BinaryProcedureBinaryFunction<Object, Object, Object>(new NoOp())); assertObjectsAreNotEqual(f,Constant.of("x")); assertObjectsAreNotEqual(f, new BinaryProcedureBinaryFunction<Object, Object, Object>( new BinaryProcedure<Object, Object>() { public void run(Object a, Object b) { } })); assertObjectsAreNotEqual(f,Constant.of(null)); }