// Path: kawala-converters/src/main/java/com/kaching/platform/converters/InstantiatorErrors.java
// static Errors noSuchField(Errors errors, String fieldName) {
//   return errors.addMessage(
//       "no such field %s",
//       fieldName);
// }
// 
// Path: kawala-common/src/main/java/com/kaching/platform/common/Errors.java
// public class Errors {
// 
//   // null or [E :: L] where L is any list
//   private List<String> messages;
// 
//   public Errors addMessage(String message, Object... values) {
//     if (messages == null) {
//       messages = newArrayList();
//     }
//     String formattedMessage = format(message, values);
//     if (!messages.contains(formattedMessage)) {
//       messages.add(formattedMessage);
//     }
//     return this;
//   }
// 
//   public Errors addErrors(Errors errors) {
//     if (errors.messages == null) {
//       return this;
//     }
//     for (String message : errors.messages) {
//       addMessage(message);
//     }
//     return this;
//   }
// 
//   public List<String> getMessages() {
//     if (messages == null) {
//       return emptyList();
//     }
//     return ImmutableList.copyOf(messages);
//   }
// 
//   public void throwIfHasErrors() {
//     if (messages != null) {
//       throw new RuntimeException(toString());
//     }
//   }
// 
//   public int size() {
//     return messages == null ? 0 : messages.size();
//   }
// 
//   public boolean hasErrors() {
//     return 0 < size();
//   }
// 
//   @Override
//   public int hashCode() {
//     return messages == null ? EMPTY_LIST.hashCode() : messages.hashCode();
//   }
// 
//   @Override
//   public boolean equals(Object that) {
//     if (this == that) {
//       return true;
//     }
//     if (!(that instanceof Errors)) {
//       return false;
//     }
//     return this.messages == null ?
//         ((Errors) that).messages == null :
//           this.messages.equals(((Errors) that).messages);
//   }
// 
//   @Override
//   public String toString() {
//     if (messages == null) {
//       return "no errors";
//     }
//     StringBuilder buf = new StringBuilder();
//     int num = 1;
//     String separator = "";
//     for (String message : messages) {
//       buf.append(separator);
//       buf.append(num);
//       buf.append(") ");
//       buf.append(message);
//       num++;
//       separator = "\n\n";
//     }
//     return buf.toString();
//   }
// 
// }


import static com.kaching.platform.converters.InstantiatorErrors.noSuchField;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import java.util.List;
import org.junit.Test;
import com.google.inject.TypeLiteral;
import com.kaching.platform.common.Errors;

  public void enumHasAmbiguousNames() {
    check(
        "enum com.kaching.platform.converters.InstantiatorErrorsTest$AmbiguousEnum has ambiguous names",
        InstantiatorErrors.enumHasAmbiguousNames(
            new Errors(), AmbiguousEnum.class));
  }

  enum AmbiguousEnum {
  }

  @Test
  public void moreThanOneMatchingFunction() {
    check(
        "class com.kaching.platform.converters.InstantiatorErrorsTest$AmbiguousEnum has more than one matching function",
        InstantiatorErrors.moreThanOneMatchingFunction(
            new Errors(), AmbiguousEnum.class));
  }

  @Test
  public void noConverterForType() {
    check(
        "no converter for java.util.List<java.lang.String>",
        InstantiatorErrors.noConverterForType(
            new Errors(), new TypeLiteral<List<String>>() {}.getType()));
  }

  @Test
  public void addinTwiceTheSameMessageDoesNotDuplicateTheError() {
    check(
        "no such field a",

// Path: kawala-converters/src/main/java/com/kaching/platform/converters/InstantiatorErrors.java
// static Errors noSuchField(Errors errors, String fieldName) {
//   return errors.addMessage(
//       "no such field %s",
//       fieldName);
// }
// 
// Path: kawala-common/src/main/java/com/kaching/platform/common/Errors.java
// public class Errors {
// 
//   // null or [E :: L] where L is any list
//   private List<String> messages;
// 
//   public Errors addMessage(String message, Object... values) {
//     if (messages == null) {
//       messages = newArrayList();
//     }
//     String formattedMessage = format(message, values);
//     if (!messages.contains(formattedMessage)) {
//       messages.add(formattedMessage);
//     }
//     return this;
//   }
// 
//   public Errors addErrors(Errors errors) {
//     if (errors.messages == null) {
//       return this;
//     }
//     for (String message : errors.messages) {
//       addMessage(message);
//     }
//     return this;
//   }
// 
//   public List<String> getMessages() {
//     if (messages == null) {
//       return emptyList();
//     }
//     return ImmutableList.copyOf(messages);
//   }
// 
//   public void throwIfHasErrors() {
//     if (messages != null) {
//       throw new RuntimeException(toString());
//     }
//   }
// 
//   public int size() {
//     return messages == null ? 0 : messages.size();
//   }
// 
//   public boolean hasErrors() {
//     return 0 < size();
//   }
// 
//   @Override
//   public int hashCode() {
//     return messages == null ? EMPTY_LIST.hashCode() : messages.hashCode();
//   }
// 
//   @Override
//   public boolean equals(Object that) {
//     if (this == that) {
//       return true;
//     }
//     if (!(that instanceof Errors)) {
//       return false;
//     }
//     return this.messages == null ?
//         ((Errors) that).messages == null :
//           this.messages.equals(((Errors) that).messages);
//   }
// 
//   @Override
//   public String toString() {
//     if (messages == null) {
//       return "no errors";
//     }
//     StringBuilder buf = new StringBuilder();
//     int num = 1;
//     String separator = "";
//     for (String message : messages) {
//       buf.append(separator);
//       buf.append(num);
//       buf.append(") ");
//       buf.append(message);
//       num++;
//       separator = "\n\n";
//     }
//     return buf.toString();
//   }
// 
// }


// Path: kawala-converters/src/test/java/com/kaching/platform/converters/InstantiatorErrorsTest.java
import static com.kaching.platform.converters.InstantiatorErrors.noSuchField;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import java.util.List;
import org.junit.Test;
import com.google.inject.TypeLiteral;
import com.kaching.platform.common.Errors;

  public void enumHasAmbiguousNames() {
    check(
        "enum com.kaching.platform.converters.InstantiatorErrorsTest$AmbiguousEnum has ambiguous names",
        InstantiatorErrors.enumHasAmbiguousNames(
            new Errors(), AmbiguousEnum.class));
  }

  enum AmbiguousEnum {
  }

  @Test
  public void moreThanOneMatchingFunction() {
    check(
        "class com.kaching.platform.converters.InstantiatorErrorsTest$AmbiguousEnum has more than one matching function",
        InstantiatorErrors.moreThanOneMatchingFunction(
            new Errors(), AmbiguousEnum.class));
  }

  @Test
  public void noConverterForType() {
    check(
        "no converter for java.util.List<java.lang.String>",
        InstantiatorErrors.noConverterForType(
            new Errors(), new TypeLiteral<List<String>>() {}.getType()));
  }

  @Test
  public void addinTwiceTheSameMessageDoesNotDuplicateTheError() {
    check(
        "no such field a",

        noSuchField(noSuchField(new Errors(), "a"), "a"));
