class TextDescription extends Description {
  @VisibleForTesting
  final String value;

  final Object[] args;

  /**
   * Creates a new <code>{@link TextDescription}</code>.
   *
   * @param value the value of this description.
   * @param args the replacements parameters of this description.
   * @throws NullPointerException if the given value is {@code null}.
   */
  public TextDescription(String value, Object... args) {
    this.value = value == null ? "" : value;
    this.args = Arrays.isNullOrEmpty(args) ? null : args.clone();
  }

  @Override
  public String value() {
    return formatIfArgs(value, args);
  }

  @Override
  public int hashCode() {
    return Objects.hash(value, args);
  }

  @Override
  public boolean equals(Object obj) {<FILL_FUNCTION_BODY>}
}

    if (this == obj) return true;
    if (obj == null) return false;
    if (getClass() != obj.getClass()) return false;
    TextDescription other = (TextDescription) obj;
    return deepEquals(value, other.value) && deepEquals(args, other.args);
  
<methods>public non-sealed void <init>() ,public static org.assertj.core.description.Description emptyIfNull(org.assertj.core.description.Description) ,public static java.lang.String mostRelevantDescription(org.assertj.core.description.Description, java.lang.String) ,public java.lang.String toString() ,public abstract java.lang.String value() <variables>