### Question:
FunctionDesc implements ProtoObject<FunctionDescProto>, Cloneable, GsonObject { @Override public Object clone() throws CloneNotSupportedException{ FunctionDesc desc = (FunctionDesc)super.clone(); desc.signature = this.signature; desc.params = params.clone(); desc.description = this.description; desc.example = this.example; desc.detail = this.detail; desc.returnType = this.returnType; desc.funcClass = this.funcClass; return desc; } FunctionDesc();  FunctionDesc(String signature, Class<? extends Function> clazz,
      FunctionType funcType, DataType retType,
      DataType [] params);  FunctionDesc(FunctionDescProto proto);  FunctionDesc(String signature, String className, FunctionType type,
                      DataType retType,
                      DataType... argTypes); Function newInstance(); String getSignature(); @SuppressWarnings("unchecked") Class<? extends Function> getFuncClass(); FunctionType getFuncType(); DataType [] getParamTypes(); DataType getReturnType(); String getDescription(); String getDetail(); String getExample(); void setDescription(String description); void setDetail(String detail); void setExample(String example); @Override int hashCode(); @Override boolean equals(Object obj); @Override Object clone(); @Override FunctionDescProto getProto(); @Override String toString(); String toJson(); String getHelpSignature(); static String dataTypesToStr(List<DataType> parameterTypesList);  }### Answer:
@Test public void testClone() throws CloneNotSupportedException { FunctionDesc desc = new FunctionDesc("sum", TestSum.class, FunctionType.GENERAL, CatalogUtil.newSimpleDataType(Type.INT4), CatalogUtil.newSimpleDataTypeArray(Type.INT4, Type.INT8)); FunctionDesc cloned = (FunctionDesc)desc.clone(); assertTrue("reference chk" , !(desc == cloned)); assertTrue("getClass() chk", desc.getClass() == cloned.getClass()); assertTrue("equals() chk", desc.equals(cloned)); }