// Path: src/main/java/de/jformchecker/criteria/ValidationResult.java
// public class ValidationResult {
// 
// 	boolean isValid = false;
// 	
// 	// caching:
// 	private static ValidationResult okResult =  new ValidationResult(true, "", null, null);
// 
// 	public boolean isValid() {
// 		return isValid;
// 	}
// 
// 	public String getMessage() {
// 		return message;
// 	}
// 
// 	public Object[] getErrorVals() {
// 		return errorVals;
// 	}
// 
// 	String message;
// 	String translatedMessage;
// 	Object[] errorVals;
// 
// 	public ValidationResult(boolean isValid, String message, Object[] errorVals, String translatedMessage) {
// 		this.isValid = isValid;
// 		this.message = message;
// 		this.errorVals = errorVals;
// 		this.translatedMessage = translatedMessage;
// 	}
// 
// 	// factory methods
// 	public static ValidationResult of_(boolean isValid, String message, Object... errorVals) {
// 		return new ValidationResult(isValid, message, errorVals, null);
// 	}
// 
// 	public static ValidationResult fail(String message, Object... errorVals) {
// 		return new ValidationResult(false, message, errorVals, null);
// 	}
// 
// 	public static ValidationResult failWithTranslated(String message, Object... errorVals) {
// 		return new ValidationResult(false, null, errorVals, message);
// 	}
// 
// 	public static ValidationResult failWithTranslated(String message) {
// 		return new ValidationResult(false, null, new Object[0], message);
// 	}
// 	
// 	public static ValidationResult ok() {
// 		// RFE: Could return always the same object! will reduce memory
// 		// footprint!
// 		return okResult;
// 	}
// 
// 	public String getTranslatedMessage() {
// 		return translatedMessage;
// 	}
// 
// }
// 
// Path: src/main/java/de/jformchecker/elements/TextInput.java
// public class TextInput extends AbstractInput<TextInput> implements FormCheckerElement {
// 
// 	private String placeholderText = "";
// 
// 	public static TextInput build(String name) {
// 		TextInput i = new TextInput();
// 		i.name = name;
// 		return i;
// 	}
// 
// 	public TextInput setPlaceholerText(String placeholderText) {
// 		this.placeholderText = placeholderText;
// 		return this;
// 	}
// 
// 	@Override
// 	public String getInputTag(Map<String, String> attributes, MessageSource messageSource, boolean html5Validation) {
// 		TagAttributes tagAttributes = new TagAttributes(attributes);
// 		tagAttributes.add(this.inputAttributes);
// 		return String.format("<input " + buildAllAttributes(tagAttributes, messageSource, html5Validation) + buildMaxLen()
// 				+ "type=\"text\" name=\"%s\" value=\"%s\"" + getPlaceholder() + ">", name,
// 				(value == null ? "" : getValueHtmlEncoded()));
// 	}
// 
// 	
// 	protected String getPlaceholder() {
// 		return StringUtils.isEmpty(placeholderText) ? ""
// 				: " placeholder=\"" + Escape.htmlText(placeholderText) + "\"";
// 	}
// 	
// 	@Override
// 	public String getType() {
// 		return "text";
// 	}
// 
// 
// }
// 
// Path: src/main/java/de/jformchecker/validator/DefaultValidator.java
// public class DefaultValidator implements Validator {
// 
// 	/*
// 	 * (non-Javadoc)
// 	 * 
// 	 * @see de.jformchecker.validator.Validator#validate(de.jformchecker.
// 	 * FormCheckerElement)
// 	 */
// 	@Override
// 	public ValidationResult validate(FormCheckerElement elem) {
// 		String value = elem.getValue();
// 		ValidationResult vr = ValidationResult.ok();
// 		if (value != null && !"".equals(value)) {
// 			vr = allCriteriaSatisfied(elem);
// 		} else {
// 			// blank input is valid if it's not required
// 			if (elem.isRequired()) {
// 				vr = ValidationResult.fail("jformchecker.required", "");
// 			} 
// 		}
// 		return vr;
// 	}
// 
// 	// RFE: Maybe return here an array? So we can have more than one error-message per field.
// 	private ValidationResult allCriteriaSatisfied(FormCheckerElement elem) {
// 		for (Criterion criterion : elem.getCriteria()) {
// 			ValidationResult vr = criterion.validate(elem);
// 			if (!vr.isValid()) {
// 				return vr;
// 			}
// 		}
// 
// 		return ValidationResult.ok();
// 	}
// 
// 
// }


