package com.googlecode.totallylazy.validations; import org.junit.Test; import java.util.Map; import static com.googlecode.totallylazy.Maps.entries; import static com.googlecode.totallylazy.Maps.map; import static com.googlecode.totallylazy.Pair.pair; import static com.googlecode.totallylazy.matchers.IterableMatcher.hasExactly; import static com.googlecode.totallylazy.matchers.IterableMatcher.isEmpty; import static com.googlecode.totallylazy.validations.ValidationResult.constructors.failure; import static com.googlecode.totallylazy.validations.ValidationResult.constructors.pass; import static com.googlecode.totallylazy.validations.Validators.forAll; import static org.hamcrest.MatcherAssert.assertThat; public class EveryItemValidatorTest { @Test public void appliesValidationToEachItemAndMergesTheResult() { Map<String, String> values = map( pair("one", "not valid"), pair("two", "valid"), pair("three", "not valid") ); // EveryItemValidator is called inside Validators.forAll(). // This is the typical pattern of usage, rather than constructing // an EveryItemValidator directly. ValidationResult result = forAll( entries(String.class, String.class), hasValue("valid")). validate(values); assertThat(result.messages("one"), hasExactly("Not the right value")); assertThat(result.messages("two"), isEmpty(String.class)); assertThat(result.messages("three"), hasExactly("Not the right value")); } private Validator<Map.Entry<String, String>> hasValue(final String expected) { return new LogicalValidator<Map.Entry<String, String>>() { @Override public ValidationResult validate(Map.Entry<String, String> entry) { return entry.getValue().equals(expected) ? pass() : failure(entry.getKey(), "Not the right value"); } }; } }