// Path: src/test/java/com/statemachinesystems/envy/common/MyClass.java
// public class MyClass {
//     private final String value;
// 
//     public MyClass(String value) {
//         this.value = value;
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//         if (this == o) return true;
//         if (o == null || getClass() != o.getClass()) return false;
// 
//         MyClass myClass = (MyClass) o;
// 
//         if (!value.equals(myClass.value)) return false;
// 
//         return true;
//     }
// 
//     @Override
//     public int hashCode() {
//         return value.hashCode();
//     }
// 
//     @Override
//     public String toString() {
//         return "MyClass{" +
//                 "value='" + value + '\'' +
//                 '}';
//     }
// }
// 
// Path: src/test/java/com/statemachinesystems/envy/common/MyEnum.java
// public enum MyEnum {
//     FOO, BAR, BAZ
// }
// 
// Path: src/main/java/com/statemachinesystems/envy/parsers/BooleanValueParser.java
// public class BooleanValueParser implements ValueParser<Boolean> {
// 
//     public static BooleanValueParser createParser(Map<String, Boolean> acceptedValues) {
//         Map<String, Boolean> lowerCasedValues = new HashMap<String, Boolean>();
//         for (Map.Entry<String, Boolean> entry : acceptedValues.entrySet()) {
//             lowerCasedValues.put(entry.getKey().toLowerCase(), entry.getValue());
//         }
//         return new BooleanValueParser(lowerCasedValues);
//     }
// 
//     private static Map<String, Boolean> defaultAcceptedValues() {
//         Map<String, Boolean> acceptedValues = new HashMap<String, Boolean>();
// 
//         acceptedValues.put("true", Boolean.TRUE);
//         acceptedValues.put("false", Boolean.FALSE);
//         acceptedValues.put("yes", Boolean.TRUE);
//         acceptedValues.put("no", Boolean.FALSE);
//         acceptedValues.put("y", Boolean.TRUE);
//         acceptedValues.put("n", Boolean.FALSE);
//         acceptedValues.put("on", Boolean.TRUE);
//         acceptedValues.put("off", Boolean.FALSE);
// 
//         return acceptedValues;
//     }
// 
//     private final Map<String, Boolean> acceptedValues;
// 
//     public BooleanValueParser() {
//         this(defaultAcceptedValues());
//     }
// 
//     private BooleanValueParser(Map<String, Boolean> acceptedValues) {
//         this.acceptedValues = acceptedValues;
//     }
// 
//     @Override
//     public Boolean parseValue(String value) {
//         String key = value.toLowerCase();
//         if (! acceptedValues.containsKey(key)) {
//             throw new IllegalArgumentException(
//                     String.format("No registered Boolean value for '%s'", value));
//         }
//         return acceptedValues.get(key);
//     }
// 
//     @Override
//     public Class<Boolean> getValueClass() {
//         return Boolean.class;
//     }
// }


