package de.bechte.junit.runners.validation; import de.bechte.junit.stubs.validation.AlwaysAddThrowableValidator; import de.bechte.junit.stubs.validation.NeverAddThrowableValidator; import org.junit.Before; import org.junit.Test; import org.junit.runners.model.TestClass; import org.mockito.Mock; import org.mockito.Spy; import java.util.ArrayList; import java.util.List; import static org.hamcrest.Matchers.hasSize; import static org.junit.Assert.assertThat; import static org.mockito.Matchers.anyList; import static org.mockito.Matchers.same; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.MockitoAnnotations.initMocks; public class BooleanValidatorTest { @Mock private TestClass testClass; @Spy private TestClassValidator passValidator1 = new NeverAddThrowableValidator(); @Spy private TestClassValidator passValidator2 = new NeverAddThrowableValidator(); @Spy private TestClassValidator failValidator1 = new AlwaysAddThrowableValidator(); @Spy private TestClassValidator failValidator2 = new AlwaysAddThrowableValidator(); @Spy private List<Throwable> errors = new ArrayList<Throwable>(); @Before public void setUp() throws Exception { initMocks(this); } @Test public void givenAndValidator_allGivenValidatorsAreExecuted() throws Exception { BooleanValidator validator = BooleanValidator.AND(passValidator1, passValidator2); validator.validate(testClass, errors); verify(passValidator1).validate(same(testClass), anyList()); verify(passValidator2).validate(same(testClass), anyList()); } @Test public void givenAndValidator_allGivenErrorsAreGathered() throws Exception { BooleanValidator validator = BooleanValidator.AND(failValidator1, failValidator2); validator.validate(testClass, errors); assertThat(errors, hasSize(2)); verify(failValidator1).validate(same(testClass), anyList()); verify(failValidator2).validate(same(testClass), anyList()); } @Test public void givenOrValidator_allGivenValidatorsAreExecutedIfNoneOfThemPasses() throws Exception { BooleanValidator validator = BooleanValidator.OR(failValidator1, failValidator2); validator.validate(testClass, errors); verify(failValidator1).validate(same(testClass), anyList()); verify(failValidator2).validate(same(testClass), anyList()); } @Test public void givenOrValidator_afterOneValidatorPasses_noMoreValidatorsAreExecuted() throws Exception { BooleanValidator validator = BooleanValidator.OR(failValidator1, passValidator1, failValidator2); validator.validate(testClass, errors); verify(failValidator1).validate(same(testClass), anyList()); verify(passValidator1).validate(same(testClass), anyList()); verify(failValidator2, never()).validate(same(testClass), anyList()); } @Test public void givenOrValidator_ifNoValidatorPasses_allGivenErrorsAreGathered() throws Exception { BooleanValidator validator = BooleanValidator.OR(failValidator1, failValidator2); validator.validate(testClass, errors); assertThat(errors, hasSize(2)); verify(failValidator1).validate(same(testClass), anyList()); verify(failValidator2).validate(same(testClass), anyList()); } }