package com.tngtech.archunit.lang.conditions; import java.io.Serializable; import java.util.List; import com.tngtech.archunit.lang.ArchCondition; import com.tngtech.archunit.lang.ConditionEvent; import com.tngtech.archunit.lang.ConditionEvents; import com.tngtech.archunit.lang.SimpleConditionEvent; import org.junit.Test; import static com.tngtech.archunit.lang.conditions.ArchConditions.containOnlyElementsThat; import static com.tngtech.archunit.testutil.Assertions.assertThat; import static java.util.Arrays.asList; import static java.util.Collections.emptyList; public class ContainsOnlyConditionTest { private static final List<SerializableObject> TWO_SERIALIZABLE_OBJECTS = asList(new SerializableObject(), new SerializableObject()); static final List<Object> ONE_SERIALIZABLE_AND_ONE_NON_SERIALIZABLE_OBJECT = asList(new SerializableObject(), new Object()); static final ArchCondition<Object> IS_SERIALIZABLE = new ArchCondition<Object>("be serializable") { @Override public void check(Object item, ConditionEvents events) { boolean satisfied = item instanceof Serializable; events.add(new SimpleConditionEvent<>(item, satisfied, isSerializableMessageFor(item.getClass()))); } }; static String isSerializableMessageFor(Class<?> clazz) { return String.format("%s is%s serializable", clazz.getSimpleName(), Serializable.class.isAssignableFrom(clazz) ? "" : " not"); } @Test public void satisfied_works_and_description_contains_mismatches() { ConditionEvents events = new ConditionEvents(); containOnlyElementsThat(IS_SERIALIZABLE).check(ONE_SERIALIZABLE_AND_ONE_NON_SERIALIZABLE_OBJECT, events); assertThat(events).containViolations(isSerializableMessageFor(Object.class)); events = new ConditionEvents(); containOnlyElementsThat(IS_SERIALIZABLE).check(TWO_SERIALIZABLE_OBJECTS, events); assertThat(events).containNoViolation(); } @Test public void inverting_works() throws Exception { ConditionEvents events = new ConditionEvents(); containOnlyElementsThat(IS_SERIALIZABLE).check(TWO_SERIALIZABLE_OBJECTS, events); assertThat(events).containNoViolation(); assertThat(events.getAllowed()).as("Exactly one allowed event occurred").hasSize(1); assertThat(getInverted(events)).containViolations(messageForTwoTimes(isSerializableMessageFor(SerializableObject.class))); } @Test public void if_there_are_no_input_events_no_ContainsOnlyEvent_is_added() { ConditionEvents events = new ConditionEvents(); containOnlyElementsThat(IS_SERIALIZABLE).check(emptyList(), events); assertThat(events.isEmpty()).as("events are empty").isTrue(); } static ConditionEvents getInverted(ConditionEvents events) { ConditionEvents inverted = new ConditionEvents(); for (ConditionEvent event : events) { event.addInvertedTo(inverted); } return inverted; } static String messageForTwoTimes(String message) { return String.format("%s%n%s", message, message); } static class SerializableObject implements Serializable { } }