import com.statemachinesystems.envy.common.MyClass;
import com.statemachinesystems.envy.common.MyEnum;
import com.statemachinesystems.envy.parsers.BooleanValueParser;
import org.junit.Test;
import java.util.Random;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertNull;
    @Test
    public void createsParserForTypeWithStringConstructor() {
        ValueParser<?> parser = valueParserFactory.getValueParser(MyClass.class);
        String input = "foo";
        MyClass expected = new MyClass(input);
        MyClass actual = (MyClass) parser.parseValue(input);
        assertEquals(expected, actual);
    }

    @Test
    public void returnsNullForUnsupportedType() {
        assertNull(valueParserFactory.getValueParser(Random.class));
    }

    @Test
    public void createsParserForArrayOfRegisteredType() {
        Boolean[] expected = new Boolean[] { Boolean.TRUE, Boolean.FALSE };
        ValueParser<?> parser = valueParserFactory.getValueParser(Boolean[].class);
        assertArrayEquals(expected, (Boolean[]) parser.parseValue("true,false"));
    }

    @Test
    public void createsParserForBoxedArrayOfRegisteredType() {
        ValueParser<?> parser = valueParserFactory.getValueParser(boolean[].class);
        Boolean[] expected = new Boolean[] { Boolean.TRUE, Boolean.TRUE };
        assertArrayEquals(expected, (Boolean[]) parser.parseValue("true,true"));
    }

    @Test
    public void createsParserForArrayOfEnumType() {
// Path: src/test/java/com/statemachinesystems/envy/common/MyClass.java
// public class MyClass {
//     private final String value;
// 
//     public MyClass(String value) {
//         this.value = value;
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//         if (this == o) return true;
//         if (o == null || getClass() != o.getClass()) return false;
// 
//         MyClass myClass = (MyClass) o;
// 
//         if (!value.equals(myClass.value)) return false;
// 
//         return true;
//     }
// 
//     @Override
//     public int hashCode() {
//         return value.hashCode();
//     }
// 
//     @Override
//     public String toString() {
//         return "MyClass{" +
//                 "value='" + value + '\'' +
//                 '}';
//     }
// }
// 
// Path: src/test/java/com/statemachinesystems/envy/common/MyEnum.java
// public enum MyEnum {
//     FOO, BAR, BAZ
// }
// 
// Path: src/main/java/com/statemachinesystems/envy/parsers/BooleanValueParser.java
// public class BooleanValueParser implements ValueParser<Boolean> {
// 
//     public static BooleanValueParser createParser(Map<String, Boolean> acceptedValues) {
//         Map<String, Boolean> lowerCasedValues = new HashMap<String, Boolean>();
//         for (Map.Entry<String, Boolean> entry : acceptedValues.entrySet()) {
//             lowerCasedValues.put(entry.getKey().toLowerCase(), entry.getValue());
//         }
//         return new BooleanValueParser(lowerCasedValues);
//     }
// 
//     private static Map<String, Boolean> defaultAcceptedValues() {
//         Map<String, Boolean> acceptedValues = new HashMap<String, Boolean>();
// 
//         acceptedValues.put("true", Boolean.TRUE);
//         acceptedValues.put("false", Boolean.FALSE);
//         acceptedValues.put("yes", Boolean.TRUE);
//         acceptedValues.put("no", Boolean.FALSE);
//         acceptedValues.put("y", Boolean.TRUE);
//         acceptedValues.put("n", Boolean.FALSE);
//         acceptedValues.put("on", Boolean.TRUE);
//         acceptedValues.put("off", Boolean.FALSE);
// 
//         return acceptedValues;
//     }
// 
//     private final Map<String, Boolean> acceptedValues;
// 
//     public BooleanValueParser() {
//         this(defaultAcceptedValues());
//     }
// 
//     private BooleanValueParser(Map<String, Boolean> acceptedValues) {
//         this.acceptedValues = acceptedValues;
//     }
// 
//     @Override
//     public Boolean parseValue(String value) {
//         String key = value.toLowerCase();
//         if (! acceptedValues.containsKey(key)) {
//             throw new IllegalArgumentException(
//                     String.format("No registered Boolean value for '%s'", value));
//         }
//         return acceptedValues.get(key);
//     }
// 
//     @Override
//     public Class<Boolean> getValueClass() {
//         return Boolean.class;
//     }
// }


// Path: src/test/java/com/statemachinesystems/envy/ValueParserFactoryTest.java
import com.statemachinesystems.envy.common.MyClass;
import com.statemachinesystems.envy.common.MyEnum;
import com.statemachinesystems.envy.parsers.BooleanValueParser;
import org.junit.Test;
import java.util.Random;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertNull;

    @Test
    public void createsParserForTypeWithStringConstructor() {
        ValueParser<?> parser = valueParserFactory.getValueParser(MyClass.class);
        String input = "foo";
        MyClass expected = new MyClass(input);
        MyClass actual = (MyClass) parser.parseValue(input);
        assertEquals(expected, actual);
    }

    @Test
    public void returnsNullForUnsupportedType() {
        assertNull(valueParserFactory.getValueParser(Random.class));
    }

    @Test
    public void createsParserForArrayOfRegisteredType() {
        Boolean[] expected = new Boolean[] { Boolean.TRUE, Boolean.FALSE };
        ValueParser<?> parser = valueParserFactory.getValueParser(Boolean[].class);
        assertArrayEquals(expected, (Boolean[]) parser.parseValue("true,false"));
    }

    @Test
    public void createsParserForBoxedArrayOfRegisteredType() {
        ValueParser<?> parser = valueParserFactory.getValueParser(boolean[].class);
        Boolean[] expected = new Boolean[] { Boolean.TRUE, Boolean.TRUE };
        assertArrayEquals(expected, (Boolean[]) parser.parseValue("true,true"));
    }

    @Test
    public void createsParserForArrayOfEnumType() {
        MyEnum[] expected = new MyEnum[] { MyEnum.BAR, MyEnum.BAR, MyEnum.BAZ };