### Question:
ValueSchedule implements ImmutableBean, Serializable { @Override public boolean equals(Object obj) { if (obj == this) { return true; } if (obj != null && obj.getClass() == this.getClass()) { ValueSchedule other = (ValueSchedule) obj; return JodaBeanUtils.equal(initialValue, other.initialValue) && JodaBeanUtils.equal(steps, other.steps) && JodaBeanUtils.equal(stepSequence, other.stepSequence); } return false; } private  ValueSchedule(
      double initialValue,
      List<ValueStep> steps,
      ValueStepSequence stepSequence); static ValueSchedule of(double value); static ValueSchedule of(double initialValue, ValueStep... steps); static ValueSchedule of(double initialValue, List<ValueStep> steps); static ValueSchedule of(double initialValue, ValueStepSequence stepSequence); DoubleArray resolveValues(Schedule schedule); static ValueSchedule.Meta meta(); static ValueSchedule.Builder builder(); @Override ValueSchedule.Meta metaBean(); double getInitialValue(); List<ValueStep> getSteps(); Optional<ValueStepSequence> getStepSequence(); Builder toBuilder(); @Override boolean equals(Object obj); @Override int hashCode(); @Override String toString(); static final ValueSchedule ALWAYS_0; static final ValueSchedule ALWAYS_1; }### Answer:
@Test public void equals() { ValueSchedule a1 = ValueSchedule.of(10000d, Lists.newArrayList(STEP1, STEP2)); ValueSchedule a2 = ValueSchedule.of(10000d, Lists.newArrayList(STEP1, STEP2)); ValueSchedule b = ValueSchedule.of(5000d, Lists.newArrayList(STEP1, STEP2)); ValueSchedule c = ValueSchedule.of(10000d, Lists.newArrayList(STEP1)); assertThat(a1) .isEqualTo(a1) .isEqualTo(a2) .isNotEqualTo(b) .isNotEqualTo(c) .isNotEqualTo("") .isNotEqualTo(null) .hasSameHashCodeAs(a2); }