/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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 org.apache.tamaya.core.internal; import org.apache.tamaya.ConfigurationProvider; import org.apache.tamaya.spi.ConversionContext; import org.apache.tamaya.spi.PropertyConverter; import org.apache.tamaya.TypeLiteral; import org.junit.Test; import java.util.List; import static org.hamcrest.CoreMatchers.*; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.collection.IsCollectionWithSize.hasSize; public class PropertyConverterManagerTest { private final ConversionContext DUMMY_CONTEXT = new ConversionContext.Builder( "someKey", TypeLiteral.of(Object.class)).build(); @Test public void customTypeWithFactoryMethodOfIsRecognizedAsSupported() { PropertyConverterManager manager = new PropertyConverterManager(); assertThat(manager.isTargetTypeSupported(TypeLiteral.of(MyType.class)), is(true)); } @Test public void factoryMethodOfIsUsedAsConverter() { PropertyConverterManager manager = new PropertyConverterManager(); List<PropertyConverter<MyType>> converters = manager.getPropertyConverters( (TypeLiteral)TypeLiteral.of(MyType.class)); assertThat(converters, hasSize(1)); PropertyConverter<MyType> converter = converters.get(0); Object result = converter.convert("IN", DUMMY_CONTEXT); assertThat(result, notNullValue()); assertThat(result, instanceOf(MyType.class)); assertThat(((MyType)result).getValue(), equalTo("IN")); } @Test public void testDirectConverterMapping(){ PropertyConverterManager manager = new PropertyConverterManager(); List<PropertyConverter<C>> converters = List.class.cast(manager.getPropertyConverters(TypeLiteral.of(C.class))); assertThat(converters, hasSize(1)); PropertyConverter<C> converter = converters.get(0); C result = converter.convert("testDirectConverterMapping", DUMMY_CONTEXT); assertThat(result, notNullValue()); assertThat(result, instanceOf(C.class)); assertThat((result).getInValue(), equalTo("testDirectConverterMapping")); } @Test public void testDirectSuperclassConverterMapping(){ PropertyConverterManager manager = new PropertyConverterManager(true); List<PropertyConverter<B>> converters = List.class.cast(manager.getPropertyConverters(TypeLiteral.of(B.class))); assertThat(converters, hasSize(1)); converters = List.class.cast(manager.getPropertyConverters(TypeLiteral.of(B.class))); assertThat(converters, hasSize(1)); PropertyConverter<B> converter = converters.get(0); B result = converter.convert("testDirectSuperclassConverterMapping", DUMMY_CONTEXT); assertThat(result, notNullValue()); assertThat(result, instanceOf(C.class)); assertThat(((C)result).getInValue(), equalTo("testDirectSuperclassConverterMapping")); } @Test public void testMultipleConverterLoad(){ PropertyConverterManager manager = new PropertyConverterManager(); List<PropertyConverter<B>> converters = List.class.cast(manager.getPropertyConverters(TypeLiteral.of(B.class))); assertThat(converters, hasSize(0)); manager = new PropertyConverterManager(); converters = List.class.cast(manager.getPropertyConverters(TypeLiteral.of(B.class))); assertThat(converters, hasSize(0)); manager.initConverters(); converters = List.class.cast(manager.getPropertyConverters(TypeLiteral.of(B.class))); assertThat(converters, hasSize(1)); } @Test public void testTransitiveSuperclassConverterMapping(){ PropertyConverterManager manager = new PropertyConverterManager(true); List<PropertyConverter<A>> converters = List.class.cast(manager.getPropertyConverters(TypeLiteral.of(A.class))); assertThat(converters, hasSize(1)); PropertyConverter<A> converter = converters.get(0); A result = converter.convert("testTransitiveSuperclassConverterMapping", DUMMY_CONTEXT); assertThat(result, notNullValue()); assertThat(result, instanceOf(C.class)); assertThat(((C)result).getInValue(), equalTo("testTransitiveSuperclassConverterMapping")); } @Test public void testDirectInterfaceMapping(){ PropertyConverterManager manager = new PropertyConverterManager(true); List<PropertyConverter<Readable>> converters = List.class.cast(manager.getPropertyConverters(TypeLiteral.of(Readable.class))); assertThat(converters, hasSize(1)); PropertyConverter<Readable> converter = converters.get(0); Readable result = converter.convert("testDirectInterfaceMapping", DUMMY_CONTEXT); assertThat(result, notNullValue()); assertThat(result, instanceOf(C.class)); assertThat(((C)result).getInValue(), equalTo("testDirectInterfaceMapping")); } @Test public void testTransitiveInterfaceMapping1(){ PropertyConverterManager manager = new PropertyConverterManager(true); List<PropertyConverter<Runnable>> converters = List.class.cast(manager.getPropertyConverters(TypeLiteral.of(Runnable.class))); assertThat(converters, hasSize(1)); PropertyConverter<Runnable> converter = converters.get(0); Runnable result = converter.convert("testTransitiveInterfaceMapping1", DUMMY_CONTEXT); assertThat(result, notNullValue()); assertThat(result, instanceOf(C.class)); assertThat(((C)result).getInValue(), equalTo("testTransitiveInterfaceMapping1")); } @Test public void testTransitiveInterfaceMapping2(){ PropertyConverterManager manager = new PropertyConverterManager(true); List<PropertyConverter<AutoCloseable>> converters = List.class.cast(manager.getPropertyConverters(TypeLiteral.of(AutoCloseable.class))); assertThat(converters, hasSize(1)); PropertyConverter<AutoCloseable> converter = converters.get(0); AutoCloseable result = converter.convert("testTransitiveInterfaceMapping2", DUMMY_CONTEXT); assertThat(result, notNullValue()); assertThat(result, instanceOf(C.class)); assertThat(((C)result).getInValue(), equalTo("testTransitiveInterfaceMapping2")); } public static class MyType { private final String typeValue; private MyType(String value) { typeValue = value; } public static MyType of(String source) { return new MyType(source); } public String getValue() { return typeValue; } } }