// Copyright © 2015 HSL <https://www.hsl.fi> // This program is dual-licensed under the EUPL v1.2 and AGPLv3 licenses. package fi.hsl.parkandride.util; import fi.hsl.parkandride.core.service.ValidationException; import org.assertj.core.api.AbstractAssert; import org.junit.Test; import static fi.hsl.parkandride.util.ArgumentValidator.validate; import static org.assertj.core.api.Assertions.assertThat; public class ArgumentValidatorTest { @Test public void valid_values_pass() { RunnableAssert.assertThat(() -> assertThat(validate(5).gt(4)).isEqualTo(5)).passesWithoutFailure(); RunnableAssert.assertThat(() -> assertThat(validate(5).gte(5)).isEqualTo(5)).passesWithoutFailure(); RunnableAssert.assertThat(() -> assertThat(validate(4).lt(5)).isEqualTo(4)).passesWithoutFailure(); RunnableAssert.assertThat(() -> assertThat(validate(3).lte(3)).isEqualTo(3)).passesWithoutFailure(); } @Test public void invalid_values_throw() { RunnableAssert.assertThat(() -> validate(5).gt(5)) .failsWith(ValidationException.class); RunnableAssert.assertThat(() -> validate(5).gte(6)) .failsWith(ValidationException.class); RunnableAssert.assertThat(() -> validate(5).lte(4)) .failsWith(ValidationException.class); RunnableAssert.assertThat(() -> validate(5).lt(5)) .failsWith(ValidationException.class); } public static class RunnableAssert extends AbstractAssert<RunnableAssert, Runnable> { public RunnableAssert(Runnable actual) { super(actual, RunnableAssert.class); } public static RunnableAssert assertThat(Runnable r) { return new RunnableAssert(r); } public RunnableAssert passesWithoutFailure() { try { actual.run(); } catch (Exception e) { failWithMessage("Expected runnable to pass without exception. Caught <%s>", e); } return this; } public RunnableAssert failsWith(Class<? extends Exception> excClass) { try { actual.run(); failWithMessage("Expected runnable to throw <%s>. Nothing thrown.", excClass); } catch (Exception e) { if (!excClass.isAssignableFrom(e.getClass())) { failWithMessage("Expected runnable to throw <%s>. Caught <%s> instead.", excClass, e); } } return this; } } }