### Question:
LeftBoundProcedure implements Procedure<A> { @Override public boolean equals(Object obj) { if (obj == this) { return true; } if (!(obj instanceof LeftBoundProcedure<?>)) { return false; } LeftBoundProcedure<?> that = (LeftBoundProcedure<?>) obj; return procedure.equals(that.procedure) && (null == param ? null == that.param : param.equals(that.param)); } @SuppressWarnings("unchecked") <L> LeftBoundProcedure(BinaryProcedure<? super L, ? super A> procedure, L arg); void run(A obj); @Override boolean equals(Object obj); @Override int hashCode(); @Override String toString(); static LeftBoundProcedure<R> bind(BinaryProcedure<? super L, ? super R> procedure, L arg);  }### Answer:
@Test public void testEquals() throws Exception { Procedure<Object> f = new LeftBoundProcedure<Object>(NoOp.INSTANCE, "xyzzy"); assertEquals(f, f); assertObjectsAreEqual(f, new LeftBoundProcedure<Object>(NoOp.INSTANCE, "xyzzy")); assertObjectsAreNotEqual(f, new NoOp()); assertObjectsAreNotEqual(f, new LeftBoundProcedure<Object>( new BinaryFunctionBinaryProcedure<Object, Object>(RightIdentity.FUNCTION), "xyzzy")); assertObjectsAreNotEqual(f, new LeftBoundProcedure<Object>(NoOp.INSTANCE, "foo")); assertObjectsAreNotEqual(f, new LeftBoundProcedure<Object>(NoOp.INSTANCE, null)); assertObjectsAreEqual(new LeftBoundProcedure<Object>(NoOp.INSTANCE, null), new LeftBoundProcedure<Object>(NoOp.INSTANCE, null)); assertTrue(!f.equals(null)); }