// Path: config/src/main/java/io/confluent/common/config/types/Password.java
// public class Password {
// 
//     public static final String HIDDEN = "[hidden]";
// 
//     private final String value;
// 
//     /**
//      * Construct a new Password object
//      * @param value The value of a password
//      */
//     public Password(String value) {
//         this.value = value;
//     }
// 
//     @Override
//     public int hashCode() {
//         return value.hashCode();
//     }
// 
//     @Override
//     public boolean equals(Object obj) {
//         if (!(obj instanceof Password))
//             return false;
//         Password other = (Password) obj;
//         return value.equals(other.value);
//     }
// 
//     /**
//      * Returns hidden password string
//      *
//      * @return hidden password string
//      */
//     @Override
//     public String toString() {
//         return HIDDEN;
//     }
// 
//     /**
//      * Returns real password string
//      *
//      * @return real password string
//      */
//     public String value() {
//         return value;
//     }
// }
// 
// Path: config/src/main/java/io/confluent/common/config/ConfigDef.java
// public enum Type {
//   BOOLEAN, STRING, INT, LONG, DOUBLE, LIST, CLASS, PASSWORD, MAP
// }


import org.junit.Assert;
import org.junit.Test;
import java.io.IOException;
import java.net.URL;
import java.net.URLClassLoader;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import io.confluent.common.config.types.Password;
import javax.xml.bind.DatatypeConverter;
import static io.confluent.common.config.ConfigDef.Type;
import static io.confluent.common.config.ConfigDef.Type.BOOLEAN;
import static io.confluent.common.config.ConfigDef.Type.CLASS;
import static io.confluent.common.config.ConfigDef.Type.DOUBLE;
import static io.confluent.common.config.ConfigDef.Type.INT;
import static io.confluent.common.config.ConfigDef.Type.LIST;
import static io.confluent.common.config.ConfigDef.Type.LONG;
import static io.confluent.common.config.ConfigDef.Type.STRING;
import static java.util.Arrays.asList;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.fail;
    props.put("b", "foo");
    props.put("c", "true");

    // Ensure the copied ConfigDef contains all the definitions of the original
    Map<String, Object> originalParsedProps = original.parse(props);
    Map<String, Object> copyParsedProps = copy.parse(props);
    assertEquals(originalParsedProps, copyParsedProps);
    assertFalse(copyParsedProps.containsKey("c"));

    copy.define("c", BOOLEAN, ConfigDef.Importance.MEDIUM, "docs");

    // Ensure that mutating the copied ConfigDef doesn't also mutate the original
    originalParsedProps = original.parse(props);
    copyParsedProps = copy.parse(props);
    assertNotEquals(originalParsedProps, copyParsedProps);
    assertEquals(true, copyParsedProps.get("c"));
  }

  @Test
  public void testBasicTypes() {
    ConfigDef def = new ConfigDef().define("a", INT, 5, ConfigDef.Range
        .between(0, 14), ConfigDef.Importance.HIGH, "docs")
        .define("b", LONG, ConfigDef.Importance.HIGH, "docs")
        .define("c", STRING, "hello", ConfigDef.Importance.HIGH, "docs")
        .define("d", LIST, ConfigDef.Importance.HIGH, "docs")
        .define("e", DOUBLE, ConfigDef.Importance.HIGH, "docs")
        .define("f", CLASS, ConfigDef.Importance.HIGH, "docs")
        .define("g", BOOLEAN, ConfigDef.Importance.HIGH, "docs")
        .define("h", Type.BOOLEAN, ConfigDef.Importance.HIGH, "docs")
        .define("i", Type.BOOLEAN, ConfigDef.Importance.HIGH, "docs")
// Path: config/src/main/java/io/confluent/common/config/types/Password.java
// public class Password {
// 
//     public static final String HIDDEN = "[hidden]";
// 
//     private final String value;
// 
//     /**
//      * Construct a new Password object
//      * @param value The value of a password
//      */
//     public Password(String value) {
//         this.value = value;
//     }
// 
//     @Override
//     public int hashCode() {
//         return value.hashCode();
//     }
// 
//     @Override
//     public boolean equals(Object obj) {
//         if (!(obj instanceof Password))
//             return false;
//         Password other = (Password) obj;
//         return value.equals(other.value);
//     }
// 
//     /**
//      * Returns hidden password string
//      *
//      * @return hidden password string
//      */
//     @Override
//     public String toString() {
//         return HIDDEN;
//     }
// 
//     /**
//      * Returns real password string
//      *
//      * @return real password string
//      */
//     public String value() {
//         return value;
//     }
// }
// 
// Path: config/src/main/java/io/confluent/common/config/ConfigDef.java
// public enum Type {
//   BOOLEAN, STRING, INT, LONG, DOUBLE, LIST, CLASS, PASSWORD, MAP
// }


// Path: config/src/test/java/io/confluent/common/config/ConfigDefTest.java
import org.junit.Assert;
import org.junit.Test;
import java.io.IOException;
import java.net.URL;
import java.net.URLClassLoader;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import io.confluent.common.config.types.Password;
import javax.xml.bind.DatatypeConverter;
import static io.confluent.common.config.ConfigDef.Type;
import static io.confluent.common.config.ConfigDef.Type.BOOLEAN;
import static io.confluent.common.config.ConfigDef.Type.CLASS;
import static io.confluent.common.config.ConfigDef.Type.DOUBLE;
import static io.confluent.common.config.ConfigDef.Type.INT;
import static io.confluent.common.config.ConfigDef.Type.LIST;
import static io.confluent.common.config.ConfigDef.Type.LONG;
import static io.confluent.common.config.ConfigDef.Type.STRING;
import static java.util.Arrays.asList;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.fail;

    props.put("b", "foo");
    props.put("c", "true");

    // Ensure the copied ConfigDef contains all the definitions of the original
    Map<String, Object> originalParsedProps = original.parse(props);
    Map<String, Object> copyParsedProps = copy.parse(props);
    assertEquals(originalParsedProps, copyParsedProps);
    assertFalse(copyParsedProps.containsKey("c"));

    copy.define("c", BOOLEAN, ConfigDef.Importance.MEDIUM, "docs");

    // Ensure that mutating the copied ConfigDef doesn't also mutate the original
    originalParsedProps = original.parse(props);
    copyParsedProps = copy.parse(props);
    assertNotEquals(originalParsedProps, copyParsedProps);
    assertEquals(true, copyParsedProps.get("c"));
  }

  @Test
  public void testBasicTypes() {
    ConfigDef def = new ConfigDef().define("a", INT, 5, ConfigDef.Range
        .between(0, 14), ConfigDef.Importance.HIGH, "docs")
        .define("b", LONG, ConfigDef.Importance.HIGH, "docs")
        .define("c", STRING, "hello", ConfigDef.Importance.HIGH, "docs")
        .define("d", LIST, ConfigDef.Importance.HIGH, "docs")
        .define("e", DOUBLE, ConfigDef.Importance.HIGH, "docs")
        .define("f", CLASS, ConfigDef.Importance.HIGH, "docs")
        .define("g", BOOLEAN, ConfigDef.Importance.HIGH, "docs")
        .define("h", Type.BOOLEAN, ConfigDef.Importance.HIGH, "docs")
        .define("i", Type.BOOLEAN, ConfigDef.Importance.HIGH, "docs")
        .define("j", Type.PASSWORD, ConfigDef.Importance.HIGH, "docs")