package com.googlecode.totallylazy.validations;
import com.googlecode.totallylazy.Sequence;
import com.googlecode.totallylazy.collections.PersistentMap;
import org.junit.Test;
import static com.googlecode.totallylazy.Pair.pair;
import static com.googlecode.totallylazy.Sequences.empty;
import static com.googlecode.totallylazy.Sequences.sequence;
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.ValidationResult.functions.add;
import static com.googlecode.totallylazy.validations.ValidationResult.functions.addSingleMessageWithKey;
import static com.googlecode.totallylazy.validations.ValidationResult.functions.addWithKey;
import static com.googlecode.totallylazy.validations.ValidationResult.functions.assignToKey;
import static com.googlecode.totallylazy.validations.ValidationResult.functions.merge;
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertTrue;
import static org.hamcrest.MatcherAssert.assertThat;
public class ValidationResultTest {
@Test
public void isImmutable() {
ValidationResult original= failure("A", "message a");
original.add("A", "message b");
assertThat(original.allMessages(), hasExactly("message a"));
}
@Test
public void tellsUsWhetherItSucceeded() {
assertTrue(pass().succeeded());
assertFalse(failure("failed").succeeded());
}
@Test
public void exposesAllMessagesForAllKeysAsASequence() {
ValidationResult result = pass().
add("A", "message a").
add("B", "message b");
assertThat(result.allMessages(), hasExactly("message a", "message b"));
}
@Test
public void canConvertToMap() {
ValidationResult result = pass().
add("A", "message a 1").
add("A", "message a 2").
add("B", "message b 1").
add("B", "message b 2");
PersistentMap<String,Sequence<String>> map = result.toMap();
assertThat(map.lookup("A").get(), hasExactly("message a 1", "message a 2"));
assertThat(map.lookup("B").get(), hasExactly("message b 1", "message b 2"));
}
@Test
public void canReassignAllMessagesToANewKey() {
ValidationResult result = pass().
add("A", "message a").
add("B", "message b");
ValidationResult reassigned = result.assignToKey("C");
assertThat(reassigned.messages("C"), hasExactly("message a", "message b"));
assertThat(reassigned.messages("A"), isEmpty(String.class));
assertThat(reassigned.messages("B"), isEmpty(String.class));
}
@Test
public void keysAreCaseSensitive() {
ValidationResult result = failure("A", "message a");
assertThat(result.messages("a"), isEmpty(String.class));
assertThat(result.remove("a").allMessages(), hasExactly("message a"));
}
@Test
public void canGetMessagesByCallingToStringOnAnArbitraryKey() {
ValidationResult result = failure("A", "message a");
assertThat(result.messages(new Object(){
@Override
public String toString() {
return "A";
}
}), hasExactly("message a"));
}
@Test
public void canRemoveKeys() {
ValidationResult result = pass().
add("A", "message a").
remove("A");
assertThat(result.allMessages(), isEmpty(String.class));
}
@Test
public void exposesConvenienceFunctions() {
ValidationResult addPairsOfKeysAndMessages = sequence(pair("A", sequence("message 1", "message 2"))).
fold(pass(), add());
assertThat(addPairsOfKeysAndMessages.messages("A"), hasExactly("message 1", "message 2"));
ValidationResult flatMapMessagesUsingKey = sequence(sequence("message 1"), sequence("message 2")).
fold(pass(), addWithKey("A"));
assertThat(flatMapMessagesUsingKey.messages("A"), hasExactly("message 1", "message 2"));
ValidationResult addSingleMessages = sequence(pair("A", "message 1"), pair("A", "message 2")).
fold(pass(), ValidationResult.functions.addSingleMessage());
assertThat(addSingleMessages.messages("A"), hasExactly("message 1", "message 2"));
ValidationResult addSingleMessagesUsingKey = sequence("message 1", "message 2").
fold(pass(), addSingleMessageWithKey("A"));
assertThat(addSingleMessagesUsingKey.messages("A"), hasExactly("message 1", "message 2"));
}
@Test
public void exposesFunctionsToMapManyResultsToANewKeyAndThenMergeThem() {
ValidationResult resultA = failure("A", "message 1");
ValidationResult resultB = failure("B", "message 2");
ValidationResult result = sequence(resultA, resultB).
map(assignToKey("C")).
reduce(merge());
assertThat(result.messages("C"), hasExactly("message 1", "message 2"));
}
@Test
public void shouldStillPassIfThereAreZeroLengthMessagesAssignedToAKey() {
assertTrue(pass().add("key", empty(String.class)).succeeded());
}
}