/** * Copyright 2012-2018 The Feign 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 * * http://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 feign; import org.junit.Test; import java.io.Reader; import java.lang.reflect.Type; import java.util.Collection; import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import feign.codec.Decoder; import static feign.Util.emptyToNull; import static feign.Util.removeValues; import static feign.Util.resolveLastTypeParameter; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.assertEquals; public class UtilTest { @Test public void removesEmptyStrings() { String[] values = new String[] {"", null}; assertThat(removeValues(values, (value) -> emptyToNull(value) == null, String.class)) .isEmpty(); } @Test public void removesEvenNumbers() { Integer[] values = new Integer[] {22, 23}; assertThat(removeValues(values, (number) -> number % 2 == 0, Integer.class)) .containsExactly(23); } @Test public void emptyValueOf() throws Exception { assertEquals(false, Util.emptyValueOf(boolean.class)); assertEquals(false, Util.emptyValueOf(Boolean.class)); assertThat((byte[]) Util.emptyValueOf(byte[].class)).isEmpty(); assertEquals(Collections.emptyList(), Util.emptyValueOf(Collection.class)); assertThat((Iterator) Util.emptyValueOf(Iterator.class)).isEmpty(); assertEquals(Collections.emptyList(), Util.emptyValueOf(List.class)); assertEquals(Collections.emptyMap(), Util.emptyValueOf(Map.class)); assertEquals(Collections.emptySet(), Util.emptyValueOf(Set.class)); } /** In other words, {@code List} is as empty as {@code List}. */ @Test public void emptyValueOf_considersRawType() throws Exception { Type listStringType = LastTypeParameter.class.getDeclaredField("LIST_STRING").getGenericType(); assertThat((List) Util.emptyValueOf(listStringType)).isEmpty(); } /** Ex. your {@code Foo} object would be null, but so would things like Number. */ @Test public void emptyValueOf_nullForUndefined() throws Exception { assertThat(Util.emptyValueOf(Number.class)).isNull(); assertThat(Util.emptyValueOf(Parameterized.class)).isNull(); } @Test public void resolveLastTypeParameterWhenNotSubtype() throws Exception { Type context = LastTypeParameter.class.getDeclaredField("PARAMETERIZED_LIST_STRING").getGenericType(); Type listStringType = LastTypeParameter.class.getDeclaredField("LIST_STRING").getGenericType(); Type last = resolveLastTypeParameter(context, Parameterized.class); assertEquals(listStringType, last); } @Test public void lastTypeFromInstance() throws Exception { Parameterized instance = new ParameterizedSubtype(); Type last = resolveLastTypeParameter(instance.getClass(), Parameterized.class); assertEquals(String.class, last); } @Test public void lastTypeFromAnonymous() throws Exception { Parameterized instance = new Parameterized() {}; Type last = resolveLastTypeParameter(instance.getClass(), Parameterized.class); assertEquals(Reader.class, last); } @Test public void resolveLastTypeParameterWhenWildcard() throws Exception { Type context = LastTypeParameter.class.getDeclaredField("PARAMETERIZED_WILDCARD_LIST_STRING") .getGenericType(); Type listStringType = LastTypeParameter.class.getDeclaredField("LIST_STRING").getGenericType(); Type last = resolveLastTypeParameter(context, Parameterized.class); assertEquals(listStringType, last); } @Test public void resolveLastTypeParameterWhenParameterizedSubtype() throws Exception { Type context = LastTypeParameter.class.getDeclaredField("PARAMETERIZED_DECODER_LIST_STRING") .getGenericType(); Type listStringType = LastTypeParameter.class.getDeclaredField("LIST_STRING").getGenericType(); Type last = resolveLastTypeParameter(context, ParameterizedDecoder.class); assertEquals(listStringType, last); } @Test public void unboundWildcardIsObject() throws Exception { Type context = LastTypeParameter.class.getDeclaredField("PARAMETERIZED_DECODER_UNBOUND").getGenericType(); Type last = resolveLastTypeParameter(context, ParameterizedDecoder.class); assertEquals(Object.class, last); } interface LastTypeParameter { final List LIST_STRING = null; final Parameterized> PARAMETERIZED_LIST_STRING = null; final Parameterized> PARAMETERIZED_WILDCARD_LIST_STRING = null; final ParameterizedDecoder> PARAMETERIZED_DECODER_LIST_STRING = null; final ParameterizedDecoder PARAMETERIZED_DECODER_UNBOUND = null; } interface ParameterizedDecoder> extends Decoder { } interface Parameterized { } static class ParameterizedSubtype implements Parameterized { } }