From 3770ff45691ccaed38464eb5c9e7832edf1d6035 Mon Sep 17 00:00:00 2001 From: John Blum Date: Sun, 26 Apr 2020 15:33:48 -0700 Subject: [PATCH] Introduce TupleConsumer interface extending and implementing the java.util.function.Consumer interface accepting a variable number of arguments reprented by InvocationArguments. --- .../geode/util/function/TupleConsumer.java | 31 ++++++++ .../util/function/TupleConsumerUnitTests.java | 76 +++++++++++++++++++ 2 files changed, 107 insertions(+) create mode 100644 apache-geode-extensions/src/main/java/org/springframework/geode/util/function/TupleConsumer.java create mode 100644 apache-geode-extensions/src/test/java/org/springframework/geode/util/function/TupleConsumerUnitTests.java diff --git a/apache-geode-extensions/src/main/java/org/springframework/geode/util/function/TupleConsumer.java b/apache-geode-extensions/src/main/java/org/springframework/geode/util/function/TupleConsumer.java new file mode 100644 index 00000000..687c690b --- /dev/null +++ b/apache-geode-extensions/src/main/java/org/springframework/geode/util/function/TupleConsumer.java @@ -0,0 +1,31 @@ +/* + * Copyright 2020 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ +package org.springframework.geode.util.function; + +import java.util.function.Consumer; + +/** + * {@link Consumer} implementation accepting a tuple of {@link InvocationArguments arguments}. + * + * @author John Blum + * @see java.util.function.Consumer + * @see org.springframework.geode.util.function.InvocationArguments + * @since 1.3.0 + */ +@SuppressWarnings("unused") +public interface TupleConsumer extends Consumer { + +} diff --git a/apache-geode-extensions/src/test/java/org/springframework/geode/util/function/TupleConsumerUnitTests.java b/apache-geode-extensions/src/test/java/org/springframework/geode/util/function/TupleConsumerUnitTests.java new file mode 100644 index 00000000..81c7a1ab --- /dev/null +++ b/apache-geode-extensions/src/test/java/org/springframework/geode/util/function/TupleConsumerUnitTests.java @@ -0,0 +1,76 @@ +/* + * Copyright 2020 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ +package org.springframework.geode.util.function; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doCallRealMethod; +import static org.mockito.Mockito.inOrder; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; + +import java.util.function.Consumer; + +import org.junit.Test; +import org.mockito.InOrder; + +/** + * Unit Tests for {@link TupleConsumer}. + * + * @author John Blum + * @see java.util.function.Consumer + * @see org.junit.Test + * @see org.mockito.Mockito + * @see org.springframework.geode.util.function.TupleConsumer + * @since 1.3.0 + */ +public class TupleConsumerUnitTests { + + @Test + public void andThenComposesTupleConsumers() { + + TupleConsumer consumerOne = mock(TupleConsumer.class); + TupleConsumer consumerTwo = mock(TupleConsumer.class); + + doCallRealMethod().when(consumerOne).andThen(any(TupleConsumer.class)); + + Consumer composedConsumer = consumerOne.andThen(consumerTwo); + + assertThat(composedConsumer).isNotNull(); + assertThat(composedConsumer).isNotSameAs(consumerOne); + assertThat(composedConsumer).isNotSameAs(consumerTwo); + + InvocationArguments arguments = InvocationArguments.from("test", 1, true); + + composedConsumer.accept(arguments); + + InOrder order = inOrder(consumerOne, consumerTwo); + + order.verify(consumerOne, times(1)).accept(eq(arguments)); + order.verify(consumerTwo, times(1)).accept(eq(arguments)); + } + + @Test(expected = NullPointerException.class) + public void andThenWithNull() { + + TupleConsumer consumer = mock(TupleConsumer.class); + + doCallRealMethod().when(consumer).andThen(any()); + + consumer.andThen(null); + } +}