import org.junit.Assert;
import org.junit.Test;
import de.jformchecker.criteria.ValidationResult;
import de.jformchecker.elements.TextInput;
import de.jformchecker.validator.DefaultValidator;
package de.jformchecker.test;



/**
 * Tests the behaviour of validation errors
 * 
 * @author jochen
 *
 */
public class ValidationErrorTest {

	// Tests if a not translated comes
	@Test
	public void testMessageKeyError() {
		String errorMsg = "ErrorMsg"; 
		boolean translateMsg = false;
		TextInput ti = getFormElement(translateMsg, errorMsg);
		boolean firstRun = false;
		ti.init(key -> "NotCorrect", firstRun, new DefaultValidator());
		Assert.assertEquals(errorMsg, ti.getValidationResult().getMessage());
	}
	
	// Test if a translated message is coming
	@Test
	public void testTranslatedError() {
		String errorMsg = "ErrorMsg"; 
		boolean translateMsg = true;
		TextInput ti = getFormElement(translateMsg, errorMsg);
		boolean firstRun = false;
		ti.init(key -> "NotCorrect", firstRun, new DefaultValidator());
		Assert.assertEquals(errorMsg, ti.getValidationResult().getTranslatedMessage());
	}
	
	private TextInput getFormElement(boolean translatedMessage, String errorMsg) {
		String content = "Jochen";
// Path: src/main/java/de/jformchecker/criteria/ValidationResult.java
// public class ValidationResult {
// 
// 	boolean isValid = false;
// 	
// 	// caching:
// 	private static ValidationResult okResult =  new ValidationResult(true, "", null, null);
// 
// 	public boolean isValid() {
// 		return isValid;
// 	}
// 
// 	public String getMessage() {
// 		return message;
// 	}
// 
// 	public Object[] getErrorVals() {
// 		return errorVals;
// 	}
// 
// 	String message;
// 	String translatedMessage;
// 	Object[] errorVals;
// 
// 	public ValidationResult(boolean isValid, String message, Object[] errorVals, String translatedMessage) {
// 		this.isValid = isValid;
// 		this.message = message;
// 		this.errorVals = errorVals;
// 		this.translatedMessage = translatedMessage;
// 	}
// 
// 	// factory methods
// 	public static ValidationResult of_(boolean isValid, String message, Object... errorVals) {
// 		return new ValidationResult(isValid, message, errorVals, null);
// 	}
// 
// 	public static ValidationResult fail(String message, Object... errorVals) {
// 		return new ValidationResult(false, message, errorVals, null);
// 	}
// 
// 	public static ValidationResult failWithTranslated(String message, Object... errorVals) {
// 		return new ValidationResult(false, null, errorVals, message);
// 	}
// 
// 	public static ValidationResult failWithTranslated(String message) {
// 		return new ValidationResult(false, null, new Object[0], message);
// 	}
// 	
// 	public static ValidationResult ok() {
// 		// RFE: Could return always the same object! will reduce memory
// 		// footprint!
// 		return okResult;
// 	}
// 
// 	public String getTranslatedMessage() {
// 		return translatedMessage;
// 	}
// 
// }
// 
// Path: src/main/java/de/jformchecker/elements/TextInput.java
// public class TextInput extends AbstractInput<TextInput> implements FormCheckerElement {
// 
// 	private String placeholderText = "";
// 
// 	public static TextInput build(String name) {
// 		TextInput i = new TextInput();
// 		i.name = name;
// 		return i;
// 	}
// 
// 	public TextInput setPlaceholerText(String placeholderText) {
// 		this.placeholderText = placeholderText;
// 		return this;
// 	}
// 
// 	@Override
// 	public String getInputTag(Map<String, String> attributes, MessageSource messageSource, boolean html5Validation) {
// 		TagAttributes tagAttributes = new TagAttributes(attributes);
// 		tagAttributes.add(this.inputAttributes);
// 		return String.format("<input " + buildAllAttributes(tagAttributes, messageSource, html5Validation) + buildMaxLen()
// 				+ "type=\"text\" name=\"%s\" value=\"%s\"" + getPlaceholder() + ">", name,
// 				(value == null ? "" : getValueHtmlEncoded()));
// 	}
// 
// 	
// 	protected String getPlaceholder() {
// 		return StringUtils.isEmpty(placeholderText) ? ""
// 				: " placeholder=\"" + Escape.htmlText(placeholderText) + "\"";
// 	}
// 	
// 	@Override
// 	public String getType() {
// 		return "text";
// 	}
// 
// 
// }
// 
// Path: src/main/java/de/jformchecker/validator/DefaultValidator.java
// public class DefaultValidator implements Validator {
// 
// 	/*
// 	 * (non-Javadoc)
// 	 * 
// 	 * @see de.jformchecker.validator.Validator#validate(de.jformchecker.
// 	 * FormCheckerElement)
// 	 */
// 	@Override
// 	public ValidationResult validate(FormCheckerElement elem) {
// 		String value = elem.getValue();
// 		ValidationResult vr = ValidationResult.ok();
// 		if (value != null && !"".equals(value)) {
// 			vr = allCriteriaSatisfied(elem);
// 		} else {
// 			// blank input is valid if it's not required
// 			if (elem.isRequired()) {
// 				vr = ValidationResult.fail("jformchecker.required", "");
// 			} 
// 		}
// 		return vr;
// 	}
// 
// 	// RFE: Maybe return here an array? So we can have more than one error-message per field.
// 	private ValidationResult allCriteriaSatisfied(FormCheckerElement elem) {
// 		for (Criterion criterion : elem.getCriteria()) {
// 			ValidationResult vr = criterion.validate(elem);
// 			if (!vr.isValid()) {
// 				return vr;
// 			}
// 		}
// 
// 		return ValidationResult.ok();
// 	}
// 
// 
// }


// Path: src/test/java/de/jformchecker/test/ValidationErrorTest.java
import org.junit.Assert;
import org.junit.Test;
import de.jformchecker.criteria.ValidationResult;
import de.jformchecker.elements.TextInput;
import de.jformchecker.validator.DefaultValidator;

package de.jformchecker.test;



/**
 * Tests the behaviour of validation errors
 * 
 * @author jochen
 *
 */
public class ValidationErrorTest {

	// Tests if a not translated comes
	@Test
	public void testMessageKeyError() {
		String errorMsg = "ErrorMsg"; 
		boolean translateMsg = false;
		TextInput ti = getFormElement(translateMsg, errorMsg);
		boolean firstRun = false;
		ti.init(key -> "NotCorrect", firstRun, new DefaultValidator());
		Assert.assertEquals(errorMsg, ti.getValidationResult().getMessage());
	}
	
	// Test if a translated message is coming
	@Test
	public void testTranslatedError() {
		String errorMsg = "ErrorMsg"; 
		boolean translateMsg = true;
		TextInput ti = getFormElement(translateMsg, errorMsg);
		boolean firstRun = false;
		ti.init(key -> "NotCorrect", firstRun, new DefaultValidator());
		Assert.assertEquals(errorMsg, ti.getValidationResult().getTranslatedMessage());
	}
	
	private TextInput getFormElement(boolean translatedMessage, String errorMsg) {
		String content = "Jochen";
		TextInput ti = (TextInput) TextInput.build("firstname").setPreSetValue(content);